分布式系统之高可用冗余复制

分布式系统之高可用冗余复制

分布式系统为了实现高可用性,一般采用冗余复制的技术,也就是采用多个冗余节点来保证系统在出现单点故障的时候的可用性,复制技术主要有:单主复制、多主复制和无主复制,接下来详细介绍这三种冗余技术

单主复制/主从复制/主从同步

单主复制又可以根据向服务器写入数据是否等待冗余节点同步完成,分为以下三种:

同步复制

如果使用的是同步复制,那么当客户端向主节点写入数据时,只有等待所有从冗余节点全部把数据同步完成后,才会给客户端返回写入成功的响应,这样就保证了数据的安全性最高,主节点崩溃了也不会造成数据丢失,因为每次写入相当于向全部节点写入,都写成功了才算写入成功。但是由于每次向主节点写,需要所有从冗余节点都写完才能返回,如果有从冗余节点网络性能很差,那么就会造成写操作很费时间,也就造成了性能低下。

异步复制

使用异步复制就不需要等待从冗余节点写入数据了,当客户端向主节点写时,写到主节点后直接返回,不等待从冗余节点的同步,因此也就不会等待很长的时间,性能相比同步复制有很大的提升,但是数据安全性缺很差,因为很有可能客户端向主节点写入了,还没来得及同步到从冗余节点,主节点崩溃了,那么所写的数据就全部丢失,造成数据安全性最低。

半同步复制

人类总是细化折中的解决两个互斥的难题,因此半同步就是同步和异步的折中,当客户端向主节点写时,不需要等待全部从冗余节点写入成功,只要部分从冗余节点写入成功就算写入成功,可以返回,这样当主节点崩溃时,部分节点还是可以有完整的数据,往好了说即保证了性能又保证了数据安全,往坏了说性能比不上异步,安全比不上同步。hhh

优点

一个主节点剩下全部时从冗余节点,实现较为简单,思路较为明了;

由于仅有一个主节点,在分布式事务上很容易实现;

可以通过扩展从冗余节点来实现对读请求的扩展

缺点

对于写请求很难扩展,因为仅有一个主节点,写请求全部在主节点上,瓶颈就在主节点上;

当主节点崩溃后,会产生新的问题,人工选主切换停机的时间较长,自动选主切换会出现脑裂现象;

**脑裂现象:**考虑这样一个案例,一主多从,主节点负责写请求,从节点负责读请求,当主节点和从节点由于网络原因导致失联,但是客户端还和主节点保持连接,进行写请求,由于从节点发现主节点失联,就会认定主节点崩溃了,那么从节点们就会选举新主节点,并把原主节点设置为从节点,这时候就出现了两个主节点,称为脑裂现象。当出现脑裂现象后原主节点就变为了从节点,当网络环境变好后,和从节点通信,自己已经降为从节点,同步操作会先把自己的数据清空,再同步新主节点的数据,这个同步就会出现数据丢失的情况。可以参考redis的哨兵模式

**如何解决:**当主节点和从节点通信延迟超过设定时间时,主节点直接停止写请求,避免出现脑裂现象。

一主多从多用于读多写少的业务。其实一般的业务都是读多写少。

多主复制

多主复制。顾名思义就是又多个主节点,也就是客户端可以在多个主节点上进行写操作,既然可以在多个节点上进行写,那么就出现问题了,那个节点上的数据是最新的,如何节点多个节点上的数据冲突(谁是先写的,谁是后写的),因此首要任务就是解决冲突,下面又三种解决冲突的方法:

解决冲突
由客户端解决

当客户端向系统请求数据时,把全部的冲突数据发送给客户端,由客户端选出正确的结果,返回给系统,系统根据此结果解决冲突,一个典型的例子是购物车应用,购物车应用解决冲突的逻辑是保留购物车中所有冲突的商品, 并全部返回给用户。用户看到购物车里出现了被删除的物品或重复的物品,会重新选择购物车里的商品数量,然后将此数据更新写入存储系统,以此解决冲突。

最后写入胜利

在所有的写操作上添加上时间戳,仅保留最新的写操作,但是在分布式系统中时没有全局时间的,因此可能会出现奇怪的现象

因果关系追踪

这个是根据写入信息的业务来确定的,比如贴吧系统,肯定是先有人发帖,才会由评论的操作,因此发帖肯定在评论前。

优点

首先主节点容错了,当主节点单点崩溃后还有其他主节点继续提供服务(这里应该是说不用选主了,避免了上面一主的两个问题);

由于有了多个主节点,那么写业务可以被分散到多台机器上,分担并发量;

应用程序可以按照规则选择最优的主节点,比如根据网络,主节点性能,主节点剩余空间等等。

缺点

tmd及其复杂,数据冲突也很复杂,一般其复杂性远超其所带来的好处。

无主复制

节点不分主从,客户端的读写请求向所有节点发起读写请求,因为一个客户端需要向所有节点发送请求,这里就会涉及一个协调问题,有两种协调方式,第一种是客户端在发送请求时,自身向所有节点发送请求,第二种是有一个协调节点,客户端把请求发送给协调节点,协调节点向所有节点发送请求。这里发送的请求不会强调发送顺序,因为所有节点关系对等部分先后;

既然是无主复制,并且没有顺序可言,那么数据冲突的情况更加多了,无敌多,下面有几个数据修复的技术:

首先是Dynamo 架构

  1. 读修复,其实就是多主复制的由客户端修复
  2. 反熵过程,单独有一个进程在寻找错误,找到错误后从最新的节点读取数据,然后更新错误

基千Quorum 的数据冗余机制

就是保证一个法定人数,和raft一致性优点像,就是根据一个数来判断是否写入成功,读取的时候读取一定的数,那么里面肯定有最新的数据。可以搜索具体的算法。

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值