1. 内閣府1. コンセプト2. MHAの構成3. MHAの特徴2. MySQL+MHAをビルドするアイデアと準備1. マスター 1 台とスレーブ 2 台による MHA アーキテクチャ データベースのインストール 2. 障害シミュレーション: プライマリ データベースの障害をシミュレートします。バックアップ プライマリ データベースがプライマリ データベースになります。元の障害が発生したプライマリ データベースが復元され、MHA に再結合されてスレーブ データベースになります。 3. MySQLをインストールするための4つの仮想マシンを準備する 1. ファイアウォールをオフにしてポートが開いているかどうかを確認しますsystemctl 停止 ファイアウォール systemctl ファイアウォールを無効にする 強制0を設定する netstat -natp | grep 3306 2. MySQLノードのホスト名を変更する192.168.221.20 の MySQL インスタンス ホスト名ctl ホスト名の設定 mysql1 su- ホスト名ctl ホスト名の設定 mysql2 su- ホスト名ctl ホスト名の設定 mysql3 su- 3. 3つのMySQLサーバーのメイン構成ファイル/etc/my.cnfを変更し、コマンドソフトリンクを作成します。MySQL1 vim /etc/my.cnf [mysqld] サーバーID = 1 log_bin = マスタービン ログスレーブ更新 = true systemctl で mysqld を再起動します。 : := mysql /usr/local/mysql/bin/mysql /usr/sbin/ を使います。 ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/ MySQL2 vim /etc/my.cnf サーバーID = 2 #server-id = 3 MySQL3は3なので、3つのサーバーのserver-idは同じにすることはできません。log_bin = master-bin リレーログ = リレーログビン リレーログインデックス = スレーブリレービンインデックス systemctl で mysqld を再起動します。 : := mysql /usr/local/mysql/bin/mysql /usr/sbin/ を使います。 ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/ 4. マスター1台とスレーブ2台でMySQLを構成する(1) すべてのMySQLサーバーはMySQL認証を実行します。mysql1 (192.168.221.20) 192.168.221.100 の MySQL インスタンス (192.168.221.110) 3台のマシンすべてでmysql -uroot -p123を設定する必要があります。 '123' で識別される 'myslave'@'192.168.221.%' に *.* 上のレプリケーションスレーブを許可します。 'manager' によって識別される 'mha'@'192.168.221.%' に *.* のすべての権限を付与します。 'manager' によって識別される 'mha'@'mysql1' に *.* のすべての権限を付与します。 'manager' によって識別される 'mha'@'mysql2' に *.* のすべての権限を付与します。 'manager' によって識別される 'mha'@'mysql3' に *.* のすべての権限を付与します。 権限をフラッシュします。 マスターステータスを表示します。 (2)Slave1ノードとSlave2ノードで同期操作を実行します。マスターをmaster_host='192.168.221.20'、master_user='myslave'、master_password='123'、master_log_file='master-bin.000005'、master_log_pos=1991に変更します。 スレーブを起動します。 スレーブステータスを表示\G スレーブIO実行中: はい スレーブSQL実行中: はい #Slave_IO_Running の一般的な可能性: いいえ: #ネットワークが機能していません#my.cnf 構成の問題#パスワード、ファイル名、位置オフセットが正しくありません#ファイアウォールが閉じられていません (3)スレーブ1とスレーブ2ノードは読み取り専用モードに設定されているmysql2(192.168.221.100) (192.168.221.110) グローバル read_only=1 を設定します。 # 読み取り/書き込み状態に戻す set global read_only=0; (4) マスタースレーブレプリケーション検証 mysql1 (192.168.221.20) データベースを作成します。create database srs; 使用テスト; テーブル test(id int) を作成します。 テスト値に挿入する(1); 192.168.221.100 の MySQL インスタンス (192.168.221.110) データベースを照会してデータベースの表示を確認します。 5. MHAソフトウェアをインストールする(1)MHA依存環境MHAmanager(192.168.221.30)が全サーバにインストールされている 192.168.221.20 の MySQL インスタンス 192.168.221.100 の MySQL インスタンス (192.168.221.110) まず、epel ソースをインストールします。これにはオンライン ソースのインストールが必要です。次に、すべてのサーバーにノード コンポーネントをインストールします。#オンライン ソースのインストール mv /etc/yum.repos.d/repos.bak/CentOS-* /etc/yum.repos.d/ yumリスト yum インストール epel-release --nogpgcheck -y yum インストール -y perl-DBD-MySQL \ perl-Config-Tiny \ perl-ログディスパッチ \ perl-Parallel-ForkManager \ perl-ExtUtils-CBuilder \ perl-ExtUtils-MakeMaker \ パール - CPAN (2)すべてのサーバーはMHAノードソフトウェアパッケージMHAmanager(192.168.221.30)をインストールします。 192.168.221.20 の MySQL インスタンス 192.168.221.100 の MySQL インスタンス (192.168.221.110) オペレーティングシステムのバージョンごとに異なります。ここでは、CentOS7.4 ではバージョン 0.57 を選択する必要があります。 マネージャはノード コンポーネントに依存しているため、最初にノード コンポーネントをすべてのサーバーにインストールし、最後にマネージャ コンポーネントを MHA マネージャ ノードにインストールする必要があります。 #ソフトウェアパッケージ mha4mysql-node-0.57.tar.gz を /opt ディレクトリに配置します cd /opt tar zxvf mha4mysql-node-0.57.tar.gz mha4mysql-node-0.57 を CD します perl メイクファイル.PL 作成 && インストール MHA マネージャー ノードにマネージャー コンポーネントをインストールします。パッケージ mha4mysql-manager-0.57.tar.gz を /opt ディレクトリに配置します。cd /opt tar zxvf mha4mysql-manager-0.57.tar.gz mha4mysql-manager-0.57 を CD します perl メイクファイル.PL 作成 && インストール #ノード コンポーネントがインストールされると、/usr/local/bin の下にいくつかのスクリプトが生成されます (これらのツールは通常、MHAManager スクリプトによってトリガーされ、手動操作は必要ありません) #マネージャーコンポーネントがインストールされると、/usr/local/binの下にいくつかのツールが生成されます 6. すべてのサーバーでパスワードレス認証を構成する(1)マネージャーノード上のすべてのデータベースノードにパスワードフリー認証MHAmanager(192.168.221.30)を設定する ssh-keygen -t rsa #Enterキーを押し続ける ssh-copy-id 192.168.221.20 sshコピーID 192.168.221.100 sshコピーID 192.168.221.110 (2)ssh-keygen -t rsaを使用して、mysql1でデータベースノードmysql2とmysql3へのパスワードなしの認証を設定します。 192.168.221.20 の MySQL インスタンス ssh-keygen -t rsa sshコピーID 192.168.221.100 sshコピーID 192.168.221.110 (3)データベースノードmysql1とmysql3に対してmysql2でパスワードフリー認証を設定します。mysql2(192.168.221.100) ssh-keygen -t rsa sshコピーID 192.168.221.20 sshコピーID 192.168.221.110 (4)mysql3でデータベースノードmysql1とmysql2へのパスワードフリー認証を設定します。mysql3(192.168.221.110) ssh-keygen -t rsa sshコピーID 192.168.221.20 sshコピーID 192.168.221.100 記事が長すぎるため、説明できません 7. マネージャーノードでMHAを構成するMHAmanager (192.168.221.30) (1)関連するスクリプトをマネージャーノードの/usr/local/binディレクトリにコピーします:cp -rp /opt/mha4mysql-manager-0.57/samples/scripts /usr/local/bin #コピー後、4つの実行可能ファイルll /usr/local/bin/scripts/が作成されます。 (2)自動切り替え用の上記のVIP管理スクリプトを/usr/local/binディレクトリにコピーします。ここでは、VIPとフェイルオーバーの管理にmaster_ip_failoverスクリプトを使用します。cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin # まず元のコンテンツをクリアします echo '' > /usr/local/bin/master_ip_failover #vip関連のパラメータを直接コピーして変更する vim /usr/local/bin/master_ip_failover #!/usr/bin/env パール 厳密なものを使用します。 警告 FATAL => 'all' を使用します。 Getopt::Long を使用します。 私の $コマンド、$ssh_user、$orig_master_host、$orig_master_ip、 $orig_master_port、$new_master_host、$new_master_ip、$new_master_port ); ##################################コンテンツ セクションを追加########################################## my $vip = '192.168.221.200'; #vipmy のアドレスを指定します $brdc = '192.168.221.255'; #vipmy のブロードキャスト アドレスを指定します $ifdev = 'ens33'; #vipmy にバインドされているネットワーク カードを指定します $key = '1'; #vipmy にバインドされている仮想ネットワーク カードのシリアル番号を指定します $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip"; #この変数の値が ifconfig ens33:1 192.168.221.200 であることを表します my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down"; #この変数の値は ifconfig ens33:1 down my $exit_code = 0; #終了ステータスコードを0に指定します #my $ssh_start_vip = "/usr/sbin/ip addr $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 アドレス del $vip/24 dev $ifdev ラベル $ifdev:$key"; ################################################################################## オプションを取得( '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, '新しいマスターポート=i' => \$新しいマスターポート、 ); &main() を終了します。 サブメイン{ print "\n\nスクリプトテストで====$ssh_stop_vip==$ssh_start_vip===\n\n"; $command が "stop" の場合 || $command が "stopssh" の場合 { 私の$exit_code = 1; 評価 { print "古いマスターの VIP を無効にしています: $orig_master_host \n"; &stop_vip(); $終了コード = 0; }; もし($@){ warn "エラーが発生しました: $@\n"; 終了 $exit_code; } 終了 $exit_code; } elsif ( $command が "start" と等しい ) { 私の$exit_code = 10; 評価 { print "新しいマスター $new_master_host で VIP $vip を有効にしています \n"; 開始vip(); $終了コード = 0; }; もし($@){ 警告 $@; 終了 $exit_code; } 終了 $exit_code; } elsif ( $command が "ステータス" と等しい ) { print "スクリプトのステータスを確認しています。OK \n"; 終了0; } それ以外 { &使用法(); 出口1; } } サブ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 \"`; } サブの使用法 { 印刷 "使用方法: 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=port\n"; } /etc/masterha をディレクトリに追加します。 cp /opt/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha エコー '' > /etc/masterha/app1.cnf vim /etc/masterha/app1.cnf [サーバーのデフォルト] マネージャログ=/var/log/masterha/app1/manager.log マネージャーワークディレクトリ=/var/log/masterha/app1 マスター_binlog_dir=/usr/local/mysql/data マスターIPフェイルオーバースクリプト=/usr/local/bin/マスターIPフェイルオーバー マスターIPオンライン変更スクリプト=/usr/local/bin/マスターIPオンライン変更 ユーザー=mha パスワード=マネージャー ping_interval=1 リモートワークディレクトリ=/tmp repl_user=myslave パスワードを123に変更 セカンダリチェックスクリプト=/usr/local/bin/masterha_secondary_check -s 192.168.221.100 -s 192.168.221.110 シャットダウンスクリプト="" ssh_user=ルート [サーバー1] ホスト名=192.168.221.20 ポート=3306 [サーバー2] 候補マスター=1 チェック_repl_delay=0 ホスト名=192.168.221.100 ポート=3306 [サーバー3] ホスト名=192.168.221.110 ポート=3306 #--------------------------設定ファイルの説明---------------------------------------------------------------------------------------- [サーバーのデフォルト] manager_log=/var/log/masterha/app1/manager.log #マネージャー ログ manager_workdir=/var/log/masterha/app1.log #マネージャー作業ディレクトリ 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=mha #監視ユーザーを root に設定します password=manager #mysql の root ユーザーのパスワードを設定します。このパスワードは、前回の記事で作成した監視ユーザーのパスワードです。 ping_interval=1 #監視メインデータベースを設定します。ping パケットを送信する間隔は 1 秒です。デフォルトは 3 秒です。3 回試行しても応答がない場合は、自動的にフェイルオーバーが実行されます。 remote_workdir=/tmp #切り替え発生時にリモート MySQL バイナリログが保存される場所を設定します repl_user=myslave #レプリケーション ユーザーのユーザーを設定します repl_password=123 #レプリケーション ユーザーのパスワードを設定します report_script=/usr/local/send_report #切り替え発生後にアラームを送信するためのスクリプトを設定します secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.221.100 -s 192.168.221.110 #チェックするスレーブ サーバーの IP アドレスを指定します shutdown_script="" #障害発生後に障害のあるホストをシャットダウンするためのスクリプトを設定します (このスクリプトの主な機能は、ブレイン スプリットを防ぐためにホストをシャットダウンすることですが、ここでは使用しません) ssh_user=root #sshログインユーザー名を設定する [server1] ホスト名=192.168.221.20 ポート=3306 [サーバー2] ホスト名=192.168.221.100 ポート=3306 候補マスター=1 #候補マスターに設定します。このパラメータを設定すると、マスターデータベースがクラスター内の最新のスレーブでなくても、マスタースレーブスイッチが発生した後にスレーブデータベースがマスターデータベースに昇格されます。 チェック_repl_delay=0 #デフォルトでは、スレーブがマスターより 100M 以上のリレー ログで遅れている場合、スレーブの回復に長い時間がかかるため、MHA はスレーブを新しいマスターとして選択しません。check_repl_delay=0 を設定すると、MHA は新しいマスターを選択するときにレプリケーションの遅延を無視するようにスイッチをトリガーします。このパラメータは、candidate_master=1 のホストに非常に役立ちます。候補マスターは、切り替え中に新しいマスターになる必要があるためです。 [サーバー3] ホスト名=192.168.221.110 ポート=3306 8. 最初の構成では、マスターノードの仮想IPを手動で有効にする必要があります。マスター (192.168.221.20) /sbin/ifconfig ens33:1 192.168.221.200/24 9. マネージャーノードでテストする(1) マネージャノードMHAmanager (192.168.221.30)でsshパスワードレス認証をテストする masterha_check_ssh -conf=/etc/masterha/app1.cnf #すべてがうまくいけば、最終出力は成功します。 #失敗した場合は、パスワード認証なしでサーバー構成にアクセスして、問題がないか確認できます。 (2) マネージャーノードでMySQLマスタースレーブ接続をテストします。 MHAmanager (192.168.221.30) masterha_check_repl -conf=/etc/masterha/app1.cnf #最後に「MySQL レプリケーションの健全性は正常です」というメッセージが表示され、すべてが正常であることを示します。 #MySQL Replication Health is NOT OK! というメッセージが表示されたら、MySQL サーバーのソフトリンクが欠落していないかどうかを確認できます。 --> この記事は次の場所にあります: 2. 3 つの MySQL サーバーのメイン構成ファイル /etc/my.cnf を変更し、コマンド ソフトリンクを作成します (3) マネージャー ノードで MHA を起動します MHAmanager (192.168.221.30) 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 に設定されています。 10. 関連ステータスを確認するMHAmanager (192.168.221.30) MHA ステータスを確認すると、現在のマスターが Mysql1 ノードであることがわかります。 masterha_check_status --conf=/etc/masterha/app1.cnf MHAログを確認すると、現在のマスターが192.168.221.20であることがわかります。 cat /var/log/masterha/app1/manager.log | grep "現在のマスター" Mysql1 の VIP アドレスを確認し、Mysql1 の VIP アドレス 192.168.163.200 が存在するかどうかを確認します。マネージャー ノードが MHA サービスを停止しても、この VIP アドレスは消えません。 ifconfig 補足: マネージャー サービスをシャットダウンするには、次のコマンドを使用します。 masterha_stop --conf=/etc/masterha/app1.cnf または、プロセス ID を直接強制終了してシャットダウンすることもできます。 3. 故障シミュレーション1. 故障シミュレーション(1)マネージャーノード上のMHAmanager(192.168.221.30)のログ記録を監視し観察する tail -f /var/log/masterha/app1/manager.log (2)マスターノードMySQL1(192.168.221.20)上のmysqlサービスmysql1を停止する systemctl を停止します。 またはpkill -9 mysql 通常の自動切り替え後、MHA プロセスは終了します。 HMA は app1.cnf ファイルの内容を自動的に変更し、ダウンした mysql1 ノードを削除します。 (3)mysql2がVIPを引き継いだかどうかを確認する 192.168.221.100 の MySQL インスタンス ifconfig (4)マネージャーノードに戻り、ログレコードを監視します:tail -f /var/log/masterha/app1/manager.log 候補マスター データベースのフェイルオーバーのアルゴリズム: 1. 一般的にスレーブデータベースの品質は(位置/GTID)で判断され、データに差異がある場合はマスターに最も近いスレーブが候補マスターになります。 2. データが一貫している場合は、構成ファイルの順序に従って代替マスター データベースを選択します。 3. 重み(candidate_master=1)を設定して、重みに応じて候補マスターを強制的に指定します。 (1)デフォルトでは、スレーブがマスターよりリレーログで100MB遅れている場合、重みがあっても失敗します。 (2)check_repl_delay=0の場合、ログが大量に遅れていても強制的にバックアップマスターとして選択される。 2. トラブルシューティング192.168.221.20 の MySQL インスタンス (1)マスターを修復する systemctl で mysqld を再起動します。 netstat -natp | grep 3306 192.168.221.100 の MySQL インスタンス (2)マスタースレーブサーバーを修復します。現在のマスターサーバーMysql2上のバイナリファイルと同期ポイントを表示します。mysql -uroot -p123 -e 'show master status;' # データベースで show master status を実行します。 元のマスターサーバーmysql1(192.168.221.20)で同期操作を実行します。 マスターをmaster_host='192.168.221.100'、master_user='myslave'、master_password='123'、master_log_file='master-bin.000001'、master_log_pos=1747に変更します。 スレーブを起動します。 スレーブステータスを表示\G (3)マネージャノード上の設定ファイルapp1.cnfを変更する MHAmanager (192.168.221.30) 次に、このレコードを追加します。これは、障害を検出すると自動的に消えるためです。vim /etc/masterha/app1.cnf … セカンダリチェックスクリプト=/usr/local/bin/masterha_secondary_check -s 192.168.221.20 -s 192.168.221.110 ...... [サーバー1] ホスト名=192.168.221.100 ポート=3306 [サーバー2] 候補マスター=1 チェック_repl_delay=0 ホスト名=192.168.221.20 ポート=3306 [サーバー3] ホスト名=192.168.221.110 ポート=3306 (4)マネージャーノードでMHAを起動する MHAmanager (192.168.221.30) 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 & masterha_check_status --conf=/etc/masterha/app1.cnf これで、MySQL 高可用性クラスタの展開とフェイルオーバーの実装に関するこの記事は終了です。MySQL 高可用性クラスタの展開に関するより関連性の高いコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: JD.com フラッシュセール効果を実現する JavaScript
テーブルフィールドを追加する テーブルtable1を変更し、トランザクタvarchar(10)をNu...
この記事の例では、ドロップダウンメニューのカプセル化を実装するためのVue + Element UI...
目次1. パーティクルエフェクト2. シーンを読み込む3. さまざまな粒子効果の実現エンディング: ...
システム: VMTOOLs ダウンロード:リンク: https://pan.baidu.com/s/...
オープンソース データベース アーキテクチャの設計原則01. 技術の選択最も使い慣れていて、最大限に...
まとめシナリオによっては、レコードがない場合は挿入し、レコードがある場合は更新するという要件がある場...
テーブルヘッダーでは、暗い境界線の色を個別に定義できます。基本的な構文<TH 境界線の色を暗く...
背景最近、複数のプロジェクトを展開する際に、1 つのドメイン名で複数のプロジェクトにアクセスする方法...
VMware Workstation 14 ProにCentOS 7.0をインストールする具体的な方...
目次1. provide/inject の用途は何ですか? 2. provide/injectの使い...
方法1: .bashrcまたは.bash_profileファイルを変更するこれは、ホーム ディレクト...
Redisイメージをダウンロードする docker pull yyyyttttwww/redis を...
目次簡単な説明: 1. 取引の4つの特徴2. 複数の同時トランザクションによって発生する問題3. ト...
目次フィルター01.とは02. やり方(1)フィルターを定義する(2)使用方法(3)フィルタパラメー...
序文フロントエンドで非常に便利な、小さなアイコン付きの検索ボックスを作成する方法をご紹介します。エフ...