고마워. 이쪽은 코미야야.
이전 글에서 이어서 dbserver 레시피에 대해 이야기하겠습니다.
제가 해야 할 일은 munin, zabbx, serverspec로 테스트하는 것뿐입니다. 저는 조금 인내심이 있습니다.
웹처럼 고정 버전이기 때문에 외부 레시피는 거의 사용하지 않습니다.
- MySQL 설치 및 실행 및 자동 시작 활성화
[shell]# CD /root/chef-repo/site-cookbooks/mysqld/recipes
mkdir -p /root/chef-repo/site-cookbooks/mysqld/files/default/usr/local/src/rpms
mkdir -p .. /templates/default/etc/init.d
mkdir -p .. /files/default/etc/init.d
mkdir -p .. /파일/기본값/루트
mkdir -p /root/chef-repo/site-cookbooks/mysqld/files/default/etc/logrotate.d
mkdir -p /root/chef-repo/site-cookbooks/mysqld/files/default/opt/{backup,bin}
scp -Cp xxx-db02:/opt/bin/mysql-back.sh /root/chef-repo/site-cookbooks/mysqld/files/default/opt/bin/
cp -p /etc/logrotate.d/mysqld /root/chef-repo/site-cookbooks/mysqld/files/default/etc/logrotate.d/
scp -Cp xxx-db01:/etc/init.d/mysqld .. /files/default/etc/init.d/
scp -Cp xxx-db02:/etc/my.cnf .. /templates/default/etc/
cp -p /root/.path_to_file .. /파일/기본값/root/
CD /opt/src/rpms/
tar czf /root/chef-repo/site-cookbooks/mysqld/files/default/usr/local/src/rpms/db-rpm.tar.gz ./db-rpm/
tar czf /root/chef-repo/site-cookbooks/mysqld/files/default/usr/local/src/rpms/db-tools-rpm.tar.gz ./db-tools-rpm/
tar tzf /root/chef-repo/site-cookbooks/mysqld/files/default/usr/local/src/rpms/db-rpm.tar.gz
vi .. /템플릿/기본값/등/my.cnf
diff /etc/my.cnf .. /templates/default/etc/my.cnf
53c53
< server-id = 100
서버-ID = <%= 노드['mysqld']['서버_id'] %>
vi .. /.. /.. /노드/10.0.0.241.json
서버_id 속성을 ↓node에 쓰세요 (server_id 각 노드를 복제하려면 { "mysqld" : { "server_id" : 103 }, "run_list":[ "role[dbserver]" ] }
CD /root/chef-repo/site-cookbooks/mysqld/recipes
vi mysqld-server.rb
패키지 "perl-DBI" do not_if "rpm -qa|grep perl-DBI" action :install end
package "perl-TermReadKey" do not_if "rpm -qa|grep perl-TermReadKey" action :install end
cookbook_file "/tmp/db-rpm.tar.gz" 출처 "usr/local/src/rpms/db-rpm.tar.gz" 모드 0644 끝
cookbook_file "/tmp/db-tools-rpm.tar.gz" 출처는 "usr/local/src/rpms/db-tools-rpm.tar.gz" 모드 0644 끝
filename = "db-rpm" filename2 = "db-tools-rpm" 스크립트 "install_mysqld" do not_if 'rpm -qa|grep mysql-server' 인터프리터 "bash" 사용자 "root" 코드 <-EOL cd="" mp="" tar="" xzf="" mp/#{filename}.tar.gz="" rpm="" -i="" mp/#{filename}/_rpm="" rpm="" -i="" mp/#{filename}/5.5.27/mysql_rpm="" tar="" xzf="" mp/#{filename2}.tar.gz="" rpm="" -i="" mp/#{filename2}/m*rpm="" eol="" end="" cookbook_file="" "/etc/init.d/mysqld"="" do="" source="" "etc/init.d/mysqld"="" mode="" 0755="" end="" template="" '/etc/my.cnf'="" do="" owner="" 'root'="" group="" 'root'="" source="" 'etc/my.cnf'="" end="" service="" "mysqld"="" do="" supports="" :status=""> true, :restart => true, :reload => :true action [ :enable, :start ] 끝
cookbook_file "/etc/logrotate.d/mysqld" 출처 "etc/logrotate.d/mysqld" 소유자 'root' 그룹 'root' 모드 0644 끝
디렉터리 '/opt/bin/' do owner 'root' 그룹 'root' 모드 '0755' 작업 :create end
디렉터리 '/opt/backup/' do owner 'root' 그룹 'root' 모드 '0755' 작업 :create end
cookbook_file "/opt/bin/mysql-back.sh" 출처 "opt/bin/mysql-back.sh" 소유자 'root' 그룹 'root' 모드 0755 종료
#cron "mysql-backup"은
분 "31"
4시간
날 "*"
달 "*"
평일"*"
명령어 "/opt/bin/mysql-back.sh"
행동 :창조
#end[/shell]
・MySQL 사용자 생성
초보자가 읽고 오류를 디버깅하기 어려워서 opscode 레시피는 사용하지 않기로 했습니다.
참고문헌:
Chef에서 MySQL 설치하기Chef에서 MySQL 비밀번호 관리하기 오늘 시작하기Chef Chef에서 MySQL 사용자 및 데이터베이스를 관리하세요
[shell]# vi site-cookbooks/mysqld/recipes/mysql-users.rb #include_recipe "openssl" #include_recipe 'database::mysql'
#mysql_connection_info = {:host => "localhost",
:사용자 이름 => 'root',
##:p assword => node['mysql']['server_root_password']}
:p assword => ''}
#mysql_database "xxx_db"
커넥션 마이스쿠스_connection_info
행동 :창조
#end
xxxadm_data = 셰프:: EncryptedDataBagItem.load("mysqlusers","xxx_admin") root_data = Chef::EncryptedDataBagItem.load("mysqlusers","root") repl_data = Chef::EncryptedDataBagItem.load("mysqlusers","repl") myuser_o = xxxadm_data["user"] mypass_o =xxxadm_data["pass"] myuser_ro = root_data["user"] mypass_ro =root_data["pass"] myuser_re = repl_data["user"] mypass_re =repl_data["pass"] #mysql_database_user "#{user}" do
커넥션 마이스쿠스_connection_info
비밀번호 "#{password}"
데이터베이스_name "*"
호스트 "[#{host}, %, localhost]"
특권 [:모두]
행동 [:창조, :그랜트]
#end # mysqlconn = "mysql -u root" 스크립트 "create_msql_xxxadm" do not_if "ls /root/.path_to_file" #not_if "#{mysqlconn} -p #{mypass_ro} -e 'select count(_) mysql.user where user=\'repl\';'" 인터프리터 "bash" 사용자 "root" 코드
<-EOL #{mysqlconn} < EOF grant all privileges on *._ to #{myuser_o}@'%' identified by "#{mypass_o}"; grant all privileges on . to #{myuser_o}@'10.0.0.%' identified by "#{mypass_o}"; grant all privileges on . to #{myuser_o}@'localhost' identified by "#{mypass_o}"; grant all privileges on . to #{myuser_ro}@'10.0.0.%' identified by "#{mypass_ro}"; grant all privileges on . to #{myuser_ro}@'localhost' identified by "#{mypass_ro}"; grant replication slave, replication client on . to #{myuser_re}@'10.0.0.%' identified by "#{mypass_re}"; grant replication slave, replication client on . to #{myuser_re}@'localhost' identified by "#{mypass_re}"; drop database test; delete from mysql.user where password=''; flush privileges; EOF EOL end
script "create_pfile" do not_if 'ls /root/.path_to_file' interpreter "bash" user "root" code <-EOL echo="" "#{mypass_ro}"=""> /root/.path_to_file chown 400 /root/.path_to_file EOL 종료[/shell] *EOF가 줄 앞에 없으면 오류가 발생합니다.
·복제 구성 레시피 (테스트되지 않음)
아직 테스트해보진 못했지만, 실제 절차를 레시피로 바꾸는 방법을 생각해봤고, 결과는 다음과 같았습니다.
저는 Bash에서만 할 수 있는 것 같아요.
서드파티 레시피를 살펴보고 완전히 해독하는 데 시간이 걸릴 것 같아요
이해하지 못하는 것을 사용하는 것은 매우 위험하니 일단은 그대로 하겠습니다.
STG 서버는 stg db로 백업되어 있어서 사용하지 않습니다.
db02나 remote_file 같은 것으로 만든 최신 덤프 파일을 가져와서 넣으세요.
마이그레이션에 사용될 수 있으므로 master-data=2로 수집된 데이터이므로
덤프 파일에서 ZGREP 같은 걸 사용해 GHANGE MASTER TO 구문을 추출해서 변수에 넣으세요.
mysql -e 같은 변수를 전달해서 마스터를 인식하게 하고, 읽기 전용으로 설정했습니다.
복제가 시작되는 느낌이 들 것 같아요.
당분간은 복제_setup.sh 를 만들고 실행하는 방향으로 진행 중입니다.
가져온 데이터를 모두 입력하면, 전체 사용자가 mysql 스키마에 입력하게 됩니다.
아마 데이터백으로 암호화할 필요가 없었을 거야. (지금)
복제를 설정하기 위한 셸 작성
[shell]# vi 복제_setup.sh ------------------------------- #!/bin/bash
BACKUP_SRV='10.0.0.222'
BACKUP_PATH='/opt/backup'
BACKUP_FL='mysqldump_3306_"'LANG=C;date +%y%m%d'".sql''
MSQL_USER=근
MSQL_PASS='고양이 /path_to_file'
MSQL_CONN="mySQL -u ${MSQL_USER} -p${MSQL_PASS}"
MSQL_CMD_RO='set global read_only=1;'
#MAIL_TO='hoge@isao.co.jp'
MAIL_TO='hoge@isao.net'
MYHOST='uname -n'
DATETIME='date +%Y%m%d_%H:%M:%D'
만약 [ -s /tmp/${BACKUP_FL}.gz ]; 그렇다면
:
그렇지 않으면
echo "replication setup faild"|mail -s 'uname -n'_'date +%Y%m%d_%H:%M:%S' ${MAIL_TO}
출구 0
Fi
건지프 /TMP/${BACKUP_FL}.gz
${MSQL_CONN} < /tmp/${BACKUP_FL}
CHANGE_MASTER='cat /tmp/${BACKUP_FL}|head -30|grep 'CHANGE MASTER TO'|sed -e 's/^-- //g'''
${MSQL_CONN} -e "노예 멈춰; "
${MSQL_CONN} -e "${CHANGE_MASTER}"
${MSQL_CONN} -e "${MSQL_CMD_RO}"
${MSQL_CONN} -e "노예 시작; "
에코 '${MSQL_CONN} -e "노예 상태 표시\G"'|메일 -s 'uname -n'_'date +%Y%m%d_%H:%M:%S' ${MAIL_TO}
출구 0
-------------------------------
chmod +x 복제_setup.sh
mkdir /root/chef-repo/site-cookbooks/mysqld/files/default/tmp
MV 복제_setup.sh /root/chef-repo/site-cookbooks/mysqld/files/default/tmp/[/shell]
<br>당분간은 매일 STG에서 구입할 예정입니다.<br>```
\[shell\]# mkdir -p /root/chef-repo/site-cookbooks/mysqld/files/default/opt/{backup,bin}
# vi /선택/버려/받아 dbbkup.sh
#!/빈/쾅
CHEF_BKUP_PATH=/root/chef-repo/site-cookbooks/mysqld/files/default/opt/backup BACKUP_SRV='10.0.0.222' BACKUP_PATH='/opt/backup' BACKUP_FL='mysqldump_3306_"'LANG=C;date +%y%m%d'".sql'' scp -Cp root@${BACKUP_SRV}:${BACKUP_PATH}/${BACKUP_FL}.gz ${CHEF_BKUP_PATH}
출구 0
# chmod +x /opt/bin/get\_dbbkup.sh
# 크론탭 -에
# 크론탭 -l
셰프 슬레이브 설정을 위한 DB 백업 데이터를 확보하세요.
0 6 * * * /opt/bin/get_dbbkup.sh > /dev/null 2>&1
--------------[/shell]
```
복제 중지 감지 스크립트를 파일에 배치하세요
[shell]# SCP -p xxx-db02:/opt/bin/rep_fail_mail.sh /root/chef-repo/site-cookbooks/mysqld/files/default/opt/bin/[/shell]
복제 설정 레시피를 작성하세요
[shell]# CD /root/chef-repo/site-cookbooks/mysqld/recipes
vi 복제.rb
----------------------------
dumpfile = mysqldump_3306_"'LANG=C;date +%y%m%d'.sql
cookbook_file "/tmp/#{dumpfile}.gz" do
출처 "opt/backup/#{dumpfile}.gz"
모드 0644
끝
문자 "setup_replication"
통역사 "배쉬"
사용자 "루트"
코드 <<-EOL
/tmp/replication_setup.sh
폐지
끝
cookbook_file "/opt/bin/rep_fail_mail.sh"
출처 "OPT/BIN/rep_fail_mail.sh"
모드 0755
끝
크론 "rep_fail_mail" 도르
1분 "0-59/15"
시간"*"
일일 "*"
월 "*"
평일"*"
명령어 "/opt/bin/rep_fail_mail.sh"
행동 :Create
끝
----------------------------[/shell]
・HA 구성 설정에 대하여
회사에서 주로 사용되는 세 가지 유형이 있습니다: 심장박동 연결, MHA, VIP 수동 스위칭입니다.
그래서 이번에는 VIP 수동 전환(가장 긴 다운타임과 데이터 손실 가능성이 가장 높은 불행한 유형)이 될 것입니다.
세 번째 이후에는 굳이 VIP를 DB에 붙일 필요를 느끼지 않지만, 둘 다 깨졌을 때를 위해서요.
만일을 대비해, VIP 보조금 스크립트만 옮기는 레시피를 준비할게. (롤에 포함되지 않음)
[shell]# scp -Cp xxx-db02:/opt/bin/eni_vip_up.sh /root/chef-repo/site-cookbooks/mysqld/files/default/opt/bin/
# VI VIP 아타치.rb
요리책_file "/opt/bin/eni_vip_up.sh" 출처 "opt/bin/eni_vip_up.sh" 모드 0755 끝
#script "eni_vip_up"
통역사 "배쉬"
사용자 "root"
코드 <-EOL
/opt/bin/eni_vip_up.sh
EOL
#end -----------------------------[/shell] ※間違ってロールに入れてしまったときのために転送したスクリプトの実行はコメントインしておく
クックブックのシンタックステスト
[shell]# knife cookbook test mysqld[/shell] FATAL:エラーがでなければOKと思われる
今回はここまでです。長々読んでいただいてありがとうございました。
다음에는 무닌과 자빅스 레시피가 나올 거야.</-EOL></-EOL>