数据库架构
主从复制如何工作
实现原理
- 打开二进制日志bin log
- 主库db的更新事件(update、insert、delete)被写到binlog
- 主库创建一个binlog dump thread,把binlog的内容发送到从库
- 从库启动并发起连接,连接到主库
- 从库启动之后,创建一个I/O线程,读取主库传过来的binlog内容并写入到relay log
- 从库启动之后,创建一个SQL线程,从relay log里面读取内容,从Exec_Master_Log_Pos位置开始执行读取到的更新事件,将更新内容写入到slave的db
异步复制
半同步复制
需要从服务器在等待时间内进行回答,否则降级为异步复制
主从复制配置
master
slaver
读写分离
如何支持事务
- client将读或写请求路由到不同的master或slave上,提高QPS
- 如果读操作是为了写操作,则在client上开启事务
读库延迟问题怎么处理
client向master提交了事务,master回复事务已经成功,但是没有同步到slave,只能保持最终一致性
- 解决方式1:让client等一等,等待master与slave同步
- 解决方式2:将需要写完之后立马读的数据强制转接到master上(读操作打上事务标签)
主从切换事务
master宕机时,将slave提升为master,并且切换client
风险:bin log来不及处理,来不及完成同步
解决:半同步方案,master只有收到至少一个slave的确认消息后再对客户端进行回复,master宕机后寻找最新的slave
半同步风险: slave同步ack丢失
再解决:2PC,MYSQL没有,因为影响性能
分库分表
垂直拆分
join操作,小表驱动大表
水平拆分:分库分表
QPS、TPS打散
按照user_id进行打散,分库分表
按照时间戳进行分库分表
按照Item搞到对应的搜索引擎中
基于GTID方式的复制和基于日志点的复制
基于日志点的复制
从主服务器的哪个二进制日志的偏移量进行增量同步,如果指定错误会造成遗漏或重复。
随着事务的提交,二进制文件和偏移量是不断改变的,Master宕机,很难找到正确的文件名和偏移量
- 传统的主从复制方式
- slave请求Master的增量日志依赖于日志偏移量
- 配置链路时需指定master_log_file和master_log_pos参数
GTID复制
从服务器会告诉主服务器,已经在从服务器上已经执行完了哪些gtid值,然后主库会把从库未执行的事务gtid值发送给从库执行。同一个事务只在指定的从库上执行一次,主服务器宕机后,可以通过事务ID比较出哪一台S上的事务更接近主服务器的状态,从而选举出最合适的M
- GTID全局事务ID(集群范围内):
source_id:transcation_id
, s表示M的id,t表示事务的id - Slave增量同步Master的数据依赖于其未同步的事务ID,记录哪些事务还没有同步到s上
- 配置复制链路时,s可以根据已经同步的事务ID继续自动同步
MMM和MHA两种高可用架构的优缺点
MMM与MHA的作用
- 对主从复制集群中的Master的健康状况进行监控
- 当Master宕机后把写VIP迁移到新的Master(VIP标识Master迁移到新的Master)
- 重新配置集群中的其他Slave对新Master的同步
MMM(Master-Master replication manager)
是一套支持双主故障切换和双主日常管理的脚本程序。MMM使用Perl语言开发,主要用来监控和管理MySQL Master-Master(双主)复制,虽然叫做双主复制,但是业务上同一时刻只允许对一个主进行写入,另一台备选主上提供部分读服务,以加速在主主切换时刻备选主的预热,可以说MMM这套脚本程序一方面实现了故障切换的功能,另一方面其内部附加的工具脚本也可以实现多个slave的read负载均衡。
读VIP可以在SLAVE之间进行迁移,写VIP只能在主和主备之前进行迁移(主服务器宕机时就适用主备),从服务器出现宕机,则也迁移到其他从服务器上
MMM_monitor服务器用于监控整套系统
MMM故障转移过程:
Slave服务器
- 完成主上已复制日志的恢复
- Change Master命令配置新Master(主备)
Master服务器上的操作
- 关闭 read_only
- 迁移写VIP
MMA(Master HA)
MASTER宕机时,从几个从服务器中选出最接近MASTER的服务器作为新的MASTER
MHA故障恢复
如何减小主从复制的延迟
- 大表DDL的操作,在Master上执行:1.把大数据化为小事务 2.适用pt-online-schema-change工具进行DDL操作,建设新表,对新表修改,新表修改完毕后,修改新表名字,并删除原始表
- bin_log,网络延迟:1.减小单次事务处理的数据量以减小产生的日志文件大小2.减少需要同步的slave数量
- 主上多线程并发写入,从上单线程恢复引起的延迟,1.适用mysql5.7后的多线程复制,2.MGR复制架构
MGR(全新的复制技术)
- Mysql Group Replication
- 官方推出的一种基于Paxos协议的复制
- 不同于异步复制的多Master复制集群
多主模式:获得请求的节点对其他节点进行广播,都收到消息后才可以处理,多个节点可以同时处理前端的写请求
单主模式:只有一个可以处理写请求
多主模式:都可以处理写请求
如何解决数据库读写负载大的问题
-
读负载大:增加slave,读写分离或增加中间层反向代理
-
写负载大: