架构师训练营 - 学习总结 第 6 周
分布式数据库:
MySQL主从复制的原理:MySQL主库承担写的任务,写redo_log和undo_log,同时异步写bin_log;MySQL从库读主库的bin_log,加载到自己的relay_log中,再由SQL执行线程消费relay_log将数据入库。一主多从的架构中,主机负责写,从机可分摊读的并发压力,也便于数据备份。
MySQL主主复制也是利用bin_log,目标是为了保证写的高可用,一台主机down了可以切换到另一台主机,做自动的故障检测和失效转移。
为了增加并发写能力和突然单机存储瓶颈,需要引入数据分片技术。分片技术有硬编码和映射表等手段,需要引入数据库中间件,来实现路由配置、执行代理、结果合并等功能。
总之,只需要读的高并发,可采用主主复制+主从复制。还需要写的高并发,则需要引入分片后的多主多从。实际业务处理中,考虑先按业务类型不同做垂直分库,再针对特定的业务库做优化。
NoSQL:
CAP原理:一致性,可用性,分区耐受性。在分布式系统必须满足分区耐受性的前提下,可用性和一致性无法同时满足。而AP又引入了BASE的概念,去实现最终一致性。
最终一致性的写冲突:简单处理策略是根据时间戳,最后写入覆盖;或者使用投票解决冲突(Paxos[zk采用的zab算法], Raft[etcd采用]等算法)。
Hbase架构:HMaster通过zk来实现热备和故障转移,做元数据管理;数据保存在HRegionServer的
HRegion中,底层是HFile,通过HDFS来实现副本冗余。
重点是HBase中的LSM存储思想:The Log-Structured Merge-Tree.
LSM-tree 是专门为 key-value 存储系统设计的,最大的特点就是写入速度快,主要利用了磁盘的顺序
写,pk掉了需要随机写入的 B-tree。首先是内存的 C0 层,保存了所有最近写入的 (k,v),这个内存结构是有序的,并且可以随时原地更新,同时支持随时查询。剩下的 C1 到 Ck 层都在磁盘上,每一层都是一个在 key 上有序的结构。
写入流程:
1)一个 put(k,v) 操作来了,首先追加到写前日志(Write Ahead Log,也就是真正写入之前记录的日志)中,接下来加到 C0 层。当 C0 层的数据达到一定大小,就把 C0 层 和 C1 层合并,类似归并排序,这个过程就是Compaction(合并)。
2)合并出来的新的 new-C1 会顺序写磁盘,替换掉原来的 old-C1。当 C1 层达到一定大小,会继续和下层合并。合并之后所有旧文件都可以删掉,留下新的。
3)写入过程基本只用到了内存结构,Compaction 可以后台异步完成,不阻塞写入。
查询流程:
1)在写入流程中可以看到,最新的数据在 C0 层,最老的数据在 Ck 层,所以查询也是先查 C0 层,如果没有要查的 k,再查 C1,逐层查。
2)一次查询可能需要多次单点查询,稍微慢一些。所以 LSM-tree 主要针对的场景是写密集、少量查询的场景。
总之,LSM-tree 被用在各种键值数据库中,如 LevelDB,RocksDB,还有分布式行式存储数据库 Cassandra 也用了 LSM-tree 的存储架构。
Zookeeper:
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务。作用有:主主备份(数据库、HMaster等等);
它实现了分布式选举算法Zab(Paxos的简化版实现),具体见其技术文档。集群中任何时候都有一个leader,多个follower;若leader宕机就会重新选举出一个leader。
Zookeeper的最大特点:
1)树状记录结构
2)临时节点,临时顺序节点(临时的节点会在连接主机断开连接后自动删除);持久节点,持久顺序节点。 所有节点都可用观察者模式监听,从而实现各种应用:主机选举;集群管理(负载均衡);分布式锁等等。
Doris:
Doris是阿里研发的分布式KV存储系统。从这个案例中主要学习到如何在大公司中申请一个中间件项目,分析业务现状、现有产品的缺陷、阐述开发的必要性和价值;阐述产品的具体目标,目标要体现先进性;并且以上都要有数据支撑;阐述产品的核心架构思路;阐述产品的投入资源和分阶段的里程碑计划等等。
版权声明: 本文为 InfoQ 作者【铁血杰克】的原创文章。
原文链接:【http://xie.infoq.cn/article/854fccaac6f857e1ebcfe8ffe】。未经作者许可,禁止转载。
评论