1. 程式人生 > 實用技巧 >MySQL 雙主複製 + keepalived

MySQL 雙主複製 + keepalived

參考:
https://www.jianshu.com/p/38223585e5ba
https://blog.csdn.net/xiaoyi23000/article/details/80525625
https://blog.csdn.net/u011310274/article/details/77775632
https://www.cnblogs.com/benjamin77/p/8682360.html
https://blog.csdn.net/zt15732625878/article/details/86493096
https://blog.51cto.com/853056088/2465855

1.雙主規劃

架構:雙主複製+keepalived
mysql01:  192.168.10.161 3306
mysql02:  192.168.10.162 3306
keepalived: 192.168.10.160

作業系統:  CentOS 7 x64
資料庫版本:mysql-5.7.28

備註:MySQL 安裝過程省略。

2.修改引數

#mysql01
[mysqld]
user      = mysql
basedir   = /usr/local/mysql
datadir   = /data/3306
pid-file  = /data/3306/mysql_3306.pid
socket    = /tmp/mysql3306.sock
port      = 3306
server_id = 330601

log_error       = /data/3306/mysql.log
log_timestamps = system

log_bin         = /data/3306/mysql-bin
binlog_format  = row

gtid-mode = on
enforce-gtid-consistency = true
log-slave-updates=1

#binlog-do-db=mydb01,mydb02
#binlog-ignore-db=mysql
#binlog-ignore-db=information_schema
auto-increment-increment= 2
auto-increment-offset = 1

expire_logs_days    = 15

slow_query_log      = 1
slow_query_log_file = /data/3306/slow.log
long_query_time     = 2
log_queries_not_using_indexes


#mysql02
[mysqld]
user      = mysql
basedir   = /usr/local/mysql
datadir   = /data/3306
pid-file  = /data/3306/mysql_3306.pid
socket    = /tmp/mysql3306.sock
port      = 3306
server_id = 330602


log_error       = /data/3306/mysql.log
log_timestamps = system

log_bin         = /data/3306/mysql-bin
binlog_format  = row

gtid-mode = on
enforce-gtid-consistency = true
log-slave-updates=1

#binlog-do-db=mydb01,mydb02
#binlog-ignore-db=mysql
#binlog-ignore-db=information_schema
auto-increment-increment= 2
auto-increment-offset = 2

expire_logs_days    = 15

slow_query_log      = 1
slow_query_log_file = /data/3306/slow.log
long_query_time     = 2
log_queries_not_using_indexes


#重啟mysql

#mysql01
systemctl stop mysqld3306
systemctl stop mysqld3306

#mysql02
systemctl start mysqld3306
systemctl start mysqld3306

3.主從1:mysql01 -> mysql02

#mysql01 
GRANT REPLICATION SLAVE ON *.* TO'repl1'@'%' IDENTIFIED BY '123';

#mysql02
change master to 
master_host='192.168.10.161',
master_port=3306,
master_user='repl1', 
master_password='123', 
master_auto_position=1;

start slave;

4.主從2:mysql02 -> mysql01

#mysql02
GRANT REPLICATION SLAVE ON *.* TO'repl2'@'%' IDENTIFIED BY '123';

#mysql01
change master to 
master_host='192.168.10.162',
master_port=3306,
master_user='repl2', 
master_password='123', 
master_auto_position=1;

start slave;

5.安裝keepalived

yum -y install -y openssl-devel
yum -y install gcc gcc-c++
yum -y install libnl libnl-devel  
yum -y install libnfnetlink-devel
yum -y install wget

mkdir /etc/keepalived
wget https://www.keepalived.org/software/keepalived-2.0.18.tar.gz
tar -zxvf keepalived-2.0.18.tar.gz
mv keepalived-2.0.18 /usr/local/keepalived

cd /usr/local/keepalived
./configure && make && make install

cp  -a /usr/local/etc/keepalived   /etc/init.d/
cp  -a /usr/local/etc/sysconfig/keepalived    /etc/sysconfig/
cp  -a /usr/local/sbin/keepalived    /usr/sbin/

6.配置keepalived

#mysql01
cat > /etc/keepalived/keepalived.conf << EOF
! Configuration File for keepalived
       
global_defs {
notification_email {
[email protected]
[email protected]
}
       
notification_email_from [email protected]
smtp_server 127.0.0.1 
smtp_connect_timeout 30
router_id MASTER-HA
}
       
vrrp_script chk_mysql_port {     #檢測mysql服務是否在執行。有很多方式,比如程序,用指令碼檢測等等
    script "/opt/chk_mysql.sh"   #這裡通過指令碼監測
    interval 2                   #指令碼執行間隔,每2s檢測一次
    weight -5                    #指令碼結果導致的優先順序變更,檢測失敗(指令碼返回非0)則優先順序 -5
    fall 2                    #檢測連續2次失敗才算確定是真失敗。會用weight減少優先順序(1-255之間)
    rise 1                    #檢測1次成功就算成功。但不修改優先順序
}
       
vrrp_instance VI_1 {
    state MASTER    
    interface ens33      #指定虛擬ip的網絡卡介面
    mcast_src_ip 192.168.10.161
    virtual_router_id 51    #路由器標識,MASTER和BACKUP必須是一致的
    priority 101            #定義優先順序,數字越大,優先順序越高,在同一個vrrp_instance下,MASTER的優先順序必須大於BACKUP的優先順序。這樣MASTER故障恢復後,就可以將VIP資源再次搶回來 
    advert_int 1         
    authentication {   
        auth_type PASS 
        auth_pass 1111     
    }
    virtual_ipaddress {    
        192.168.10.160
    }
      
track_script {               
   chk_mysql_port             
}
}
EOF


#mysql02
cat > /etc/keepalived/keepalived.conf << EOF
! Configuration File for keepalived
       
global_defs {
notification_email {
[email protected]
[email protected]
}
       
notification_email_from [email protected]
smtp_server 127.0.0.1 
smtp_connect_timeout 30
router_id MASTER-HA
}
       
vrrp_script chk_mysql_port {
    script "/opt/chk_mysql.sh"
    interval 2            
    weight -5                 
    fall 2                 
    rise 1               
}
       
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    mcast_src_ip 192.168.10.162
    virtual_router_id 51    
    priority 99          
    advert_int 1         
    authentication {   
        auth_type PASS 
        auth_pass 1111     
    }
    virtual_ipaddress {    
        192.168.10.160
    }
      
track_script {               
   chk_mysql_port             
}
}
EOF

7.配置mysql狀態檢查指令碼

#mysql01 and mysql02
cat >/opt/chk_mysql.sh <<'EOF'
#!/bin/bash
counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
if [ "${counter}" -eq 0 ]; then
    /etc/init.d/keepalived stop
fi
EOF

8.啟動keepalived

#mysql01 
netstat -lnp|grep 330   #確認mysql服務啟動狀態
systemctl enable keepalived
systemctl start keepalived

#mysql02 
netstat -lnp|grep 330   #確認mysql服務啟動狀態
systemctl enable keepalived
systemctl start keepalived

9.測試

#mysql01 

#1.檢查當前192.168.10.160 MySQL 連線。
[root@mysql01 ~]#  mysql -h192.168.10.160 -P3306 -uroot -p123456 -e 'select @@server_id;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+-------------+
| @@server_id |
+-------------+
|       33061 |
+-------------+

#2.檢查當前192.168.10.161 keepalived服務狀態。
[root@mysql01 ~]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2020-11-23 19:37:46 CST; 58min ago
  Process: 6666 ExecStart=/usr/local/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 6667 (keepalived)
   CGroup: /system.slice/keepalived.service
           ├─6667 /usr/local/sbin/keepalived -D
           └─6668 /usr/local/sbin/keepalived -D
Nov 23 20:09:04 mysql01 Keepalived_vrrp[6668]: Sending gratuitous ARP on ens33 for 192.168.10.160
Nov 23 20:09:09 mysql01 Keepalived_vrrp[6668]: (VI_1) Sending/queueing gratuitous ARPs on ens33 for 192.168.10.160
Nov 23 20:09:09 mysql01 Keepalived_vrrp[6668]: Sending gratuitous ARP on ens33 for 192.168.10.160

#3.停止 192.168.10.161 MySQL服務。
[root@mysql01 ~]# ps -ef|grep 3306
root     12846 12811  0 20:07 pts/1    00:00:00 mysql -h192.168.10.160 -P3306 -uroot -px xxxx
mysql    13205     1  0 20:08 ?        00:00:02 /usr/local/mysql/bin/mysqld --defaults-file=/data/3306/my.cnf
root     18582 16424  0 20:38 pts/2    00:00:00 grep --color=auto 330
[root@mysql01 ~]# kill -9 13205

#4.檢查當前192.168.10.161 keepalived服務狀態。
[root@mysql01 ~]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2020-11-23 19:37:46 CST; 1h 3min ago
  Process: 6666 ExecStart=/usr/local/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 6667 (keepalived)
   CGroup: /system.slice/keepalived.service
           ├─6667 /usr/local/sbin/keepalived -D
           └─6668 /usr/local/sbin/keepalived -D

Nov 23 20:09:04 mysql01 Keepalived_vrrp[6668]: Sending gratuitous ARP on ens33 for 192.168.10.160
Nov 23 20:09:09 mysql01 Keepalived_vrrp[6668]: (VI_1) Sending/queueing gratuitous ARPs on ens33 for 192.168.10.160
Nov 23 20:09:09 mysql01 Keepalived_vrrp[6668]: Sending gratuitous ARP on ens33 for 192.168.10.160
Nov 23 20:40:51 mysql01 Keepalived_vrrp[6668]: Script `chk_mysql_port` now returning 126
Nov 23 20:40:53 mysql01 Keepalived_vrrp[6668]: VRRP_Script(chk_mysql_port) failed (exited with status 126)
Nov 23 20:40:53 mysql01 Keepalived_vrrp[6668]: (VI_1) Changing effective priority from 101 to 96

#5.檢查當前192.168.10.160 MySQL 連線。
[root@mysql01 ~]#  mysql -h192.168.10.160 -P3306 -uroot -p123456 -e 'select @@server_id;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+-------------+
| @@server_id |
+-------------+
|       33062 |
+-------------+



#mysql02
#6.檢查當前192.168.10.162 keepalived服務狀態。
[root@mysql02 ~]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2020-11-23 19:38:11 CST; 1h 3min ago
  Process: 21069 ExecStart=/usr/local/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 21070 (keepalived)
   CGroup: /system.slice/keepalived.service
           ├─21070 /usr/local/sbin/keepalived -D
           └─21071 /usr/local/sbin/keepalived -D

Nov 23 20:40:57 mysql02 Keepalived_vrrp[21071]: Sending gratuitous ARP on ens33 for 192.168.10.160
Nov 23 20:40:57 mysql02 Keepalived_vrrp[21071]: Sending gratuitous ARP on ens33 for 192.168.10.160
Nov 23 20:40:57 mysql02 Keepalived_vrrp[21071]: Sending gratuitous ARP on ens33 for 192.168.10.160
Nov 23 20:40:57 mysql02 Keepalived_vrrp[21071]: Sending gratuitous ARP on ens33 for 192.168.10.160
Nov 23 20:41:02 mysql02 Keepalived_vrrp[21071]: Sending gratuitous ARP on ens33 for 192.168.10.160
Nov 23 20:41:02 mysql02 Keepalived_vrrp[21071]: (VI_1) Sending/queueing gratuitous ARPs on ens33 for 192.168.10.160
Nov 23 20:41:02 mysql02 Keepalived_vrrp[21071]: Sending gratuitous ARP on ens33 for 192.168.10.160
Nov 23 20:41:02 mysql02 Keepalived_vrrp[21071]: Sending gratuitous ARP on ens33 for 192.168.10.160
Nov 23 20:41:02 mysql02 Keepalived_vrrp[21071]: Sending gratuitous ARP on ens33 for 192.168.10.160
Nov 23 20:41:02 mysql02 Keepalived_vrrp[21071]: Sending gratuitous ARP on ens33 for 192.168.10.160

#mysql01
#7.檢查當前192.168.10.161 啟動MySQL服務。
[root@mysql01 ~]# systemctl start mysqld3306

#8.檢查當前192.168.10.161 keepalived服務狀態。
[root@mysql01 ~]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2020-11-23 19:37:46 CST; 1h 11min ago
  Process: 6666 ExecStart=/usr/local/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 6667 (keepalived)
   CGroup: /system.slice/keepalived.service
           ├─6667 /usr/local/sbin/keepalived -D
           └─6668 /usr/local/sbin/keepalived -D
Nov 23 20:40:53 mysql01 Keepalived_vrrp[6668]: VRRP_Script(chk_mysql_port) failed (exited with status 126)
Nov 23 20:40:53 mysql01 Keepalived_vrrp[6668]: (VI_1) Changing effective priority from 101 to 96
Nov 23 20:40:56 mysql01 Keepalived_vrrp[6668]: (VI_1) Master received advert from 192.168.10.162 with higher priority 99, ours 96
Nov 23 20:40:56 mysql01 Keepalived_vrrp[6668]: (VI_1) Entering BACKUP STATE
Nov 23 20:40:56 mysql01 Keepalived_vrrp[6668]: (VI_1) removing VIPs.
Nov 23 20:49:33 mysql01 Keepalived_vrrp[6668]: Script `chk_mysql_port` now returning 0
Nov 23 20:49:33 mysql01 Keepalived_vrrp[6668]: VRRP_Script(chk_mysql_port) succeeded
Nov 23 20:49:33 mysql01 Keepalived_vrrp[6668]: (VI_1) Changing effective priority from 96 to 101
Nov 23 20:49:33 mysql01 Keepalived_vrrp[6668]: (VI_1) received lower priority (99) advert from 192.168.10.162 - discarding
Nov 23 20:49:34 mysql01 Keepalived_vrrp[6668]: (VI_1) received lower priority (99) advert from 192.168.10.162 - discarding

#9.再次檢查當前192.168.10.160 MySQL 連線。
[root@mysql01 ~]#  mysql -h192.168.10.160 -P3306 -uroot -p123456 -e 'select @@server_id;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+-------------+
| @@server_id |
+-------------+
|       33061 |
+-------------+

備註:可以看出,再次啟動 主機mysql01 上MySQL服務,keepalived將 192.168.10.160 切換到 mysql01 主機上。


#mysql02
#10.檢查當前192.168.10.162 keepalived服務狀態。
[root@mysql02 ~]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2020-11-23 19:38:11 CST; 1h 16min ago
  Process: 21069 ExecStart=/usr/local/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 21070 (keepalived)
   CGroup: /system.slice/keepalived.service
           ├─21070 /usr/local/sbin/keepalived -D
           └─21071 /usr/local/sbin/keepalived -D
Nov 23 20:40:57 mysql02 Keepalived_vrrp[21071]: Sending gratuitous ARP on ens33 for 192.168.10.160
Nov 23 20:41:02 mysql02 Keepalived_vrrp[21071]: Sending gratuitous ARP on ens33 for 192.168.10.160
Nov 23 20:41:02 mysql02 Keepalived_vrrp[21071]: (VI_1) Sending/queueing gratuitous ARPs on ens33 for 192.168.10.160
Nov 23 20:41:02 mysql02 Keepalived_vrrp[21071]: Sending gratuitous ARP on ens33 for 192.168.10.160
Nov 23 20:41:02 mysql02 Keepalived_vrrp[21071]: Sending gratuitous ARP on ens33 for 192.168.10.160
Nov 23 20:41:02 mysql02 Keepalived_vrrp[21071]: Sending gratuitous ARP on ens33 for 192.168.10.160
Nov 23 20:41:02 mysql02 Keepalived_vrrp[21071]: Sending gratuitous ARP on ens33 for 192.168.10.160
Nov 23 20:49:37 mysql02 Keepalived_vrrp[21071]: (VI_1) Master received advert from 192.168.10.161 with higher priority 101, ours 99
Nov 23 20:49:37 mysql02 Keepalived_vrrp[21071]: (VI_1) Entering BACKUP STATE
Nov 23 20:49:37 mysql02 Keepalived_vrrp[21071]: (VI_1) removing VIPs.