vipを構成する
vipを構成する方法は2つあります。1つはkeepalivedを介して仮想IPのフローティングを管理する方法、もう1つはスクリプトを介して仮想IPを開始する方法です(つまり、keepalivedやハートビートなどのソフトウェアは必要ありません)。
1つ、キープアライブの方法
1.keepalivedモードでの仮想IPkeepalivedの管理keepalivedの
構成方法は次のとおりです。ソフトウェアをダウンロードしてインストールします(正確には、2つのマスター、1つはマスター、もう1つは代替マスター、以前はスレーブです)。切り替え)
yum -y install epel-release.noarch
yum -y install keepalived.x86_64
master2ホストも、master1と同じように、キープアライブインストールを完了します。インストールプロセスは省略されます。
注:ファイアウォールがオンになっている場合は、ファイアウォールをオフにするか、ルールを作成する必要があります
firewall-cmd --direct --permanent --add-rule ipv4 filter OUTPUT 0 --in-interface enp0s3 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface enp0s3 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --reload
Keepalivedの構成ファイルを変更します(master1で構成されます)
cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL-01
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 100
nopreempt
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.100
}
}
候補マスター(master2)で構成します
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL-02
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 50
nopreempt
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.100
}
}
キープアライブサービスを開始します
systemctl start keepalived.service
VIPを見る
ip a show dev ens33
vipはmaster1ホスト上にあり、keepalivedは正常に構成されています
注:上記の2つのサーバーのキープアライブはバックアップモードに設定されています。キープアライブには、マスターバックアップモードとバックアップ->バックアップモードの2つのモードがあります。これら2つのモードには大きな違いがあります。マスター->バックアップモードでは、メインライブラリがダウンすると、仮想IPは自動的にスレーブライブラリにドリフトします。メインライブラリが修復されてkeepalivedが開始されると、プリエンプションがない場合でも、仮想IPがプリエンプトされます。モード(プリエンプトなし)が設定されています。ipのアクションも発生します。バックアップ->バックアップモードでは、メインライブラリがダウンすると、仮想IPは自動的にスレーブライブラリにドリフトします。元のマスターライブラリが復元され、keepalivedサービスが開始されると、新しいマスターの仮想IPがプリエンプトされません。 、スレーブの優先度よりも優先度が高い場合でも、ライブラリの優先度レベルでは、プリエンプションは発生しません。IPドリフトの数を減らすために、修復されたメインライブラリは通常、新しいスタンバイライブラリと見なされます。
2. MHAはkeepalivedMySQL
サービスプロセスを導入し、サービスプロセスがハングするとMHAを介してkeepalivedを停止します):keepalivedサービスをMHAに導入するには、切り替え中にトリガーされるスクリプトファイルmaster_ip_failoverを変更し、それをに追加するだけです。マスターがダウンしたときのスクリプトkeepalivedの扱い。スクリプト/ scripts / master_ip_failoverを編集します。変更されたバージョンは次のとおりです。(バックアップ後に変更することをお勧めします)
cat master_ip_failover
#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';
use Getopt::Long;
my (
$command,$ssh_user,$orig_master_host,$orig_master_ip,$orig_master_port,
$new_master_host,$new_master_ip,$new_master_port
);
my $vip = '192.168.1.100';
my $ssh_start_vip = "systemctl start keepalived.service";
my $ssh_stop_vip = "systemctl stop keepalived.service";
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" ) {
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();
$exit_code = 0;
};
if ($@) {
warn $@;
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "status" ) {
print "Checking the Status of the script.. OK \n";
#`ssh $ssh_user\@cluster1 \" $ssh_start_vip \"`;
exit 0;
}
else {
&usage();
exit 1;
}
}
# A simple system call that enable the VIP on the new master
sub start_vip() {
`ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
# A simple system call that disable the VIP on the old_master
sub stop_vip() {
return 0 unless ($ssh_user);
`ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}
sub usage {
print
"Usage: 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";
}
なお、以下の3項目があります。
これらの3行は
vipのアドレス
キープアライブ
を開始するコマンドキープアライブを停止するコマンド
スクリプトが変更されたので、/ etc / masterha /app1.cnfでフェイルオーバースクリプトを呼び出します。
MHAを停止します
masterha_stop --conf=/etc/masterha/app1.cnf
構成ファイル/etc/masterha/app1.cnfで次のパラメーターを有効にします([サーバーのデフォルト]の下に追加)
master_ip_failover_script=/scripts/master_ip_failover
MHAを開始する
nohup masterha_manager --conf=/etc/masterha/app1.cnf &>/tmp/mha_manage.log &
ステータスを確認する
masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:15259) is running(0:PING_OK), master:192.168.1.65
クラスタステータスをもう一度チェックして、エラーが報告されるかどうかを確認します
masterha_check_repl --conf=/etc/masterha/app1.cnf
......
MySQL Replication Health is OK.
エラーがないことがわかります。/ scripts / master_ip_failoverによって追加または変更されたコンテンツは、メインライブラリデータベースに障害が発生すると、MHAスイッチがトリガーされることを意味します。MHAマネージャーは、メインライブラリのkeepalivedサービスを停止し、仮想IPをトリガーして代替スレーブライブラリにドリフトします。切り替えを完了します。もちろん、keepalivedにスクリプトを導入することもできます。このスクリプトは、mysqlが正常に実行されているかどうかを監視します。正常でない場合は、スクリプトを呼び出してkeepalivedプロセスを強制終了します。
3.
スレーブへのmaster1のmysqldサービスをテスト停止して、スレーブのステータスを確認します。
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.67
Master_User: mharep
上の図から、スレーブが新しいマスターサーバー192.168.1.67を指していることがわかります(フェイルオーバー前は192.168.1.65を指しています)。
VIPバインディングを表示する:
[root@master1 ~]# ip a show dev ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:57:8d:1c brd ff:ff:ff:ff:ff:ff
inet 192.168.1.65/24 brd 192.168.1.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::7c0:18fc:ee75:c06b/64 scope link
valid_lft forever preferred_lft forever
[root@master2 ~]# ip a show dev ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:fa:45:c1 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.64/24 brd 192.168.1.255 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.1.100/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::ed8f:78fc:474:e01/64 scope link
valid_lft forever preferred_lft forever
上記の表示結果から、VIPアドレスが192.168.1.67にドリフトしていることがわかります。
マスター/スレーブ切り替えフォローアップ作業の再構築:再構築とは、マスターがハングし、候補マスターに切り替えて候補マスターがマスターになることを意味します。したがって、再構築のスキームでは、元のマスターライブラリが新しいスレーブマスターライブラリに復元されます。元のマスターライブラリを新しいスレーブライブラリに復元します。元のマスターライブラリデータファイルが完成すると、次の方法で最後に実行されたCHANGEMASTERコマンドを見つけることができます。
[root@manager ~]# grep 'CHANGE' /masterha/app1/manager.log
Sat Mar 13 21:58:38 2021 - [info] All other slaves should start replication from here. Statement should be: CHANGE MASTER TO MASTER_HOST='192.168.1.67', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=742, MASTER_USER='mharep', MASTER_PASSWORD='xxx';
Sat Mar 13 21:58:40 2021 - [info] Executed CHANGE MASTER
master1ホストで操作して
、(元のマスターライブラリ)をスレーブライブラリに復元します
mysql> CHANGE MASTER TO MASTER_HOST='192.168.1.67', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=742, MASTER_USER='mharep', MASTER_PASSWORD='123.com';
Query OK, 0 rows affected, 2 warnings (0.01 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.67
Master_User: mharep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 742
Relay_Log_File: relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
mhaを再起動します
rm -fr /masterha/app1/app1.failover.complete
nohup masterha_manager --conf=/etc/masterha/app1.cnf --ignore_fail_on_start &>/tmp/mha_manager.log &
masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:15810) is running(0:PING_OK), master:192.168.1.67
2つ目は、VIPスイッチングを実現するためのスクリプトです。
スクリプトを使用してVIPを管理します。/ scripts / master_ip_failoverを変更します。これは、php言語などの他の言語でも実行できます。phpスクリプトで記述されたフェイルオーバーはここでは紹介されていません。変更完了後の内容は以下のとおりです。スクリプトを使用してVIPを管理する場合は、マスターサーバーでVIPを手動でバインドする必要があります。
ifconfig ens33:0 192.168.1.100/24
mha-managerの/ scripts / master_ip_failoverを変更します。内容は次のとおりです。
#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';
use Getopt::Long;
my (
$command,$ssh_user,$orig_master_host,$orig_master_ip,$orig_master_port, $new_master_host,$new_master_ip,$new_master_port
);
my $vip = '192.168.1.100';
my $key = '0';
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
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" ) {
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();
$exit_code = 0;
};
if ($@) {
warn $@;
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "status" ) {
print "Checking the Status of the script.. OK \n";
#`ssh $ssh_user\@cluster1 \" $ssh_start_vip \"`;
exit 0;
}
else {
&usage();
exit 1;
}
}
# A simple system call that enable the VIP on the new master
sub start_vip() {
`ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
# A simple system call that disable the VIP on the old_master
sub stop_vip() {
return 0 unless ($ssh_user);
`ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}
sub usage {
print
"Usage: 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";
}
スクリプトの注意点
構成ファイルに次の行を追加します
cat /etc/masterha/app1.cnf
[server default]
master_ip_failover_script=/scripts/master_ip_failover
MHAを停止します
masterha_stop --conf=/etc/masterha/app1.cnf
MHAを開始します。
#nohup masterha_manager --conf=/etc/masterha/app1.cnf &>/tmp/mha_manager.log &
ステータスを確認する
masterha_check_status --conf=/etc/masterha/app1.cnf
クラスターのステータスを再度チェックして、エラーが報告されるかどうかを確認してください。
masterha_check_repl --conf=/etc/masterha/app1.cnf
テスト
マスターでmysqlサービスを停止
し、スレーブに移動してスレーブのステータスを確認します
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.65
Master_User: mharep
Master_Port: 3306
Connect_Retry: 60
上の図から、スレーブが新しいマスターサーバーを指していることがわかり
ます。VIPを表示
ip a show dev ens33
(元のマスター)がVIPを解放し、master1(新しいマスター)がVIPアドレスを引き継ぎました。マスター/スレーブ切り替えのフォローアップマスターライブラリを切り替えた後、元のマスターライブラリを新しいスレーブライブラリに復元します。関連する操作については、以前の関連する操作を参照してください。スプリットブレインを防ぐために、本番環境では、keepalivedではなくスクリプトを使用して仮想IPを管理することをお勧めします。これまでのところ、基本的なMHAクラスターが構成されています。
総括する
MHAソフトウェアは、ManagerツールキットとNodeツールキットの2つの部分で構成されており、具体的な手順は次のとおりです。
Managerツールキットには、主に次のツールが含まれています。
- masterha_check_sshは、MHAのSSH構成ステータスをチェックします
- masterha_check_replはMySQLレプリケーションステータスをチェックします
- masterha_mangerがMHAを開始します
- masterha_check_statusは、現在のMHA実行ステータスを検出します
- masterha_master_monitorは、マスターがダウンしているかどうかを検出します
- masterha_master_switchはフェイルオーバーを制御します(自動または手動)
- masterha_conf_host構成されたサーバー情報ノードツールキットを追加または削除します(これらのツールは通常、人間の操作なしでMHAマネージャーのスクリプトによってトリガーされます)
主に次のツールが含まれています。
- save_binary_logsマスターバイナリログを保存およびコピーします
- apply_diff_relay_logsさまざまなリレーログイベントを識別し、それらの違いを他のスレーブに適用します
- filter_mysqlbinlogは、不要なROLLBACKイベントを削除します(MHAはこのツールを使用しなくなりました)
- purge_relay_logsはリレーログをクリアします(SQLスレッドをブロックしません)
マスターするために必要なmysqlのスキル:
- MySQLアーキテクチャ:mysqlアーキテクチャの全体的な印象を持っている場合にのみ、mysqlとその後の学習についての理解を深め続けることができます。
- MySQLデータベースをさまざまな姿勢でバックアップします。データのバックアップは、DBAまたは運用および保守エンジニアの日常業務の1つです。バックアップを求められた場合、どのような種類のバックアップを使用し、いつバックアップし、どのような戦略を採用しますか。バックアップに使用する
- MySQLマスタースレーブレプリケーションと読み取り/書き込み分離MySQLマスタースレーブレプリケーションと読み取り/書き込み分離は、DBAの重要なスキルの1つです。
- MySQL / MariaDBデータベースは、SSLに基づくマスタースレーブレプリケーションを実装して、マスタースレーブレプリケーションのセキュリティを強化します
- MySQLの高可用性データの高可用性を確保する方法
- データベースシャーディングの基本的な考え方とシャーディング戦略は、データの量とともに増加し続けます。パフォーマンスと保守性の観点から、いくつかのシャーディング、つまり、垂直セグメンテーションと水平セグメンテーションを含むデータベースセグメンテーションが必要です。
- MySQL / MariaDBのパフォーマンス調整と最適化のスキルマスター最適化のアイデアとスキル、データベースの継続的な最適化は長期的なプロジェクトです