傳統(不借助中間件)的數據庫主從搭建,若是主節點掛掉了,從節點只能讀取沒法寫入,只能把人肉去恢復故障,既不想引用中間件也不想人肉恢復故障,能夠折中選擇雙主方案,本文將介紹經過keepalived搭建mysql雙主方案。mysql
本例中vip爲:172.16.0.169, 兩臺mysql實例服務器ip分別爲:172.16.0.1和172.16.0.2sql
轉帖請註明來源: https://my.oschina.net/u/2342969/blog/2963153數據庫
點擊查看keepalived搭建教程,博主親自操做過來的,若有疑問歡迎隨時私信或者評論apache
點擊查看mysql搭建教程,博主親自操做過來的,若有疑問歡迎隨時私信或者評論vim
本方案僅限兩臺均是全新安裝的mysql,若是是舊mysql實例和新mysql實例改成雙主,在新mysql實例中記得導入舊mysql實例的數據,另外可能同步複製還會報異常,自行解決一下。centos
#vim /etc/my.cnf
進入mysql配置修改一下配置:bash
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'172.16.0.%' identified by 'repl_password'; mysql> flush privileges; mysql> select @@server_id;
兩臺mysql分別執行以上語句,語句解析:服務器
mysql> CHANGE MASTER TO MASTER_HOST="對方ip", MASTER_USER="repl_user", MASTER_PASSWORD="repl_password", MASTER_PORT=3316, MASTER_AUTO_POSITION = 1; mysql> start slave; mysql> show slave status\G;
兩臺mysql分別執行以上sql,語句解析:ide
檢查點:oop
若是有異常,根據異常信息解決掉問題後,執行一下命令
mysql> stop slave; mysql> reset master;
兩臺mysql分別執行以上命令,再執行一下上一步的配置。
# vim /etc/keepalived/keepalived.conf
配置內容以下:
! Configuration File for keepalived global_defs { router_id MYSQL-1 ## 名稱自定義,兩臺機器須要不同 } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 60 priority 100 # 兩臺機器須要一個大一個小,數值大的先啓動,哪臺先啓動vip會先在哪臺機器 advert_int 1 nopreempt authentication { auth_type PASS auth_pass 123456 } virtual_ipaddress { 172.16.0.169 # 填寫本身的vip } } virtual_server 172.16.0.169 3316 { # 填寫本身的vip 和mysql端口 delay_loop 2 #lb_algo rr #lb_kind DR persistence_timeout 60 protocol TCP real_server 172.16.0.1 3316 { # 填寫mysql服務器真實ip 和mysql端口 weight 3 notify_down /etc/keepalived/checkmysql.sh # 檢查mysql是否存活腳本,根據腳本位置自行填寫 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 3316 # mysql的端口號 } } }
注意: 上面配置註釋的部分,兩臺機器根據實際狀況修改,配置文件中的註釋必定要去掉,以避免出現奇怪問題
#vim /etc/keepalived/checkmysql.sh
腳本內容以下:
#!/bin/sh datetime=`date +20\%y\%m\%d_\%H\%M\%S` isok=$(/usr/local/mysql/bin/mysql -h localhost -u數據庫帳號 -p數據庫密碼 -P數據庫端口 -S /tmp/mysql3316.sock 2>/dev/null -e 'select 1' |sed -n '2p') function error_query(){ systemctl stop keepalived echo $datetime >> /etc/keepalived/keepalived.log echo "mysql down, keepalived 切換" >> /etc/keepalived/keepalived.log } echo "isok: $isok" >> /etc/keepalived/keepalived.log if [ "$isok" != "1" ] then error_query fi
注意:根據實際狀況調整腳本中的中文部分
給腳本賦權限:
# chmod +x /etc/keepalived/*.sh
必定要先閱讀博文[centos7 下源碼安裝keepalived踩坑記],根據這篇博文中"操做keepalived"章節操做keepalived
兩臺機器記得交叉驗證,以避免有問題, 若是不能正常漂移,請認真檢查操做步驟,是否和本文一致