软提交(Soft Commit),是把文档提交到内存中,是针对可见性的;硬提交(Hard Commit)是将内存中的文档写入到硬盘上,是针对持久化的。
基本概念
事务日志Transaction Log(Tlog)
- 记录的是原始文档,主要用于索引恢复功能。
- 无论是新增、更新(包括原子更新)都会将文档整个写到Tlog中。
硬提交Hard Commit
- 通过 solrconfig.xml 的选项来进行配置自动调用,或者也可以客户端显式调用。
- 作用是提交数据持久化到磁盘里面,并且能够查询到这条数据。
- Tlog会截断:当前 Tlog会关闭,一个新的 Tlog会开始,在已关闭的 Tlog中,如果较新的 Tlog超过了 100 个文档,则老的 Tlog会删除掉。
- 硬提交会结束当前索引段的构建,并开启新的索引段的构建。
- 一个可选项是
openSearcher
,开启一个新的searcher
,以使数据能被后续的搜索检索到。 - 可能触发段合并。
请注意,
openSearcher
会使非段级别的缓存失效。
软提交Soft Commit
- 可通过 solrconfig.xml 的选项来进行配置自动调用,或者也可以客户端显式调用。
- 写入到内存中,同时也会把数据写入到Tlog。
- 软提交不会结束当前索引段的构建。
-
openSearcher=true
,使数据可见。
请注意,
openSearcher
会使非段级别的缓存失效。
索引构建流程
- 写入的数据被一个节点接收,然后转交到正确的 leader 节点。
- 从那个 leader 节点发送到所有相关分片的所有副本。
- 所有副本索引完后回应 leader 节点。
- leader 节点回应一开始的接收节点。
- 当所有的 leader 节点都回应之后,接收节点回应客户端。
当第五步完成的时候基本上数据已经提交给Tlog了。
注意
- 默认中,所有的文档在提交索引并返回成功的时候,文档已经被写入Tlog中了,但是可能还没有全部写到段中。
- 如果重启某个节点的服务,需要联系leader 节点,然后会执行恢复。
如果leader 节点接收到小于等于100个文档,则会从它自己的 Tlog恢复文档,缺失的文档会从leader节点同步。
如果leader 节点接收到大于100个文档,那么会直接从leader节点同步全部数据。
思考
- 检查Tlog大小,调整硬提交的间隔时间,使硬提交的间隔更合理。
- 正确合理的关闭solr,先停止写入,再进行硬提交,最后停止服务。
- 大量构建索引时,增加软硬提交的间隔时间。
- 合理设置软硬提交的间隔时间,需要依据目前的性能决定。没有银弹!!!!
特殊情况可采用的索引构建策略
1. 在批量索引时完全关闭tlog。
2. 离线构建索引,比如mapreduce方式构建索引。
3. 在构建索引时,每个分片只有一个leader节点,没有副本,构建完成后,再开启副本,让它们进行传统的复制来保持一致。注意,这个是自动实现的,如果副本发现和leader相差太远,就会触发传统的复制。复制完成后,它会继续接受leader节点的文档,并保存到自己的tlog中。
网友评论