生產環境對數據庫要求很高的,爲了避免數據庫的突發情況,給他做個保險--用keepalived做高可用
環境(此處ip,密碼均是亂造的):
主:192.1.31.161 端口:3306 用戶:vnum 密碼:vnum@123
從: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='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: [email protected]
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了,他才能重登大位
最後一步就是做監控報警了