架构师训练营 第 6 周总结

发布于: 2020 年 07 月 15 日

本周学习了以下内容:

  • 分布式数据库的设计

  • NoSQL的设计

  • 分布式存储系统Doris的架构设计

  • Zookeeper实现分布式一致性

分布式数据库

复制

主要从MySql的设计介绍,用主从复制解决数据备份、读写分离分摊负载,用主主复制解决主节点故障恢复的高可用问题;

需要注意的是MySql的主主复制不能增加写能力,它只是主节点的镜像,方便主节点故障时及时顶上,保证系统高可用;

从节点因为只是复制了数据,只是提升了读能力,并不能增加存储和写能力;

分片

如果要提升写能力和存储能力,可以通过数据分片的方式。

通常的做法有:

  • 硬编码,使用hash将数据存储到不同节点上,读的时候也是hash到同一节点上;

  • 映射表,跟hash类似,只是将映射关系存储到外部配置上;

  • 中间件,由于上述分片需要在操作端支持,所以会增加操作端的复杂性,而且需要能够伸缩扩容,所以引入中间件,由它代理实现数据hash分片,伸缩扩容的数据迁移等;主要介绍了Cobar中间件,它实现了数据的hash分片读写,还有扩容时的数据迁移;在实践中,往往将数据以hash片为单位存储,迁移时检查hash片即可,不用每条数据都检查,提高了迁移的效率;

  • 分库分表,可以采用业务拆分的方式,将数据拆到不同的库和表,即可以完全利用到单库、单表的能力来提升系统的读写能力;

NoSQL

CAP

首先NoSQL是分布式存储系统,它需要满足CAP,即分布式存储系统的指导原理。

  • C指的是数据一致性,要求操作时数据时,要不就是最新的,不要就返回错误;

  • A指的是系统可用性,要求操作时一定要是成功的,读取一定要能返回数据,不管最新与否;

  • P指的是分区耐受性,因为网络是不可靠的,系统一定会出现网络不可用的情况,这时就不能同时满足一致性和可用性了。

总的来说,CAP说明在分布式系统满足分区耐受性时,可用性和一致性是不能同时满足的。

从CAP中也能体现分布式系统的设计往往会存在不能满足的特性,这时需要架构师能判断出来哪些是矛盾的,避免系统围绕不可能的特性做兼容,最终系统越来越复杂,也不能满足设定的要求。

举个例子,在A/B节点通信失败时,客户端1、3分别向A、B写数据,因为两个节点没办法通信所以没办法同步数据,所以客户端2、4分别从A、B读数据时,就读不到最新的数据;

如果我们在通信失败时要保证一致性,那1,3的操作将返回失败,导致系统不可用。

最终一致性

NoSQL实现的是最终一致性。

多个节点同时写数据并进行异步扩散,在数据冲突时,根据一些策略,保证节点数据最终一致,允许实时读存在不一致的情况。

解决一致性冲突的策略:

  • 时间戳,根据最新的时间,覆盖旧时间的冲突;

  • 客户端解决,局限在某些业务场景下,如拿购物车信息,如果客户端拿到一个用户有多个购物车,则进行合并处理;

  • 投票策略,读写多个节点,写操作以多数成功为准,读操作以多个节点中的最新版本为准;cassandra则使用了该策略;

解决高可用的架构:

HBase,底层用HFile实现多副本的高可用,上层用HMaster进行数据分片,转发到存储分片上;

HFile使用了LSM算法,解决高效读写数据,特点是只支持读和添加数据,修改、删除等通过写新记录的方式实现;它利用了磁盘的顺序写比较快的特点,并且是先写内存,然后存储成树的结构,然后将多层树合并成大的树,顺序写入磁盘;

Doris

  • 解决的场景:典型NoSQL场景,海量数据,而且不断增长;

  • 分布式存储系统的核心:路由算法,将数据分配到指定节点上,如redis的桶分配

  • 集群状态主要有如下几个:

  • 正常读写,应用服务器通过管理中心拿到存储节点,同时写入这些节点,但从一个节点上读;

  • 节点故障,节点状态:临时失效、完全失效;

  • 节点数据迁移:失效节点数据迁移到新节点;

  • 节点恢复:恢复过程中,新节点只写不读;

状态情况的时序图见 [作业](https://xie.infoq.cn/article/73d2b3dc0ec4590b7510515e0)

启发:架构师要争取做自己想做的、能提升自己能力的项目,而且要用解决实际问题的方法说服别人,引入新技术也需要一定的套路,即提出现状并分析,且能给出新技术带来的解决方案;

Zookeeper

  • 用来解决分布式的一致性问题;即分布式系统“脑裂”:多主节点的时候,如果主节点间数据不一致,就会出现故障,客户端不知道以哪个为准;

  • 解决方式:通过仲裁节点判断哪个是主节点;

  • 分布式一致性算法 paxos: proposer发起提案,acceptors确认并投票,投票结果由learner进行存储;但zookeeper使用的是zab协议(paxos的简化版):leader向folower发起提案,根据投票结果进行commit;

  • 除了为分布式选master,还有提供分布式配置中心的方案;它的优势也是提供了众多分布式的解决方案,才逐渐被广泛应用;

用户头像

Glowry

关注

还未添加个人签名 2019.02.13 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营 第6周总结