28 | 读写分离有哪些坑?

怎么处理主备延迟导致的读写分离

图 1 读写分离基本结构

分摊主库压力。client负载均衡,

中间代理层 proxy,客户端连接 proxy(根据请求类型上下文决定分发路由

图 2 带 proxy 的读写分离架构  

1.  客户端直连,少了一层 转发,查询性能好排查问题方便。连接信息客户端连接层,主备切换、库迁移客户端感知调整连接信息。信息冗余,架构很丑。伴随管理后端组件Zookeeper

2.   proxy 架构(更多),客户端不需关注后端连接维护、后端信息维护等工作,proxy 需高可用架构,相对复杂。

过期读”:主从延迟,更新后马上查询,从库查询,可能读到更新前状态。

处理过期读方案

强制走主库方案;

sleep 方案;

判断主备无延迟方案;

配合 semi-sync 方案;

等主库位点方案;

等 GTID 方案。

一、强制走主库方案

两类查询:

1.  最新结果库。看商品是否发布成功。

2.  可读旧数据发库。晚几秒看到最新发布商品。

金融类的业务。读写压力都在主库放弃扩展性

二、Sleep 方案

主库更新后,读从库之先 sleep,类似执行select  sleep(1)(主备延迟在 1 秒之内, sleep 大概率拿最新)

用户体验不友好,但解决问题:商品发布后,用 Ajax(Asynchronous JavaScript + XML,异步 JavaScript 和 XML)显示客户端内容“新的商品”,不真查询。再刷新查看商品时,过了一段时间,达到sleep 目的

不精确,包含了两层意思:

1.  本来 0.5 秒就可拿结果(从库),等 1 秒

2.  延迟超过 1 秒,还会过期读

三、判断主备无延迟方案

第 25 篇文章, show slave status 里seconds_behind_master衡量主备延迟时间

(1)从库查询前,seconds_behind_master 是否=0。不等于  ,等0 执行。

图 3 show slave status 结果

(2)对比位点

Master_Log_File 和 Read_Master_Log_Pos,主库最新位点

Relay_Master_Log_File 和 Exec_Master_Log_Pos,备库最新位点

两组值完全相同,同步完成

(3)对比 GTID 集合

Auto_Position=1 ,主备关系GTID 协议

Retrieved_Gtid_Set备库收到GTID 集合

Executed_Gtid_Set备库执行完 GTID 集合

这两个集合相同,表示备库都同步完成

2、3 更准确,没有达到“精确”

事务 binlog 主备库之间状态:

1. 主库执行完,写入 binlog,反客户端;

2.  binlog 主库发备库;

3. 备库执行 binlog 完成。

无延迟逻辑:“备库收到的日志都执行完成了”。但一部分日志,客户端提交备库,没收到日志状态

图 4 备库还没收到 trx3

主库上执行完成了三个事务 trx1、trx2 和 trx3,其中:

1.  trx1 和2 传到从库,执行完;

2.  trx3 主库执行完,回复客户端,没有从库中。

B 查不到 trx3 出现了过期读

四、配合semi-sync

引入半同步复制semi-sync replication。

1.  提交时,主库binlog 发从

2. 从发回给主库ack,表收到

3. 主库收到ack 后,给客户端返回“完成”

第 25 篇文章如果主库掉电,binlog 没发从库会不会数据丢失?

异步复制可能丢失semi-sync + 位点判断,解决(一主一备),避免过期读

一主多从,从库查询两种情况:

1.  查询响应ack从库,读最新

2.  其他从库上,过期读

潜在问题,高峰期,主库位点或 GTID 集合更新快,两位一直不等,从库无法响应。查询不需要等到“主备完全同步”

图 5 主备持续延迟一个事务

等待位点 bad case。 1 到状态 4,一直延迟

客户端发完 trx1 更新后 select ,确保 trx1完成就可(3 查得预期)

semi-sync 配合判断主备无延迟方案,两个问题(等主库位点解决):

一主多从,过期读过度等

五、等主库位点方案

从库执行:select  master_pos_wait(file, pos[, timeout]);//主库上文件名和位置;timeout 最多等 N 秒(可选)

返回正整数 M,从开始到应用完 file 和 pos (表示的 binlog 位置)执行多少事务

返回其他结果:

1. 异常,返回 NULL

2.  等待超过 N 秒,返回 -1

3.  执行过这个位置,返回 0

先执行 trx1,再查询保证数据正确

1.  trx1 更新完,show master status 得主库 File 和 Position

2. 选从库,执行 select master_pos_wait(File, Position, 1);

4.  返回正整数,从库查询;否则主库执行

图 6 master_pos_wait 方案

1 秒内返回正整数,查询正确。等待超时,放弃主库去查

步骤 5 主库查询语句,退化机制。

从库都延迟超过 1 秒,压力都跑主库上

不允许过期读,要么超时放弃,要么转主库查。做好限流

六、GTID 方案

开启了 GTID 模式,对应等待 GTID方案。

 select wait_for_executed_gtid_set(gtid_set,  1);  等待直到执行事务包含gtid_set返回 0;超时返回 1。

等位点中,执行后主库show master status。5.7.6 版本开始,更新后,GTID 返回客户端,GTID 减一次查询。

GTID 流程

1. trx1 更新后,返回包获取 GTID,记为 gtid1;

2.  选从库,执行 select wait_for_executed_gtid_set(gtid1, 1)

3.  返回 0,从库查询;否则主库查询

图 7 wait_for_executed_gtid_set 方案

session_track_gtids = OWN_GTID,通过 API 接口mysql_session_track_get_first 返回包解析出 GTID 值

mysql_reset_connection 没有接口SQL 用法,提供给程序API(https://dev.mysql.com/doc/refman/5.7/en/c-api-functions.html)。

提交后,返回GITD 在客户端显示修改

图 8 显示更新事务的 GTID-- 代码
图 9 显示更新事务的 GTID-- 效果

客户端代码中调用mysql_session_track_get_first 函数

小结

一主多从做读写分离,读的方案。

不接受过期读,用等待位点和 GTID ,实际混合用

不需等就可水平扩展,写性能换来。

问题

 GTID 主库大表DDL,可能会出现什么情况呢?如何避免?


主库10 分钟,提交后传备库10 分钟。主库 DDL 后再提交 GTID,备库10 分钟才查到。超时走主库。

低峰期都切到主库,等备库延迟追上,读切备

gh-ost也可解决

评论1

主从延迟,流量全到主库

1.库SET sql_log_bin = OFF,然后DDL,从库及备主全做完,主从切换,同样的方式DDL

2.从库DDL从库GTID在主库上生成(利用生成空事务GTID方式)。切换,主库同样。

MM,写职责主库slave先停

评论2

proxy分布式数据库难点。MariaDB MaxScale

一主多从可以多到什么地步,一主十三从?

13从有点多,主库生成binlog快网卡被打爆。这么多得做级联

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

推荐阅读更多精彩内容