1. 程式人生 > >mysql(五)-----keepalived配置mysql的高可用

mysql(五)-----keepalived配置mysql的高可用

硬盤 二進制 enc server2 虛擬ip 監控 tar vip 虛擬

生產環境對數據庫要求很高的,為了避免數據庫的突發情況,給他做個保險--用keepalived做高可用
環境(此處ip,密碼均是亂造的):
主:192.1.31.161 端口:3306 用戶:vnum 密碼:[email protected]
從:192.1.31.162 端口:3306

方案介紹
兩臺mysql互為主從,但只有master寫,slave只負責讀。主從通過keepalive做成高可用,當master出問題,
由slave接替master工作,即讀寫都在slave操作。當master恢復正常,master自動同步故障時間段數據,接替slave的寫工作。

一:配置主主同步

、配置文件
master my.cnf 主要參數

log_slave_updates
log-bin = mysql-bin
server-id = 1
binlog-ignore-db=mysql
#auto_increment_increment = 2
#auto_increment_offset = 2

slave my.cnf 主要參數

log_slave_updates
log-bin = mysql-bin
server-id = 2
binlog-ignore-db=mysql
#auto_increment_increment = 2
#auto_increment_offset = 1

註:
log_slave_updates  同步數據時也寫入日誌,二進制記錄id號,互為主從時時不會引起循環。建議開啟方便實施日誌恢復。 可選
slave-skip-errors  跳過錯誤,可以通過=指定特定的錯誤,如:slave-skip-errors=1062  可選
log-bin = mysql-bin 開啟二進制日誌,必須開啟,主從同步主要是通過二進制日誌。 必須
sync_binlog=n  設置二進制日誌在寫入多少此後與硬盤同步,1 為最安全的也是效率最低的,根據實際情況設定 可選
server-id  設置mysql的id號,主從不能相同。 必須
binlog-ignore-db 設置不寫入日誌的庫,建議設置不需要的庫,節省流量。如需設置多個庫可加多個此參數  可選
binlog-do-db 設置寫入二進制日誌的庫,如設置則只有設置的庫才能寫入二進制日誌。如需設置多個庫可加多個此參數。 可選
replicate-ignore-db 設置slave不同步的庫,如需設置多個庫可加多個此參數。 可選
replicate-do-db 設置slave同步的庫,如需設置多個庫可加多個此參數。 可選
auto_increment_increment  自增增長值,如:id 設置為 auto_increment,則每次插入數據自增值為2,以1,3,5...或2,4,6...方式增長。 可選
auto_increment_offset 自增初始化便宜值,如果前一個id 為2 則 下一個為3 然後在這個基礎上按auto_increment_increment 設置的值進行自增。 可選
master-host = 192.168.1.2 設置master 服務器地址,也可以啟動時通過change master to 設置 。 可選
master-user = repl 設置更新用的帳號,也可以啟動時通過change master to 設置 。 可選
master-password = 123 設置跟新用的密碼,也可以啟動時通過change master to 設置 。 可選
master-port = 3306 設置master端口,也可以啟動時通過change master to 設置 。 可選

binlog-do-db、binlog-ignore-db、replicate_do_db、replicate_ignore_db 在使用時應註意,若加了以上參數,則在操作數據庫是要避免跨庫操作(例:update test.table1 set...)
如設置 binlog-do-db=test
use mysql;
update test.table1 set ......
第二句會執行但不會寫入二進制日誌,即從庫不能同步,主從數據庫出現差異

如設置 binlog_ignore_db=mysql
use mysql;
update test.table1 set ......
第二句會執行但不會寫入二進制日誌,即從庫不能同步,主從數據庫出現差異

如設置 replicate_do_db=test
use mysql;
update test.table1 set ......
第二句將不會被執行,即從庫不能同步,主從數據庫出現差異

如設置 replicate_ignore_db=mysql
use mysql;
update test.table1 set ......
第二句會被忽略執行,即從庫不能同步,主從數據庫出現差異

原因是設置binlog-do-db、binlog-ignore-db、replicate_do_db或replicate_ignore_db後,MySQL執行sql前檢查的是當前默認數據庫,所以跨庫更新語句被忽略。

登錄master數據庫
mysql> show master status\G;

技術分享圖片

同理,查看slave的

技術分享圖片

master:
mysql>CHANGE MASTER TO
MASTER_HOST=‘192.1.31.162‘,    
MASTER_USER=‘vnum‘,           
MASTER_PASSWORD=‘[email protected]‘,   
MASTER_PORT=3306,                 
MASTER_LOG_FILE= ‘my_log.00006‘,   
MASTER_LOG_POS= 154,                         
MASTER_CONNECT_RETRY=10;  

mysql>start slave;
mysql>show slave status\G;

salve:
mysql>CHANGE MASTER TO
MASTER_HOST=‘192.1.31.161‘,    
MASTER_USER=‘vnum‘,           
MASTER_PASSWORD=‘[email protected]‘,   
MASTER_PORT=3306,                 
MASTER_LOG_FILE= ‘my_log.00018‘,   
MASTER_LOG_POS= 154,                         
MASTER_CONNECT_RETRY=10;  

mysql>start slave;
mysql>show slave status\G;

均出現兩個yes,就證明主主配置成功

1.安裝keepalived
   # yum -y install  keepalived
         一般配置文件是/etc/keepalived/keepalived.conf
         日誌在/etc/log/messages

2.修改keepalived的配置
   # cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id mysql1

}

vrrp_instance VI_1 {
    state BACKUP  #指定keepalived的角色。兩臺均配置成BACKUP,這樣可以根據優先級決定主從
    interface ens160   # 指定HA監控的網絡名稱
    virtual_router_id 51  # 主從保持一致,VRRP的唯一標識
    priority 100   #優先級,選舉master,主的比從的高
    advert_int 1  #發varrp包的時間間隔,即多久選舉一次master
    nopreempt  # 不搶占,即允許一個priority比較低的節點作為主,主要預防腦裂
    authentication {
        auth_type PASS
        auth_pass 1111
    }

    virtual_ipaddress {   #指定VIP的地址
     192.1.31.3
    }
}
virtual_server 192.1.31.3 3306 {  #設置虛擬服務器,需要指定虛擬IP端口,ip和端口之間空格隔開
    delay_loop 2     #設置運行檢查時間,單位秒
    lb_algo rr          # 設置後端調度算法,這裏設置為rr
    lb_kind DR       # 設置LVS實現的算法
    persistence_timeout 60  # 保持會話60S

    peotocol TCP  # TCP協議

   real_server 192.1.31.161  3306 {  # 本機ip  端口
     weight 3         # 配置服務點的權值,權值大小用數字標識,數字越大,權值越高,權值是為了區分不同的服務器
       notify_down    /root/keepalived_check_mysql.sh  # 檢查mysql是否是down

       TCP_CHECK { 
            connect_timeout 3  # 連接超時時間
            nb_get_retry 3    # 重連次數
            delay_before_retry 1   # 重連時間間隔
            connect_port 3306  # 健康檢查端口

       }

   }

}

同樣的也需要修改mysql2的keepalived配置文件(下圖中綠色部分為和mysql1不一樣的地方)
可以使用scp命令把mysql1主機上配置好的keepalived.conf文件拷貝到server2主機,只需要改
 router_id mysql1    ------> router_id mysql2
 priority 100    ----->    priority  90
  nopreempt   ----->    #  nopreempt 
    real_server 192.1.31.161 3306  ------->   real_server 192.1.31.162 3306

3.寫腳本
  # cat /root/keepalived_check_mysql.sh 
    #!/bin/sh
# -------------------------------------------------------------------------------
# FileName:    check_mysql.sh
# Revision:    1.0
# Date:        2019/05/07
# Author:      salarh
# Email:       [email protected]

MYSQL=/data/mysql/bin/mysql
MYSQL_HOST=localhost
MYSQL_USER=root
MYSQL_PASSWORD=‘[email protected]‘
CHECK_TIME=3

#mysql  is working MYSQL_OK is 1 , mysql down MYSQL_OK is 0
MYSQL_OK=1

check_mysql_helth (){
    $MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p${MYSQL_PASSWORD} -e "show status;" &>/dev/null
    if [ $? -eq 0 ] ;then
        MYSQL_OK=1
    else
        MYSQL_OK=0
    fi
    return $MYSQL_OK
}

while [ $CHECK_TIME -ne 0 ]
do
        check_mysql_helth
        if [ $MYSQL_OK -eq 1 ] ; then
                exit 0
        fi

        if [ $MYSQL_OK -eq 0 ] &&  [ $CHECK_TIME -eq 1 ];then
                systemctl stop keepalived.service
                exit 1
        fi
        let CHECK_TIME--
        sleep 1
done

別忘了授權
# chmod +x  /root/keepalived_check_mysql.sh
3.開啟主從上的keepalived
  # systemctl restart keepalived
    在打開一個窗口查看日誌
(192.1.31.3這個虛擬ip應該在192.1.31.161上)
4.觀察,測試
1)登錄192.1.31.3(vip)的數據庫,進行數據插入,再去162這臺機器上看是否同步
2)關閉161這臺數據庫,vip在162這臺數據庫上,進行數據插入,是正常的。
但當161這臺機器上的mysql和keepalived開啟後,161 就相當於備庫了,除非162mysql或主機down了,他才能重登大位

最後一步就是做監控報警了

mysql(五)-----keepalived配置mysql的高可用