美文网首页
微服务MySQL改造

微服务MySQL改造

作者: 滨岩 | 来源:发表于2020-03-04 17:58 被阅读0次

MySQL 主从复制之半同步模式
MYSQL半同步概念:一般情况下Mysql默认复制模式为异步

异步复制模式

主服务器的I/O threads 将 binlog 写入二进制日志中就返回给客户端请求一个结果,无需等待二进制日志是否成功发送到从库和从库上是否成功完成relay log写入和SQL threads从relay log中提取二进制写入自己binlog的过程。异步模式的缺点是一旦主库写入binlog 发生宕机,此时从库还未完成对主库传送过来的binlog的读写存储操作,那么从库就会发生数据丢失的风险。

半同步模式

主库将binlog日志信息写入到日志中,然后等待从库完成后接受读取和存储操作,从库返回主库一个ack确认信息,即从库接收完主库发送过来的binlog内容,并写入自己的repalylog中,通知主库上的等待线程,该操作已经完成。主库接收到从库发过来的信息就会进入下一个同步操作,如果此时等待超时,超过主库设置的超时时间限制(rpl_semi_sync_master_timeout),则关闭半同步,并切换为异步模式,直到至少一台从库告诉已经接收到传送过来的binlog信息为止。

mysql 主从复制延迟问题

insert操作:查询一次从库未找到,可以从主库中去获取。
update操作:查询主库是有的,但是从库未同步,比如主库扣减了金额100,但是从库还是差的原来老的值,就出现数据不一致的风险。
一种解决方案就是写主库的时候,向Redis写一份,然后查询的时候从Redis去取,当然这要系统就变得复杂化了。
第二种解决方案就是实时性比较高的直接查询主库,这样的话主库流量就扛不住,又回到单点故障来了,写扛不住的时候,就要分库分表
第三种解决方案:写主库的时候3秒内切主库查询,3秒后同步完成之后,切从库查询。
第三种方案:主写入量很大就采取分库分表的形式,主写入量不大可以考虑直接开启强同步,每次写库,需要等从库同步ack成功之后再返回。

分库分表拆分

数据库拆分,用户表为例
用户表(单一查询维度)
uid,name,city,time,sex,age
5亿记录
x86_64机器
如何分表
Partition key 如何选择
城市、时间、用户唯一标示

uid:20 ,name:50,city:8,time:13位 sex 1位 age 3位

20+50+8+13+1+3=95Byte

如果 size of row <100B 5千万
如果 size of row >100B 1千万

当然还要看存储介质:硬盘是PCLE SSD
5亿记录/5千万=10张表
但是10张表 不是2的幂,所以我们用16,扩展最好是扩一倍,这样迁移数据只需要迁移50%

商品表(多个查询维度)
uid,infoid,content,timestamp
5亿记录
X86_64机器
查询维度
uid infoid timestamp
如何分表
partition 可以如何选择

相关文章

网友评论

      本文标题:微服务MySQL改造

      本文链接:https://www.haomeiwen.com/subject/qxiblhtx.html