詳細検索

Configurações de implantação para o MasterHigh AvailabilityManager (MHA)

Avatar
por komi

Configurações de implantação para o MasterHigh AvailabilityManager (MHA)
Traduzido do 日本語 • Ver original

Configurações de implantação do MHA (MasterHigh AvailabilityManager) Versões usadas: mha4mysql-manager-0.53-0, MySQL-5.5

mha-img1

(1) Explicação de benefícios simples, etc.

MHA é um produto que usa o escravo mais recente como mestre em caso de falha do mestre mysql, compensa as diferenças entre outros escravos e muda a direção do mestre.
Comparado ao Heartbeat+mon+mysql, ele também reconstrói a replicação, então o banco de dados não se torna um único mesmo que você troque. (Para configurações de 3 ou mais unidades)

Site oficial do slide do autor
Limitações do MHA: LOAD DATA INFILE não pode ser usado para mysql 5.0 ou superior e SBR (Replicação Baseada em Statement)
*O gerenciador é o servidor administrador, e o nó é o servidor de banco de dados (comum ao mestre e ao escravo).

(2) Instalação no gerenciador *A partir de agora realizada a partir do servidor ADM

Instalação
[php]

O que http://mysql-master-ha.googlecode.com/files/mha4mysql-node-0.53-0.noarch.rpm

O que http://mysql-master-ha.googlecode.com/files/mha4mysql-manager-0.53-0.noarch.rpm

yum --enablerepo=instalação rpmforge \

perl-Config-Tiny \ perl-Time-HiRes \ perl-Log-Dispatch \ perl-Parallel-ForkManager \ perl-Params-Valide

yum install perl-DBD-MySQL

RPM -IVH MHA4MySQL*

[/php]

[shell]yum install --enablerepo=remi mysql mysql-server perl-DBD-MySQL[/shell] *O gerenciador pode não ser necessário para mysql-server

(3) Instalação em um nó *A partir de agora realizada a partir de um servidor de banco de dados
[shell]

O que http://mysql-master-ha.googlecode.com/files/mha4mysql-node-0.53-0.noarch.rpm

RPM -IVH MHA4MySQL-Node*

[/shell] (4) Mudando Configurações (Manager)

Configuração de chave pública ・SSH
Você precisa conseguir fazer login no nó com root a partir do gerenciador
Crie uma chave (ssh-keygen -t rsa -N "")
Adicione a chave pública (~.pub) ao anel de chaves públicas (/root/.ssh/authorized_keys) em cada nó.

・Instalação de arquivos de configuração e scripts
[shell]

# vi /etc/app1.cnf

[servidor padrão]

Usuário MySQL e senha

usuário=senha root= ssh_user=root

Diretório de trabalho sobre o gerente

gerente_workdir=/var/log/masterha/app1 manager_log=/var/log/masterha/app1/manager.log

diretório funcional em servidores MySQL

remote_workdir=/var/log/masterha/app1

Master Binlog Diretor

master_binlog_dir=/usr/local/mysql/var

master_ip_failover_script=/usr/local/bin/master_ip_failover report_host=/usr/local/bin/send_report ping_interval=3

[server1] nome do host=192.168.100.1 porta=3306

[server2] nome do host=192.168.100.2 porta=3306 candidato_master=1

[server3] nome do host=192.168.100.3 porta=3306

não_master=1

[/shell] principais parâmetros de configuração para detalhes aqui

*Outros parâmetros que podem ser melhores
secundária_check_script
 Especifique o script e o host que serão verificados pela segunda interface.
ignorar_fail
 Mesmo que o segundo escravo caia, se o mestre cair, se você quiser trocar, pode ignorar como escravo.
[Deslig_script amento](https://code.google.com/p/mysql-master-ha/wiki/Parameters#shutdown_script)
 Parece que é bom especificar um script com essa opção se você quiser eliminar completamente o master para evitar o SplitBrain, etc.

Script para trocar VIP
[shell]

# vi /usr/local/bin/master_ip_failover

#!/usr/bin/env perl

usar rigoroso; usar avisos FATAL => 'todos';

usar Getopt::Long;

meus ($command, $ssh_user, $orig_master_host, $orig_master_ip, $orig_master_port, $new_master_host, $new_master_ip, $new_master_port );

meu $vip = '192.168.100.5/24'; # IP virtual meu $key = "1"; meu $ssh_start_vip = "sudo /sbin/ifconfig eth1:$key $vip"; meu $ssh_stop_vip = "sudo /sbin/ifconfig eth1:$key desligado"; meu $ssh_stop_mysqld = "sudo /sbin/service mysqld stop";

GetOptions( 'command=s' => \$command, 'ssh_user=s' => \$ssh_user, 'orig_master_host=s' => \$orig_master_host, 'orig_master_ip=s' => \$orig_master_ip, 'orig_master_port "=i' => \$orig_master_port, 'new_master_host=s' => \$new_master_host, 'new_master_ip=s' => \$new_master_ip, 'new_master_port=i' => \$new_master_port, );

saída & main();

sub main {

imprima "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";

if ( $command eq "stop" || $command eq "stopssh" ) {

$orig_master_host, $orig_master_ip, $orig_master_port passam.

# Se você gerencia o endereço IP mestre no banco de dados global do catálogo, # invalide o orig_master_ip aqui. meu $exit_code = 1; eval { print "Desabilitando o VIP no antigo mestre: $orig_master_host \n"; avaliando { &stop_vip(); imprima "Pare o meu sqld no antigo mestre: $orig_master_host \n"; system("ssh $ssh_user\@$orig_master_host \" $ssh_stop_mysqld \""); }; system("/usr/local/bin/mod_lvs_weight.sh"); $exit_code = 0; }; if ($@) { avisar "Tenho Erro: $@\n";

saída $exit_code;

}

saída $exit_code;

} elsif ( $command eq "start" ) {

Todos os argumentos são aprovados.

# Se você gerencia o endereço IP mestre no banco de dados global do catálogo, # ative o novo_master_ip aqui. # Você também pode conceder acesso de escrita (criar usuário, definir leitura_only=0, etc) aqui. meu $exit_code = 10; eval { print "Ativando o VIP - $vip no novo mestre - $new_master_host \n"; &start_vip(); $exit_code = 0; }; if ($@) { avisar $@; exit $exit_code; } exit $exit_code; } elsif ( $command eq "status" ) { print "Verificando o status do script.. OK \n";

'ssh $ssh_usuário@gentoo8 " $ssh_start_vip "';

saída 0; } else { &usage(); saída 1; } }

Uma chamada simples de sistema que permite o VIP no novo mestre

sub start_vip() { 'ssh $ssh_user@$new_master_host " $ssh_start_vip "'; }

Uma simples chamada de sistema que desativa o VIP no vel_master ho\

sub stop_vip() { 'ssh $ssh_user@$orig_master_host " $ssh_stop_vip "'; }

subusage { print "Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=porta --new_master_host=host --new_master_ip=ip --new_master_port=port\n";

}

[/shell] *Processar peças como dropar IP, IF e mysql, e alterar o peso do LVS deve ser alterado conforme necessário.
Roteiro original

Script para alterar o peso do LVS chamado do script que troca o VIP
[shell]

# vi /usr/local/bin/mod_lvs_weight.sh

#!/lixo/batida #

Este roteiro foi retirado do mestre_ip\_failover-roteiro.

script-task: Modificar o peso do lvs e o peso do script de backup do admin-server.

isao-unyou 2012.11.5 - Criação

por favor, modifique. (e verifique o ldirectod.cf.failover!)

TÍTULO=TESTE READVIP=192.168.100.8 LVSSRV1=192.168.100.6 LVSSRV2=192.168.100.7 NIC=eth1 DB1=192.168.100.1 DB2=192.168.100.2 DB3=192.168.100.3 REDE=192.168.100 LVS_CF=/etc/ha.d/ldirectord.cf MAILADDR=XXXX@isao.net BKUPSRV=192.168.100.3 BKUP_SH=/opt/bin/mysql-back.sh DB1_WEIGHT=0 DB2_WEIGHT=2 DB3_WEIGHT=4 BK_WEIGHT=4 MHA_LOG=/var/log/masterha/app1/manager.log

Leia o servidor VIP

srv_chk() { RVIP_CHK='ssh $LVSSRV 1 ip addr show $NIC|grep $READVIP|awk '{print $2}'|awk -F / '{print $1}'' se [ "$READVIP" = "$RVIP_CHK" ]; então LVSSRV=$LVSSRV 1 LVSBKSRV=$LVSSRV 2 RVIP_CHK2='ssh $LVSSRV 2 ip addr show $NIC|grep $READVIP|awk '{print $2}'|awk -F / '{print $1}'' se [ "$READVIP" = "$RVIP_CHK2" ]; então ecoa "'LANG=C;date': LVS read vip split-brain 'uname -n'." \ | mail -s "NG_READ_VIP $READVIP" $MAILADDR eco 'ERRO: LVS leitura vip split-brain. ' exit 1 fi else RVIP_CHK2='ssh $LVSSRV 2 ip addr show $NIC|grep $READVIP|awk '{print $2}'|awk -F / '{print $1}'' if [ "$READVIP" = "$RVIP_CHK2" ]; então LVSSRV=$LVSSRV 2 LVSBKSRV=$LVSSRV 1 else echo "'LANG=C;date': LVS read vip desconhecido 'uname -n'." \ | mail -s "NG_READ_VIP $READVIP" $MAILADDR eco 'ERRO: LVS lido vip desconhecido. ' saída 1 fi fi }

Modificar peso e correspondência para Unyou. (Informações sobre peso LVS)

mod_weight() { SSH $LVSSRV "IPvsadm -e -t $READVIP:3306 -R $DB 1 -G -W $DB 1_WEIGHT" SSH $LVSSRV "IPvsadm -E -T $READVIP:3306 -R $DB 2 -G -W $DB 2_WEIGHT" SSH $LVSSRV "ipvsadm -e -t $READVIP::006 3306 -r $DB 3 -g -w $DB 3_WEIGHT" ssh $LVSSRV "cp -p $LVS_CF{,.'date +%Y%m%d.%H%M'} \ &&\cp -pf $LVS_CF.failover $LVS_CF \ &&& service ldirectord force-reload" \ && scp -Cp $LVSSRV:$LVS_CF /tmp/ \ && scp -Cp /tmp/ldirectord.cf $LVSBKSRV:/etc/ha.d/ echo -e "'LANG=C;date'\nCurrent weights: \n\n 'ssh $LVSSRV ipvsadm -Ln'" \ | mail -s "$TITLE mysql-master Failover. modificar o peso do LVS e do bkupscript." $MAILADDR

modificar o script de backup.

#ssh $BKUPSRV "cp -p $BKUP_SH{,.'date +%Y%m%d.%H%M'} && sed -i \"s/WEIGHT=[0-9]{1,100}/WEIGHT=$BK_WEIGHT/g\" $BKUP_SH" }

principal

exec >> $MHA_LOG exec 2>&1 echo "INICIAR lvs weight modification. 'date '+%Y%m%d %T''" srv_chk mod_weight echo "END lvs weight change. 'date '+%Y%m%d %T''"

saída 0

chmod +x /usr/local/bin/mod_lvs_weight.sh

[/shell]
Script para enviar um e-mail de relatório

[shell]# vi /usr/local/bin/send_report

#!/usr/bin/perl

Nota: Este é um script de exemplo e não está completo. Modifique o script com base no seu ambiente.

usar rigoroso; usar avisos FATAL => 'todos';

usar Getopt::Long;

#new_master_host e novo_slave_hosts só são definidos quando o mestre recuperado sucede meu ($dead_master_host, $new_master_host, $new_slave_hosts, $subject, $body ); GetOptions( 'orig_master_host=s' => $dead\ _master_host, 'novo_master_host=s' => \$new_master_host, 'novo_slave_hosts=s' => \$new_slave_hosts, 'sujeito=s' => \$subject, 'corpo=s' => \$body, );

Faça o que quiser aqui

#my $vip = '/sbin/ip addr mostrar eth0'; meu $vip = '/usr/bin/ssh $new_master_host /sbin/ip addr mostrar eth0'; meu $datetime = '/bin/date +%Y%m%d_%H:%M:%S'; meu $manager_cnf='/etc/app1.cnf'; meu $manager_workdir='grep manager_workdir $manager_cnf|sed -e 's/[^=]=//g''; meu $remote_workdir=''grep remote_workdir $manager_cnf|sed -e 's/[^=]=//g''; meu $sendmail = '/usr/sbin/sendmail'; # caminho de comando sendmail meu $from = 'hoge@isao.net'; # Do e-mail #my $to = 'hoge@isao.co.jp'; # Do endereço de e-mail meu $to = 'hoge@isao.net'; # Para o endereço de e-mail meu $cc = 'hoge@ezweb.ne.jp'; # Copiar para o endereço de e-mail #$subject = 'test'; # Sujeito do e-mail #$msg = <"_TEXT_"; #="" メールの本文(ヒアドキュメントで変数に代入)="" #message="" #_text_="" #="" sendmail="" コマンド起動="" open(sdml,"|="" $sendmail="" -t="" -i")="" ||="" die="" 'sendmail="" error';="" #="" メールヘッダ出力="" print="" sdml="" "from:="" $from\n";="" print="" sdml="" "to:="" $to\n";="" print="" sdml="" "cc:="" $cc\n";="" print="" sdml="" "subject:="" $subject="" $datetime\n";="" print="" sdml="" "content-transfer-encoding:="" 7bit\n";="" print="" sdml="" "content-type:="" text/plain;charset="\"ISO-2022-JP\"\n\n";" #="" メール本文出力="" #print="" sdml="" "$msg";="" print="" sdml="" "$body";="" print="" sdml="" "\n";="" print="" sdml="" "ip="" addr="" show="" eth0:\n";="" print="" sdml="" "="" $vip";="" print="" sdml="" "\n";="" print="" sdml="" "="" manager_workdir:\n";="" print="" sdml="" /bin/ls="" -l="" $manager_workdir\n;="" print="" sdml="" "="" remote_workdir:\n";="" print="" sdml="" /bin/ls="" -l="" $remote_workdir\n;="" #="" sendmail="" コマンド閉じる="" close(sdml);="" exit="" 0;="" ------------------------------------------[/shell]="" ※tarからダウンロードしてきたものに追記。="" ※適宜、sendmailのセットアップとレポートが送付されるか動作確認する。="" ⑤="" 設定変更(ノード)="" ・sudo設定="" [shell]="" ##="" #="" visudo="" defaults="" requiretty="" ↓="" ##="" #defaults="" requiretty="" [/shell]="" ※ssh越しにsudoして以下のメッセージが出る場合の設定(master_ip_failoverスクリプトを利用する場合に必要)="" sudo:="" sorry,="" you="" must="" have="" a="" tty="" to="" run="" sudo="" ・mysql的な初期ユーザ設定(ノード側)="" rootでセグメント許可でgrantつけず(mysqlのユーザ名はrootでなくても大丈夫)="" [sql]="" #="" mysql="" -u="" root="" -p=""> CONCEDER TODOS OS PRIVILÉGIOS EM . PARA 'root'@'192.168.100.%' IDENTIFICADO POR '***'; selecione Usuário, Host, Senha de mysql.user; [/sql] ・Construção de Replicação
Verifique os arquivos de log e as posições do mestre >

Mestre
[sql] RESETAR MESTRE; mostrar status mestre; [/sql] Verifique e registre o nome e posição do arquivo de log, só por precaução.

Especifique informações mestres no servidor escravo e inicie a replicação
Escravo
[sql] RESETAR MESTRE; mostrar status mestre; MUDAR MESTRE PARA MESTRE_HOST='Endereço IP do Mestre', MESTRE_USER='repl', MESTRE_PASSWORD='**', MESTRE_LOG_FILE='mysql-bin.000001', MESTRE_LOG_POS=106; INICIAR SLAVE; mostrar status do escravo\G definido global de leitura_only=1; mostrar variáveis globais como 'read_only'; [/sql] resetar mestre se estiver no estado padrão; resetar o escravo; Tudo o que você precisa fazer é corresponder à posição.
Se você tiver dados, registre a posição no master, recupere e transfira os dados com o mysqldump, insira os dados no mysql, compare as posições e inicie o slave.
Regras de filtragem como Replicar_Ignore_DB devem ser comuns

・Configurações de comutação de log de relé
purge_relay_logs é um comando complementar à configuração que impede o conjunto de log de relé no nó quando o MHA é introduzido.
Quando o mestre é comutado, o log de relé é usado para compensar a diferença com o mestre, então não o exclua porque é necessário.
[shell]

mysql -u root -p'cat /path_to_file'

definir relé global_log_purge=0; mostrar variáveis globais como 'relé_log%';

ls -l /var/lib/mysql/mysqld-relay-bin.*

/usr/bin/perl /usr/bin/purge_relay_logs --user=root --password='cat /path_to_file' --disable_relay_log_purge >> /var/log/masterha/purge_relay_logs.log 2>&1

ls -l /var/lib/mysql/mysqld-relay-bin.*

cauda /var/tronco/masterha/purga_relay_logs.log

crontab -e

----------slave1---------- 30 2,4,6,10,14,16 * * * /usr/bin/perl /usr/bin/purge_relay_logs --user=root --password='cat /path_to_file' --disable_relay_log_purge >> /var/log/masterha/purge_relay_logs.log 2>&1 ----------slave2----------

30 3,5,9,11,15,17 * * * /usr/bin/perl /usr/bin/purge_relay_logs --user=root --password='cat /path_to_file' --disable_relay_log_purge >> /var/log/masterha/purge_relay_logs.log 2>&1

[/shell] *Recomenda-se chamar cron em diferentes momentos entre os escravos. (Se todos os escravos iniciarem a purga_relay_logs ao mesmo tempo, nenhum dos escravos pode ter os eventos de log de retransmissão necessários em caso de travamento.) )
*Cuidado para não sobrepor com outros lotes agregados. (Em termos de carga)
Se o registro de relés se acumular demais e causar problemas, ele deve ser implementado a cada hora.
*No caso de uma operação que não retorne o mestre, é recomendável registrar o mestre em estado de comentário e em um momento escalonado.
*Se você estiver montado em um ioDrive e não puder vincular diretamente ao /var/tmp, precisa especificar o diretório que está montando com a opção –workdir.

purge_relay_logs Para mais informações sobre opções e especificações de comando, veja aqui.

Especificações do Registro de Relé
http://dev.mysql.com/doc/refman/5.1/ja/slave-logs-relaylog.htmlhttp://open-groove.net/mysql/binlog-relay-log/ O próximo é o teste de comutação.

・URL de referência
mha-for-mysqldenaMHA para MySQL: Mestre em Gerenciador de Alta Disponibilidade e ferramentas para MySQLIntrodução do MySQL-MHA As considerações ao aplicar o MySQL-MHA ao seu próprio ambiente Tente MySQL-MHA Tenta alcançar o failover automático do MySQL usando MySQL-MHAT A comparação entre a operação MySQL da DeNA e o Amazon RDS na Conferência de Tecnologia NHN. Tentei adicionar o MySQL-mha! Parte 2MHA, Murakumo & Meatomd / master_ip_failover Vamos tentar fazer failover na replicação do MySQL com MHA e HAProxy Vamos tornar o MySQL redundante com configurações de implantação MHA + HAProxy MHA (MasterHigh AvailabilityManager) Versão usada: mha4mysql-manager-0.53-0, MySQL-5.5

mha-img1

(1) Explicação de benefícios simples, etc.

MHA é um produto que usa o escravo mais recente como mestre em caso de falha do mestre mysql, compensa as diferenças entre outros escravos e muda a direção do mestre.
Comparado ao Heartbeat+mon+mysql, ele também reconstrói a replicação, então o banco de dados não se torna um único mesmo que você troque. (Para configurações de 3 ou mais unidades)

Site oficial do slide do autor
Limitações do MHA: LOAD DATA INFILE não pode ser usado para mysql 5.0 ou superior e SBR (Replicação Baseada em Statement)
*O gerenciador é o servidor administrador, e o nó é o servidor de banco de dados (comum ao mestre e ao escravo).

(2) Instalação no gerenciador *A partir de agora realizada a partir do servidor ADM

Instalação
[php]

O que http://mysql-master-ha.googlecode.com/files/mha4mysql-node-0.53-0.noarch.rpm

O que http://mysql-master-ha.googlecode.com/files/mha4mysql-manager-0.53-0.noarch.rpm

yum --enablerepo=instalação rpmforge \

perl-Config-Tiny \ perl-Time-HiRes \ perl-Log-Dispatch \ perl-Parallel-ForkManager \ perl-Params-Valide

yum install perl-DBD-MySQL

RPM -IVH MHA4MySQL*

[/php]

[shell]yum install --enablerepo=remi mysql mysql-server perl-DBD-MySQL[/shell] *O gerenciador pode não ser necessário para mysql-server

(3) Instalação em um nó *A partir de agora realizada a partir de um servidor de banco de dados
[shell]

O que http://mysql-master-ha.googlecode.com/files/mha4mysql-node-0.53-0.noarch.rpm

RPM -IVH MHA4MySQL-Node*

[/shell] (4) Mudando Configurações (Manager)

Configuração de chave pública ・SSH
Você precisa conseguir fazer login no nó com root a partir do gerenciador
Crie uma chave (ssh-keygen -t rsa -N "")
Adicione a chave pública (~.pub) ao anel de chaves públicas (/root/.ssh/authorized_keys) em cada nó.

・Instalação de arquivos de configuração e scripts
[shell]

# vi /etc/app1.cnf

[servidor padrão]

Usuário MySQL e senha

usuário=senha root= ssh_user=root

Diretório de trabalho sobre o gerente

gerente_workdir=/var/log/masterha/app1 manager_log=/var/log/masterha/app1/manager.log

diretório funcional em servidores MySQL

remote_workdir=/var/log/masterha/app1

Master Binlog Diretor

master_binlog_dir=/usr/local/mysql/var

master_ip_failover_script=/usr/local/bin/master_ip_failover report_host=/usr/local/bin/send_report ping_interval=3

[server1] nome do host=192.168.100.1 porta=3306

[server2] nome do host=192.168.100.2 porta=3306 candidato_master=1

[server3] nome do host=192.168.100.3 porta=3306

não_master=1

[/shell] principais parâmetros de configuração para detalhes aqui

*Outros parâmetros que podem ser melhores
secundária_check_script
 Especifique o script e o host que também farão a verificação a partir da segunda interface
ignorar_fail
 Mesmo que o segundo escravo caia, se o mestre cair, se você quiser trocar, pode ignorar como escravo.

Script para trocar VIP
[shell]

# vi /usr/local/bin/master_ip_failover

#!/usr/bin/env perl

usar rigoroso; usar avisos FATAL => 'todos';

usar Getopt::Long;

meus ($command, $ssh_user, $orig_master_host, $orig_master_ip, $orig_master_port, $new_master_host, $new_master_ip, $new_master_port );

meu $vip = '192.168.100.5/24'; # IP virtual meu $key = "1"; meu $ssh_start_vip = "sudo /sbin/ifconfig eth1:$key $vip"; meu $ssh_stop_vip = "sudo /sbin/ifconfig eth1:$key desligado"; meu $ssh_stop_mysqld = "sudo /sbin/service mysqld stop";

GetOptions( 'command=s' => \$command, 'ssh_user=s' => \$ssh_user, 'orig_master_host=s' => \$orig_master_host, 'orig_master_ip=s' => \$orig_master_ip, 'orig_master_port "=i' => \$orig_master_port, 'new_master_host=s' => \$new_master_host, 'new_master_ip=s' => \$new_master_ip, 'new_master_port=i' => \$new_master_port, );

saída & main();

sub main {

imprima "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";

if ( $command eq "stop" || $command eq "stopssh" ) {

$orig_master_host, $orig_master_ip, $orig_master_port passam.

# Se você gerencia o endereço IP mestre no banco de dados global do catálogo, # invalide o orig_master_ip aqui. meu $exit_code = 1; eval { print "Desabilitando o VIP no antigo mestre: $orig_master_host \n"; avaliando { &stop_vip(); imprima "Pare o meu sqld no antigo mestre: $orig_master_host \n"; system("ssh $ssh_user\@$orig_master_host \" $ssh_stop_mysqld \""); }; system("/usr/local/bin/mod_lvs_weight.sh"); $exit_code = 0; }; if ($@) { avisar "Tenho Erro: $@\n";

saída $exit_code;

}

saída $exit_code;

} elsif ( $command eq "start" ) {

Todos os argumentos são aprovados.

# Se você gerencia o endereço IP mestre no banco de dados global do catálogo, # ative o novo_master_ip aqui. # Você também pode conceder acesso de escrita (criar usuário, definir leitura_only=0, etc) aqui. meu $exit_code = 10; eval { print "Ativando o VIP - $vip no novo mestre - $new_master_host \n"; &start_vip(); $exit_code = 0; }; if ($@) { avisar $@; exit $exit_code; } exit $exit_code; } elsif ( $command eq "status" ) { print "Verificando o status do script.. OK \n";

'ssh $ssh_usuário@gentoo8 &quot; $ssh_start_vip &quot;';

saída 0; } else { &usage(); saída 1; } }

Uma chamada simples de sistema que permite o VIP no novo mestre

sub start_vip() { 'ssh $ssh_user@$new_master_host &quot; $ssh_start_vip &quot;'; }

Uma simples chamada de sistema que desativa o VIP no vel_master ho\

sub stop_vip() { 'ssh $ssh_user@$orig_master_host &quot; $ssh_stop_vip &quot;'; }

subusage { print "Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=porta --new_master_host=host --new_master_ip=ip --new_master_port=port\n";

}

[/shell] *Processar peças como dropar IP, IF e mysql, e alterar o peso do LVS deve ser alterado conforme necessário.
Roteiro original

Script para alterar o peso do LVS chamado do script que troca o VIP
[shell]

# vi /usr/local/bin/mod_lvs_weight.sh

#!/lixo/batida #

Este roteiro foi retirado do mestre_ip\_failover-roteiro.

script-task: Modificar o peso do lvs e o peso do script de backup do admin-server.

isao-unyou 2012.11.5 - Criação

por favor, modifique. (e verifique o ldirectod.cf.failover!)

TÍTULO=TESTE READVIP=192.168.100.8 LVSSRV1=192.168.100.6 LVSSRV2=192.168.100.7 NIC=eth1 DB1=192.168.100.1 DB2=192.168.100.2 DB3=192.168.100.3 REDE=192.168.100 LVS_CF=/etc/ha.d/ldirectord.cf MAILADDR=XXXX@isao.net BKUPSRV=192.168.100.3 BKUP_SH=/opt/bin/mysql-back.sh DB1_WEIGHT=0 DB2_WEIGHT=2 DB3_WEIGHT=4 BK_WEIGHT=4 MHA_LOG=/var/log/masterha/app1/manager.log

Leia o servidor VIP

srv_chk() { RVIP_CHK='ssh $LVSSRV 1 ip addr show $NIC|grep $READVIP|awk '{print $2}'|awk -F / '{print $1}'' se [ "$READVIP" = "$RVIP_CHK" ]; então LVSSRV=$LVSSRV 1 LVSBKSRV=$LVSSRV 2 RVIP_CHK2='ssh $LVSSRV 2 ip addr show $NIC|grep $READVIP|awk '{print $2}'|awk -F / '{print $1}'' se [ "$READVIP" = "$RVIP_CHK2" ]; então ecoa "'LANG=C;date': LVS read vip split-brain 'uname -n'." \ | mail -s "NG_READ_VIP $READVIP" $MAILADDR eco 'ERRO: LVS leitura vip split-brain. ' exit 1 fi else RVIP_CHK2='ssh $LVSSRV 2 ip addr show $NIC|grep $READVIP|awk '{print $2}'|awk -F / '{print $1}'' if [ "$READVIP" = "$RVIP_CHK2" ]; então LVSSRV=$LVSSRV 2 LVSBKSRV=$LVSSRV 1 else echo "'LANG=C;date': LVS read vip desconhecido 'uname -n'." \ | mail -s "NG_READ_VIP $READVIP" $MAILADDR eco 'ERRO: LVS lido vip desconhecido. ' saída 1 fi fi }

Modificar peso e correspondência para Unyou. (Informações sobre peso LVS)

mod_weight() { SSH $LVSSRV "IPvsadm -e -t $READVIP:3306 -R $DB 1 -G -W $DB 1_WEIGHT" SSH $LVSSRV "IPvsadm -E -T $READVIP:3306 -R $DB 2 -G -W $DB 2_WEIGHT" SSH $LVSSRV "ipvsadm -e -t $READVIP::006 3306 -r $DB 3 -g -w $DB 3_WEIGHT" ssh $LVSSRV "cp -p $LVS_CF{,.'date +%Y%m%d.%H%M'} \ &&\cp -pf $LVS_CF.failover $LVS_CF \ &&& service ldirectord force-reload" \ && scp -Cp $LVSSRV:$LVS_CF /tmp/ \ && scp -Cp /tmp/ldirectord.cf $LVSBKSRV:/etc/ha.d/ echo -e "'LANG=C;date'\nCurrent weights: \n\n 'ssh $LVSSRV ipvsadm -Ln'" \ | mail -s "$TITLE mysql-master Failover. modificar o peso do LVS e do bkupscript." $MAILADDR

modificar o script de backup.

#ssh $BKUPSRV "cp -p $BKUP_SH{,.'date +%Y%m%d.%H%M'} && sed -i \"s/WEIGHT=[0-9]{1,100}/WEIGHT=$BK_WEIGHT/g\" $BKUP_SH" }

principal

exec >> $MHA_LOG exec 2>&1 echo "INICIAR lvs weight modification. 'date '+%Y%m%d %T''" srv_chk mod_weight echo "END lvs weight change. 'date '+%Y%m%d %T''"

saída 0

chmod +x /usr/local/bin/mod_lvs_weight.sh

[/shell]
Script para enviar um e-mail de relatório

[shell]# vi /usr/local/bin/send_report

#!/usr/bin/perl

Nota: Este é um script de exemplo e não está completo. Modifique o script com base no seu ambiente.

usar rigoroso; usar avisos FATAL => 'todos';

usar Getopt::Long;

#new_master_host e novo_slave_hosts só são definidos quando o mestre recuperado sucede meu ($dead_master_host, $new_master_host, $new_slave_hosts, $subject, $body ); GetOptions( 'orig_master_host=s' => $dead\ _master_host, 'novo_master_host=s' => \$new_master_host, 'novo_slave_hosts=s' => \$new_slave_hosts, 'sujeito=s' => \$subject, 'corpo=s' => \$body, );

Faça o que quiser aqui

#my $vip = '/sbin/ip addr mostrar eth0'; meu $vip = '/usr/bin/ssh $new_master_host /sbin/ip addr mostrar eth0'; meu $datetime = '/bin/date +%Y%m%d_%H:%M:%S'; meu $manager_cnf='/etc/app1.cnf'; meu $manager_workdir='grep manager_workdir $manager_cnf|sed -e 's/[^=]=//g''; meu $remote_workdir='grep remote_workdir $manager_cnf|sed -e 's/[^=]=//g''; meu $sendmail = '/usr/sbin/sendmail'; # caminho de comando sendmail meu $from = 'unyou-all@isao.net'; # Do e-mail #my $to = 'komiyay@isao.co.jp'; # Endereço de e-mail meu $to = 'unyou-all@isao.net'; # Endereço de e-mail meu $cc = 'komi325_y@ezweb.ne.jp'; # CC endereço de e-mail #$subject = 'teste'; # Sujeito do e-mail #$msg = <"_TEXT_"; #="" メールの本文(ヒアドキュメントで変数に代入)="" #message="" #_text_="" #="" sendmail="" コマンド起動="" open(sdml,"|="" $sendmail="" -t="" -i")="" ||="" die="" 'sendmail="" error';="" #="" メールヘッダ出力="" print="" sdml="" "from:="" $from\n";="" print="" sdml="" "to:="" $to\n";="" print="" sdml="" "cc:="" $cc\n";="" print="" sdml="" "subject:="" $subject="" $datetime\n";="" print="" sdml="" "content-transfer-encoding:="" 7bit\n";="" print="" sdml="" "content-type:="" text/plain;charset="\"ISO-2022-JP\"\n\n";" #="" メール本文出力="" #print="" sdml="" "$msg";="" print="" sdml="" "$body";="" print="" sdml="" "\n";="" print="" sdml="" "ip="" addr="" show="" eth0:\n";="" print="" sdml="" "="" $vip";="" print="" sdml="" "\n";="" print="" sdml="" "="" manager_workdir:\n";="" print="" sdml="" /bin/ls="" -l="" $manager_workdir\n;="" print="" sdml="" "="" remote_workdir:\n";="" print="" sdml="" /bin/ls="" -l="" $remote_workdir\n;="" #="" sendmail="" コマンド閉じる="" close(sdml);="" exit="" 0;="" ------------------------------------------[/shell]="" ※tarからダウンロードしてきたものに追記。="" ※適宜、sendmailのセットアップとレポートが送付されるか動作確認する。="" ⑤="" 設定変更(ノード)="" ・sudo設定="" [shell]="" ##="" #="" visudo="" defaults="" requiretty="" ↓="" ##="" #defaults="" requiretty="" [/shell]="" ※ssh越しにsudoして以下のメッセージが出る場合の設定(master_ip_failoverスクリプトを利用する場合に必要)="" sudo:="" sorry,="" you="" must="" have="" a="" tty="" to="" run="" sudo="" ・mysql的な初期ユーザ設定(ノード側)="" rootでセグメント許可でgrantつけず(mysqlのユーザ名はrootでなくても大丈夫)="" [sql]="" #="" mysql="" -u="" root="" -p=""> CONCEDER TODOS OS PRIVILÉGIOS EM . A 'root'@'192.168.100.%' IDENTIFICADO POR '***'; selecione User,Host,Password from mysql.user; [/sql] ・Replication Building
Verifique os arquivos de log e as posições do mestre >

Mestre
[sql] RESETAR MESTRE; mostrar status mestre; [/sql] Verifique e registre o nome e posição do arquivo de log, só por precaução.

Especifique informações mestres no servidor escravo e inicie a replicação
Escravo
[sql] RESETAR MESTRE; mostrar status mestre; MUDAR MESTRE PARA MESTRE_HOST='Endereço IP do Mestre', MESTRE_USER='repl', MESTRE_PASSWORD='**', MESTRE_LOG_FILE='mysql-bin.000001', MESTRE_LOG_POS=106; INICIAR SLAVE; mostrar status do escravo\G definido global de leitura_only=1; mostrar variáveis globais como 'read_only'; [/sql] resetar mestre se estiver no estado padrão; resetar o escravo; Tudo o que você precisa fazer é corresponder à posição.
Se você tiver dados, registre a posição no master, recupere e transfira os dados com o mysqldump, insira os dados no mysql, compare as posições e inicie o slave.
Regras de filtragem como Replicar_Ignore_DB devem ser comuns

・Configurações de comutação de log de relé
purge_relay_logs é um comando complementar à configuração que impede o conjunto de log de relé no nó quando o MHA é introduzido.
Quando o mestre é comutado, o log de relé é usado para compensar a diferença com o mestre, então não o exclua porque é necessário.
[shell]

mysql -u root -p'cat /path_to_file'

definir relé global_log_purge=0; mostrar variáveis globais como 'relé_log%';

ls -l /var/lib/mysql/mysqld-relay-bin.*

/usr/bin/perl /usr/bin/purge_relay_logs --user=root --password='cat /path_to_file' --disable_relay_log_purge >> /var/log/masterha/purge_relay_logs.log 2>&1

ls -l /var/lib/mysql/mysqld-relay-bin.*

cauda /var/tronco/masterha/purga_relay_logs.log

crontab -e

----------slave1---------- 30 2,4,6,10,14,16 * * * /usr/bin/perl /usr/bin/purge_relay_logs --user=root --password='cat /path_to_file' --disable_relay_log_purge >> /var/log/masterha/purge_relay_logs.log 2>&1 ----------slave2----------

30 3,5,9,11,15,17 * * * /usr/bin/perl /usr/bin/purge_relay_logs --user=root --password='cat /path_to_file' --disable_relay_log_purge >> /var/log/masterha/purge_relay_logs.log 2>&1

[/shell] *Recomenda-se chamar cron em diferentes momentos entre os escravos. (Se todos os escravos iniciarem a purga_relay_logs ao mesmo tempo, nenhum dos escravos pode ter os eventos de log de retransmissão necessários em caso de travamento.) )
*Cuidado para não sobrepor com outros lotes agregados. (Em termos de carga)
Se o registro de relés se acumular demais e causar problemas, ele deve ser implementado a cada hora.
*No caso de uma operação que não retorne o mestre, é recomendável registrar o mestre em estado de comentário e em um momento escalonado.
*Se você estiver montado em um ioDrive e não puder vincular diretamente ao /var/tmp, precisa especificar o diretório que está montando com a opção –workdir.

purge_relay_logs Para mais informações sobre opções e especificações de comando, consulte aqui.

Especificações do Registro de Relé
http://dev.mysql.com/doc/refman/5.1/ja/slave-logs-relaylog.htmlhttp://open-groove.net/mysql/binlog-relay-log/

Em seguida, vem o teste de comutação.

・URL de referência
mha-for-mysqldenaMHA para MySQL: Mestre em Gerenciador de Alta Disponibilidade e ferramentas para MySQLIntrodução do MySQL-MHA As considerações ao aplicar o MySQL-MHA ao seu próprio ambiente Tente MySQL-MHA Tenta alcançar o failover automático do MySQL usando MySQL-MHAT A comparação entre a operação MySQL da DeNA e o Amazon RDS na Conferência de Tecnologia NHN. Tentei adicionar o MySQL-mha! Parte 2MHA, Murakumo & Meatomd / master_ip_failoverReplicação de MySQL por failover com MHA e HAProxy Vamos usar MySQL redundante com MHA + HAProxy

</"_TEXT_";>

</"_TEXT_";>

Related Articles