复制和分区是存储系统常用的两种设计方式,在《数据密集型应用系统设计》第五章讲解了数据复制,数据复制是在多台机器上保存不同的副本,通过数据复制:
- 当部分组件出现故障的时候,系统仍然可以工作,从而提高可用性
- 扩展多台机器提供数据访问服务,提高读吞吐量
- 是数据在地理位置上更加接近用户,从而降低访问延迟
复制有主从节点复制、多主节点复制和无主节点复制。
主从节点复制
主从节点复制工作原理
- 指定一个副本为主节点,当用户写数据时,先将数据数据写到主节点,主节点将数据存到本地存储。
- 其它副本为从副本,主节点完成数据存储后,将数据更改以日志或者变更流的方式发给从副本,从副本获取到更改日志后应用到本地,保持与主节点相同的写入顺序
- 客户端读取数据的时候,可以在主节点或者从副本执行查询,只有主节点可以接受写请求,对于客户端,从副本都是只读的。
关系型数据库如MySQL、PostgreSQL都只吃主从复制,Kafka支持多副本复制。
数据复制的时候有同步复制和异步复制,同步复制就是主节点需等待所有从副本都完成数据存储后才能进行读取;异步复制则将信息发送给从副本就返回。同步复制可以保证数据读取的时候数据最新,但是当有一个节点异常,则整体就会阻塞在这里,异步复制就可能读取不到最新的数据,需要考虑线性读。
节点失效
当主节点失效的时候,就会进行主节点切换,一般我们使用zookeeper、etcd等来进行主节点选举。
- 首先时检测主节点失效情况,一般时通过心跳进行检测
- 然后通过选举方式选出新的主节点,将老的主节点下线
- 系统重新认定新的主节点,从副本与主节点之间进行数据同步
在选主过程中,由于各种原因,可能会造成脑裂等情况存在。
当从节点失效的时候,超出检测时间会被集群下线,当重新加入时,需要对主节点数据进行追赶。
数据复制
数据复制的方式有:
- 基于语句的方式,例如mysql的语句
- 基于WAL日志方式,例如etcd的主从之间就是通过WAL日志
- 基于逻辑日志,例如redis的AOF方式
- 基于触发器的房四海
多主节点复制
复杂度较高,只适用与少数场景,例如多数据中心
无主节点复制
无主节点,客户端写数据的时候直接将请求发送给多副本,或者由一个协调者同时发送给多副本。
小结
这章内容基本讲述了数据复制的基本原理,并且开阔了眼界,对多主节点复制和无主节点复制开阔了眼界。
网友评论