26_MySQL高可用性MHA-02

継続MySQL高可用性MHA-01

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のパフォーマンス調整と最適化のスキルマスター最適化のアイデアとスキル、データベースの継続的な最適化は長期的なプロジェクトです

おすすめ

転載: blog.csdn.net/weixin_45310323/article/details/114757880