There was an error while loading. Please reload this page.
有的时候,用户存在大表倾斜,可能某个表特别大,导致整体增量同步性能比较低。默认情况下,incr_sync.shard_key参数是为collection,表示按表并发,另外还有id表示按_id并发,只有所有表都没有唯一索引,才可以使用id。但是,如果用户存在大表倾斜的情况下,这个大表还没有唯一索引,那么其实这个大表可以加入白名单,进行更高层次的并发,比如按_id进行并发,从而提高并发的效率。
incr_sync.shard_key
id
_id
因此,v2.4.12版本中添加了incr_sync.shard_by_object_id_whitelist,指定哪些表可以进行按_id并发,前提是这些指定的表不能存在唯一索引或者存在唯一索引但不存在对unique key的更新或删除后插入相同unique key的操作。
incr_sync.shard_by_object_id_whitelist
使用说明:
示例:db1.collection1;db2.collection2,不支持仅指定db:
db1.collection1;db2.collection2
incr_sync.shard_by_object_id_whitelist = db1.collection1;db2.collection2
有唯一索引可能带来数据不一致的问题
假设a字段上有unique index,然后有按顺序的以下3个操作:
1)insert a:1 b:1 2)update a:1 ->2 3)insert a:1 b:2
理论上,得到的应该是{a:1,b:2}和{a:2,b:1} 2条文档,但实际上可能得到的是其他结果。 分发的hash是按_id的做的,所以1和2一定在一个回放线程里顺序处理;但1+2和3在不同回放线程中处理,顺序是无法保证的。如果是1-3-2的实际执行顺序,得到的是{a:2,b:1}1条文档;如果是3-1-2的实际执行顺序,得到的则是{a:1,b:2}1条文档;都丢了一条数据。
{a:1,b:2}
{a:2,b:1}