Keepalived + MySQLfailover + GTIDs 高可用
架构图

配置基于GTIDs的主从
1
2
3
4
5
6
|
vim /etc/my.cnf
添加以下内容
gtid-mode=on -- 启动gtid模式
enforce_gtid_consistency -- 强制gtid一致性 5.6.9之前的版本为disable-gtid-unsafe-statement
log-bin -- master和slave都必须启用binlog
log-slave-updates -- 必须使用
|
1
2
3
4
5
6
7
8
|
change master to
master_host='master_ip',
master_port=3306,
master_user='repl',
master_password='redhat',
master_auto_position=1; -- 表示基于GTIDs的主从 MySQL自动判断从哪开始同步 基于GTIDs的主从已经不需要手动指定编号了
start slave; -- 启动slave;
|
开启master与备用master之间的主从半同步
开启半同步后,在master提交一个写事务之后,master会block这个事务,直到备用master确认已经接受到了该复制事件,这时master才向应用程序确认提交成功。否则超时中断半同步,直到重新满足条件开启。
在master提交事务之后,而slave未来得及接收复制事件,这时候master crash的话,应用程序会切换到slave上,并重新发起事务,这正好是我们所需要的,满足高可用的初衷。但是这里存在一个缺陷,那就是在master恢复之后,原来的事务已经提交,这时候复制会出现问题。
解决办法:在原来的master恢复之后数据重做(推荐),或者跳过重复数据错误。
1
2
|
mysql> install plugin rpl_semi_sync_master SONAME 'semisync_master.so';
mysql> install plugin rpl_semi_sync_slave SONAME 'semisync_slave.so';
|
1
2
|
mysql> set global rpl_semi_sync_master_enabled = 1; -- 开启为master角色
mysql> set global rpl_semi_sync_master_timeout = 1000; -- 配置
|
(rpl_semi_sync_master_timeout=1000)表示主库在某次事务中,如果等待时间超过1000毫秒,那么则降级为普通模式,不再等待备库。如果主库再次探测到,备库恢复了,则会自动再次回到Semi-sync状态。建议把半同步跑在高速网络环境中
1
2
3
|
mysql> stop slave; -- 先停止主从 不然即使执行开启半同步命令也没效果
mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1; -- 开启为slave角色
mysql> start slave;
|
1
2
3
4
5
|
vim /etc/my.cnf
添加一下内容
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000
rpl_semi_sync_slave_enabled=1
|
1
2
3
4
5
6
7
8
|
show status like '%semi_sync%';
master上
Rpl_semi_sync_master_clients | 1 -- 有一个slave(备用master)开启半同步
Rpl_semi_sync_master_status | ON -- 已开启成功
备用master上
Rpl_semi_sync_slave_status | ON -- 已开启成功
|
安装配置MySQLfailover
1
|
mysal> grant create,insert,drop,select,super,replication slave,reload on *.* to 'replm'@'10.1.1.210' identified by 'replm' with grant option;
|
1
2
3
4
5
|
vim /etc/my.cnf
添加以下配置
report_host=10.1.1.210 -- 只读参数 指定报告主机为10.1.1.210(mysqlfailover monitor)
master_info_repository=TABLE -- 把master.info的信息 保存到数据库里面 mysqlfailover必须 原本默认保存到文件
relay_log_info_repository=TABLE -- 把relay_log信息保存到数据库里面 mysqlfailover必须 原本默认保存到文件
|
配置MySQLfailover
-- 授权 把主从帐号权限精确到登录IP (用IP范围的话在failover时会自动创建用户,下一次failover时就会卡住 切换失败)
1
2
|
grant replication slave,reload,super on *.* to 'repl'@'10.1.1.207' identified by 'redhat';
grant replication slave,reload,super on *.* to 'repl'@'10.1.1.206' identified by 'redhat';
|
1
2
3
4
5
|
vim /usr/local/sbin/mysqlfailover_after.sh -- 编写failover后执行的脚本
#!/bin/bash
candidateIP=$3 -- 接收备用master的IP
mysql -ureplm -preplm -h $candidateIP -e 'set global read_only=0' -- 把候选者mysql的只读取消
mysql -ureplm -preplm -h $candidateIP -e 'set global rpl_semi_sync_master_enabled=1' -- 开启备用master的半同步状态为master
|
1
2
3
4
5
6
7
8
9
10
|
mysqlfailover --master=replm:replm@10.1.1.207 --slaves=replm:replm@10.1.1.206,replm:replm@10.1.1.208 --candidates=replm:replm@10.1.1.206 --force --log=/var/log/mysqlfailover.log --exec-after=/usr/local/sbin/mysqlfailover_after.sh
解释
--master=replm:replm@10.1.1.207 -- 指定连接master的用户名(刚刚给mysqlfailover授权的用户)和密码和master的IP
--slaves= -- 指定所有slave(包括备用master)的用户名和密码和IP地址 多个slave之间用逗号隔开
--candidates= -- 指定备用master是哪台
--force -- 最好添加 如果mysqlfailover上次意外退出 不添加此参数 则不能启动mysqlfailover
--log= -- 指定配置文件路径
--exec-before= -- 指定failover切换前执行的脚本路径 (刚刚编写的脚本路径)
--exec-after= -- 指定failover切换后执行的脚本路径 (刚刚编写的脚本路径)
--daemon=start -- 以服务的形式运行 start表示启动 stop表示停止 restart表示重启 detach表示占用前台但只输出到日志
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
MySQL Replication Failover Utility
Failover Mode = auto Next Interval = Wed Dec 16 19:00:17 2015 -- Failover Mode 必须 = auto状态 不然不会自动切换
Master Information
------------------
Binary Log File Position Binlog_Do_DB Binlog_Ignore_DB
mysqld-bin.000024 271
GTID Executed Set
9507aa71-9280-11e5-88d8-525400ef6331:1-33 [...]
Replication Health Status
+-------------+-------+---------+--------+------------+--------------------------------------------+
| host | port | role | state | gtid_mode | health |
+-------------+-------+---------+--------+------------+--------------------------------------------+
| 10.1.1.207 | 3306 | MASTER | UP | ON | OK |
| 10.1.1.206 | 3306 | SLAVE | UP | ON | OK |
| 10.1.1.208 | 3306 | SLAVE | UP | ON | OK |
+-------------+-------+---------+--------+------------+--------------------------------------------+
|
模拟故障
1
2
3
4
5
6
7
|
Replication Health Status
+-------------+-------+---------+--------+------------+---------+
| host | port | role | state | gtid_mode | health |
+-------------+-------+---------+--------+------------+---------+
| 10.1.1.206 | 3306 | MASTER | UP | ON | OK | -- 新master为206
| 10.1.1.208 | 3306 | SLAVE | UP | ON | OK | -- 208已成为206的从
+-------------+-------+---------+--------+------------+---------+
|
1
2
3
4
5
6
7
|
mysql> show variables like 'read_only';
+---------------+-------+
| read_only | OFF | -- 由于执行了脚本 把只读取消 新master就能写了
+---------------+-------+
show status like '%semi_sync%';
| Rpl_semi_sync_master_status | ON | -- 半同步状态的master为on 为原来的master恢复后挂为从做准备
|
1
2
3
4
5
6
7
8
9
|
mysql> service mysqld start
mysql> set global read_only=1; -- 启动只读 原理跟之前一样.
mysql> set global rpl_semi_sync_slave_enabled=1; -- 启动半同步的slave状态 其实配置文件里已开启 这里以防万一
mysql> change master to master_host='10.1.1.206',master_user='repl',master_password='redhat',master_auto_position=1; -- 指定为新master的从
mysql> start slave;
mysql> show slave status\G;
Master_Host: 10.1.1.206 -- 已成功切换为206的slave
mysql> show status like '%semi_sync%';
| Rpl_semi_sync_slave_status | ON | -- 成功与新master建立半同步关系
|
1
2
3
4
5
|
mkdir /usr/local/keepalived/mysqld_script -p
vim /usr/local/keepalived/mysqld_script/mysqld_check.sh
#!/bin/bash
mysqladmin -predhat ping 2> /dev/null | grep alive >> /dev/null -- 判断mysqld是否存活
exit $? -- 把返回值返回给keepalived 0为健康 1为不健康(keepalived对脚本的设定)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
vim /usr/local/keepalived/etc/keepalived/keepalived.conf
vrrp_script chk_mysqld { -- 定义检查脚本
script "/usr/local/keepalived/mysqld_script/mysqld_check.sh"
interval 2
timeout 2
fall 3
}
vrrp_instance mysqld {
state BACKUP -- 重点 master也设置为backup 不会抢VIP
interface eth0
virtual_router_id 52
priority 150 -- 权重 比备用master高
nopreempt -- 重点 设置为mysql恢复后不抢回VIP 如果mysql master启动后VIP又飘过去 即不安全又麻烦
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.1.1.211 -- 指定VIP mysql需要监听在此VIP上 注意/etc/my.cnf上的bind-address
}
track_script { -- 指定定义监控脚本
chk_mysqld
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
vim /usr/local/keepalived/etc/keepalived/keepalived.conf
vrrp_script chk_mysqld {
script "/usr/local/keepalived/mysqld_script/mysqld_check.sh"
interval 2
timeout 2
fall 3
}
vrrp_instance mysqld {
state BACKUP -- 角色也为BACKUP
interface eth0
virtual_router_id 52
priority 100 -- 权重 比master低
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.1.1.211
}
track_script {
chk_mysqld
}
}
|
Keepalived + Mysqlfailover 联合测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
vim /usr/local/sbin/mysql_insert.sh
#!/bin/bash
flag=1
while ((1==1)) -- 定义死循环 无限插入sql
do
RECV=1
flag=$((flag=$flag+1))
while (($RECV!=0)) -- 这里为了模拟真实环境对操作语句是否成功的判断 并保证语句失败重新提交 根据返回值定义了循环
do
mysql -h10.1.1.211 -u'user_db01' -predhat -e "insert into db01.t1 values($flag,'a')" &>> /tmp/mysql_insert.log -- 执行语句并把输出重定向给日志文件
RECV=$?
echo "insert into db01.t1 values($flag,'a')" >> /tmp/mysql_insert.log
echo $RECV >> /tmp/mysql_insert.log
sleep 0.01
done
done
|
Keepalived + MySQLfailover + GTIDs 高可用的更多相关文章
- LVS+Keepalived搭建MyCAT高可用负载均衡集群
LVS+Keepalived 介绍 LVS LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统.本项目在1998年5月由章文嵩博士成立,是中国 ...
- MariaDB+Keepalived双主高可用配置MySQL-HA
利用keepalived构建高可用MySQL-HA,保证两台MySQL数据的一致性,然后用keepalived实现虚拟VIP,通过keepalived自带的服务监控功能来实现MySQL故障时自动切换. ...
- CentOS 6.3下部署LVS(NAT)+keepalived实现高性能高可用负载均衡
一.简介 VS/NAT原理图: 二.系统环境 实验拓扑: 系统平台:CentOS 6.3 Kernel:2.6.32-279.el6.i686 LVS版本:ipvsadm-1.26 keepalive ...
- 转载--CentOS 6.3下部署LVS(NAT)+keepalived实现高性能高可用负载均衡
源地址:http://www.cnblogs.com/mchina/archive/2012/08/27/2644391.html 一.简介 VS/NAT原理图: 二.系统环境 实验拓扑: 系统平台: ...
- keepalived对nginx高可用演练脚本
keepalived对nginx高可用演练脚本 参考文章:http://deidara.blog.51cto.com/400447/302402/ .安装nginx.keepalived.epel-r ...
- RHEL 5.4下部署LVS(DR)+keepalived实现高性能高可用负载均衡
原文地址:http://www.cnblogs.com/mchina/archive/2012/05/23/2514728.html 一.简介 LVS是Linux Virtual Server的简写, ...
- CentOS 6.3下部署LVS(NAT)+keepalived实现高性能高可用负载均衡【转】
CentOS 6.3下部署LVS(NAT)+keepalived实现高性能高可用负载均衡 一.简介 VS/NAT原理图: 二.系统环境 实验拓扑: 系统平台:CentOS 6.3 Kernel:2 ...
- Haproxy+Keepalived搭建Weblogic高可用负载均衡集群
配置环境说明: KVM虚拟机配置 用途 数量 IP地址 机器名 虚拟IP地址 硬件 内存3G 系统盘20G cpu 4核 Haproxy keepalived 2台 192.168.1.10 192 ...
- 基于keepalived搭建MySQL高可用集群
MySQL的高可用方案一般有如下几种: keepalived+双主,MHA,MMM,Heartbeat+DRBD,PXC,Galera Cluster 比较常用的是keepalived+双主,MHA和 ...
随机推荐
- (4)PHP基本语法、变量、数据类型、运算符、流程控制
一.基本语法 1.PHP在网页里的结构 <?php ..... ?> 2.php的另一种格式(不推荐使用) <script language="php"> ...
- SpringBoot动态数据源
1.原理图 2.创建枚举类 /** * 存数据源key值 */ public enum DataSourceKey { master,salve,migration } 3.创建自定义注解类 /** ...
- 如何隐藏 Safari 中 input 标签的 autofill 图标
Safari 浏览器会为 <input type="passport"> 标签自动添加一个小锁的图标(如下图),本意上是让用户可以从这里选择相应的 用户名/密码 进行自 ...
- 在VisualStudio 工具箱中隐藏用户控件
当我们创建一个用户控件后,VisualStudio会自动将其添加到工具箱中,本来这是一个比较贴心的设计.但是,有的时候,我们并不想将用户控件放到工具箱中. 例如:在WPF中,为了避免一个页面的控件过多 ...
- CSS浮动设置与清除
float:设置浮动 浮动会使元素脱离普通文档流,使元素向左或向右移动,其周围的元素也会重新排布,在布局中非常有用. html: <p>以下是图片的浮动设置:</p> < ...
- linux selenium运行chrome
chrome版本要和chromedriver版本匹配才能正常运行.
- IT开发者对Mac钟爱
由于Mac的操作系统OSX相比Windows win7/8/10来说,比較适合开发者使用.个人的体会例如以下: 首先.OSX的多窗体多应用程序切换功能非常强大,对开发者来说非常实用.开发者一般都须要开 ...
- hibernate的 lazy 和 fetch 一般配置
fetch 和 lazy 配置用于数据的查询 lazy 参数值常见有 false 和 true,Hibernate3 映射文件中默认lazy = true : fetch 指定了关联对象抓取的方式,参 ...
- Nginx 服务并发过10万的Linux内核优化配置
以下Linux 系统内核优化配置均经在线业务系统测试,服务器运行状态良好,用了一些时间整理,现和大家分享一下,如有那位高人看到配置上有问题,请给与指出! # Controls the use of T ...
- .Net程序测试使用阿里云OCS开放缓存服务
首先需要有一个阿里的OCS实例和ECS云服务器 请确认这两个是在同一个可用区的,这个很重要! 这两个可以在阿里云官网申请得到 拿到OCS之后 进入OCS控制台,点击下面的客户端下载选择.Net客 ...