記事ディレクトリ
1. MHA理論
1.1 MHAとは
MHA (MasterHigh Availability) は、MySQL 高可用性環境におけるフェイルオーバーおよびマスター/スレーブ レプリケーションのための優れたソフトウェア セットです。
MHA の登場は、MySQL の単一点の問題を解決することです。
MySQL フェイルオーバー プロセス中、MHA は 0 ~ 30 秒以内にフェイルオーバー操作を自動的に完了します。
MHA は、フェイルオーバー プロセス中にデータの一貫性を最大限に確保し、本当の意味での高可用性を実現します。
1.2 MHAの構成
-
MHA ノード (データ ノード)
MHA ノードは各 MySQL サーバー上で実行されます。 -
MHA マネージャー (管理ノード)
MHA マネージャーは、複数のマスター/スレーブ クラスターを管理するために独立したマシンに展開できます。また、スレーブ ノードに展開することもできます。
MHA マネージャーは定期的にクラスター内のマスター ノードを検出します。マスターに障害が発生すると、最新のデータを持つスレーブが新しいマスターとして自動的に昇格し、他のすべてのスレーブが新しいマスターを再び指すようになります。フェイルオーバー プロセス全体は、アプリケーションに対して完全に透過的です。
1.3 MHAの特徴
- 自動フェイルオーバー プロセス中に、MHA はデータが最大限失われないように、ダウンタイム マスター サーバーからバイナリ ログを保存しようとします。
- 半同期レプリケーションを使用すると、データ損失のリスクを大幅に軽減できます。1 つのスレーブのみが最新のバイナリ ログを受信した場合、MHA は最新のバイナリ ログを他のすべてのスレーブ サーバーに適用できるため、すべてのノードのデータの一貫性が確保されます。
- 現在、MHA は 1 つのマスターと複数のスレーブのアーキテクチャ、少なくとも 3 つのサーバー、つまり 1 つのマスターと 2 つのスレーブをサポートしています。
2. MHA の 1 つのマスターと 2 つのスレーブの展開
実験計画
満たされた要件: 1 つのマスターと 2 つのスレーブを備えた高可用性読み取り/書き込みレプリケーション mysql クラスターを構築します。マスター サーバーがダウンすると、最新のデータを持つスレーブ サーバーがマスター サーバーに代わって VIP を占有し、正常な動作を保証します。
実験的なコンポーネント:
ノードサーバー | システム | CPU名 | IPアドレス | インストールツールとサービス |
---|---|---|---|---|
MHAマネージャーサーバー | CentOS7.9(64ビット) | マネジャー | 192.168.44.100 | MHA ノードとマネージャーのコンポーネント |
マスターサーバー | CentOS7.9(64ビット) | mysql1 | 192.168.44.101 | MHA ノードのコンポーネント |
スレーブ1サーバー | CentOS7.9(64ビット) | mysql2 | 192.168.44.102 | MHA ノードのコンポーネント |
スレーブ2サーバー | CentOS7.9(64ビット) | mysql3 | 192.168.44.103 | MHA ノードのコンポーネント |
VIPアドレス: 192.168.44.150 |
1.時刻同期
マスターサーバーとスレーブサーバーで時刻同期を行います(オンライン時刻同期)
2. マスター、スレーブ 1、スレーブ 2、およびマネージャー ノードのホスト名を変更します。
hostnamectl set-hostname mysql1
hostnamectl set-hostname mysql2
hostnamectl set-hostname mysql3
hostnamectl set-hostname manager
3. すべてのサーバーのファイアウォールをオフにし、マスター サーバーとスレーブ サーバーのホスト ファイルを変更します。
4. マスター、スレーブ 1、およびスレーブ 2 ノードの Mysql マスター設定ファイル /etc/my.cnf を変更します。
##Master 节点##
vim /etc/my.cnf
[mysqld]
server-id = 1
log_bin = mysql-bin
binlog_format = mixed
log-slave-updates = true
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
systemctl restart mysqld
##Slave1、Slave2 节点##
vim /etc/my.cnf
server-id = 2 #三台服务器的 server-id 不能一样
log_bin = mysql-bin
binlog_format = mixed
log-slave-updates = true
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
systemctl restart mysqld
5. マスター、スレーブ 1、およびスレーブ 2 ノードに 2 つのソフト リンクを作成します。
ln -s /usr/local/mysql/bin/mysql /usr/sbin/
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/
6. mysql、1 つのマスターと 2 つのスレーブを構成します
(1) すべてのデータベース ノードが mysql を認可します
mysql -uroot -p
give replication smile on . to 'myslave'@'192.168.80.%'identified by '123'; #Synchronous use fromデータベースは.
に対するすべての権限を'mha123' で識別される 'manager'@'192.168.80.%' に付与します; #manager use
.のすべての権限を'mha123 'で識別される 'manager'@'mysql1' に付与します; #スレーブ ライブラリがホスト名を介してメイン ライブラリに接続できないことを防止します.
のすべての権限を付与します.のすべての権限を'manager に付与します'@'mysql3' は 'mha123' によって識別され、フラッシュ権限。
(2) マスターノード上のバイナリファイルと同期ポイントを表示する
show master status;
(3) Slave1 ノードと Slave2 ノードで同期操作を実行します。
change master to master_host='192.168.44.100',master_user='myslave',master_password='123',master_log_file='mysql-bin.000002',master_log_pos=1761;
start slave;
(4) 2 つのスレーブ ライブラリを読み取り専用モードに設定する必要があります。
set global read_only=1;
7. MHA ソフトウェアのインストール
(1) すべてのサーバーに MHA 依存環境をインストールします。まず、epel ソースをインストールします。
yum install epel-release --nogpgcheck -y
yum install -y perl-DBD-MySQL \
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPAN
(2) MHA ソフトウェア パッケージをインストールするには、まずノード コンポーネントをすべてのサーバーにインストールする必要があります
。オペレーティング システムのバージョンごとに異なります。ここでは、CentOS7.4 ではバージョン 0.57 を選択する必要があります。
マネージャーはノード コンポーネントに依存するため、最初にノード コンポーネントをすべてのサーバーにインストールし、最後にマネージャー コンポーネントを MHA マネージャー ノードにインストールする必要があります。
cd /opt
tar zxvf mha4mysql-node-0.57.tar.gz
cd mha4mysql-node-0.57
perl Makefile.PL
make && make install
(3) MHAマネージャノードにマネージャコンポーネントをインストールする
cd /opt
tar zxvf mha4mysql-manager-0.57.tar.gz
cd mha4mysql-manager-0.57
perl Makefile.PL
make && make install
#manager コンポーネントがインストールされると、主に次のようないくつかのツールが /usr/local/bin に生成されます。
masterha_check_ssh MHA の SSH 構成ステータスをチェック
masterha_check_repl MySQL レプリケーション ステータスを
チェック masterha_manger マネージャ スクリプトを開始
masterha_check_status 現在実行中の MHA をチェックステータス
masterha_master_monitor 検出 マスターがダウンしているかどうか
masterha_master_switch フェイルオーバーの制御 (自動または手動)
masterha_conf_host 構成されたサーバー情報の追加または削除
masterha_stop マネージャー
#node を閉じる コンポーネントがインストールされると、いくつかのスクリプトが /usr/local/bin の下に生成されます (これらのツールは通常、MHAManager によって提供されます。このスクリプトは、手動操作なしで主に次のようにトリガーされます:
save_binary_logs マスターのバイナリ ログを保存およびコピーします
apply_diff_relay_logs 差分リレー ログ イベントを特定し、差分イベントを他のスレーブに適用します
filter_mysqlbinlog 不要な ROLLBACK イベントを削除します (MHA はこのツールを使用しなくなりました)
purge_relay_logs リレー ログをパージします (SQL スレッドをブロックしません)。
8. 全サーバにパスワードレス認証を設定する
(1) マネージャーノードのすべてのデータベースノードにパスワードレス認証を設定する
ssh-keygen -t rsa #一路按回车键
yum -y install sshpass #安装工具
ssh-copy-id 192.168.44.101
ssh-copy-id 192.168.44.102
ssh-copy-id 192.168.44.103
/etc/ssh/ssh_conf ファイルを変更します。
/etc/ssh/ssh_conf ファイルを変更します。
(2) mysql1 上のデータベース ノード mysql2 および mysql3 へのパスワードレス認証を構成します。
ssh-keygen -t rsa
ssh-copy-id 192.168.44.102
ssh-copy-id 192.168.44.103
(3) mysql2 上のデータベース ノード mysql1 および mysql3 へのパスワードレス認証を構成します。
ssh-keygen -t rsa
ssh-copy-id 192.168.44.101
ssh-copy-id 192.168.44.103
(4) mysql3 上のデータベース ノード mysql1 および mysql2 へのパスワードレス認証を構成します。
ssh-keygen -t rsa
ssh-copy-id 192.168.44.101
ssh-copy-id 192.168.44.102
9. マネージャーノードでのMHAの構成
(1) 該当するスクリプトをマネージャーノードの/usr/local/binディレクトリにコピーします。
cp -rp /opt/mha4mysql-manager-0.57/samples/scripts /usr/local/bin
//拷贝后会有四个执行文件
ll /usr/local/bin/scripts/
master_ip_failover #自動切り替え時のVIP管理のスクリプト
master_ip_online_change #オンライン切り替え時のVIPの管理
power_manager #障害発生後にホストをシャットダウンするスクリプト
send_report #フェイルオーバー後にアラームを送信するスクリプト
(2) 自動切り替え中の上記の VIP 管理スクリプトを /usr/local/bin ディレクトリにコピーします。ここで、master_ip_failover スクリプトが VIP とフェイルオーバーの管理に使用されます。
cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin
(3) 変更された内容は次のとおりです: (元の内容を削除し、vip 関連のパラメーターを直接コピーして変更します。vim が順番どおりに貼り付けられない問題を解決するには、コピーする前に set past を入力できます) vim /usr/local/
bin /master_ip_failover
#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';
use Getopt::Long;
my (
$command, $orig_master_host, $orig_master_ip,$ssh_user,
$orig_master_port, $new_master_host, $new_master_ip,$new_master_port,
$orig_master_ssh_port,$new_master_ssh_port,$new_master_user,$new_master_password
);
# 这里定义的虚拟IP配置要注意,这个ip必须要与你自己的集群在同一个网段,否则无效
my $vip = '192.168.44.150/24';
my $key = '1';
# 这里的网卡名称 “ens33” 需要根据你机器的网卡名称进行修改
# 如果多台机器直接的网卡名称不统一,有两种方式,一个是改脚本,二是把网卡名称修改成统一
# 我这边实际情况是修改成统一的网卡名称
my $ssh_start_vip = "sudo /sbin/ifconfig ens33:$key $vip";
my $ssh_stop_vip = "sudo /sbin/ifconfig ens33:$key down";
my $ssh_Bcast_arp= "sudo /sbin/arping -I ens33 -c 3 -A $vip";
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,
'orig_master_ssh_port=i' => \$orig_master_ssh_port,
'new_master_host=s' => \$new_master_host,
'new_master_ip=s' => \$new_master_ip,
'new_master_port=i' => \$new_master_port,
'new_master_ssh_port' => \$new_master_ssh_port,
'new_master_user' => \$new_master_user,
'new_master_password' => \$new_master_password
);
exit &main();
sub main {
$ssh_user = defined $ssh_user ? $ssh_user : 'root';
print "\n\nIN SCRIPT TEST====$ssh_user|$ssh_stop_vip==$ssh_user|$ssh_start_vip===\n\n";
if ( $command eq "stop" || $command eq "stopssh" ) {
my $exit_code = 1;
eval {
print "Disabling the VIP on old master: $orig_master_host \n";
&stop_vip();
$exit_code = 0;
};
if ($@) {
warn "Got Error: $@\n";
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "start" ) {
my $exit_code = 10;
eval {
print "Enabling the VIP - $vip on the new master - $new_master_host \n";
&start_vip();
&start_arp();
$exit_code = 0;
};
if ($@) {
warn $@;
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "status" ) {
print "Checking the Status of the script.. OK \n";
exit 0;
}
else {
&usage();
exit 1;
}
}
sub start_vip() {
`ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
sub stop_vip() {
`ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}
sub start_arp() {
`ssh $ssh_user\@$new_master_host \" $ssh_Bcast_arp \"`;
}
sub usage {
print
"Usage: master_ip_failover --command=start|stop|stopssh|status --ssh_user=user --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n";
}
(4) MHA ソフトウェア ディレクトリを作成し、設定ファイルをコピーします。ここでは、mysql ノード サーバーを管理するために app1.cnf 設定ファイルを使用します。
マネージャーサーバーで作成される
mkdir -p /opt/mysql-mha/mha
すべてのサーバーで作成される
mkdir -p /opt/mysql-mha/mha-node
マネージャーサーバーにファイルを作成します
vim /opt/mysql-mha/mysql-mha.cnf
[server default]
manager_log=/opt/mysql-mha/manager.log
manager_workdir=/opt/mysql-mha/mha
master_binlog_dir=/usr/local/mysql/data
master_ip_failover_script=/usr/local/bin/master_ip_failover
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
user=manager
password=mha123
port=3306
ping_interval=1
remote_workdir=/opt/mysql-mha/mha-node
repl_user=myslave
repl_password=123456
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.44.102 -s 192.168.44.103
shutdown_script=""
ssh_user=root
[server1]
hostname=192.168.44.101
port=3306
[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.44.102
port=3306
[server3]
hostname=192.168.44.103
port=3306
[サーバーのデフォルト]
manager_log=/opt/mysql-mha/manager.log #マネージャーのログパスを指定します
manager_workdir=/opt/mysql-mha/mha #マネージャーの作業ディレクトリを指定します
master_binlog_dir=/usr/local/mysql/data #指定します保存するマスター バイナリログの場所。ここでのパスは、MHA
が master_ip_failover_script=/usr/local/bin/master_ip_failover を見つけられるように、マスタに設定されているバイナリログのパスと一致している必要があります。 #自動フェイルオーバー用のスイッチング スクリプトの設定これは上記のスクリプトです
master_ip_online_change_script=/ usr/local/bin/master_ip_online_change #手動切り替え用の切り替えスクリプトを設定します
user=manager #データベースにアクセスするための mha のアカウント パスワードを設定しますpassword
=mha123 #アクセスするための mha のアカウント パスワードを設定しますデータベース
ping_interval=1 #メイン ライブラリを監視して ping パケットを送信する時間を設定します。間隔、デフォルトは 3 秒で、3 回試行しても応答がない場合はフェイルオーバーが自動的に実行されます。remote_workdir=/opt/mysql-mha/
mha -node #リモート ノード上の mha の作業ディレクトリを指定します。
repl_user=myslave #マスター/スレーブ レプリケーションのユーザーを設定します。
repl_password= 123456 #マスター/スレーブ レプリケーションのユーザー パスワードを設定します。
report_script=/usr/local/send_report #フェイルオーバー発生時のリマインダーメール送信設定Secondary_check_script
=/usr/local/bin/masterha_secondary_check -s 192.168.44.102 -s 192.168.44.103 #チェックするスレーブサーバーのIPアドレスを指定
shutdown_script= "" #障害発生後に障害が発生したホストを閉じるようにスクリプトを設定します (スクリプトの主な機能はスプリット ブレインを防ぐためにホストをシャットダウンすることですが、ここでは使用しません) ssh_user=root #ssh のログイン ユーザー名を設定し
ます
[server1]
hostname=192.168.44.101
port=3306
[server2 ]
hostname=192.168.44.102
port=3306candidate_master
=1
#マスター候補として設定 このパラメータを設定すると、スレーブ ライブラリはマスター ライブラリの後にマスター ライブラリに昇格しますスレーブ ライブラリがクラスター内の最新のスレーブでない場合でも、スレーブ切り替えが発生します。
check_repl_lay =0
# デフォルトでは、スレーブがマスターより 100M リレー ログ以上遅れている場合、MHA はスレーブを新しいマスターとして選択しません。スレーブの復元には長い時間がかかるため、check_repl_lay=0 を設定すると、MHA トリガー スイッチオーバーは、新しいマスターを選択するときにレプリケーション遅延を無視します。このパラメーターは、候補マスターがスイッチオーバープロセス中の新しいマスター
[サーバー3]
ホスト名=192.168.44.103
ポート=3306
10.メインサーバーにvipを追加します
ifconfig ens33:1 192.168.44.150/24
11、10。マネージャーノードでsshパスワードレス認証をテストし、正常であれば最終的には以下のように正常に出力されます。
masterha_check_ssh -conf=/opt/mysql-mha/mysql-mha.cnf
12. マネージャー ノードで mysql のマスター/スレーブ接続をテストします。最後に「MySQL Replication Health is OK」というメッセージが表示され、正常であることを示します。次のように。
masterha_check_repl -conf=/opt/mysql-mha/mysql-mha.cnf
13、12。マネージャーノードでMHAを開始します。
nohup masterha_manager \
--conf=/opt/mysql-mha/mysql-mha.cnf \
--remove_dead_master_conf \
--ignore_last_failover < /dev/null > /var/log/mha_manager.log 2>&1 &
–remove_dead_master_conf: このパラメータは、マスター/スレーブの切り替えが発生したときに、古いマスター ライブラリの IP が設定ファイルから削除されることを意味します。
–ignore_last_failover: デフォルトでは、MHA が連続的なダウンタイムを検出し、2 つのダウンタイムの間隔が 8 時間未満の場合、フェールオーバーは実行されません。この制限の理由は、ピンポン効果を回避するためです。このパラメータは、最後の MHA トリガー スイッチオーバーによって生成されたファイルを無視することを意味します。デフォルトでは、MHA スイッチオーバー後、app1.failover.complete ログ ファイルに記録されます。次回スイッチオーバーが発生したときにファイルがディレクトリに存在する場合、最初のスイッチオーバー後にファイルが削除されない限り、トリガースイッチオーバーは許可されません。便宜上、ここでは –ignore_last_failover に設定されています。
●バックグラウンドでプログラムを使用および実行します。結果は端末に出力されます。Ctrl+C を使用して SIGINT シグナルを送信すると、プログラムは影響を受けません。セッションを閉じて SIGHUP シグナルを送信すると、プログラムは閉じられます。
●nohup を使用してプログラムを実行します。結果はデフォルトで nohup.out に出力されます。Ctrl+C を使用して SIGINT シグナルを送信すると、プログラムが閉じられます。セッションを閉じて SIGHUP シグナルを送信すると、プログラムは影響を受けなくなります。
● nohup と & を使用してプログラムを開始します。 nohup ./test &: SIGINT 信号と SIGHUP 信号の影響を同時に受けません。
14. MHA ステータスを確認すると、現在のマスターが mysql1 ノードであることがわかります。
masterha_check_status --conf=/opt/mysql-mha/mysql_mha.cnf
15. MHA ログを確認すると、以下に示すように、現在のマスターが 192.168.80.10 であることがわかります。
cat /opt/mysql-mha/manager.log | grep "current master"
16. mysql1 の VIP アドレス 192.168.80.200 が存在するか確認します この VIP アドレスはマネージャーノードが MHA サービスを停止しているため消えません。
ifconfig
//マネージャー サービスを閉じるには、次のコマンドを使用できます。
masterha_stop --conf=/opt/mysql-mha/mysql_mha.cnf
または、プロセス ID を強制終了して直接閉じることもできます。
故障シミュレーション
1. マネージャーノード上のログレコードを監視および観察します。
2. マスターノード mysql1 上の mysql サービスを停止します。
systemctl stop mysqld
マネージャーのログ:
スレーブ1:
スレーブ2:
#通常の自動切り替え後、MHA プロセスは終了します。HMA は、app1.cnf ファイルの内容を自動的に変更し、ダウンタイムの mysql1 ノードを削除します。
mysql2 が VIP ifconfig
フェイルオーバー代替マスター データベースのアルゴリズムを引き継ぐかどうかを確認します
。 1.通常、スレーブライブラリは(位置/GTID)で良否を判断し、データが異なっており、マスターに最も近いスレーブがマスター候補となります。
2. データに一貫性がある場合は、構成ファイルの順序に従って代替のメイン ライブラリを選択します。
3. 重みを設定すると (candidate_master=1)、重みに従って候補マスターが強制的に指定されます。
(1) デフォルトでは、スレーブがマスターのリレーログより 100M 遅れている場合、たとえ重みがあっても失敗します。
(2) check_repl_delay=0 の場合、ログが滞っていても強制的にバックアップマスタとして選択されます。
/opt/mysql-mha/mysql-mha.cnf ファイルを表示する
トラブルシューティングの手順:
1. mysql
systemctlを修復してmysqldを再起動します
2. マスター/スレーブを修復します# バイナリ ファイルと同期ポイントを表示します
。 現在のマスター ライブラリ サーバーの
マスター ステータスを表示しますmysql2 ;
#元のマスター データベース サーバーで同期操作を実行します mysql1
マスターを master_host='192.168.44.101', master_user='myslave', master_password='123456', master_log_file='mysql-bin.000001', master_log_pos=2647; に変更します。
スレーブを開始します。