生產環境對數據庫要求很高的,爲了不數據庫的突發狀況,給他作個保險--用keepalived作高可用
環境(此處ip,密碼均是亂造的):
主:192.1.31.161 端口:3306 用戶:vnum 密碼:vnum@123
從:192.1.31.162 端口:3306mysql
方案介紹 兩臺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='vnum@123', 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='vnum@123', 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: salarh@163.com MYSQL=/data/mysql/bin/mysql MYSQL_HOST=localhost MYSQL_USER=root MYSQL_PASSWORD='root@123' 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了,他才能重登大位 最後一步就是作監控報警了