美文网首页
mongo分shard后unique索引的替代方案

mongo分shard后unique索引的替代方案

作者: Teech | 来源:发表于2021-01-10 15:42 被阅读0次

分shard是提高数据库性能和容量的方法,但是mongo有个限制是分shard后,不能对hash index施加unique约束。
官方描述如下:

Sharded collections cannot enforce unique indexes.MongoDB does not support creating new unique indexes and does not allow sharding collections with unique indexes on fields other than _id. MongoDB can enforce uniqueness on the shard key. MongoDB enforces uniqueness on the entire key combination, and not specific components of the shard key. You cannot specify a unique constraint on a hashed index.

但是很多实际应用场景中有这个需求,比如游戏服务器检测玩家的昵称是否唯一时有需要,需要保证插入时唯一,此时我们可以使用unique range index来替代hash index。这里介绍的是使用类似分布式二阶段提交协议来替代unique index。
先介绍下具体办法

  1. 除了nickname外,先插入一个占位符,取名prename。
  2. 在对应的集合中查找{"$or": [{"nickname": tgtname}, {"prename": tgtname}]},如果找到说明失败。
  3. 如果没有找到,说明查找的这个时间点是其他地方没有插入成功,但此时不能直接插入,可能有多个地方查找都没找到,此时插入会导致nickname有多份相同的tgtname,此时插入{ "prename": tgtna me}
    4.插入完然后在查找{ "prename": tgtname},此时mongo会返回一个list,如果有且仅有一条说明刚刚插入成功了,此时把nickname改成正常的tgtname,否则说明插入失败,应该回滚刚刚的操作,插入失败。
  4. 如果插入失败了,应该在一个随机的时间点再次插入,否则出现多个竞争者不停插入,会导致插入一直失败。

分布式两阶段提交协议

上述处理分布式事务的办法就是两阶段提交协议,先简单下这个协议。

投票阶段

该阶段的主要目的主要是打探多个数据库集群中各个参与者能否正常执行事务,具体步骤如下:

  1. 协调者向各个参与者发送数据库事务的执行请求,并等待参与者的事务的执行结果。
  2. 参与者执行事务但不commit,并记录事务日志
  3. 参与者将自己的事务结果发送给协调者,同时阻塞等待协调者后续命令
事务提交阶段

经过第一轮的盘问后,后续只会出现3个结果

  1. 所有参与者都回复能够正常执行事务,
  2. 一个或多个参与者执行失败
  3. 协调者等待超时

针对第一种情况,协调者向所有的参与者发起commit请求。

  • 协调者向各个参与者发送commit请求,请求提交事务结果。
  • 参与者收到commit请求后,提交事务结果,释放占有资源。
  • 参与者向协调者发送commit的结果信息

针对第二第三种情况,均认为无法执行事务,执行回滚操作。两阶段提交协议解决的是分布式数据库中数据强一致性的问题。

相关文章

  • mongo分shard后unique索引的替代方案

    分shard是提高数据库性能和容量的方法,但是mongo有个限制是分shard后,不能对hash index施加u...

  • 索引创建及索引用法

    数据库索引分三种:普通索引(index)、唯一索引(unique)、主键(primary key)、外建索引()、...

  • Chapter 12 Intelligent Pointers

    介绍的shard_ptr和unique_ptr都在头文件中哦 shard_ptr是一个模板, 因此...

  • 57、索引管理_创建、修改以及删除索引

    1、创建索引 创建索引的语法 示例 2、修改索引 修改索引replica shard数量,primary shar...

  • es的一些功能点的记录

    shard:索引分片,每个shard在功能上是一个完整的索引,实际上就是一个lucene core,能够进行独立的...

  • mongo回顾(四)

    上回聊到mongo索引采用了B树,而且采用的原因。今天具体聊聊mongo中的索引。MongoDB defines ...

  • MySQL键值

    键值类型:index 普通索引unique 唯一索引fulltext ...

  • 索引

    创建: CREATE [UNIQUE] INDEX 索引名 ON 表名(列名)CREATE UNIQUE IND...

  • ElasticSearch-索引原理

    索引分片 索引分片-水平扩展: 索引分片-应对故障: 数据路由 路由策略: 1、 路由公式:shard = has...

  • 7. Interview-MySQL

    1 MySQL索引类型? 普通索引,index 主键索引,primary 唯一索引,unique index 全文...

网友评论

      本文标题:mongo分shard后unique索引的替代方案

      本文链接:https://www.haomeiwen.com/subject/azgkaktx.html