Mysql之配置双主热备+keeepalived.md
准备
1 1. 双主 master1 192.168.199.49
2 master2 192.168.199.50
3 VIP 192.168.199.52 //虚拟IP
4 2.环境 master:nginx + php + mysql + keepalived
5 VIP:只要和master在一个局域网内即可。
6 3. 服务器之间网络通畅,可以互相ping通。
7 4. 2个服务器的mysql版本要一致。数据库密码一致
8 5. 防火墙增加允许组播和允许VRRP(虚拟路由器冗余协)通信,这样主服务器在故障恢复后才能抢回资源
9 -A INPUT -s 182.148.15.0/24 -d 224.0.0.18 -j ACCEPT
10 -A INPUT -s 182.148.15.0/24 -p vrrp -j ACCEPT
11 重启生效:service iptables reload

配置服务器

1 服务器1:
2
3 在my.cnf文件的[mysqld]配置区域添加下面内容:
4 log-bin=mysql-bin #记录二进制文件
5 binlog_format=mixed #mysql默认采用的二进制格式
6 server-id = 2 #服务号,必须是唯一的,一般取IP的后8位
7 expire_logs_days = 10 #binlog过期清理时间
8
9 binlog-do-db = db1 #需要服务的数据库。
10 #replicate-ignore-db = db3,mysql,test,information_schema,performance_schema,transfer_new #不需要复制的数据库
11 #replicate-wild-ignore-table=garbage.% #有问题可以尝试使用此项配置
12 sync_binlog = 1 #表示binlog日志在每1次写入后与硬盘同步,设置1最安全也最慢
13 auto-increment-increment = 2 #服务器个数
14 auto-increment-offset = 2 #自增偏移量,如果有2台,则一台设置1,另一台设置2
15 slave-skip-errors = all #从库复制时跳过所有的错误
16 服务器2:
17
18 log-bin=mysql-bin
19 binlog_format=mixed
20 server-id = 1
21 expire_logs_days = 10
22 binlog-do-db = db1
23 #replicate-ignore-db = db3,mysql,test,information_schema,performance_schema,transfer_new
24 #replicate-wild-ignore-table=garbage.% #有问题可以尝试使用此项配置
25 sync_binlog = 1
26 auto-increment-increment = 2
27 auto-increment-offset = 1
28 slave-skip-errors = all

2台服务器都重启mysql服务:
1 service mysql restart
同步配置(2台服务器分别执行)

1 给对方授权复制权限
2
3 //对方服务器60.205.182.26允许复制本服务器数据库,用户名repl 密码ocnt-123
4 mysql> grant replication slave,replication client on *.* to repl@'60.205.182.26' identified by "ocnt-123";
5 //生效
6 mysql> flush privileges;
7 //锁定表
8 mysql> flush tables with read lock;

同步数据
1 1.锁定表
2 mysql> flush tables with read lock;
3 2.同步数据,可使用navicat
同步操作(2台服务器分别执行)

1 //查看各自服务器当前二进制日志文件名称和记录位置
2 mysql> show master status;
3
4 <!-----------------------服务器1同步------------------------------------>
5 //解锁表
6 mysql> unlock tables;
7 //停止slave
8 mysql> slave stop;
9 //开始同步: IP、用户名和密码为服务器2刚才grant授权配置的,日志文件和pos值得位置通过服务器2 show master status查看得来
10 mysql> change master to master_host='101.200.63.35',master_user='repl',master_password='123456',master_log_file='mysql-bin.000016',master_log_pos=363;
11 //开启slave
12 mysql> start slave;
13
14 <!-----------------------服务器2同步------------------------------------>
15 //解锁表
16 mysql> unlock tables;
17 //停止slave
18 mysql> slave stop;
19 <!--开始同步-->
20 change master to master_host='60.205.182.26',master_user='repl',master_password='123456',master_log_file='mysql-bin.000028',master_log_pos=107;
21 <!--开启slave-->
22 mysql> start slave;

查看同步状态,如下出现两个“Yes”,表明同步成功!(Slave_IO_Running和Slave_SQL_Running)
1 mysql> show slave status \G;
配置到此处就完成了双主热备。
keepalived故障自动切换配置

1 master1:192.168.199.49 主机1
2 master2:192.168.199.50 主机2 备份
3 VIP:192.168.199.52 虚拟IP
4 ### 2台服务器安装keepalived
5
6 [root@localhost ]#yum install -y openssl-devel
7 [root@localhost src]#cd /usr/local/src/
8 [root@localhost src]# wget http://www.keepalived.org/software/keepalived-1.3.5.tar.gz
9 [root@localhost src]# tar -zvxf keepalived-1.3.5.tar.gz
10 [root@localhost src]# cd keepalived-1.3.5
11 [root@localhost keepalived-1.3.5]# ./configure --prefix=/usr/local/keepalived
12 [root@localhost keepalived-1.3.5]# make && make install
13
14 [root@localhost keepalived-1.3.5]# cp /usr/local/src/keepalived-1.3.5/keepalived/etc/init.d/keepalived /etc/rc.d/init.d/
15 [root@localhost keepalived-1.3.5]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
16 [root@localhost keepalived-1.3.5]# mkdir /etc/keepalived/
17 [root@localhost keepalived-1.3.5]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
18 [root@localhost keepalived-1.3.5]# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
19 [root@localhost keepalived-1.3.5]# echo "/etc/init.d/keepalived start" >> /etc/rc.local

master1服务器配置

1 [root@master1 ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
2 [root@master1 ~]# vim /etc/keepalived/keepalived.conf #删除所有内容,重新配置如下
3
4 ! Configuration File for keepalived
5 global_defs {
6 notification_email {
7 412140451@qq.com
8 }
9
10 notification_email_from 412140451@qq.com
11 smtp_server 127.0.0.1
12 smtp_connect_timeout 30
13 router_id MASTER-HA
14 }
15
16 vrrp_script chk_mysql_port { #检测mysql服务是否在运行
17 script "/opt/chk_mysql.sh" #这里通过脚本监测
18 interval 3 #脚本执行间隔,每3s检测一次
19 weight -5 #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
20 fall 2 #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
21 rise 1 #检测1次成功就算成功。但不修改优先级
22 }
23
24 vrrp_instance VI_1 {
25 state MASTER
26 interface eth0 #指定虚拟ip的网卡接口
27 mcast_src_ip 192.168.199.49 #本机master的 IP地址
28 virtual_router_id 100 #路由器标识,MASTER和BACKUP必须是一致的
29 priority 100 #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级。这样MASTER故障恢复后,就可以将VIP资源再次抢回来
30 advert_int 1
31 authentication { #加密协议
32 auth_type PASS
33 auth_pass 1111
34 }
35 virtual_ipaddress {
36 192.168.199.52 #虚拟IP地址 VIP
37 }
38
39 track_script {
40 chk_mysql_port
41 }
42 }

master2服务器配置 修改 mcast_src_ip priority

1 global_defs {
2 notification_email {
3 412140451@qq.com
4 }
5
6 notification_email_from 412140451@qq.com
7 smtp_server 127.0.0.1
8 smtp_connect_timeout 30
9 router_id MASTER-HA
10 }
11
12 vrrp_script chk_mysql_port {
13 script "/opt/chk_mysql.sh"
14 interval 3
15 weight -5
16 fall 2
17 rise 1
18 }
19
20 vrrp_instance VI_1 {
21 state BACKUP
22 interface eth0
23 mcast_src_ip 192.168.199.50
24 virtual_router_id 100
25 priority 90
26 advert_int 1
27 authentication {
28 auth_type PASS
29 auth_pass 1111
30 }
31 virtual_ipaddress {
32 192.168.199.52
33 }
34
35 track_script {
36 chk_mysql_port
37 }
38 }

2个服务器都编写检测切换mysql脚本

1 KeepAlived做心跳检测,如果Master的MySQL服务挂了(3306端口挂了),那么它就会选择自杀。Slave的KeepAlived通过心跳检测发现这个情况,就会将VIP的请求接管
2 vim /opt/chk_mysql.sh
3
4 #!/bin/bash
5 CHECK_TIME=3
6
7 #Mysql
8 host='localhost'
9 port='3306'
10 user='root'
11 password='ocnt-123'
12 mysqlclient="mysql"
13
14 #mysql is working MYSQL_OK is 1 , mysql down MYSQL_OK is 0
15 function check_mysql_helth (){
16 #NEW=$MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p${MYSQL_PASSWORD} -e "show status;" >/dev/null 2>&1
17 $mysqlclient --host=$host --port=$port --user=$user --password=$password -e "show databases;" > /dev/null 2>&1
18
19 if [ $? == 0 ]
20 then
21 MYSQL_OK=1
22 else
23 MYSQL_OK=0
24 fi
25 # echo $MYSQL_OK
26 return $MYSQL_OK
27 }
28
29 while [ $CHECK_TIME -ne 0 ]
30 do
31 let "CHECK_TIME -= 1"
32 check_mysql_helth
33 if [ $MYSQL_OK == 1 ] ; then
34 CHECK_TIME=0
35 exit 0
36 fi
37 if [ $MYSQL_OK -eq 0 ] && [ $CHECK_TIME -eq 0 ]
38 then
39 pkill keepalived
40 exit 1
41 fi
42 sleep 1
43 done

赋权限
1 chmod 755 /opt/chk_mysql.sh
启动服务
1 关闭防火墙
2 service iptables stop
3 启动服务
4 /etc/init.d/keepalived start
数据库测试
1 使用局域网内的客户端连接VIP
2 mysql -h192.168.199.52 -uroot -pocnt-123
3 测试是否可用
故障切换检测

1 默认情况下,vip是在master1上的。使用"ip addr"命令查看vip切换情况
2 ip addr
3 查找
4 inet 192.168.199.49/32 scope global eth0 //这个32位子网掩码的vip地址表示该资源目前还在master1机器上,而master2机器上没有
5 同时查看 tail -f /var/log/message 会发现
6 Dec 13 17:52:38 localhost Keepalived_vrrp[65545]: VRRP_Instance(VI_1) Entering MASTER STATE
7 Dec 13 17:52:38 localhost Keepalived_vrrp[65545]: VRRP_Instance(VI_1) setting protocol VIPs.
8 Dec 13 17:52:38 localhost Keepalived_vrrp[65545]: Sending gratuitous ARP on eth0 for 192.168.199.51
9
10 关掉master1的mysql服务
11 service mysql stop
12 查看 master1的日志 tail -f /var/log/message 会发现
13 Dec 13 18:52:44 localhost Keepalived_vrrp[65545]: Stopped
14 Dec 13 18:52:44 localhost Keepalived[65542]: Stopped Keepalived v1.3.5 (03/19,2017), git commit v1.3.5-6-g6fa32f2
15
16 查看master2的日志
17 Dec 13 18:52:45 localhost Keepalived_vrrp[28451]: VRRP_Instance(VI_1) Transition to MASTER STATE
18 Dec 13 18:52:46 localhost Keepalived_vrrp[28451]: VRRP_Instance(VI_1) Entering MASTER STATE
19 Dec 13 18:52:46 localhost Keepalived_vrrp[28451]: VRRP_Instance(VI_1) setting protocol VIPs.
20 Dec 13 18:52:46 localhost Keepalived_vrrp[28451]: Sending gratuitous ARP on eth0 for 192.168.199.51
21
22 此时就已经转移到master2上,
23 恢复master1 的mysql服务
24 service mysql start
25 恢复master1 的keepalive
26 /etc/init.d/keepalived start
27
28 查看master1的日志
29 Dec 13 18:54:41 localhost Keepalived_vrrp[71002]: VRRP_Instance(VI_1) Transition to MASTER STATE
30 Dec 13 18:54:42 localhost Keepalived_vrrp[71002]: VRRP_Instance(VI_1) Entering MASTER STATE
31 Dec 13 18:54:42 localhost Keepalived_vrrp[71002]: VRRP_Instance(VI_1) setting protocol VIPs.
32 Dec 13 18:54:42 localhost Keepalived_vrrp[71002]: Sending gratuitous ARP on eth0 for 192.168.199.51
33
34 查看master2的日志
35 Dec 13 18:54:41 localhost Keepalived_vrrp[28451]: VRRP_Instance(VI_1) Received advert with higher priority 100, ours 90
36 Dec 13 18:54:41 localhost Keepalived_vrrp[28451]: VRRP_Instance(VI_1) Entering BACKUP STATE
37 Dec 13 18:54:41 localhost Keepalived_vrrp[28451]: VRRP_Instance(VI_1) removing protocol VIPs.
38
39 说明服务已经转移到master2上了。
40 至此完成

完成
其它:删除主从复制
1 mysql> stop slave;
2 mysql> slave reset;
3 mysql> reset master;
keepalived
1 启动
2 /etc/init.d/keepalived start
异常解决办法
1 如果不能正常复制,查看状态
2 sql> show slave status \G;
3 然后可以看到错误信息,一般情况下,重启一下slave就好了
4 sql> stop slave;
Mysql之配置双主热备+keeepalived.md的更多相关文章
- 11 Mysql之配置双主热备+keeepalived.md
准备 1. 双主 master1 192.168.199.49 master2 192.168.199.50 VIP 192.168.199.52 //虚拟IP 2.环境 master:nginx + ...
- Mysql + keepalived 实现双主热备读写分离【转】
Mysql + keepalived 实现双主热备读写分离 2013年6月16日frankwong发表评论阅读评论 架构图 系统:CentOS6.4_X86_64软件版本:Mysql-5.6.12 ...
- Mysql主从复制,双主热备
Mysql主从复制: 主从复制: 主机准备工作: 开启bin.Log 注意:server-id 是唯一的值 重启mysql:service mysql restart 查看是否开启成功: 查看当前状 ...
- Mysql+Keepalived双主热备高可用操作记录
我们通常说的双机热备是指两台机器都在运行,但并不是两台机器都同时在提供服务.当提供服务的一台出现故障的时候,另外一台会马上自动接管并且提供服务,而且切换的时间非常短.MySQL双主复制,即互为Mast ...
- Mysql双主热备+LVS+Keepalived高可用操作记录
MySQL复制能够保证数据的冗余的同时可以做读写分离来分担系统压力,如果是主主复制还可以很好的避免主节点的单点故障.然而MySQL主主复制存在一些问题无法满足我们的实际需要:未提供统一访问入口来实现负 ...
- 高可用Mysql架构_Mysql主从复制、Mysql双主热备、Mysql双主双从、Mysql读写分离(Mycat中间件)、Mysql分库分表架构(Mycat中间件)的演变
[Mysql主从复制]解决的问题数据分布:比如一共150台机器,分别往电信.网通.移动各放50台,这样无论在哪个网络访问都很快.其次按照地域,比如国内国外,北方南方,这样地域性访问解决了.负载均衡:M ...
- MySQL双主热备问题处理
1. Slave_IO_Running: No mysql> show slave status\G *************************** 1. row *********** ...
- keepalived+mysql双主热备
这里使用keepalived实现mysql的双主热备高可用 实验环境: 主机名 IP 系统版本 软件版本 master 192.168.199.6/vip:192.168.199.111 Rhel7. ...
- mysql双主热备
先搭建mysql主从模式,主从请参考mysql 主从笔记 然后在在配置文件里添加如下配置 1 log_slave_updates= #双主热备的关键参数.默认情况下从节点从主节点中同步过来的修改事件是 ...
随机推荐
- 迅雷极速版开启强制升级迅雷X模式,网友出招
IT之家7月13日消息 近期,不少网友反馈,迅雷极速版已经开启强制用户升级到迅雷X的模式,而且不能关闭取消,并且会默认安装到C盘上 迅雷X是迅雷最新推出的下载客户端工具,使用Electron软件框架完 ...
- 使用Jenkins来实现内部的持续集成流程(下)
目录 配置项目构建 添加任务 添加源代码地址和登录凭据 添加构建触发器 TFS添加WebHook 添加构建步骤 后端UI API端 配置项目构建 1.添加任务 2.添加源代码地址和登录凭据 添 ...
- eclipse使用maven,启动工程tomcat报错:java.lang.ClassNotFoundException: org.springframework.web.context.Contex
maven是个不错的管理jar包工具,但是我们在eclipse使用maven时,总是遇上这样那样的问题,比如今天,我编译工程,启动过后,tomcat报错:java.lang.ClassNotFound ...
- Oracle学习笔记(六)
Oralce行定位与rowid: drop table t purge; create table t as select * from dba_objects; create index idx_o ...
- Layui 时间转换时间戳
我比较喜欢用Layui,当然也遇到一些坑!例如:绑定时间的时候是那种 是这种13位数据的日期,如果不经过转换是不能正常显示的,当然这是我遇到的问题不知道你们有没有遇到,后来我也是经过了解才知道怎么回事 ...
- C# 简单日志帮助类LogHelper
调用: LogHelper.Debug(""); LogHelper.Info(""); LogHelper.Error(""); 项目添加 ...
- 1.Shell特殊位置变量
$0 文件名及路径 $1,$2 参数1,参数2 , 也可以用${1} 和 ${2} 来表示 $# 传递给脚本或函数的参数个数 $$ 当前Shell进程ID $? 判断上 ...
- java包装类和值类型的关系
java包装类总是让人疑惑 它与值类型到底是怎么样一种关系? 本文将以int和Integer为例来探讨它们的关系 java值类型有int short char boolean byte long fl ...
- 2019 上海轻轻java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.上海轻轻等公司offer,岗位是Java后端开发,因为发展原因最终选择去了上海轻轻,入职一年时间了,也成为了面 ...
- WebSocket实现Web端即时通信
前言 WebSocket 是HTML5开始提供的一种在浏览器和服务器间进行全双工通信的协议.目前很多没有使用WebSocket进行客户端服务端实时通信的web应用,大多使用设置规则时间的轮询,或者使用 ...