微服务MySQL改造

三丰 soft张三丰

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 可以如何选择

列的字符串类型可以是什么?


字符串类型是:SET BLOB ENUM CHAR TEXT VARCHAR

CHAR 和 VARCHAR 的区别?


CHAR 和 VARCHAR 类型在存储和检索方面有所不同。CHAR 列长度固定为创建表时声明的长度,长度值范围是 1 到 255。当 CHAR 值被存储时,它们被用空格填充到特定长度,检索 CHAR 值时需删除尾随空格。

在 MySQL 中 ENUM 的用法是什么?


ENUM 是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用。SQL 语法如下:Create table size(name ENUM('Smail,'Medium','Large');

面试题积累 https://www.cnblogs.com/skyme/p/13212296.html