Mysql8 高可用性デュアルマスター + キープアライブ

1。概要

Mysql データベースの高可用性を実現するには keepalived を使用します。MYSQL-HA を実現するには Keepalived+Mysql デュアル マスターを使用します。2 つの Mysql データベースのデータが完全に一貫していることを確認する必要があります。実装方法は、2 つの Mysql データベースにマスターとスレーブが存在することです。 MySQL データベースの 1 つがダウンすると、アプリケーションは自動的に別の MySQL データベースに切り替わり、システムの高可用性を確保できます。

2. 実験環境

オペレーティング·システム レッドハット 4.8.5
MySQLのバージョン mysql 8.0.28
キープアライブバージョン keepalibed-2.2.8
Mysql-マスター-1 192.168.15.94
Mysql-マスター-2 192.168.15.92
MySQL-VIP 192.168.15.100

3. 関連する構成

3.1 ファイアウォールをオフにする

両方のマシンに mysql をインストールし、firewalld を閉じます。

[root@skymachine ~]# systemctl stop firewalld
[root@skymachine ~]# systemctl disable firewalld
[root@skymachine ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)

3.2 master-1設定ファイルの変更

MySQL マスターを構築するには、my.cnf を構成する必要があります。master -1 ライブラリ my.cnf の[mysqld]セクションに次のコンテンツを追加します。

vi /etc/my.cnf 

[mysqld]

log-bin=mysql-bin                               #开启主从binlog(二进制日志),主库必须开启
binlog_format=mixed                             #指定二进制日志格式为mixed,即在语句和行两种模式之间自动切换
server-id=1                                     #配置server-id(唯一)标识主机,必须与从库不一致
relay-log=relay-bin                             #指定中继日志文件的名称为relay-bin,用于在主从复制中传输数据
relay-log-index=slave-relay-bin.index           #指定中继日志索引文件的名称,用于记录中继日志文件的位置。
auto_increment_increment=2                      #指定自增长ID的增量为2,用于在主从复制中避免ID冲突。
auto_increment_offset=1                         #指定自增长ID的起始值为1,用于在主从复制中避免ID冲突。

##保存退出,并重启MySQL服务
[root@skymachine ~]# service mysql restart
Shutting down MySQL.. SUCCESS! 
Starting MySQL.. SUCCESS! 

3.3 マスター 2 設定ファイルの変更

vi /etc/my.cnf 
​
[mysqld]
​
log-bin=mysql-bin                               #开启主从binlog(二进制日志),主库必须开启
binlog_format=mixed                             #指定二进制日志格式为mixed,即在语句和行两种模式之间自动切换
server-id=2                                    #配置server-id(唯一)标识主机,必须与从库不一致
relay-log=relay-bin                             #指定中继日志文件的名称为relay-bin,用于在主从复制中传输数据
relay-log-index=slave-relay-bin.index           #指定中继日志索引文件的名称,用于记录中继日志文件的位置。
auto_increment_increment=2                      #指定自增长ID的增量为2,用于在主从复制中避免ID冲突。
auto_increment_offset=2                         #指定自增长ID的起始值为2,用于在主从复制中避免ID冲突。
​
##保存退出,并重启MySQL服务
[root@skymachine ~]# service mysql restart
Shutting down MySQL.. SUCCESS! 
Starting MySQL.. SUCCESS! 

4.デュアルマスターモードの設定

4.1 2つのノードにそれぞれ同期ユーザーを作成する

root ユーザーとして mysql にログインします

create user 'test'@'192.168.15.%' identified by 'Test12#$';
​
grant replication slave on *.* to 'test'@'192.168.15.%';
​
flush privileges; 
​
select user,host from mysql.user;

操作の結果は次のとおりです

mysql> create user 'test'@'192.168.15.%' identified by 'Test12#$';
Query OK, 0 rows affected (0.20 sec)
​
mysql> grant replication slave on *.* to 'test'@'192.168.15.%';
Query OK, 0 rows affected (0.03 sec)
​
mysql> flush privileges; 
Query OK, 0 rows affected (0.03 sec)
​
mysql> select user,host from mysql.user;
+------------------+--------------+
| user             | host         |
+------------------+--------------+
| user01           | %            |
| test             | 192.168.15.% |
| mysql.infoschema | localhost    |
| mysql.session    | localhost    |
| mysql.sys        | localhost    |
| root             | localhost    |
+------------------+--------------+
6 rows in set (0.00 sec)

4.2 master-1 でマスターサーバーを構成する

master-1 でマスターサーバーを設定するには、まず master-2 のユーザー名、パスワード、IP、ポート、master_log_file、file、master_log_pos、および get_master_public_key を取得する必要があります。

4.2.1 マスター 2 構成情報の取得

マスター 2 サーバーの mysql コマンド ラインに次のように入力します。

show master status;
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 |      960 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

ファイルを取得してコンテンツを配置する

4.2.2 メインサーバーの構成

master-1 サーバーの mysql コマンド ラインに戻り、次のコマンドを入力します。

stop slave;
​
reset slave;
​
change master to master_host='192.168.15.92',
master_port=3306,master_user='test',
master_password='Test12#$',
master_log_file='mysql-bin.000003',
master_log_pos=960,
get_master_public_key=1;
​
start slave;
​
show slave status\G;

参考までに実行結果を記載します

mysql> stop slave;
Query OK, 0 rows affected, 2 warnings (0.00 sec)
​
mysql> reset slave;
Query OK, 0 rows affected, 1 warning (0.07 sec)
​
mysql> change master to master_host='192.168.15.92',
    -> master_port=3306,master_user='test',
    -> master_password='Test12#$',
    -> master_log_file='mysql-bin.000003',
    -> master_log_pos=960,
    -> get_master_public_key=1;
Query OK, 0 rows affected, 10 warnings (0.08 sec)
​
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.04 sec)
​
mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 192.168.15.92
                  Master_User: test
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 960
               Relay_Log_File: relay-bin.000002
                Relay_Log_Pos: 326
        Relay_Master_Log_File: mysql-bin.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 960
              Relay_Log_Space: 530
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 2
                  Master_UUID: 820016c0-131c-11ee-895a-00505682d637
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
       Master_public_key_path: 
        Get_master_public_key: 1
            Network_Namespace: 
1 row in set, 1 warning (0.01 sec)

次の 2 つの構成で YES が表示される場合は、構成が成功したことを意味します。

Slave_IO_Running:  Yes
Slave_SQL_Running: Yes

4.3 マスター-2 でマスターサーバーを構成する

master-2 でマスターサーバーを設定するには、まず master-1 のユーザー名、パスワード、IP、ポート、master_log_file、file、master_log_pos、および get_master_public_key を取得する必要があります。

4.3.1 マスター 1 構成情報の取得

master-1 サーバーの mysql コマンド ラインで、次のように入力します。

show master status;
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 |      157 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

ファイルを取得してコンテンツを配置する

4.3.2 メインサーバーの構成

マスター 2 サーバーの mysql コマンド ラインに戻り、次のコマンドを入力します。

stop slave;
​
reset slave;
​
change master to master_host='192.168.15.94',
master_port=3306,master_user='test',
master_password='Test12#$',
master_log_file='mysql-bin.000002',
master_log_pos=157,
get_master_public_key=1;
​
start slave;
​
show slave status\G;

参考までに実行結果を記載します

mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.03 sec)
​
mysql> reset slave all;
Query OK, 0 rows affected, 1 warning (0.26 sec)
​
mysql> change master to master_host='192.168.15.94',
    -> master_port=3306,master_user='test',
    -> master_password='Test12#$',
    -> master_log_file='mysql-bin.000002',
    -> master_log_pos=157,
    -> get_master_public_key=1;
Query OK, 0 rows affected, 10 warnings (0.12 sec)
​
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.05 sec)
​
mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 192.168.15.94
                  Master_User: test
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 157
               Relay_Log_File: relay-bin.000002
                Relay_Log_Pos: 326
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 157
              Relay_Log_Space: 530
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
                  Master_UUID: b5609587-1307-11ee-96e9-00505682d2a5
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
       Master_public_key_path: 
        Get_master_public_key: 1
            Network_Namespace: 
1 row in set, 1 warning (0.01 sec)

次の 2 つの構成で YES が表示される場合は、構成が成功したことを意味します。

Slave_IO_Running:  Yes
Slave_SQL_Running: Yes

5. デュアルマスター同期のテスト

5.1 マスター 1 ホスト上に同期データベースを作成する

たとえば、abcd を作成し、abcd に t1 などのテスト テーブルを作成します。

mysql> CREATE DATABASE IF NOT EXISTS abcd DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci;
Query OK, 1 row affected (0.04 sec)
​
mysql> use abcd;
Database changed
​
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| abcd               |
| information_schema |
| mydb               |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.00 sec)
​
​
mysql> create table t1(id int,name varchar(20));
Query OK, 0 rows affected (0.30 sec)
​
​
mysql> show tables;
+----------------+
| Tables_in_abcd |
+----------------+
| t1             |
+----------------+
1 row in set (0.00 sec)
​
mysql> select * from t1;
Empty set (0.01 sec)

5.2 マスター 1 の変更がマスター 2 で同期されているかどうかを確認する

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| abcd               |
| information_schema |
| mydb               |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.01 sec)
​
mysql> use abcd;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
​
Database changed
mysql> show tables;
+----------------+
| Tables_in_abcd |
+----------------+
| t1             |
+----------------+
1 row in set (0.00 sec)

5.3 マスター 2 にデータを挿入して、マスター 1 で同期して更新されるかどうかを確認します。

マスター-2

mysql> insert into t1 (id,name) values (3,'李四');
Query OK, 1 row affected (0.01 sec)
​
mysql> select * from t1;
+------+--------+
| id   | name   |
+------+--------+
|    3 | 李四   |
+------+--------+
1 row in set (0.00 sec)

マスター-1

mysql> select * from t1;
+------+--------+
| id   | name   |
+------+--------+
|    3 | 李四   |
+------+--------+
1 row in set (0.00 sec)

データのクエリが実行されたということは、マスター間構成の同期が成功したことを意味します。

6. プライマリ データベースとスタンバイ データベースの両方をシャットダウンし、同期を再度有効にします。

両方のマスターがシャットダウンされており、再構成する必要がある場合は、ステップ 4

7. 主要パラメータの設定

7.1 ステータスパラメータの説明

Slave_IO_state は現在の IO スレッドのステータスを表示し、通常はメイン サーバーへの送信を待機しているバイナリ ログを表示します。
Master_log_file には、現在同期されているマスターサーバーのバイナリログが表示されます。
Read_master_log_pos は、マスターサーバー上のバイナリログに同期された現在のオフセット位置を表示します。
Relay_master_log_file 現在のリレー ログ同期のバイナリ ログ。
Relay_log_file には、現在書き込まれているリレー ログが表示されます。
Relay_log_pos は、リレー ログ内の現在の実行のオフセット位置を表示します。
Slave_IO_running スレーブ サーバーの IO スレッドの実行ステータス。yes は
スレーブ サーバーの SQL スレッドの通常の実行ステータスを表します。 Slave_SQL_running、YES は通常の実行ステータスを表します。 Exec_Master_log_pos は、
マスター サーバーに同期されたバイナリ ログのオフセット位置を表します。

7.2 スレーブを起動および停止するための共通コマンド

STOP SLAVE IO_THREAD; IO プロセスを停止します
STOP SLAVE SQL_THREAD; SQL プロセスを停止します
STOP SLAVE; IO および SQL プロセスを停止します
START SLAVE IO_THREAD; IO プロセスを開始します START SLAVE 
SQL_THREAD; SQL プロセスを開始し
ます START SLAVE; IO および SQL プロセスを開始します
RESET SLAVE; スレーブがマスターのバイナリ ログ内でのレプリケーション位置を忘れ、master.info ファイルとrelay-log.info ファイル、およびすべてのリレー ログが削除され、削除しない場合に新しいリレー ログを開始するために使用されます。マスターが必要 この操作はスレーブから実行できます。
SHOW SLAVE STATUS; MySQL 同期ステータスの表示
STOP SLAVE; SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE; mysql のマスター/スレーブ同期で主キーの競合などのエラーが発生した場合、多くの場合、データがその行は一貫しています このエラーを一時的にスキップしたい場合は、SQL_SLAVE_SKIP_COUNTER = n コマンドを使用する必要があります。n は次の n イベントをスキップすることを意味します。CHANGE MASTER TO 
MASTER_HOST='10.1.1.75'、MASTER_USER='replication'、MASTER_PASSWORD= '123456 ', MASTER_LOG_FILE='mysql-bin.000006', MASTER_LOG_POS=106; START SLAVE; 指定された場所から再同期します

8.キープアライブのインストールと展開

keepalived をマスター 1 サーバーとマスター 2 サーバーにそれぞれインストールします。インストール手順は同じですが、構成ファイルが異なります。以下に説明します。

8.1 依存関係パッケージをインストールし、keepalived をダウンロードする

プラグインの依存関係パッケージをインストールし、keepalived2.2.8 バージョンを /opt ディレクトリにダウンロードして解凍します。

yum -y install gcc openssl-devel popt-devel psmisc
​
yum install wget
Is this ok [y/d/N]: y              #安装wget提示,输入y
​
cd /opt/
​
wget --no-check-certificate https://www.keepalived.org/software/keepalived-2.2.8.tar.gz
​
ll
​
tar -zxvf keepalived-2.2.8.tar.gz 

参考までに実行結果を記載します

[root@skymachine ~]# yum -y install gcc openssl-devel popt-devel psmisc
已加载插件:fastestmirror
Determining fastest mirrors
base                                                                                                                                                 | 1.8 kB  00:00:00     
docker-ce-stable                                                                                                                                     | 1.4 kB  00:00:00     
epel                                                                                                                                                 | 1.8 kB  00:00:00     
extras                                                                                                                                               | 1.4 kB  00:00:00     
...中间省略安装过程代码
作为依赖被安装:
  cpp.x86_64 0:4.8.5-44.el7                  glibc-devel.x86_64 0:2.17-326.el7_9    glibc-headers.x86_64 0:2.17-326.el7_9     kernel-headers.x86_64 0:3.10.0-1160.90.1.el7  
  keyutils-libs-devel.x86_64 0:1.5.8-3.el7   krb5-devel.x86_64 0:1.15.1-55.el7_9    libcom_err-devel.x86_64 0:1.42.9-19.el7   libkadm5.x86_64 0:1.15.1-55.el7_9             
  libmpc.x86_64 0:1.0.1-3.el7                libselinux-devel.x86_64 0:2.5-15.el7   libsepol-devel.x86_64 0:2.5-10.el7        libverto-devel.x86_64 0:0.2.5-4.el7           
  mpfr.x86_64 0:3.1.1-4.el7                  pcre-devel.x86_64 0:8.32-17.el7        zlib-devel.x86_64 0:1.2.7-21.el7_9       
​
作为依赖被升级:
  e2fsprogs.x86_64 0:1.42.9-19.el7        e2fsprogs-libs.x86_64 0:1.42.9-19.el7      glibc.x86_64 0:2.17-326.el7_9              glibc-common.x86_64 0:2.17-326.el7_9     
  krb5-libs.x86_64 0:1.15.1-55.el7_9      libcom_err.x86_64 0:1.42.9-19.el7          libgcc.x86_64 0:4.8.5-44.el7               libgomp.x86_64 0:4.8.5-44.el7            
  libss.x86_64 0:1.42.9-19.el7            openssl.x86_64 1:1.0.2k-26.el7_9           openssl-libs.x86_64 1:1.0.2k-26.el7_9      zlib.x86_64 0:1.2.7-21.el7_9             
​
完毕!
​
[root@skymachine opt]# yum install wget
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
正在解决依赖关系
--> 正在检查事务
---> 软件包 wget.x86_64.0.1.14-18.el7_6.1 将被 安装
--> 解决依赖关系完成
​
依赖关系解决
​
============================================================================================================================================================================
 Package                               架构                                    版本                                             源                                     大小
============================================================================================================================================================================
正在安装:
 wget                                  x86_64                                  1.14-18.el7_6.1                                  base                                  547 k
​
事务概要
============================================================================================================================================================================
安装  1 软件包
​
总下载量:547 k
安装大小:2.0 M
Is this ok [y/d/N]: y
Downloading packages:
wget-1.14-18.el7_6.1.x86_64.rpm                                                                                                                      | 547 kB  00:00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  正在安装    : wget-1.14-18.el7_6.1.x86_64                                                                                                                             1/1 
  验证中      : wget-1.14-18.el7_6.1.x86_64                                                                                                                             1/1 
​
已安装:
  wget.x86_64 0:1.14-18.el7_6.1                                                                                                                                             
​
完毕!
[root@skymachine ~]# cd /opt/
​
[root@skymachine opt]# wget --no-check-certificate https://www.keepalived.org/software/keepalived-2.2.8.tar.gz
​
--2023-06-27 09:32:19--  https://www.keepalived.org/software/keepalived-2.2.8.tar.gz
正在解析主机 www.keepalived.org (www.keepalived.org)... 91.121.30.175, 2001:41d0:1:71af::1
正在连接 www.keepalived.org (www.keepalived.org)|91.121.30.175|:443... 已连接。
警告: 无法验证 www.keepalived.org 的由 “/C=US/O=Let's Encrypt/CN=R3” 颁发的证书:
  颁发的证书已经过期。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:1202602 (1.1M) [application/octet-stream]
正在保存至: “keepalived-2.2.8.tar.gz”
​
100%[==================================================================================================================================>] 1,202,602    868KB/s 用时 1.4s   
​
2023-06-27 09:32:21 (868 KB/s) - 已保存 “keepalived-2.2.8.tar.gz” [1202602/1202602])
​
[root@skymachine opt]# ll
总用量 1180
-rw-r--r--  1 root root 1202602 5月  31 18:37 keepalived-2.2.8.tar.gz
drwxr-xr-x  3 root root      75 6月  25 13:49 software
​
[root@skymachine opt]# tar -zxvf keepalived-2.2.8.tar.gz 
keepalived-2.2.8/
keepalived-2.2.8/tools/
keepalived-2.2.8/tools/timed_reload
keepalived-2.2.8/Dockerfile.in
keepalived-2.2.8/Makefile.in
keepalived-2.2.8/build-aux/
...中间省略安装过程代码
keepalived-2.2.8/keepalived/check/check_file.c
keepalived-2.2.8/keepalived/check/check_tcp.c
keepalived-2.2.8/keepalived/check/libipvs.c
keepalived-2.2.8/configure.ac
keepalived-2.2.8/aclocal.m4

8.2 キープアライブの設定とコンパイル

cd keepalived-2.2.8
​
 ./configure --prefix=/opt/keepalived-2.2.8
​
make && make install

参考までに実行結果を記載します

[root@skymachine opt]# cd keepalived-2.2.8
​
[root@skymachine keepalived-2.2.8]#   ./configure --prefix=/opt/keepalived-2.2.8
​
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a race-free mkdir -p... /usr/bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking whether make supports nested variables... (cached) yes
​
...中间省略安装过程代码
​
Strict config checks     : No
Build documentation      : No
Default runtime options  : -D
​
*** WARNING - this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS.
​
[root@skymachine keepalived-2.2.8]#  make && make install
Making all in lib
make[1]: 进入目录“/opt/keepalived-2.2.8/lib”
make  all-am
make[2]: 进入目录“/opt/keepalived-2.2.8/lib”
  CC       memory.o
  CC       utils.o
utils.c: 在函数‘dump_buffer’中:
utils.c:106:5: 警告:无法优化可能无穷的循环 [-Wunsafe-loop-optimizations]
     for (j = i - 15; j <= i; j++)
     ^
     
...中间省略安装过程代码
​
make[3]: 对“install-data-hook”无需做任何事。
make[3]: 离开目录“/opt/keepalived-2.2.8”
make[2]: 离开目录“/opt/keepalived-2.2.8”
make[1]: 离开目录“/opt/keepalived-2.2.8”

8.3 ファイルを対応するディレクトリにコピーします。

[root@128 keepalived-2.2.7]# mkdir /etc/keepalived
[root@128 keepalived-2.2.7]# cp keepalived/etc/keepalived/keepalived.conf.sample /etc/keepalived/keepalived.conf
[root@128 keepalived-2.2.7]# cp keepalived/etc/init.d/keepalived /etc/init.d/
[root@128 keepalived-2.2.7]# cp keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@128 keepalived-2.2.7]# cp bin/keepalived /usr/sbin/

8.4 新しい shutdown.sh ファイルの作成

vi /etc/keepalived/keepalived.conf
内容は
#!/bin/bash
#该脚本是在mysql服务出现异常时,将keepalived应用停止,从而使虚拟vip主机自动连接到另一台mysql上
killall keepalived

保存して終了し、実行権限を実行可能ファイルに設定します

[root@skymachine keepalived]# chmod +x /etc/keepalived/shutdown.sh

8.5 ifconfig でネットワークカード名を確認する

ローカルネットワークカードの名前はens192です。

[root@skymachine keepalived-2.2.8]# ifconfig
ens192: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.15.94  netmask 255.255.255.0  broadcast 192.168.15.255
        inet6 fe80::5952:cea:7d3a:9438  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::e689:8ec0:4cf9:2338  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::ce71:1610:b52d:de15  prefixlen 64  scopeid 0x20<link>
        ether 00:50:56:82:d1:76  txqueuelen 1000  (Ethernet)
        RX packets 737719  bytes 964242277 (919.5 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 398867  bytes 29004910 (27.6 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
​
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 58  bytes 5076 (4.9 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 58  bytes 5076 (4.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

8.6 マスター 1 サーバーのキープアライブ設定ファイルを変更する

元の keepalived.conf の名前を keepalived_bak.conf に変更し、新しい keepalived.conf 構成ファイルを作成します。

cd /etc/keepalived/
[root@skymachine keepalived]# ll
总用量 4
-rw-r--r-- 1 root root 3550 6月  27 09:34 keepalived.conf
[root@skymachine keepalived]# mv keepalived.conf  keepalived_bak.conf
[root@skymachine keepalived]# ll
总用量 4
-rw-r--r-- 1 root root 3550 6月  27 09:34 keepalived_bak.conf
[root@skymachine keepalived]#  vi /etc/keepalived/keepalived.conf

次の内容をコピーします

! Configuration File for keepalived
​
#主要配置故障发生时的通知对象及机器标识
global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id MYSQL-1                   #主机标识符,唯一即可
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
​
#用来定义对外提供服务的VIP区域及相关属性
vrrp_instance VI_1 {
    state BACKUP                     #表示keepalived角色,都是设成BACKUP则以优先级为主要参考
    interface ens192                 #指定HA监听的网络接口,刚才ifconfig查看的接口名称
    virtual_router_id 151            #虚拟路由标识,取值0-255,master-1和master-2保持一致
    priority 100                     #优先级,用来选举master,取值范围1-255
    advert_int 1                     #发VRRP包时间间隔,即多久进行一次master选举
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {              #虚拟出来的地址
        192.168.15.100
    }
}
​
#虚拟服务器定义
virtual_server 192.168.15.100 3306 { #虚拟出来的地址加端口
    delay_loop 2                     #设置运行情况检查时间,单位为秒
    lb_algo rr                       #设置后端调度器算法,rr为轮询算法
    lb_kind DR                       #设置LVS实现负载均衡的机制,有DR、NAT、TUN三种模式可选
    persistence_timeout 50           #会话保持时间,单位为秒
    protocol TCP                     #指定转发协议,有 TCP和UDP可选
​
        real_server 192.168.15.94 3306 {          #实际本地ip+3306端口
       weight=5                      #表示服务器的权重值。权重值越高,服务器在负载均衡中被选中的概率就越大
        #当该ip 端口连接异常时,执行该脚本
        notify_down /etc/keepalived/shutdown.sh   #检查mysql服务down掉后执行的脚本
        TCP_CHECK {
            #实际物理机ip地址
            connect_ip 192.168.15.94
            #实际物理机port端口
            connect_port 3306
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
​
        }
    }
}
​

8.7 マスター 2 サーバーのキープアライブ設定ファイルを変更する

元の keepalived.conf の名前を keepalived_bak.conf に変更し、新しい keepalived.conf 構成ファイルを作成します。

cd /etc/keepalived/
[root@skymachine keepalived]# ll
总用量 4
-rw-r--r-- 1 root root 3550 6月  27 09:34 keepalived.conf
[root@skymachine keepalived]# mv keepalived.conf  keepalived_bak.conf
[root@skymachine keepalived]# ll
总用量 4
-rw-r--r-- 1 root root 3550 6月  27 09:34 keepalived_bak.conf
[root@skymachine keepalived]#  vi /etc/keepalived/keepalived.conf

以下の内容をコピーします。master-1 の設定との違いは、router_id、priority、real_server、connect_ip の 4 つの設定です。

! Configuration File for keepalived
​
#主要配置故障发生时的通知对象及机器标识
global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id MYSQL-2                   #主机标识符,唯一即可
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
​
#用来定义对外提供服务的VIP区域及相关属性
vrrp_instance VI_1 {
    state BACKUP                     #表示keepalived角色,都是设成BACKUP则以优先级为主要参考
    interface ens192                 #指定HA监听的网络接口,刚才ifconfig查看的接口名称
    virtual_router_id 151            #虚拟路由标识,取值0-255,master-1和master-2保持一致
    priority 40                      #优先级,用来选举master,取值范围1-255
    advert_int 1                     #发VRRP包时间间隔,即多久进行一次master选举
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {              #虚拟出来的地址
        192.168.15.100
    }
}
​
#虚拟服务器定义
virtual_server 192.168.15.100 3306 { #虚拟出来的地址加端口
    delay_loop 2                     #设置运行情况检查时间,单位为秒
    lb_algo rr                       #设置后端调度器算法,rr为轮询算法
    lb_kind DR                       #设置LVS实现负载均衡的机制,有DR、NAT、TUN三种模式可选
    persistence_timeout 50           #会话保持时间,单位为秒
    protocol TCP                     #指定转发协议,有 TCP和UDP可选
​
        real_server 192.168.15.92 3306 {          #实际本地ip+3306端口
       weight=5                      #表示服务器的权重值。权重值越高,服务器在负载均衡中被选中的概率就越大
        #当该ip 端口连接异常时,执行该脚本
        notify_down /etc/keepalived/shutdown.sh   #检查mysql服务down掉后执行的脚本
        TCP_CHECK {
            #实际物理机ip地址
            connect_ip 192.168.15.92
            #实际物理机port端口
            connect_port 3306
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
​
        }
    }
}
​

8.8 キープアライブサービスの開始

マスター 1 およびマスター 2 サーバーのキープアライブ サービスを開始します。

[root@skymachine keepalived]# systemctl start keepalived
[root@skymachine keepalived]# systemctl status keepalived
systemctl enable keepalived #开机启动,根据需求设置

起動後のキープアライブのステータスはアクティブ (実行中) になります。これは正常です。

参考までに実行結果を記載します

[root@skymachine keepalived]# systemctl start keepalived
[root@skymachine keepalived]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)
   Active: active (running) since 二 2023-06-27 09:53:23 CST; 4s ago
     Docs: man:keepalived(8)
           man:keepalived.conf(5)
           man:genhash(1)
           https://keepalived.org
  Process: 20817 ExecStart=/opt/keepalived-2.2.8/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 20818 (keepalived)
   CGroup: /system.slice/keepalived.service
           ├─20818 /opt/keepalived-2.2.8/sbin/keepalived -D
           ├─20819 /opt/keepalived-2.2.8/sbin/keepalived -D
           └─20820 /opt/keepalived-2.2.8/sbin/keepalived -D
​
6月 27 09:53:26 skymachine Keepalived_vrrp[20820]: (VI_1) received lower priority (40) advert from 192.168.15.92 - discarding
6月 27 09:53:26 skymachine Keepalived_vrrp[20820]: (VI_1) Receive advertisement timeout
6月 27 09:53:26 skymachine Keepalived_vrrp[20820]: (VI_1) Entering MASTER STATE
6月 27 09:53:26 skymachine Keepalived_vrrp[20820]: (VI_1) setting VIPs.
6月 27 09:53:26 skymachine Keepalived_vrrp[20820]: (VI_1) Sending/queueing gratuitous ARPs on ens192 for 192.168.15.100
6月 27 09:53:26 skymachine Keepalived_vrrp[20820]: Sending gratuitous ARP on ens192 for 192.168.15.100
6月 27 09:53:26 skymachine Keepalived_vrrp[20820]: Sending gratuitous ARP on ens192 for 192.168.15.100
6月 27 09:53:26 skymachine Keepalived_vrrp[20820]: Sending gratuitous ARP on ens192 for 192.168.15.100
6月 27 09:53:26 skymachine Keepalived_vrrp[20820]: Sending gratuitous ARP on ens192 for 192.168.15.100
6月 27 09:53:26 skymachine Keepalived_vrrp[20820]: Sending gratuitous ARP on ens192 for 192.168.15.100

8.9 仮想IPログインユーザーの設定

両方のサーバーに新しいユーザーを作成して、キープアライブ サービスが正常に構成されているかどうかを確認します。

useradd -m keepalived
​
passwd keepalived
​
Qwe135.

参考までに実行結果を記載します

[root@skymachine ~]# useradd -m keepalived
[root@skymachine ~]# passwd keepalived
更改用户 keepalived 的密码 。
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。

8.10 キープアライブサービスをテストする

起動後は、vip 192.168.15.100 を仮想化するのと同じになります。ssh ツールを使用してサーバーに接続します。ip、ユーザー名、パスワードを入力します。仮想 IP にログインして接続します。ifconfig を使用して、実際の IP アドレスを確認します。仮想 vip が使用する物理サーバーは master-1. (192.168.15.94) サーバーです。

[root@skymachine keepalived]# systemctl stop keepalived

マスター 1 (192.168.15.94) サーバーのキープアライブ アプリケーションを停止します。192.168.15.100 サーバーが切断されます。再接続します。192.168.15.100 サービスの ifconfig を再度確認します。192.168.15.100 サーバーが物理マシンを自動的にドリフトしていることがわかります。マスターへの IP。サーバー上では -2(192.168.15.92)

94 サーバーで systemctl stop keepalived を実行します。
[root@skymachine keepalived]# systemctl stop keepalived

9. Mysql デュアル マスター デュアル アクティブ + キープアライブ高可用性全体テスト

9.1 サービスを開始します(再度開始する必要はありません)

まず、2 つのサーバー master-1 と master-2 ですべての mysql アプリケーションと keepalived アプリケーションを起動し、次に新しいユーザーを作成して、外部ネットワークにアクセスするための権限を構成します。

mysql> CREATE DATABASE IF NOT EXISTS mydb DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci;
Query OK, 1 row affected (0.10 sec)
​
mysql> create user 'user01'@'%' identified by 'Mysql12#$';
Query OK, 0 rows affected (0.19 sec)
​
mysql> grant all privileges on `mydb`.* to 'user01'@'%' ;
Query OK, 0 rows affected (0.02 sec)
​
mysql> flush privileges; 
Query OK, 0 rows affected (0.02 sec)
​
mysql> select user,host from mysql.user;
+------------------+--------------+
| user             | host         |
+------------------+--------------+
| user01           | %            |
| test             | 192.168.15.% |
| mysql.infoschema | localhost    |
| mysql.session    | localhost    |
| mysql.sys        | localhost    |
| root             | localhost    |
+------------------+--------------+
6 rows in set (0.00 sec)

9.2 キープアライブ仮想サーバーへの接続

mysql 接続ツールを使用して、keepalived 仮想サーバー 192.168.15.100 に接続します。

9.3 テストデータの作成 

192.168.15.100 データベース mydb テスト ライブラリに新しいテーブルを作成し、そのテーブルにデータを挿入します。

drop table ceshi1;
​
CREATE TABLE ceshi1(
    ID int,
    NAME VARCHAR(255),
    subject VARCHAR(18),
    score int);
insert into ceshi1  values(1,'张三','数学',90);
insert into ceshi1  values(2,'张三','语文',70);
​
select * from ceshi1;

9.4 マスター1とマスター2の同期状態を確認する

この時点では、master-1 データベースと master-2 データベースを表示でき、データは同期されています。

9.5 100台のサーバの実物理マシンIPを確認する

ifconfig コマンドを使用して、使用されている実際の物理マシンが 192.168.15.94 であることを確認します。つまり、master-1 (192.168.15.94) サーバー mysql がメイン データベースであることを確認します。

9.6 物理マシンの mysql サービスを停止する

この時点で、マスター 1 サーバーの mysql を手動で停止します。Keepalived は、192.168.15.94 サービス 3306 ポートの接続が失敗したことを検出します。/etc/keepalived/shutdown.sh スクリプトが実行され、192.168.15.94 サーバーの keepalived アプリケーションが終了します。

[root@skymachine ~]# service mysql stop
Shutting down MySQL............. SUCCESS! 

9.7 ドリフトIPの実行状況を確認する

このとき、192.168.15.100 サービスに接続して ifconfig を確認すると、実際には物理マシンが master-1 (192.168.15.94) サーバーから master-2 (192.168.15.92) サーバーに移動されていることがわかります。

9.8 新しいプライマリ サーバーにデータを挿入する

次に、mysql 接続ツールを使用して 192.168.15.100 の mysql に接続し、データを挿入し、そのデータがマスター 2 (192.168.15.92) サーバーの mysql に保存されているかどうかをテストします。

insert into ceshi1 values(6,'李四','英语',94);

9.9 新しいマスターサーバーデータの表示

マスター 2 サーバーの mysql データを確認します。データは同期されており、keepalived が高可用性を正常に確立したことを示しています。マスター 1 サーバーの mysql に問題がある場合、keepalived は自動的に IP を物理マシンのマスター 2 サーバーにドリフトします。マスター 2 サーバーの mysql がマスター データベースになります。

9.10 master-1 サービスを再起動し、データ同期ステータスを確認します。

この時点で、master-1 (192.168.15.94) サーバーの mysql と keepalived アプリケーションを起動します。

service mysql start
systemctl start keepalived
systemctl status keepalived

 参考までに実行結果を記載します

[root@skymachine ~]# service mysql start
Starting MySQL... SUCCESS! 
[root@skymachine ~]# systemctl start keepalived
[root@skymachine ~]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)
   Active: active (running) since 二 2023-06-27 20:24:07 CST; 7s ago
     Docs: man:keepalived(8)
           man:keepalived.conf(5)
           man:genhash(1)
           https://keepalived.org
  Process: 23869 ExecStart=/opt/keepalived-2.2.8/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 23870 (keepalived)
   CGroup: /system.slice/keepalived.service
           ├─23870 /opt/keepalived-2.2.8/sbin/keepalived -D
           ├─23871 /opt/keepalived-2.2.8/sbin/keepalived -D
           └─23872 /opt/keepalived-2.2.8/sbin/keepalived -D
​
6月 27 20:24:10 skymachine Keepalived_vrrp[23872]: (VI_1) received lower priority (40) advert from 192.168.15.92 - discarding
6月 27 20:24:10 skymachine Keepalived_vrrp[23872]: (VI_1) Receive advertisement timeout
6月 27 20:24:10 skymachine Keepalived_vrrp[23872]: (VI_1) Entering MASTER STATE
6月 27 20:24:10 skymachine Keepalived_vrrp[23872]: (VI_1) setting VIPs.
6月 27 20:24:10 skymachine Keepalived_vrrp[23872]: (VI_1) Sending/queueing gratuitous ARPs on ens192 for 192.168.15.100
6月 27 20:24:10 skymachine Keepalived_vrrp[23872]: Sending gratuitous ARP on ens192 for 192.168.15.100
6月 27 20:24:10 skymachine Keepalived_vrrp[23872]: Sending gratuitous ARP on ens192 for 192.168.15.100
6月 27 20:24:10 skymachine Keepalived_vrrp[23872]: Sending gratuitous ARP on ens192 for 192.168.15.100
6月 27 20:24:10 skymachine Keepalived_vrrp[23872]: Sending gratuitous ARP on ens192 for 192.168.15.100
6月 27 20:24:10 skymachine Keepalived_vrrp[23872]: Sending gratuitous ARP on ens192 for 192.168.15.100

master-1 データベース ceshi1 テーブルのデータを確認すると、データは正常に同期されています。 

この時点で、mysql デュアルマスター デュアルアクティブ + キープアライブの高可用性の展開とテストが完了しました。

10. まとめ

1. 高可用性ソリューションとしてキープアライブを使用する場合、2 つのノードで同じデータが誤ってプリエンプションされることによって引き起こされる競合を避けるために、両方のノードを BACKUP モードに設定することが最善です。

2. 2 つのノードの auto_increment_increment (自己インクリメント ステップ サイズ) と auto_increment_offset (ワード インクリメント開始値) を異なる値に設定します。これは、マスター ノードが予期せずダウンしたときに、一部のバイナリ ログがノードにコピーされないことを避けるためです。これはスレーブに適用されるため、スレーブに新しく書き込まれたデータの自己インクリメント値が元のマスターと競合するため、最初からずらされます。

3. スレーブ ノード サーバーの構成が貧弱すぎてはなりません。そうでない場合、レプリケーションの遅延が発生する可能性が高くなります。ホット スタンバイ ノードのスレーブ サーバーとして、ハードウェア構成をマスター ノードのハードウェア構成より低くすることはできません。

レイテンシに非常に敏感な場合は、MariaDB ブランチ バージョンの使用を検討してください。マルチスレッド レプリケーションにより、レプリケーションのレイテンシを大幅に短縮できます。

個人組織、非専門家

参考記事

1. Mysql+Keepalived で mysql の高可用性を実現 データベース_keepalived データベース_KaiA8 のブログ - CSDN ブログ

2. Mysql クラスターの mysql デュアルマスター デュアルアクティブ + keepalived による高可用性の実現_mysql+keepalived セットアップ チュートリアル_Tiandaohouqin-L のブログ - CSDN ブログ

おすすめ

転載: blog.csdn.net/m0_61388193/article/details/131430091