1. 程式人生 > >搭建keepalived+mysql主從復制高可用

搭建keepalived+mysql主從復制高可用

pos onf 通過 用戶 mtu 實時 ipa 由於 mysql主從

準備工作:

  • 完成keepalived的安裝
  • 完成docker的安裝
  • docker鏡像裏面自行安裝iproute2, vim, iputils-ping(可選)等工具,便於測試
    apt-get install iproute2
    apt-get install vim
    apt-get install iputils-ping


主數據庫master

1. 使用docker安裝mysql
mkdir -p ~/compose/mysql-master
cd ~/compose/mysql-master

cat docker-compose.yml
version: 2
services:
  mysql
-master: image: mysql:5 restart: always container_name: mysql-master ports: - 3306:3306 volumes: - ./conf.d:/etc/mysql/conf.d - /data/docker/mysql-master/data:/var/lib/mysql environment: - MYSQL_ROOT_PASSWORD=123456 networks: default: external: name: service

假如沒有把3306端口映射到宿主機,在宿主機上可通過docker-ip:3306來訪問。

2. mysql的配置
cat conf.d/lowercase.cnf
[mysqld]
lower_case_table_names = 1
default-time-zone = +08:00
character-set-server = utf8
event_scheduler = on
log-bin = mysql-bin
server-id = 1

參數說明:

  • lower_case_table_names 設置不區分大小寫
  • default-time-zone 設置時區為東八區
  • character-set-server
    修改字符集為utf8
  • log-bin 開啟二進制日誌
  • server-id 設置server-id

master開啟二進制日誌後默認記錄所有庫所有表的操作,可以通過配置來指定只記錄指定的數據庫甚至指定的表的操作,具體在mysql配置文件的[mysqld]可添加修改如下選項:

# 不同步哪些數據庫
binlog-ignore-db = mysql  
binlog-ignore-db = test  
binlog-ignore-db = information_schema  


  
# 只同步哪些數據庫,除此之外,其他不同步
binlog-do-db = mydatabase

3. 啟動服務
docker-compose pull && docker-compose up -d

4. 在宿主機連接mysql

說明: 由於我是使用虛擬機安裝的字符版Ubuntu系統,所以使用MyCli作為mysql命令行工具來連接mysql。

# 查看master主機的ip地址為192.168.11.188,使用MyCli連接mysql
mycli -h 192.168.11.188 -u root -p 123456

# 給root用戶分配遠程訪問權限:
grant all on *.* to root@% identified by "123456";
flush privileges; 

# 查看master狀態
mysql root@192.168.11.188:(none)> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 586      |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set
Time: 0.004s

需要記錄主數據庫的二進制文件名(mysql-bin.000003)和位置586


從數據庫slave

1. docker-compose.yml

只需要從主數據庫的配置名稱由mysql-master改為mysql-slave即可。

2. mysql配置
cat conf.d/lowercase.cnf
[mysqld]
lower_case_table_names = 1
default-time-zone = +08:00
character-set-server = utf8
event_scheduler = on
server-id= 2

需添加server-id並且與主數據庫中不一致

3. 啟動服務
docker-compose pull && docker-compose up -d

4. 在宿主機連接mysql
# 查看slave主機的ip地址為192.168.11.186,使用MyCli連接mysql
mycli -h 192.168.11.186 -u root -p 123456
# 給root用戶分配遠程訪問權限,略

# 執行同步SQL語句,參照MASTER配置:
CHANGE MASTER TO MASTER_HOST=192.168.11.188,MASTER_USER=root,MASTER_PASSWORD=123456,MASTER_LOG_FILE=mysql-bin.000003,MASTER_LOG_POS=586;

# 啟動slave同步進程
start slave;

# 查看slave狀態:
show slave status\G;

其中下面兩項為YES則表示成功:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes


測試主從復制

在MASTER中新建數據庫和表,發現數據在SLAVE中已經實時同步過來


Keepalived監控mysql服務

1. master主機上的配置
cat /etc/keepalived/keepalived.conf

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的網卡接口,不一定是eth0根據ifconfig確定
    virtual_router_id 51 #路由器標識,MASTER和BACKUP必須是一致的
    priority 100 #定義優先級,數字越大,優先級越高,在同一個vrrp_instance下,MASTER的優先級必須大於BACKUP的優先級。這樣MASTER故障恢復後,就可以將VIP資源再次搶回來
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.11.25
    }
    track_script {
       chk_mysql_port
    }
}

需要配置的地方有:script,state,interface,virtual_router_id,priority,virtual_ipaddress

2. slave主機上的配置
cat /etc/keepalived/keepalived.conf

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
    virtual_router_id 51
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.11.25
    }
    track_script {
       chk_mysql_port
    }
}

只需要設置stateBACKUP, priority比MASTER低即可。

3. 監測監本的配置
cat /opt/chk_mysql.sh

#!/bin/bash
counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
if [ "${counter}" -eq 0 ]
then
    /etc/init.d/keepalived stop
else
   echo "running..." >> /opt/keepalived-running-info.log
   sleep 5000
fi


Keepalived監測Mysql測試

先要保證兩臺服務器的mysql服務正常啟動哦~

1. 啟動Keepalived
# 在master和slave上執行
sudo /etc/init.d/keepalived start

# 查看腳本是否正常執行
tail -f /opt/keepalived-running-info.log

# 查看master的ip,發現虛擬ip綁定成功
ip addr

2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:64:35:17 brd ff:ff:ff:ff:ff:ff
    inet 192.168.11.188/24 brd 192.168.11.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.11.25/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe64:3517/64 scope link
       valid_lft forever preferred_lft forever

2. 高可用測試

在任意一臺主機執行以下命令測試:

mycli -h 192.168.11.25 -u root -p 123456 #ok
mycli -h 192.168.11.188 -u root -p 123456 #ok
mycli -h 192.168.11.186 -u root -p 123456 #ok

再次查看master主機的ip,發現虛擬ip不見了:

ip addr

2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:64:35:17 brd ff:ff:ff:ff:ff:ff
    inet 192.168.11.188/24 brd 192.168.11.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe64:3517/64 scope link
       valid_lft forever preferred_lft forever

此時查看slave主機的ip定, 發現ip漂移情況,虛擬ip自動綁定到到了slave主機上:

ip addr

2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:f0:00:ad brd ff:ff:ff:ff:ff:ff
    inet 192.168.11.186/24 brd 192.168.11.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.11.25/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fef0:ad/64 scope link
       valid_lft forever preferred_lft forever

此時查看slave主機情況,Slave_IO_Running變成了Connecting

mycli -h 192.168.11.186 -u root -p 123456
show slave status\G;

Slave_IO_Running | Connecting
Slave_SQL_Running | Yes

繼續測試

現在把master重新啟動

mycli -h 192.168.11.188 -u root -p 123456 #ok
show master status;
+------------------+----------+--------------+-------------------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB              | Executed_Gtid_Set |
+------------------+----------+--------------+-------------------------------+-------------------+
| mysql-bin.000009 | 154      |              | mysql,test,information_schema |                   |
+------------------+----------+--------------+-------------------------------+-------------------+
1 row in set
Time: 0.004s

會發現信息發生了改變,再次查看slave的狀態恢復正常:

Slave_IO_Running | Yes
Slave_SQL_Running | Yes

繼續查看master主機發現未綁定vip,vip依然存在於slave所屬主機上面。

那麽現在把slave停掉試試看:

docker stop mysql-slave

mycli -h 192.168.11.186 -u root -p 123456 #error
mycli -h 192.168.11.25 -u root -p 123456 # error
mycli -h 192.168.11.188 -u root -p 123456 # ok

出現只有master主機的mysql服務能訪問的情況,是因為上面測試把兩個mysql服務停止,腳本監測不到3306端口執行了/etc/init.d/keepalived stop,所以需要重新啟動keepalived :

# master主機
sudo /etc/init.d/keepalived start

# slave主機
docker start mysql-slave
sudo /etc/init.d/keepalived start

這個時候發現vip又重新綁定到master上面,OK,一切正常。

總結:

寫的可能有些啰嗦,但是每一步的操作和測試又是必要的,只為記錄自己的一次學習心得。

搭建keepalived+mysql主從復制高可用