浅聊分布式系统数据复制
为什么要使用分布式架构呢?
首先是硬件层面,摩尔定律失效,单机性能提升出现瓶颈,或者说单机性能达到一定高度后,继续提升性能的成本是巨大的,是承受不起的。
当前网络速度变快,机器之间信息传输变快,这就给分布式带来了可能。
现在对应用的可用性要求越来越高,分布式架构中如果某一台机器出现故障,不一定会影响整体可用。
分布式应用扩展方便。
数据复制
对于分布式系统来说,不同节点的数据需要进行复制备份,以满足数据一致性的要求。
接下来讲解三种复制模式:单主复制,多主复制,无主复制。
单主复制
单住复制又称为主从复制。如下图,由一个主节点以及几个从节点组成。其中所有的写请求都将发送向主节点,所有的读请求都发送到从节点。
优势
主从复制搭建简单
数据又冗余,更加安全
扩展性好
负载均衡
缺点
如果主节点出现故障,需要重新选举从节点,此时可能会出现数据不一致。如,当写请求发送到了主节点,主节点尚未将数据同步到从节点,此时主节点宕机,新的从节点将损失数据。
如果主节点没有宕机,但是部分从节点因为网络问题判定为主节点宕机,选举了新的主节点,这时候同时出现多个主节点。这种现象被称为“脑裂”。
所有的写请求都发送向主节点,主节点可能会成为集群的瓶颈。
多主复制
在单主复制的基础上,增加了主节点个数。可以在任意主节点写入,由该主节点同步到其它节点。
优势
解决了分担了主节点写请求的压力。
避免了主节点故障的选举过程。
缺点
假如主节点A与主节点B先后收到了对某个数据的修改,此时A将对C,D,E进行同步,当A修改完C的值后,出现了网络拥塞,此时B开始同步,当B把C,D,E修改完之后,A不在拥塞继续同步,将DE覆盖。此时,CDE三个从节点中的数据不一样,C保存的B同步的信息,DE保存的A同步的信息。此时就会出现数据不一致的。
无主复制
没有主节点从节点之分,每次写请求同时对多个节点进行写入,如果写入成功的节点数达到一定数量代表写入成功。读取的时候也是同时读取多个节点。
假设有ABCDEFG七个节点,每次写入4个节点,读取的时候读4个节点。举个例子,第一次写入ABCD节点,第二次BCDE,此时读的时候,每次读4个节点,肯定能读到至少一个新节点,然后就可以读到数据。
写请求读请求个数设置
假设一共有n个节点,读的时候读r个节点,写的时候写w个节点。要求r+w>n,w>n/2。
r+w>n是为了使每次读的时候至少读取到一个保存有新数据的节点。w>n/2为了保证避免两次写的时候出现冲突。
读修复
当读取的时候,获取到有新数据的节点,但是如果读取的节点中有旧节点,这时候将旧节点更新为新数据。
反嫡过程
会新建一个后台进程来修复数据,该进程找出错误的数据’并从存储最新的数据的节点中将数据复制到错误的节点。反熵过程保证最终结果,不保证写入顺序。
进行反熵过程用哈希树对比。
优势
相比单主复制避免了写请求压力,也避免出现脑裂的情况出现(它都没有脑)。相比多住复制大大减少了数据不一致的可能。
劣势
每次读的时候需要读好多,会有一定的资源浪费。