第六周学习技术选型 2 总结
分布式数据库
复制
* 一主多从
* 主主
数据分片
* 硬编码
* 映射表
* 挑战
* 大量额外代码,处理逻辑复杂
* 无法多分片联合查询
* 服务使用数据库事务
* 添加服务器困难
分布式数据库中间件
* Cobar
* 原理 —— 介于应用服务器和数据库服务器之间的代理服务器集群,根据分库规则对SQL进行分解,分发到不同的数据库实例上执行,对结果进行合并返回
* 可伸缩性
* Cobar 服务器本身是无状态的应用服务器,可简单使用复杂均衡实现伸缩
* 添加数据库实例扩容时需要进行数据迁移。数据迁移以Schema 为单位,使用 MySQL 的同步机制。
* 限制
* 无法跨库JOIN
* 无法跨库执行事务
* 其它能支持跨库JOIN的关系数据库,由于实现JOIN需要在服务器间传输大量数据,访问延迟也比较大。
NoSQL数据库
* 思路
* 放弃关系代数为基础的数据建模与查询
* 牺牲事务的一致性(ACID),换取高可用性和可伸缩性
* CAP 原理
分布式系统中,一致性、可用性、分区耐受性三者无法同时满足。由于对于分布式系统而言,网络失效一定会发生,所以分区耐受性必须保证,那么在可用性和一致性上必须二选一。
选择了可用性的话,系统返回的数据不一定是最新的。
选择了一致性的话,系统可能处于不可用状态。
处理不一致数据的策略:
* 最终一致性 —— 根据时间戳,最后写入覆盖
* 客户端解决冲突
* 投票解决冲突
*
分布式锁
* 分布式一致性算法 Paxos
分布式处理的参与者通过投票选举,逐步达成一致意见(共识)。参与者不执着于让自己的提议通过,而是执着于尽快对提议达成一致。
* ZAB协议
ZooKeeper 构建高可用分布式数据主备系统的算法
搜索引擎
* 爬虫系统
* 文档矩阵、倒排索引(变体:带词频的倒排索引、带词频与位置的倒排索引)
* Lucene
将索引文件拆分为多个段,需要定期进行段合并
* Elasticsearch
分布式索引分片
* Page Rank 算法
让链接对网页进行投票来决定网页的排名
自然语言处理
* HanLP
* 智能助理机器人
案例分析 —— Doris 海量 KV Engine
* 定位 —— 海量分布式透明化 KV 存储引擎
* 解决问题 —— 解决扩容迁移复杂,维护困难的问题
* 关键技术点
* 临时失效的 failover
* 永久失效的 failover
* 扩容实施数据迁移
* 产品规划
总结
对于任何给定的问题,都有多种解决方案,而这些解决方案都有各自的优缺点和折中之处。
例如数据库的复制有主从复制、多主节点复制、无主节点复制。主从复制容易立即,也不需要担心冲突问题。但如果主节点失效,那么多主节点复制、无主节点复制方案会提供更高的可用性,但代价是弱一致性。
对于“将数据保存起来,支持后续的查询”这种问题,其实不存在唯一正确的解决方案,或者说不同具体情况下有不同的方案。而软件的实现通常必须选择一种特定的方案。但一个特定的实现很难同时兼顾鲁棒性和性能,如果试图兼顾所有方面,最终的实现一定很糟糕。
面对众多的备选方案,架构师需要弄清
软件产品与它们适合运行的环境之间的对应关系
将软件产品以恰当的方式组合起来解决复杂的问题
评论