背景
数据库读写分离是一个常见的优化, 可以通过将读和写放在不同的服务器从而提升读的性能. 这篇文章主要说一说SolrCloud的读写分离.
默认的Solr架构
如图, 默认的SolrCloud(NRT)架构有以下特点:
- 在写上有三种操作:
- Update
- Commit(硬提交)
- SoftCommit(软提交)
- 每种操作在逻辑上都是相同的, 即首先把请求发送到对应Shard, 然后Shard先把请求交给leader, leader再把请求分发到所有follower.
对于一个Shard的所有节点而言(包括一个leader和所有follower), Update/Commit/SoftCommit是在所有节点上重复进行的, 比如先执行3个Update请求添加3个文档, 这个时候的过程是leader自己本地索引这3个文档, 然后把3个Update请求转发给follower, follower分别在自己本地索引这3个文档. 然后如果再执行一个硬提交的话, leader会自己本地执行硬提交, 然后把硬提交请求转发给所有follower, follower们都要在自己本地执行硬提交.
可见, 默认的SolrCloud(NRT)的同一个shard上的所有节点对于写操作都是重复执行的.
因此, 默认的SolrCloud(NRT)架构就会有如下缺点: