詳細検索

Escrevendo Receitas para Procedimentos Existentes no Chef 4 (Servidor de Banco de Dados)

Avatar
por komi
6 min de leitura

Escrevendo Receitas para Procedimentos Existentes no Chef 4 (Servidor de Banco de Dados)
Traduzido do 日本語 • Ver original

Obrigado. Esta é a Komiya.

Continuando do artigo anterior, vou escrever sobre receitas de dbserver.
A única coisa que preciso fazer é testar com munin, zabbx e serverspec. Sou um pouco paciente.

Como é uma instalação fixa, como a web, receitas externas basicamente não são usadas.

  • Instalar e iniciar o MySQL e ativar o início automático

[shell]# cd /root/chef-repo/site-cookbooks/mysqld/receitas

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 .. /files/default/root

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 .. /files/default/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 .. /templates/default/etc/my.cnf

diff /etc/my.cnf .. /templates/default/etc/my.cnf

53c53

< server-id = 100

server-id = <%= nó['mysqld']['server_id'] %>

vi .. /.. /.. /nós/10.0.0.241.json

Escrever o atributo do servidor_id no ↓node (servidor_id precisa ser alterado para cada nó a ser replicado, { "mysqld" : { "server_id" : 103 }, "run_list":[ "role[dbserver]" ] }

CD /root/chef-repo/site-cookbooks/mysqld/receitas

vi mysqld-server.rb

pacote "perl-DBI" não_if ação "rpm -qa|grep perl-DBI" :install end

pacote "perl-TermReadKey" não_if "rpm -qa|grep perl-TermReadKey" ação :install end

Cookbook_file "/tmp/db-rpm.tar.gz" do source "usr/local/src/rpms/db-rpm.tar.gz" modo 0644 fim

cookbook_file "/tmp/db-tools-rpm.tar.gz" do source "usr/local/src/rpms/db-tools-rpm.tar.gz" modo 0644 fim

Nome do arquivo = "DB-RPM" Nome do Arquivo2 = "DB-Tools-RPM" script "Install_mysqld" não_if 'RPM -QA|GREP MySQL-Server' Interpretador "bash" usuário "<-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="">root" código true, :restart => true, :reload => :true action [ :enable, :start ] fim

cookbook_file "/etc/logrotate.d/mysqld" fonte "etc/logrotate.d/mysqld" proprietário do grupo 'root' 'root' modo 0644 fim

diretório '/opt/bin/' fazer proprietário 'root' grupo 'root' modo '0755' ação :criar fim

diretório '/opt/backup/' do proprietário 'root' group 'root' modo '0755' ação :criar fim

cookbook_file "/opt/bin/mysql-back.sh" do source "opt/bin/mysql-back.sh" proprietário 'root' group 'root' mode 0755 fim

#cron "mysql-backup" fazem

Minuto "31"

Hora "4"

dia "*"

mês "*"

Dias de Semana"*"

comando "/opt/bin/mysql-back.sh"

Ação :Criar

#end[/shell]

・Criar um usuário para mysql
Decidi não usar receitas do Opscode porque são difíceis para iniciantes lerem e depuram erros.
Referência:
Instale MySQL no ChefGerencie as senhas MySQL no ChefComece hojeGerencie usuários e bancos de dados MySQL no Chef Chef

[shell]# site vi Cookbooks/mysqld/recipes/mysql-users.rb #include_recipe "openssl" #include_recipe 'banco de dados::mysql'

#mysql_connection_info = {:host => "localhost",

:username => 'root',

#:p assword => nó['mysql']['server_root_password']}

:p espada => ''}

#mysql_database "xxx_db" fazem

conexão MySQL_connection_info

Ação :Criar

#end

xxxadm_data = Chef::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

conexão MySQL_connection_info

senha "#{senha}"

banco de dados_name "*"

host "[#{host}, %, localhost]"

privilégios [:todos]

ação [:criar, :conceder]

#end # mysqlconn = "mysql -u root" script "create_msql_xxxadm" não if "ls /root/.path_to_file" #not_if "#{mysqlconn} -p #{mypass_ro} -e 'select count() from mysql.user where user=\'repl\';'" interpretador "bash" user código "root" do usuário

<-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 fim EOL[/shell] *Um erro ocorrerá se o EOF não estiver no início da linha.

・Receita de construção de replicação (note que não foi testada)

Ainda não consegui testar, mas pensei em como transformar o procedimento em uma receita, e acabou sendo o seguinte.
 Só consigo pensar em fazer isso no bash.
 Parece que vai levar tempo para passar por receitas de terceiros e decifrá-las completamente
 É muito perigoso usar algo que você não entende, então vou usar por enquanto.
  O servidor stg é respaldado pelo banco de dados stg, então eu não uso.
  Leve o arquivo dump mais recente feito com db02 ou algo como remote_file e coloque-o.
  Como pode ser usado para migração, é um dado coletado com master-data=2, então
  Extraia a sintaxe do GHANGE MASTER TO no arquivo de dump com zgrep ou algo assim e coloque em uma variável.
  Passei uma variável no mysql -e ou algo assim, deixei ver o mestre e ativei para que fosse somente leitura.
  Acho que vai parecer que a replicação começa.
  Por enquanto, na direção de fazer uma replicação_setup.sh e executá-la.
  Se você colocar os dados que coletou em todos, todo o usuário entrará no esquema mysql.
   Talvez eu não precisasse criptografar com databags. (Agora)

Escrevendo um Shell para Configurar a Replicação
[shell]# vi replicação_setup.sh ------------------------------- #!/bin/bash

BACKUP_SRV='10.0.0.222' 
BACKUP_PATH='/opt/backup' 
BACKUP_FL='mysqldump_3306_&quot;'LANG=C;date +%y%m%d'&quot;.sql' 
MSQL_USER=raiz
MSQL_PASS='gato /path_to_file'
MSQL_CONN=&quot;mysql -u ${MSQL_USER} -p${MSQL_PASS}&quot; 
MSQL_CMD_RO='definir 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'

se [ -s /tmp/${BACKUP_FL}.gz ]; então
 : 
senão
 echo &quot;configuração de replicação falhou&quot;|mail -s 'uname -n'_'date +%Y%m%d_%H:%M:%S' ${MAIL_TO}
 saída 0
fi

gunzip /tmp/${BACKUP_FL}.gz
${MSQL_CONN} &lt; /tmp/${BACKUP_FL}
CHANGE_MASTER='cat /tmp/${BACKUP_FL}|cabeça -30|grep 'MUDAR MESTRE PARA'|sed -e 's/^-- //g''

${MSQL_CONN} -e &quot;escravo de parada; &quot; 
${MSQL_CONN} -e &quot;${CHANGE_MASTER}&quot; 
${MSQL_CONN} -e &quot;${MSQL_CMD_RO}&quot; 
${MSQL_CONN} -e &quot;iniciar escravo; &quot; 

echo '${MSQL_CONN} -e &quot;mostrar status de escravo\G&quot;'|mail -s 'uname -n'_'date +%Y%m%d_%H:%M:%S' ${MAIL_TO}

saída 0
------------------------------- 

chmod +x replicação_setup.sh

mkdir /root/chef-repo/site-cookbooks/mysqld/files/default/tmp

Replicação MV_setup.sh /root/chef-repo/site-cookbooks/mysqld/files/default/tmp/[/shell]

<br>Por enquanto, vou pegar na STG todos os dias.<br>```

\[shell\]# mkdir -p /root/chef-repo/site-cookbooks/mysqld/files/default/opt/{backup,bin}

# vi /opt/bin/get\_dbbkup.sh

#!/lixo/batida

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}

saída 0


# chmod +x /opt/bin/get\_dbbkup.sh

# crontab -e

# crontab -l

Obter dados de backup do banco de dados para a configuração do Chef Slave.

0 6 * * * /opt/bin/get_dbbkup.sh > /dev/null 2>&1 --------------[/shell]
```

Coloque o script de detecção de parada de replicação em arquivos
[shell]# SCP -p xxx-db02:/opt/bin/rep_fail_mail.sh /root/chef-repo/site-cookbooks/mysqld/files/default/opt/bin/[/shell]
Escreva uma receita para configuração de replicação
[shell]# cd /root/chef-repo/site-cookbooks/mysqld/receitas

vi replication.rb

---------------------------- 
dumpfile = mysqldump_3306_&quot;'LANG=C;date +%y%m%d'&quot;.sql
cookbook_file &quot;/tmp/#{dumpfile}.gz&quot; faça
  fonte: &quot;opt/backup/#{dumpfile}.gz&quot; 
  Modo 0644
fim

script &quot;setup_replication&quot; do
  Intérprete &quot;Bash&quot; 
  &quot;Root&quot; do usuário 
  código &lt;&lt;-EOL
    /tmp/replication_setup.sh 
  EOL
fim

cookbook_file &quot;/opt/bin/rep_fail_mail.sh&quot; fazem
  fonte &quot;opt/bin/rep_fail_mail.sh&quot; 
  Modo 0755
fim

cron &quot;rep_fail_mail&quot; do
  Minuto &quot;0-59/15&quot; 
  hora &quot;*&quot; 
  dia &quot;*&quot; 
  mês &quot;*&quot; 
  Dia de semana&quot;*&quot; 
  comando &quot;/opt/bin/rep_fail_mail.sh&quot; 
  Ação :Criar
fim
----------------------------[/shell]

・Sobre os cenários de construção do HA

Existem três tipos principais usados na empresa: ligação Heartbeat, MHA e comutação manual VIP.
Então, desta vez será a troca manual VIP (do tipo infeliz, com o maior tempo de inatividade e a que mais provavelmente causa perda de dados).
Não sinto muita necessidade de anexar VIP ao DB depois do terceiro, mas para quando ambos estiverem quebrados.
Só por precaução, vou preparar uma receita que só transfira o roteiro da bolsa VIP. (Não incluído no rolo)

[shell]# scp -Cp xxx-db02:/opt/bin/eni_vip_up.sh /root/chef-repo/site-cookbooks/mysqld/files/default/opt/bin/

# vi vip-attach.rb

cookbook_file "/opt/bin/eni_vip_up.sh" do source "opt/bin/eni_vip_up.sh" modo 0755 end

#script "eni_vip_up" fazem

Intérprete "Bash"

usuário "root"

código <-EOL

/opt/bin/eni_vip_up.sh

EOL

#end -----------------------------[/shell] ※間違ってロールに入れてしまったときのために転送したスクリプトの実行はコメントインしておく

クックブックのシンタックステスト
[shell]# knife cookbook test mysqld[/shell] FATAL:エラーがでなければOKと思われる

今回はここまでです。長々読んでいただいてありがとうございました。
Da próxima vez será uma receita para Munin e Zabbix.</-EOL></-EOL>

Related Articles