mysql5.7数据强一致性与高可用(2)

上节简单的介绍了MySQL5.5,5.6,5.7各版本做半同步复制的差异,现在开始做一个实际的操作。业务需求(金融):性能方面可以退而求其次,但是必须做到数据的强一致性与服务的高可用性。如此,正好用上MySQL5.7版本的无损复制。

基础环境:CentOS7.2 MySQL5.7.20
A:172.31.1.51
B:172.31.1.61
基本架构:两台服务器都要安装MySQL+keepalived,做MySQL的双主模型,平时只有一台(A)对外提供服务,另一台(B)做备,当对外提供服务的A宕机或服务不可用时则对外IP自动切换到备B服务器(也是主)上,做到服务的高可用性。

1.使用semisync半同步机制,保证双主数据一致。

A、B上都需执行:
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so'; --安装 semisync_master.so插件

mysql>install plugin rpl_semi_sync_slave soname 'semisync_slave.so'; --安装 semisync_slave.so插件

然后分别查看:show plugins; 查看模块,模块都已安装。

如此,则证明A,B都可以使用semisync半同步机制了,下面再做相应的配置启用此功能。

双主的配置:

A:
[client]  
default-character-set=utf8

[mysqld]
#数据强一致性
rpl_semi_sync_master_enabled=1
rpl_semi_sync_slave_enabled=1
rpl_semi_sync_master_timeout=6000
#二进制日志的格式
binlog-format=ROW
###启用二进制日志
log-bin=master-bin
###slave 更新是否记录到日志
log-slave-updates=true
###启用gtid类型,否则就是普通的复制架构
gtid-mode=on
###强制GTID的一致性
enforce-gtid-consistency=true
###主服信息记录库=表/文件
master-info-repository=TABLE
###中继日志信息记录库
relay-log-info-repository=TABLE
###同步主库信息
sync-master-info=1
###从服务器的SQL线程数,要复制库数目相同
slave-parallel-workers=2
###校验码
binlog-checksum=CRC32
###主服校验
master-verify-checksum=1
###从服校验
slave-sql-verify-checksum=1
###二进制日志详细记录事件
binlog-rows-query-log_events=1
###提供复制报告端口
report-port=3306
###提供复制报告主机
report-host=172.31.1.51
###主库id
server-id=50
port=3306
##忽略不需要同步的库
binlog-ignore-db = information_schema
binlog-ignore-db = performance_schema
binlog-ignore-db = sys
##保留3天的二进制日志
expire-logs-days=3
#开启慢查询日志
slow_query_log = on
##超出时间设定值的SQL即被记录到慢查询日志
long_query_time = 2
slow_query_log_file = /var/log/mysql/master_slow.log
#优化部分
join_buffer_size = 128M
sort_buffer_size = 16M
read_rnd_buffer_size = 16M
interactive_timeout = 600
wait_timeout = 60
skip-name-resolve
back_log = 200
max_connections = 300
table_open_cache = 1024
max_allowed_packet = 4M
query_cache_size = 128M
innodb_buffer_pool_size = 4096M
innodb_file_per_table = 1
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

#修改字符集
character-set-server=utf8
collation-server=utf8_general_ci

B:

[client]  
default-character-set=utf8

[mysqld]
#数据强一致性
rpl_semi_sync_master_enabled=1
rpl_semi_sync_slave_enabled = 1
rpl_semi_sync_master_timeout=6000
#主从配置
log-bin=slave-bin
sync_binlog=0
binlog_format=row
log-slave-updates=true
gtid-mode=on
enforce-gtid-consistency=true
master-info-repository=TABLE
relay-log-info-repository=TABLE
sync-master-info=1
slave-parallel-workers=2
binlog-checksum=CRC32
master-verify-checksum=1
slave-sql-verify-checksum=1
binlog-rows-query-log_events=1
report-port=3306
port=3306
report-host=172.31.1.61
server-id = 60
expire-logs-days=3
slave-skip-errors=all
binlog-ignore-db = information_schema
binlog-ignore-db = performance_schema
binlog-ignore-db = sys

#优化配置
join_buffer_size = 128M
sort_buffer_size = 16M
read_rnd_buffer_size = 16M
interactive_timeout = 600
wait_timeout = 60
skip-name-resolve
back_log = 200
max_connections = 300
table_open_cache = 1024
max_allowed_packet = 4M
query_cache_size = 128M
innodb_buffer_pool_size = 4096M
innodb_file_per_table = 1
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

#修改字符集
character-set-server=utf8
collation-server=utf8_general_ci

然后在A、B上分别授权给从服务器(A、B互为主从,即双主)
A做主,B做从,A上执行:

主给从授权:
grant  replication  slave,replication  client  on  *.*  to  user1@'172.31.1.61'   identified   by 'xxxxxxxx';

从库执行:
change master to master_host='172.31.1.51',master_user='user1',master_port=3306,master_password='xxxxxxxx',master_auto_position=1;

A做从,B做主,B上执行:

主给从授权:
grant  replication  slave,replication  client  on  *.*  to  user1@'172.31.1.51'   identified   by 'xxxxxxxx';

从库执行:
change master to master_host='172.31.1.61',master_user='user1',master_port=3306,master_password='xxxxxxxx',master_auto_position=1;
2. 怎么确认是同步还是半同步?

至此,重启A、B的MySQL服务,分别执行如下SQL:
A上执行:

1.png

B上执行:
2.png

依据上面的A、B服务器的my.cnf配置我们可以看出,A、B都已经启用了semisync半同步机制,且都是主服务器。(不必纠结于我的binlog日志号,因为这是环境做好后补发的文档)

3.参数解析:
mysql> show status like "%semi%";
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 1     |有多少个Semi-sync的备库
| Rpl_semi_sync_master_net_avg_wait_time     | 0     |事务提交后,等待备库响应的平均时间
| Rpl_semi_sync_master_net_wait_time         | 0     |等待网络响应的总次数
| Rpl_semi_sync_master_net_waits             | 0     |总的网络等待时间
| Rpl_semi_sync_master_no_times              | 0     |一共有几次从Semi-sync跌回普通状态
| Rpl_semi_sync_master_no_tx                 | 0     |库未及时响应的事务数,如果这个值很大就有问题
| Rpl_semi_sync_master_status                | ON    |主库上Semi-sync是否正常开启
| Rpl_semi_sync_master_timefunc_failures     | 0     |时间函数未正常工作的次数
| Rpl_semi_sync_master_tx_avg_wait_time      | 0     |开启Semi-sync,事务返回需要等待的平均时间
| Rpl_semi_sync_master_tx_wait_time          | 0     |事务等待备库响应的总时间
| Rpl_semi_sync_master_tx_waits              | 0     |事务等待备库响应的总次数
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |改变当前等待最小二进制日志的次数
| Rpl_semi_sync_master_wait_sessions         | 0     |当前有几个线程在等备库响应
| Rpl_semi_sync_master_yes_tx                | 0     |Semi-sync模式下,成功的事务数
| Rpl_semi_sync_slave_status                 | ON    |备库上Semi-sync是否正常开启
+--------------------------------------------+-------+

rpl_semi_sync_master_timeout=60000

表示主库在某次事务中,如果等待时间超过6秒,则降级为普通模式,不再等待备库。如果主库再次探测到备库恢复了,则会自动再次回到semisync模式。
很好的解释了上篇讲到的如果从库宕机了,那么从库就不会返回ACK给master的解决办法。

rpl_semi_sync_master_wait_point=AFTER_SYNC

这个参数是MySQL5.7新增的,AFTER_SYNC(5.7默认)工作流程:
1、客户端提交一个事务,master将事务写入binlog并刷新到磁盘,发送到slave,master等待slave反馈。
2、slave接收master的binlog,写到本地的relaylog里。发送确认信息给master。
3、当接收到slave反馈,master提交事务并返回结果给客户端。这样就保证了主从数据一致。

4. 再来看A、B都为从库是否正常

A上执行sql如下:

3.png

B上执行sql如下:
4.png

此处可能会优点混乱,但是仔细看上面A、B服务器的my.cnf的配置就能够看出来是正常的,文档水平有限,请谅解。

至此,我的基于MySQL5.7做的双主数据强一致服务已然完成,下一篇再写高可用。如有不当之处,烦请指导。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容

  • 环境 操作系统:CentOS-6.6-x86_64-bin-DVD1.iso MySQL版本:mysql-5.6....
    思梦PHP阅读 2,042评论 0 12
  • 在谈MySQL5.7的数据强一致性之前先来看看5.5,5.6,5.7版本做数据半同步复制时的原理。 1.半同步复制...
    wangfs阅读 2,292评论 0 0
  • 文/萧让 对飒飒冷风细雨来 逐渐人失魂 东风胡乱吹,鱼游鸽眠,艳阳哀愁 湖畔莺歌燕舞,水映图书楼 芳华绝代美,思绪...
    萧让听雪阅读 179评论 0 0
  • 上天在创造人类时,给了我们两只眼睛,一只眼睛要我们看别人,一只眼睛要我们看自己。只是我们总是把别人的那只眼睁得很大...
    欧阳善策阅读 536评论 0 0
  • 六月以后就进入了一个小魔咒,十一假期以后进入一个大魔咒,到现在,魔咒似乎又升级了。你走过一些路,经历一些事,...
    给懒惰起个好名字阅读 148评论 0 0