同步复制-组复制-多实例-主主复制
同步复制(组复制)
了解 MGR(multi group replication) —>多节点的组复制
Consensus
是 讨论,共识 —>(半数以上的成功通过就可以)达成一致
Consensus 分为单主和
多主
(推荐使用)多主最多可以支持九个节点↓
- Master 1:
- 执行操作(execute)。
- 然后对这些操作进行认证(certify)。
- 接着操作被写入到一个二进制日志(binlog)。
- 最后,操作被提交(commit)到数据库。
- Master 2 和 Master 3:
- 这两个实例不直接执行操作,而是从一个中继日志(relay log)中获取操作。
- 它们各自认证(certify)这些操作,保证数据的一致性。
- 然后应用(apply)这些操作到自己的数据集。
- 将操作写入自己的二进制日志(binlog)。
- 最后提交(commit)操作。
底部的“Consensus”表示所有的主实例在进行变更前需要达成一致,这是为了确保数据在所有主实例中保持同步和一致性。
什么是同步复制
同步复制是数据库复制技术的一种形式,它确保数据在多个数据库副本(通常是分布在不同服务器上)之间保持一致。在同步复制中,所有的数据更改(如INSERT、UPDATE、DELETE操作)在主数据库上执行后,会即时复制到一个或多个从数据库上。只有当所有的从数据库都确认已经接收并应用了这些更改之后,操作才会在主数据库上提交。这种方式保证了在任何时候,所有数据库副本都包含了相同的数据集。
形象的理解一下:
想象一下你是一位厨师,在做一道需要精确配方的蛋糕。你有几个助手,每个助手都要做一个一模一样的蛋糕。在同步复制的情况下,这就像你和你的助手们一起动作同步。
每当你加一个配料到你的蛋糕里,你的每个助手都要在他们的蛋糕里做同样的事情。你等待他们告诉你:“好的,我加好了”,然后你们一起进行下一步。如果其中一个助手说:“等一下,我还没加”,那么大家都会等待,直到每个人都完成了这一步。
这就是同步复制的工作方式。每次主数据库更新数据时,所有的从数据库(就像助手们)都必须确认他们已经接收并且更新了相同的数据。只有在这个确认过程完成之后,整个系统才会继续下一步操作。这样可以确保所有数据库的数据都是完全一致的,就像确保每个助手的蛋糕都是按照相同的配方制作的一样。
就像厨房里同步工作可能会让整个烘焙过程慢下来一样,同步复制也可能增加数据库操作的延迟,因为它需要等待所有副本的确认。但好处是你会得到高度一致和可靠的结果,就像每个蛋糕都会一样美味一样。
图中,一个白人男性厨师正往碗里加入蛋糕配料。与此同时,他的三位助手——一位亚洲女性、一位黑人男性和一位拉丁裔男性——都在自己的烹饪台上,手里拿着与主厨相同的碗,模仿主厨的动作,且动作完全同步。他们都暂停了手中的活,注视着厨师,等待下一步的指示。
这正如同在同步复制的数据库系统中,每一项数据变动都需要在所有的数据库副本中被复制和确认后,系统才会执行下一步操作。这个过程确保了所有副本在任何时刻都保持数据的一致性。
什么叫多实例
一个实例就是运行一个mysqld的进程
mysql多实例: '简单理解就是在一台服务器上,mysgl 服务开启多个不同的端口(如3306.3307),运行多个服务进程。这些 mysql 服务进程通过不同的 socket 来监听不同的数据端口,进而互不干涉的提供各自的服务。'
多实例: 就是多个运行起来的 mysqld 进程,每个进程里运行自己的库,各自为各自的库提供服务。
一台服务器运行着两个mysqld进程,然后一台监控3306,一台监控3307。
一个跑hunan的库,一个跑shanxi的库
web1访问hunan
web2访问sahnxi
多实例的优点
- 资源隔离:
- 每个实例可以单独配置和管理,提供更好的安全性和稳定性。
- 故障隔离:
- 单个实例故障不会影响到同一服务器上的其他实例。
- 性能优化:
- 可以根据每个实例的需求进行资源(内存、CPU、I/O)的优化配置。
- 维护灵活性:
- 可以单独对某个实例进行重启或维护,而不干扰其他实例。
- 负载分散:
- 可以通过增加实例数量来分散高负载,提高系统的可扩展性和吞吐量。
- 服务特化:
- 不同实例可以针对不同的应用程序或服务需求进行特化。
多实例的缺点
- 资源消耗:
- 每个实例可能都需要一定量的系统资源,多实例可能导致资源使用不足。
- 管理复杂性:
- 需要监控和管理更多的实例,可能会增加管理的复杂性和开销。
- 配置复杂性:
- 每个实例可能需要不同的配置,使得配置管理变得更加复杂。
- 潜在的性能冲突:
- 如果多个高负载实例运行在同一物理服务器上,可能会相互竞争资源,导致性能问题。
- 数据一致性挑战:
- 如果实例之间需要共享数据,保持数据一致性可能会变得更加困难。
主主复制
其实是两台服务器互为主从
主主复制主键冲突问题解决方案:
2台mysql地位相等, 假如2个请求同时到达2台服务器。请求A节点,stu的id为1。请求的B节点,stu的id也为1,这时候主键很容易冲突。
让A服务器的主键id从1,3,5,7来增长(从1开始自增,偏移量2)
set global auto_increment_increment = 2;
set global auto_increment_offset = 1;
set session auto_increment_increment = 2;
set session auto_increment_offset = 1;
让B服务器的主键id从2,4,6,8来增长(从2开始自增,偏移量2)
set global auto_increment_increment = 2;
set global auto_increment_offset = 2;
set session auto_increment_increment=2;
set session auto_increment_offset = 2;
假如后期我们还需要加sql服务器,我们还可以用其他办法去限制。比如在oracle有sequnce,序列(序列每次访问,生成递增/递减的数)
以redis为例,我们可以专门构建一个global:userid。每次PHP插入mysql前,执行incr->global:userid, 得到一个递增的userid