searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

分库分表-Sharding-JDBC3-MySql Replication主从复制

2024-06-20 03:17:29
23
0

一、什么是Mysql的主从复制

MySQL数据库自身提供的主从复制功能就可以方便的实现数据的多处自动备份,实现数据库的拓展。多个
数据备份不仅可以加强数据的安全性,通过实现读写分离还能进一步提升数据库的负载性能。

二、Mysql 主从复制分类

2.1 从硬件实现主从复制架构区分

1. 一主一从
  最简单的主从复制架构,一台主机一台从机
2. 一主多从
  在一主多从的数据库体系中,多个从服务器默认采用异步的方式更新主数据库的变化,业务服务器在执行写或者相关修改数据库的操作是在主服务器上进行的,读操作则是在各从服务器上进行(多从需要考虑相应的负载均衡)
3. 多主无从
  多个master,所有的master全部会负责读+写,master和master之间会建立一个主主复制,就不在是简单的主从复制,一般情况下只在解决"高可用性"(High availability, HA)使用多主无从
多主涉及到2中模式:

  • 主备:active-passive模式,active服务器对外提供正常服务,当active宕机时,passive中进行选举一个升级为新的active对外提供服务,active 和 passive 进行主主复制保证数据一致性
  • 互为主从:active-active 模式,也可以理解为互为主从,所有的maste都是activer全部会负责读+写,业务场景更多的是写多读少,master对于代码来说是透明的,请求经过负载均衡之后分发到相应的某一个master上,master和master之间也是通过主主复制保证数据一致性。

无论是active-active还是active-passive, 都是为了解决"高可用性"(High availability, HA)问题. 就是说尽量不要让你的服务挂掉.
4. 主到从到从

链式复制:主从从模式,maste 和 slave1、slave2 进行主从复制,但是 slave1、slave2两台服务器既做主又做从,需要与 slave3、slave4同步数据
5. 环形多主
  服务器互为主从,业互为主从结构只不过是在master1于master2上互相设置主服务器为对方。务场景更多的是写多读少,master对于代码来说是透明的,请求经过负载均衡之后会发到相应的某一个master上,master之间再进行主主复制。属于active-active 模式
7. 多主多从

主从之间主从复制,主主互为主从进行主主复制

2.2 复制方式区分

1. 异步复制
  My SQL复制默认是异步复制, Master:将事件写入 bingo,提交事务,自身并不知道save是否接收是否处理;这样就会有一个问题,主如果 crash掉了,此时主上已经提交的事务可能并没有传到从上,如果此时强行将从提升为主,可能导致新主上的数据丢失
  缺点:牺牲了强一致性,不能保证所有事务都被所有save接收
2. 同步复制
  所有的从库都执行了该事务才返回给客户端,也就是说 Maste提交事务,直到事务在所有save都已提交,才会返回客户端事务执行完毕信息;
  缺点:需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会受到严重的影响

3. 半同步复制
  当Master上开启半同步复制功前时,至少有一个save开启其功能。当 Master向 slave提交事务,且事务已写入 relay-og中并刷新到磁盘上,Save才会告知 Maste已收到;若 Master提交事务受到阻塞,出现等待超时,在一定时间内 Master没被告知已收到,此时 Master自动转换为异步复制机制。
  介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给套户端,而是等待至少一个从库接收到并写到 relay log中才返回给客户端。
  缺点:
  此时,客户端会收到事务提交失败的信息,客户端会重新提交该事务到新的主上,当岩机的主库重新
启动后,以从库的身份重新加入到该主从结构中,会发现,该事务在从库中被提交了两次,一次是之前作为主的时候,一次是被新主同步过来
  此时,从库已经收到并应用了该事务,但是客户端仍然会收到事务提交失败的信息,重新提交该事务到新的主机上 
半同步复制(mysql5.5以上支持),5.7 中半同步复制已经解决了2次写入的缺点

三、主从复制实现原理

复制过程:

1、 Master必须启用二进制日志,将任何修改了数据库数据的事件(insert,alert,create…)记录到二进制日志(binarylog)中;
2、 Slave开启一个线程(I/OThread)把自己扮演成mysql的客户端,通过mysql协议,请求Master的二进制日志文件中的事件;
3、 Master启动一个线程(dumpThread),检查自己二进制日志中的事件,跟对方请求的位置对比,如果不带请求位置参数,则Master就会从第一个日志文件中的第一个事件一个一个发送给Slave;
4、 Slave接收到Master发送过来的数据把它放置到中继日志(Relaylog)文件中并记录该次请求到Master的具体哪一个二进制日志文件内部的哪一个位置(主节点中的二进制文件会有多个);
5、 Slave启动另外一个线程(sqlThread),把Relaylog中的事件读取出来,并在本地再执行一次;

0条评论
0 / 1000