cassandra、Hbase 等分布式数据库是如何处理唯一键并发写的问题?
假设有一个 Hbase
集群,有两台 slave
机器 A、B
现在我建了一个表T
,表的 rowkey
是唯一的
此时有两个客户端同时发起写请求: habse.set(rowkey='hi',value='xxx')
此时 Hbase 集群会怎么做?
如果客户端 A
往 slave A
的 表 T
写入 habse.set(rowkey='hi',value='haha')
客户端 B
往 slave B
的 表 T
写入 habse.set(rowkey='hi',value='lala')
从 slave A
的角度是合法的,因为还没有 rowkey='hi',此时 slave A 接受了客户端 A 的写请求。
从 slave B
的角度是合法的,因为还没有 rowkey='hi',此时 slave B 接受了客户端 B 的写请求。
但是 slave A
和 slave B
要同步数据库的时候,发现重复 rowkey
!
有了两条会重复的 rowkey !
- habse.set(rowkey='hi',value='haha')
- habse.set(rowkey='hi',value='lala')
此时怎么办?
所以我的问题是:又发生这种情况吗?Hbase 是如何防止发生这种情况的?
我觉得有以下几种方案:
- 方案一:对于一个表,同一时间段内,只有一个 slave 机器可以被写入,其他的 slave 机器是只读的,类似 Mysql 的读写分离,一台机器写,其余机器只读
- 方案二:任意一个
slave A
接受到写请求之后,告知其余的slave
机器,”我收到了 rowkey ='hi'“,避免其他机器继续写入相同的rowkey
,但是这种方案需要大量的网络广播,速度非常的缓慢!!!
两种方案都有很大的缺点!
我想知道类似的 MongoDB
集群、cassandra
集群和 Hbase
集群是如何解决这个问题的!