1. MHA 関連の知識
1.1 MHA とは
MHA (MasterHigh Availability) は、MySQL 高可用性環境におけるフェイルオーバーおよびマスター/スレーブ レプリケーションのための優れたソフトウェア セットです。
MHA の登場は、MySQL の単一障害点の問題を解決することです。
MySQL フェイルオーバー プロセス中、MHA は 0 ~ 30 秒以内にフェイルオーバー操作を自動的に完了します。
MHA は、フェイルオーバー プロセス中にデータの一貫性を最大限に確保し、本当の意味での高可用性を実現します。
1.2 MHAの構成
1) MHAノード(データノード)
MHA ノードは各 MySQL サーバー上で実行されます。
2) MHAマネージャー(管理ノード)
MHA マネージャーは、複数のマスター/スレーブ クラスターを管理するために独立したマシンに展開できます。また、スレーブ ノードに展開することもできます。
MHA マネージャーは定期的にクラスター内のマスター ノードを検出します。マスターに障害が発生すると、最新のデータを持つスレーブが新しいマスターとして自動的に昇格し、他のすべてのスレーブが新しいマスターを再び指すようになります。フェイルオーバー プロセス全体は、アプリケーションに対して完全に透過的です。
MHA の動作原理は次のように要約されます。
MHA マネージャーはクラスター内のマスター ノードを定期的に検出します。
マスターに障害が発生した場合、クラッシュしたマスターからバイナリ ログ イベント (binlog イベント) を保存します。
最新のアップデートを適用したスレーブを識別します。
差動リレーログを他のスレーブに適用します。
マスターから保存されたバイナリ ログ イベント (binlog イベント) を適用します。
スレーブを新しいマスターに昇格させ、他のスレーブをレプリケーションのために新しいマスターに接続させます。
1.3 MHA の機能
自動フェイルオーバーのプロセスで、MHA はデータが最大限失われないように、ダウンタイム マスター サーバーからバイナリ ログを保存しようとします。
半同期レプリケーションを使用すると、データ損失のリスクを大幅に軽減できます。1 つのスレーブのみが最新のバイナリ ログを受信した場合、MHA は最新のバイナリ ログを他のすべてのスレーブ サーバーに適用できるため、すべてのノードのデータの一貫性が保証されます。
現在、MHA は、少なくとも 3 つのサーバー、つまり 1 つのマスターと 2 つのスレーブを備えた 1 つのマスターと複数のスレーブのアーキテクチャをサポートしています。
2. MHA の 1 マスター 2 スレーブ展開
実験設計は
要件を満たしています: 1 つのマスターと 2 つのスレーブを備えた可用性の高い読み書きレプリケーション mysql クラスターを構築します。マスター サーバーがダウンすると、最も完全なデータ更新を持つスレーブ サーバーが配置されます。はマスターサーバーを置き換えて VIP を占有し、通常の動作を保証します。
実験用コンポーネント
実験固有の操作
ステップ 1: マスター/スレーブ レプリケーションの構成
(1) mysql ノード サーバーのホスト名を変更します
##マスター ノード ##
hostnamectl set-hostname mysql1
su
##
Slave1 ノード ##
hostnamectl set-hostname mysql2
su
##
Slave2 ノード ##
hostnamectl set-hostname mysql3
su
##manager##
hostnamectl set-hostname manager
su
(2) マスターとスレーブの mysql マッピング関係を追加し
、3 つのホストをすべて追加します。
vim /etc/hosts
192.168.73.105 mysql1
192.168.73.106 mysql2
192.168.73.107 mysql3
(3) メインの Mysql 設定ファイル /etc/my.cnf を変更します
。 注:
マスターノード、バイナリログを開きます。
Slave1、Slave2 ノードでは、バイナリ ログとリレー ログを開きます。
##マスターノード##
vim /etc/my.cnf
[mysqld]
server-id = 1
log-bin = master-bin #バイナリログを開き、保存場所を指定します
log-slave-updates = true
#データをコピーするときにスレーブが自分自身に書き込むことを許可しますマスターから
systemctl
のバイナリ ログで restart mysqld #restart mysql
##
Slave1 node##
vim /etc/my.cnf
[mysqld]
server-id = 2 #3 つのサーバーのサーバー ID を同じにすることはできません
log-bin = master-bin
リレーログ = リレーログビン
リレーログインデックス =スレーブリレー -bin.index
systemctl
restart mysqld
##
スレーブ 2 ノード##
vim /etc/my.cnf
[mysqld]
server-id = 3 #3 つのサーバーのサーバー ID を同じにすることはできません
log-bin = master-bin
リレーログ = リレーログビン
リレーログインデックス = 3 つの mysql ノード サーバーが すべて
作成されます。
* 「manager」によって識別された「mha」@「mysql2」へ; *.* に対するすべての権限を「manager」によって識別される「mha」@「mysql3」に付与します。
フラッシュ
権限; #リフレッシュ権限
(6) マスター/スレーブ同期の構成
マスター ノードでバイナリ ファイルと同期ポイント (オフセット) を表示し、スレーブ 1 ノードとスレーブ 2 ノードで同期操作を実行します。
##(1) マスター ノード上のバイナリ ファイルと同期ポイント (つまり、オフセット) を表示します
。 ## show master status;
#「Slave_IO_Running: No」の考えられる一般的な理由:
1. ネットワークに到達できない
2. my.cnf 構成に問題がある (server-id が繰り返される)
3. パスワード、ファイル名、および pos オフセットが間違っている
4.ファイアウォールが閉じられていない
##Slave1 ノードと Slave2 ノードで同期操作を実行します##
マスターを master_host='192.168.73.105', master_user='myslave', master_password='123123',
master_log_file='master-bin.000006', master_log_pos=154
;
start に変更しますスレーブ; #同期を開始します。エラーがある場合は、リセット スレーブを実行します。
##
スレーブ 1 とスレーブ 2 でノードのステータスを確認します##
スレーブのステータスを表示\G
##2 つのスレーブ ライブラリは読み取り専用モードに設定する必要があります##
set global read_only=1;
##
マスター メイン ライブラリにデータを挿入し、データベース同期をテストします##
mysql> use db_test
mysql> create table info(id int ,name char (10));
mysql> insert into infovalues(1,'mysql1's data'); #データベースから同期が成功したかどうかを確認する
ステップ 2: MHA を構成する 注: ここでの epel ソースのインストールは、からインストールすることはできません。ローカル ソース。centos7 のローカル ソースは利用できないため、インストールするにはオンライン ソースに変更する必要があります。
1) すべてのサーバーに MHA ソフトウェアをインストールします
## (1) すべてのサーバーに MHA 依存環境をインストールします。最初に epel ソースをインストールします ##
yum install epel-release --nogpgcheck -y #MHA 依存環境を
インストールします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 パッケージをインストールするには、最初にすべてのサーバーにノード コンポーネントをインストールする必要があります ## #インストール パッケージを /opt/ ディレクトリにアップロードし、解凍してノード コンポーネントをインストールします## 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 スレッドをブロックしません)
(2) すべてのサーバにパスワードレス認証を設定する
## (1) マネージャノードのすべてのデータベースノードにパスワードレス認証を設定する
ssh-keygen -t rsa # Enter キーを全押ししてキーを生成します。「-t rsa」はキーの種類を指定します。
ssh-copy-id 192.168.73.105 #すべてのデータベースノードに公開鍵を渡し、ログインするためのパスワード不要の接続を形成します
ssh-copy-id 192.168.73.106
ssh-copy-id 192.168.73.107
##
(2)設定mysql1 でのデータベース ノード mysql2 および mysql3 のパスワードレス認証
ssh-keygen -t rsa ssh-copy-id 192.168.73.106 #公開キーを 2 つのスレーブ ノードに 渡して、ssh-copy-id 192.168 に
ログインするためのパスワードなしの接続を形成します。
73.107
##
(3) mysql2 でデータベース ノード mysql1 および mysql3 へのパスワードレス認証を設定します。
ssh-keygen -t rsa
ssh-copy-id 192.168.73.105
ssh-copy-id 192.168.73.107
##
(4) mysql3 で次のように設定します。データベースノード mysql1 および mysql2 のパスワードレス認証
ssh-keygen -t rsa
ssh コピー ID 192.168.73.105
ssh コピー ID 192.168.73.106
(3) マネージャーノードで MHA を設定します
## (1) 関連するスクリプトをマネージャーノードの /usr/local/bin ディレクトリにコピーします。 cp
-rp /opt/mha4mysql-manager-0.57/samples/scripts /usr/local /bin
#コピー後、実行ファイルは4つになります
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 関連のパラメータを直接コピーして変更します。次のように入力できます: set pastコピーする前に解決 vim ペースト順不同) vim /usr/local/bin/master_ip_failover #!/usr/bin/env perl use strict; use warnings FATAL => 'all'; use Getopt::Long; my ( $コマンド、$ssh_user、$orig_master_host、$orig_master_ip、 $orig_master_port、$new_master_host、$new_master_ip、$new_master_port ); ######################### ## ## コンテンツセクションを追加 ########################################## 私の$vip = '192.168.73.66'; #vipのアドレスを指定
my $brdc = '192.168.73.255'; #vip のブロードキャスト アドレスを指定します
my $ifdev = 'ens33'; #vip にバインドされているネットワーク カードを指定します
my $key = '1'; #仮想ネットワークのシリアル番号を指定しますvip にバインドされたカード
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip"; #この変数の値を表します ifconfig ens33:1 192.168.72.100 my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down
" ; #この変数の値を表します For ifconfig ens33:1 192.168.72.100 down
my $exit_code = 0; #終了ステータス コードを 0 として指定
#my $ssh_start_vip = "/usr/sbin/ip addr add $vip/24 brd $ brdc dev $ifdev label $ifdev: $key;/usr/sbin/arping -q -A -c 1 -I $ifdev $vip;iptables -F;"; #my $ssh_stop_vip = "/usr/sbin/ip
addrデル $vip/24 dev $ifdev ラベル $ifdev:$キー";
################################################ ##############################
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,
);
exit
&main();
sub
main { print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n"; if ( $command eq "stop" | | $command eq "stopssh" ) {
私の$exit_code = 1;
eval { print "古いマスターで VIP を無効にしています: $orig_master_host \n"; &stop_vip(); $exit_code = 0; }; if ($@) { warn "エラーが発生しました:
print "スクリプトのステータスを確認しています。OK \n";
0番出口;
}
else { &usage(); 1番出口。 sub start_vip() { `ssh $ssh_user@ $ new_master_host " $ssh_start_vip "`; } ## old_master サブの VIP を無効にする単純なシステム コール stop_vip() { `ssh $ssh_user@$orig_master_host " $ssh_stop_vip "`; } sub 使用法 { print "使用法: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=ポート\n"; }
(4) マネージャーノードは設定ファイルを編集し、mysql ノードサーバーを管理します。
mkdir /etc/masterha
cp /opt/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha/ #copy 設定ファイル
vim
/ etc/masterha /app1.cnf #元のコンテンツを削除し、ノード サーバーの IP アドレスを直接コピーして変更します
[サーバーのデフォルト]
manager_log=/var/log/masterha/app1/manager.log
manager_workdir=/var/log/masterha /app1
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=mha
passwd=manager
ping_interval=1
Remote_workdir=/tmp
repl_password=123123
repl_user=ミスル・アベニュー
Secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.73.106
-s 192.168.73.107
shutdown_script=""
ssh_user=root
user=mha
[
server1]
hostname=192.168.73.105
port=3306
[
server2]
Candidate_master=1
check_repl_delay =0
ホスト名=192.168.73.106
ポート=3306
[
サーバー3]
ホスト名=192.168.73.107
ポート=3306
[サーバーのデフォルト]
manager_log=/var/log/masterha/app1/manager.log #manager ログ manager_workdir
=/var/log/masterha/app1 #manager 作業ディレクトリ
master_binlog_dir=/usr/local/mysql/data/ #master save binlog MHA が master_ip_failover_script
=/usr/local/bin/master_ip_failover #自動フェイルオーバーが設定されている場合の切り替えスクリプトを設定します。これは、 master_ip_online_change_script=
上のスクリプトです。
/usr /local/bin/master_ip_online_change
#手動切り替え用の切り替えスクリプトを設定します
user=mha #マネージャーを認可するときに作成されるユーザーである mysql ユーザーを設定します
password=manager #mysql ユーザーのパスワードを設定します。前の記事で監視ユーザーを作成します
ping_interval=1
#メイン ライブラリを監視して ping パケットを送信する時間間隔を設定します。デフォルトは 3 秒で、3 回試行しても応答がない場合は自動的にフェイルオーバーが実行されます。remote_workdir=/tmp
#リモート mysql が切り替わるときの binlog ストレージの場所を設定します
repl_password=123123 #複製されたユーザーのパスワードを設定します (マスター/スレーブ同期認証中に作成されたユーザーとパスワード) repl_user=myslave #
複製されたユーザーのユーザーを設定します
report_script=/usr/local/send_report #スクリプトを設定します切り替えが発生した後に送信されるアラーム
Secondary_check_script= /usr/local/bin/masterha_secondary_check -s 192.168.73.106 -s 192.168.73.107 #チェックするスレーブ サーバーの IP アドレスを指定します
shutdown_script="" #障害が発生したサーバーをシャットダウンするスクリプトを設定します障害発生後のホスト (このスクリプトの主な機能は、障害の発生を防ぐためにホストをシャットダウンすることです。 スプリット ブレイン、ここでは使用しません。システムに付属の power_manager を使用できます) ssh_user=root #ssh のログイン ユーザー名を設定し
ます
[
server1] #master
hostname=192.168.73.105
port=3306
[
server2] #slave1
hostname=192.168.73.106
port=
3306candidate_master=1 #
候補マスターとして設定 このパラメータを設定すると、スレーブ ライブラリはスレーブ ライブラリがクラスタ内の最新の
スレーブ
check_repl_delay=0
#デフォルトでは、スレーブがマスターより100Mリレーログ以上遅れている場合、スレーブの復元に時間がかかるため、MHAはスレーブを新しいマスターとして選択しません。切り替えをトリガーし、新しいマスターを選択するときにレプリケーション遅延を無視します。切り替えプロセス中にマスター候補が新しいマスターになる必要があるため、このパラメーターは、candidate_master=1 のホストに非常に役立ちます [server3] # smile2 hostname
=192.168.73.107 ポート=3306
(5) 最初の構成では、マスター ノード上の仮想 IP
/sbin/ifconfig ens33:1 192.168.73.66/24を手動で開く必要があります。
(6) マネージャーノードでsshパスワードレス認証をテストする
masterha_check_ssh -conf=/etc/masterha/app1.cnf
(7) マネージャーノードで mysql のマスター/スレーブ接続をテストします。
masterha_check_repl -conf=/etc/masterha/app1.cnf
マネージャー ノードで mysql のマスターとスレーブの接続をテストすると、最後に「MySQL Replication Health is OK」というメッセージが表示され、正常であることが示されます。
(8) マネージャーノードでMHA nohupを開始
masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 & ------------------------
以下は注意事項です ------------------------ -------------------------------------------------- Remove_dead_master_conf #このパラメータは、マスター/スレーブの切り替えが発生したときに、古いマスター ライブラリの IP が設定ファイルから削除されることを意味します。 --manger_log #ログの保存場所。 --ignore_last_failover #デフォルトでは、MHA が継続的なダウンタイムを検出し、2 つのダウンタイムの間隔が 8 時間未満の場合、フェイルオーバーは実行されません。この制限の理由は、ピンポン効果 (切り替えを行ったり来たりすると、スプリットブレイン)。このパラメータは、最後の MHA トリガー スイッチによって生成されたファイルを無視することを意味します。デフォルトでは、MHA スイッチが発生した後、app1.failover.complete ログ ファイルに記録されます。ファイルがディレクトリに存在することが判明した場合、次回再度スイッチが行われると、最初のスイッチオーバー後にファイルが削除されない限り、スイッチオーバーのトリガーは許可されません。便宜上、ここでは --ignore_last_failover に設定します。
-------------------------------------------------- ----------------------------------- プログラムを
使用し ●nohup を使用してプログラムを実行します。結果はデフォルトで nohup.out に出力されます。Ctrl+C を使用して SIGINT シグナルを送信すると、プログラムが閉じられます。セッションを閉じて SIGHUP シグナルを送信すると、プログラムが終了します。免疫。 ● nohup と & を使用してプログラムを開始します。 nohup ./test &: SIGINT 信号と SIGHUP 信号の影響を同時に受けません。
(9) マネージャーノードのMHAステータスとMHAログを確認すると、マスターのアドレスが確認できます。
#MHAステータスを確認すると、現在のマスターがMysql1ノードであることがわかります。
masterha_check_status --conf=/etc/masterha/app1.cnf #MHA ログ
を確認すると cat /var/log/masterha/app1/manager.log | grep "current master 」
(10) Mysql1 ifconfigに VIP アドレスが存在するかどうかを確認します
#
マネージャー サービスを閉じるには、次のコマンドを使用できます。
masterha_stop --conf=/etc/masterha/app1.cnf
#または、プロセス ID を強制終了して直接閉じることもできます。
ステップ 3: 障害テスト
------------------------ 代替メイン ライブラリのフェイルオーバーのアルゴリズム ------------- - ---------- 代替プライマリ ライブラリの
フェイルオーバー 1. 通常、スレーブライブラリは(位置/GTID)で良否を判断し、データが異なっており、マスターに最も近いスレーブがマスター候補となります。 2 . データに一貫性がある場合は、構成ファイルの順序に従って代替のメイン ライブラリを選択します。 3 . 重みを設定すると (candidate_master=1)、重みに従って候補マスターが強制的に指定されます。 ( 1) デフォルトでは、スレーブがマスターのリレーログより 100M 遅れている場合、たとえ重みがあっても失敗します。 ( 2) check_repl_delay=0 の場合、ログが多くても強制的にバックアップマスターとして選択されます。
##(1) マスター ノードの mysql サービスを停止します。 Mysql1
systemctl stop mysqld
または
pkill -9 mysql
##
(2) マネージャー ノードのログ レコードを監視し、観察します。
tail -f /var/log/masterha/app1/manager。 log ##
(3) 通常の自動切り替え後、MHA プロセスが終了します。MHA は、app1.cnf ファイルの内容を自動的に変更し、ダウンタイムの mysql1 ノードを削除します。 vim /etc/masterha/app1.cnf #マネージャーノードの設定ファイルを表示 ## (4) mysql2がVIPを引き継ぐか確認 ifconfig
3. 障害のあるマスターを修復します
(1) mysql1 を修復します (つまり、元のマスター ノードを修復します)
systemctl restart mysqld
(2) マスター/スレーブ データを修復する
mysql -u root -p
mysql> show master status;
mysql -u root -p
マスターを master_host='192.168.73.106',master_user='myslave',master_password='123123',master_log_file='master-bin.000002',master_log_pos=154 に変更します。
(3) マネージャーノードの構成ファイル app1.cnf を変更します。
vi /etc/masterha/app1.cnf
......
Secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.72.192 -s 192.168.72.80
。 . ....
[サーバー 1]
ホスト名=192.168.72.60
ポート=3306
[
サーバー 2]
候補マスター=1
check_repl_delay=0
ホスト名=192.168.72.192
ポート=3306
[
サーバー 3]
ホスト名=192.168.72.80
ポート=3306
(4) マネージャーノードでMHAを起動
masterha_stop --conf=/etc/masterha/app1.cnf
nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var /log/masterha/app1/manager.log 2>&1 &
(5) mysql1 と mysql2 を再起動します。
systemctl は mysqld を再起動します。