本文根据DBAplus社群第67期线上分享整理而成前端
本次分享主要包括如下内容:git
一、MySQL高可用方案github
二、为何选择MHAweb
三、读写分离方案的寻找以及为何选择Maxscalesql
1、MySQL Failover的方案后端
常见的Failover方案缓存
MMM服务器
MMM缺点:微信
Monitor节点是单点,能够结合Keepalived实现高可用目前MySQL Failover 的方案架构
Keepalived会有脑裂的风险
在读写繁忙的业务中可能丢数据
MHA + ssh -o 测试心跳 + masterMHA_secondary_check(两次检测)
MHA
MHA优势:
从宕机崩溃的Master保存二进制日志事件(binlogevent)
识别含有最新更新的Slave
应用差别的中继日志(relaylog)到其余Slave
应用从Master保存的二进制日志事件
提高一个Slave为新的Master
使其余的Slave链接新的Master进行复制
MariaDB Replication Manager (MRM)
只支持MariaDB with GTID based replication topologies
2、MHA
今天主要说下MHA。MHA能够说是强一致的主从切换工具 ,并且切换间隔小于30s,很是适合在线上使用。
具体原理
从宕机崩溃的Master保存二进制日志事件(binlogevent)
识别含有最新更新的Slave
应用差别的中继日志(relaylog)到其余Slave
应用从Master保存的二进制日志事件
提高一个Slave为新的Master
使其余的Slave链接新的Master进行复制
MHA组成
rpm -ql MHA4MySQL-manager-0.56-0.el6.noarch
一、管理节点
二、数据节点
三、MySQL的配置要点
安装配置MHA
1)MySQL主从
MySQL一主两从(一个candidate_master)
master:
slave:
MySQL主从搭建 (一主两从)
1)MySQL主从配置
建立用户
备份
MySQLdump --master-data=2 --single-transaction -A > bk.sql (咱们生产上不容许使用函数和存储过程)
Tips:若是不是新建db,建议使用mydumper(slave)或者innobackupex(master) 备份
从库执行
a.将bk.sql 在从库恢复
b.执行
c.若是开启GTID
Tips:
一、下降数据丢失风险
innodb_flush_log_at_trx_commit=1
innodb_support_xa=1
sync_binlog =1
gtid
半同步复制或者5.7的加强半同步
binlog_format 为RBR
二、主从一致检测
pt-table-checksum
pt-table-sync
pt-online-schema-change 虽然5.6 支持ddl online ,我仍是建议使用pt-osc ,可是注意:若是binlog_format为SBR , 使用pt-osc 会有主键冲突的风险
四、MHA配置
1)ssh 配置
ansible 来作
2)安装MHA
yum install -y --nogpgcheck MHA4MySQL-*(已经下载好了) 在每一个节点都执行
3)编辑文件
4)清理relay log
slave上的relay_log_purge是关闭的,在MHA环境中,failover时,会用到relay log来对比差别日志,将差别日志发送到其余slave上,进行回放
五、MHA环境监测
检查MHA环境
启动MHA manager
六、MHA切换测试
1)模拟实例cresh
/etc/init.d/MySQL stop
2)模拟主机cresh
echo a > /proc/sysrq-trigger
3)使用iptables
iptables -A INPUT -p tcp -m iprange --src-range 192.168.10.1-192.168.10.241 --d port 3306 -j DROP
PS.能够在master节点跑sysbench,在压测的过程当中来作以上测试
Tips:
MHA默认没有arping,这个要本身加上,不然服务器会自动等到vip缓存失效,期间VIP会有必定时间的不可用
masterha_manager 命令行中加入--ignore_last_failover 不然再次切换会失败,除非删除app1.failover.complete文件
vip 咱们没有使用keepalive,是在两个主机上插网线, 如eth1,将vip加到 master 的eth1上
要将备主的对应网卡激活
report_script=/usr/bin/send_report 发邮件的功能要加上
slave不要延迟过长,延迟越久,切换也越久
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.10.100 -s 192.168.10.101 --user=root --master_host=maven119 --master_ip=192.168.10.88 --master_port=3306 这样只有当两个manager都ping不通才会切换,防止数据不一致(注意修改masterha_secondary_check 中ssh的端口号,他是写死的22)
grep -i 'change master' manager.log 能够找到change master to 语句 ,能够在切换后旧的主库上执行
设置 ignore_fail = 1 这样即便slave 有错误,也会切换
设置ssh 的 timeout 防止ssh链接慢时,MHA发生切换
七、MHA manager 管理多实例
这样就完成多实例的部署。
Tips:
若是以为MHA部署麻烦,还要本身写脚本,可使用MHA_helper
web:https://github.com/ovaistariq/MHA-helper
SQL-aware负载均衡器:
MySQL proxy:官方不维护了
MySQL Router:官方维护,比较简单
MaxScale:插件式,定制灵活,自动检测MySQL master failure
Amoeba:支持sql过滤,读写分离,sharding,不支持 MySQL Failover
Cobar:支持分库,不支持分表
MyCat:基于Cobar的二次开发
TDDL(Taobao Distributed Data Layer):阿里自研的基于client模式的读写分离的中间件
3、Maxscale
这里想要介绍的是Maxscale。
Maxscale有哪些优势呢,一句话,上面这些中间件有的优势,它基本都有。
带权重的读写分离(负载均衡)
SQL防火墙
多种路由策略(Connection based, Statement based,Schema based)
自动检测MySQL master Failover (配合MHA或者MRM)
检测主从延时
多租户sharding架构
架构比较
大多数互联网公司的db架构
隐患:通常的互联网公司会使用MHA作Failover , 而后使用LVS在读库上作负载均衡,可是LVS走的TCP协议,当read 库挂掉,LVS也不会将其踢掉,另外LVS对长链接的应用支持的很差, 由于因为LVS的检查时长通常在30s, 可是长链接的设置通常都是30分钟,或者不设置timwout,这样,当业务端 断开链接后,LVS还认为它会死活着的, 因此 链接到db的thread却并不减小。形成thead_connected 打满,MySQL不可用。
使用Maxscale的db层架构
规避了使用LVS时候的长连接超时不断开问题。
Maxscale配置很简单
yum -y install Maxscale (只在Maxscale上执行)
cp MaxScale_template.cnf Maxscale.cnf
生成密码:
maxkeys /var/lib/maxscale/
maxpasswd /var/lib/maxscale/ maven119
修改配置文件
须要的单独找我吧,太长了配置文件……
经过管理命令,查看状态
能够看到目前有两台db,以及运行状态
看到开启了什么服务读写分离和client
下面来作一下结单的测试:
MySQL master节点:
4 rows in set (0.00 sec)
MySQL slave节点,多增长一条记录。
发现读打在了从库。
若是想让读搭载主库上 ,能够把select语句放到事务中。
具体的读写状况可使用general_log观察。
在 master 节点执行 :
set global general_log=1;
在Maxscale节点执行 :
发现写打在了主库上。
Tips:
若是想要在master上读
能够把select语句放到事务中begin;select;commit
Maxscale会对每一个slave作健康检查,原理与pt-heartbeat同样的。主库插入时间戳,到slave与serevr时间对比。
gnoring secrets file /var/lib/maxscale/.secrets, invalid permissions .secrets的权限不对 chown maxscale:maxscale .secrets
Maxscale 1.4版本作了不少的改进
重要概念DCB
从这种图中能够看出来DCB的重要性了,callback 最后走到了 dcb.h
那么什么是DCB呢?
一个DCB(Descriptor Control Block)表示一个在MaxScale内部的链接的状态,每一个来自client的链接、到后端server的链接、以及每一个listener都会被分配一个DCB,这些链接的状态统计由这些DCB来完成。每一个DCB并不会有特定的名字用于查询,而是直接使用具备惟一性的内存地址。
Maxscale的MHA
官方推荐使用Lsyncd或者Corosync-Pacemaker。
我的认为Maxscale的一些想法是不错的,包括Percona也生成Maxscale是目前最好的读写分离中间件。目前还不是很成熟,小项目能够试试。大型项目仍是推荐TDDL这种通过生产实践的中间件。
Maxscale与MHA整合
Maxscale与MHA整合其实很是简单,通常MHA都会让 开发使用vip。master宕掉后,slave接管,对前端是透明的。
在与Maxscale结合的时候,Maxscale.conf文件不须要改变任何东西,只须要在后端将MHA部署上就能够。因Maxscale能够监控MySQL的主从变动。
总结:Maxscale与MHA整合,只须要安装MHA便可。
写在最后,对已有的MySQL主从环境上MHA和Maxscale几乎不须要更改任何配置。只须要更改开发框架中的配置 ,把原IP和端口改写为Maxscale server的IP和端口便可。
Q&A
Q1:请问,这个10.10.111.1是部署Maxscale服务器的物理IP吗,部署Maxscale的服务器是否是也须要两台服务器作HA?就一台服务器的话要是意外宕机岂不是会致使整个应用瘫痪?仍是说我理解错了?
A1:官方推荐使用Lsyncd或者Corosync-Pacemaker作Maxscale的HA。
Q2:监控系统是自主研发的仍是采用开源的?都是以哪些为监控指标来监控性能和稳定性的?
A2:pt-heartbeat来实时监控主从状态,pt-heartbeat能够一秒。
Q3:一直不明白挺好的东西为啥不用,非要主从之间切来切去?
A3:可能场景不一样,咱们通常都会有4台db作Master-slave,主要是须要扩容读库。优酷基本上是读大于写。
Q4:slave-skip-errors = 1062,1032,1060这类配置大家用吗?
A4:用。可是1062,1032这两个不能配。
好书相送
在本文微信评论区留下足以引发共鸣的真知灼见,