架构师训练营第 1 期第 6 周总结
一、分布式数据库
1.1 MySQL复制
1 主从复制
主从复制的过程
1) 主服务器维护binlg与客户端线程;从服务器维护ralaylg与获取线程。
2) 主服务器更新数据时,除了写入本地数据集,还要写入binlg。
3) 从服务器的获取线程与主服务器客户端线程交互,将Binlg的更新同步到relaylg。
4) 从服务器的SQL执行线程观察relaylg的变更,依次读取变更命令并写入从服务器本地数据集。
一主多从的优点
分摊负载、专机专用、便于冷备、高可用
2 主主复制
一主多从架构支持读高可用,但不支持写高可用。通过主主架构,可进一步实现写高可用。
主主复制的过程
与主从复制类似,主主复制时两个主库会互相同步对方的binlg变更到自己的relaylg中,最后从relaylg同步回自己的本地数据集。
通常实现主主复制的集群,同时也会实现主从复制。
主主复制的服务器集群不能并发写入,会导致数据冲突和数据不一致。
复制只能增加都并发处理能力,不能增加些并发处理能力和存储能力。
更新表结构会导致巨大的同步延迟。
1.2 数据分片
数据复制并没有提升数据写并发能力,而通过数据分片,可以真正提升数据的写并发。
挑战
两种简单的分片方法:
1) 硬编码数据分片:应用代码将key映射成服务器编号。
2) 外部映射表数据分片:通过查找外部映射获取服务器编号。
无论硬编码,还是映射表,都有一些缺陷:
1)需要额外代码,增加了处理逻辑复杂性。
2)无法执行多片联合查询。
3)无法使用数据库事务。
4)对数据库伸缩性不友好。
中间件
分布式数据库中间件
数据库中间件将自己伪装成一个数据库,应用将sql提交给中间件,中间件内部进行分片逻辑转换,连接多个数据库操作。
常用中间件
mycat、Cbar
Cbar的组件模型:
SQL解析:解析sql和分片规则
SQL路由:找到对应多个分片
SQL执行代理:与分片数据库交互
结果合并:合并多个分片的返回结果
伸缩
与分布式缓存不同,数据库存储的是元数据,必须能被访问到。因此数据库的分片,不能仿照缓存分片的一致性哈希来进行伸缩。
在最开始归化分片集群时,数据规模较小,服务器实例较少时,就可以多创建些分片。比如100个分片,2个实例。可在在中间件中将100个分片均摊给2个实例。
向分片集群添加新的实例时,首先将已有数据库要迁移的那部分数据对新库做主从复制。
数据迁移完成后,重新修改分片中间件的路由规则,使其指向新的集群实例。
1.3 部署
数据库部署的演进
1 单一服务与单一数据库
2 数据库主从复制实现伸缩
3 多个服务与多个主从库集群
4 综合部署:数据库主主复制与分片集群
二、NoSQL
特征:不支持SQL,伸缩性更好
CAP
在分布式系统中,网络分区一定会发生,要么接受数据不可用,要么接受数据不一致。
最终一致性
在一段时间,由于网络延迟、故障,不同分区的客户端,访问的数据可能是不一致的,但是当故障恢复,数据同步完成后,最终是一致的。
最终一致性的处理
1、最终一致性写冲突:根据时间戳,最后写入覆盖。(数据库解决)
2、客户端冲突解决:一些业务数据库不理解客户端冲突逻辑,由客户端对冲突数据进行处理、合并。
3、投票解决冲突:
Cassandra的实现方式。
写入时,尝试写入三个节点,至少写入两个节点返回成功。
读取时,尝试读取三个节点,如果返回值不一致,投票解决。
HBase
具有良好的伸缩性。
顶层通过master节点定位到底层的hadoop分布式文件系统节点,数据存在多个备份。当需要伸缩时,只需要master将一些key分配给新加入的节点即可。甚至不需要数据迁移,因为HBASE本身不存储数据,而是存储到最底层的HDFS。
HBase的存储是LSM树,类似于B+树,但是LSM树是以lg方式顺序写入的。
事务处理
关系数据库的事务处理遵循ACID
原子性、隔离性、持久性、一致性
NSQL数据库的事务处理遵循BASE
基本可用、软状态、最终一致性
三、分布式一致性架构
待整理
四、搜索引擎
倒排索引
正排索引:文档包含的词有哪些
倒排索引:包含某个词的文档有哪些
带词频位置的倒排索引:
除了记录词包含的文档编号,还可以记录某个词文档中的词频数,便于排序。
也可以记录词出现在文档的位置,便于组合查找多个词所在文档。
Lucene
组件
analysis:负责词法分析及语言处理而形成term。
index:索引的创建,里面有IndexWriter。
store:索引的读写。
QueryParser:语法的分析。
search:索引的搜索。
similarity:相关性打分的实现。
倒排索引结构
字典+倒排表 (类似于hashmap)
索引实时更新
索引文件分段,索引修改针对段操作。
通过增加新段实现索引创建,通过添加.del文件模拟索引删除,创建+删除实现更新。
控制段数量,定期执行分段合并。
Elastic Search
待整理
评论