mysql(五)-----keepalived配置mysql的高可用
阿新 • • 發佈:2019-05-16
硬盤 二進制 enc server2 虛擬ip 監控 tar vip 虛擬 生產環境對數據庫要求很高的,為了避免數據庫的突發情況,給他做個保險--用keepalived做高可用
環境(此處ip,密碼均是亂造的):
主:192.1.31.161 端口:3306 用戶:vnum 密碼:[email protected]
從:192.1.31.162 端口:3306
環境(此處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的高可用