传统(不借助中间件)的数据库主从搭建,若是主节点挂掉了,从节点只能读取没法写入,只能把人肉去恢复故障,既不想引用中间件也不想人肉恢复故障,能够折中选择双主方案,本文将介绍经过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
两台机器记得交叉验证,以避免有问题, 若是不能正常漂移,请认真检查操做步骤,是否和本文一致