大型分布式网站架构设计与实践阅读笔记2
分布式系统基础设施
分布式系统基础设施:分布式缓存系统、持久化存储、分布式消息系统、搜索引擎、CDN系统、负载均衡系统、运维自动化系统、实时计算系统、分布式文件系统、日志收集系统、监控系统、数仓系统等。
1、分布式缓存
这一小节讲的memcache.
2、持久化缓存
(1)Mysql扩展
业务拆分 -> 随着业务的发展,单个库的访问量越来越大,对业务进行拆分,每一块业务使用单独的数据库存储。这样访问不同的业务就访问到了不同的数据库,提高了吞吐能力。
复制策略 -> 业务继续发展,访问量继续加大,拆分后的每个库压力越来越大,可以使用MySQL的复制策略来对系统扩展。通过复制策略,可以将一台MySQL数据库服务器中的数据复制到其他MySQL数据库服务器上,当各台数据库服务器上包含相同数据时,访问MySQL集群中任意一台服务器,都能取到相同的数据。要实现数据库的复制,需要开启Master服务器端的Binary log,复制的过程实际上就是Slave从master获取binary log,然后再在本地镜像的执行日志中记录的操作。由于复制过程是异步的,因此Master和Slave之间数据可能存在延迟的现象,
此时只能够保证数据最终一致性。
分库与分表 -> 采用Master-Slave复制模式的MySQL架构,只能够对数据库的读进行扩展,而对数据库的写入操作还是集中于Master上,且单个Master挂载的Slave不可能无限多。对于访问频繁且数据量巨大的单表来说,分表。分表能够解决单表数据量过大带来的查询效率下降的问题,但是无法给数据库的并发处理能力带来质的提升。面对高并发的读写访问,当数据库Master服务器无法承载写操作压力时,扩展Slave服务器就没啥意义了。因此,需要对数据库进行拆分,提高数据库写入能力,即分库。
数据库经过业务拆分及分库分表后,查询性能和并发处理能力提高了,但会带来其他问题。例如:原本跨表的事务上升为分布式事务,记录被切分到不同的库和不同的表中,难以进行多表关联查询。分库分表以后,如果需要对系统进一步扩容,讲非常不方便,需要重新进行数据迁移。
3、消息系统
消息可以作为应用间通信的一种方式,消息被保存在队列中,直到被接收者取出,消息发送者不需要同步等待消息接收者的响应,消息的异步接收降低了系统集成的耦合度,提升了分布式系统协作的效率。当系统处于峰值压力时,分布式消息队列还能够作为缓冲,削峰填谷。书中介绍的ActiveMQ,这里略过,后面专门分析实际项目中用的RocketMQ。
4、垂直化搜索引擎
垂直化的搜索引擎主要针对企业内部的自有数据检索,不像Google、Baidu那样的搜索引擎平台,采用网络爬虫对全网数据进行抓取,从而
建立索引并提供给用户进行检索。在分布式系统中,垂直化的搜索引擎能够满足用户对全文检索、模糊匹配的需求,解决数据库like查询效率低下的问题,又能够解决分布式环境下,由于采用分库分表或者NoSQL数据库,导致无法进行多表关联或者进行复杂查询的问题。
(1)Lucene
倒排索引:也称反向索引,它将文档中的词作为关键字,建立词与文档的映射关系,可以根据词快速获取包含这个词的文档列表。
分词:也称为切词,将句子或者段落进行切割,从中提取出包含固定语义的词。