我认为这篇文章会对你有用。它详细解释了硬提交和软提交是如何工作的,以及在调整系统时应该考虑的权衡。
我总是对此感到不寒而栗,因为在某些情况下任何建议都是错误的。我的第一个建议是不要过度思考这个问题。一些非常聪明的人试图使整个过程变得健壮。先尝试简单的事情,然后只在必要时进行调整。特别是,查看事务日志的大小并调整硬提交间隔以保持这些“合理大小”。请记住,如果在 JVM 崩溃后重新启动,惩罚主要是涉及的重放时间。15秒可以忍受吗?那为什么要变小呢?
我们已经看到硬提交间隔比软提交间隔短得多的情况,请参见下面的批量索引位。
这些是开始的地方。
重(散装)索引
这里的假设是您有兴趣尽快将大量数据添加到索引中,以便将来某个时候进行搜索。我正在考虑数据源等的原始负载。
将您的软提交间隔设置得相当长。如在 10 分钟内。软提交是关于可见性的,我在这里的假设是批量索引不是近乎实时的搜索,所以不要做打开任何类型的搜索器的额外工作。将硬提交间隔设置为 15 秒,openSearcher=false。再次假设您将只是在 Solr 上爆破数据。这里最糟糕的情况是您重新启动系统并且必须从 tlog 重播 15 秒左右的数据。如果您的系统比这更频繁地上下跳动,请先解决其原因。只有在你尝试了简单的事情之后你才应该考虑改进,它们通常只在特殊情况下才需要。但它们包括:为批量加载操作完全关闭 tlog 使用某种 map-reduce 过程进行离线索引 每个分片只有一个领导者,没有用于加载的副本,然后稍后打开副本并让它们进行旧式复制以赶上. 请注意,这是自动的,如果节点发现它与领导者“太远”不同步,它会启动旧式复制。在它赶上之后,它将获取文档,因为它们被索引到领导者并保留自己的 tlog。等等 它将获取文档,因为它们被索引到领导者并保留自己的 tlog。等等 它将获取文档,因为它们被索引到领导者并保留自己的 tlog。等等
索引重,查询轻
我的意思是说,搜索日志文件。在这种情况下,您几乎一直有大量数据进入系统。但是查询负载很轻,经常用来排查或者分析使用情况。
将您的软提交间隔设置得相当长,直到您可以让文档可见的最大延迟。这可能只是几分钟或更长时间。甚至可能需要几个小时才能发出硬提交 (openSearcher=true) 或按需软提交。将你的硬提交设置为 15 秒,openSearcher=false
索引灯,查询灯或重
这是一个相对静态的索引,有时会出现少量索引。每隔 5-10 分钟(或更长时间)说一次更新
除非需要 NRT 功能,否则我会在这种情况下省略软提交,并使用 openSearcher=true 每 5-10 分钟进行一次硬提交。在这种情况下,如果您使用单个外部索引进程进行索引,那么让客户端发出硬提交可能是有意义的。
索引重,查询重
这是近实时 (NRT) 案例,确实是其中最棘手的案例。这需要实验,但这是我要开始的地方
将您的软提交间隔设置为您可以忍受的时间。不要听你的产品经理说“我们需要不超过 1 秒的延迟”。真的。用力推回去,看看用户是否得到了最好的服务,或者甚至会注意到。软提交和 NRT 非常棒,但它们不是免费的。将硬提交间隔设置为 15 秒。
在我的情况下(索引繁重,查询繁重),复制主从花费了太长时间,减慢了对从属的查询。通过将 softCommit 增加到 15 分钟并将 hardCommit 增加到 1 分钟,性能提升很大。现在复制工作没有问题,服务器每秒可以处理更多的请求。
虽然这是我的用例,但我意识到我真的不需要这些项目在主服务器上实时可用,因为主服务器仅用于索引项目,并且每个复制周期(5 分钟)在从服务器中都有新项目可用),这对我来说完全没问题。您应该针对您的情况调整此参数。