我正在研究分布式数据库.我试图生成一个唯一的ID将作为列族主键的卡桑德拉.
我阅读了一些关于使用Java进行此操作的文章,UUID但似乎存在碰撞的可能性(即使它非常低).
我想知道是否有办法根据时间生成一个唯一的ID?
我试图了解Cassandra以及如何构建我的列族(CF),但由于习惯了关系数据库,所以很难.
例如,如果我创建简单的usersCF并尝试插入新行,如何在MySQL中创建增量键?
我看到了很多例子,你只需要输入用户名而不是唯一的ID,这会有点意义,但是如果我希望用户拥有重复的用户名呢?
另外我如何根据我的理解进行搜索cassandra不支持>运算符,所以类似的东西select * from users where something > something2不起作用.
可能最重要的问题是关于分组的问题?我是否需要检索所有数据,然后使用我正在使用的任何语言过滤它?我认为这会大大减慢我的系统速度.
所以基本上我需要一些简短的解释如何开始使用Cassanda.
我已经考虑了很多,但无法想出一个我很满意的解决方案.
基本上这就是问题:记录100k + Chats(有些慢,有些更快)进入cassandra.因此保存userId,channelId,timestamp和消息.
Cassandra已经支持水平扩展,我在这里没有问题.
现在,我读取这些聊天的软件通过TCP(IRC)完成.对于顶级1k通道,通常会有300条消息/秒,而单个IRC连接无法处理我的实验.
我现在想要构建的是记录器的多个实例(使用Docker/Kubernetes)并在它们之间共享负载.理想情况下,如果我有4个工人和1k个聊天(例如).他们每个人都会加入至少250个频道.我说至少是因为我想要可选的冗余,所以我可以在同一个聊天中有2个记录器,以确保没有消息丢失.重复项没有问题,因为所有消息都有唯一的ID.
现在,我将如何最好地动态分享工人之间加入的当前渠道.我想避免拥有主人或控制点.还应该很容易添加更多的工人,然后减少其他工人的负担.
有关这种行为的好文章吗?也许已经定义了好的概念或协议?就像我说的,我想避免另一个中央控制点,所以没有rabbitmq,redis或其他什么.
编辑:我已经研究过像Raft Consensus Algorithm这样的东西了,但是我认为这没有意义,因为我不希望我的客户就共享状态达成一致,而是将它们之间的状态"平等地"分开.
parallel-processing tcp distributed-computing docker kubernetes
cassandra 是否支持计数器的原子获取和设置?IE
create table c(id int, value counter, primary key (id));
update update c set value=value+1 where id=1;
Run Code Online (Sandbox Code Playgroud)
好的,现在我的柜台准备好了。但是我希望能够从多个服务器读取一个唯一值,每个服务器都获得一个不同的值,例如
select value from c where id=1;
Run Code Online (Sandbox Code Playgroud) 我想为实体生成唯一的id并将实体存储在Cassandra数据库中(仅当已生成id的实体不存在时).
在id生成之后,我检查db是否有任何具有相同id的实体.如果不是,则保存实体.MyService类的示例代码:
synchronized (MyService.class) {
do {
id = generateId();
} while (myDao.find(id) != null);
sampleObject.setId(id);
myDao.create(sampleObject);
}
Run Code Online (Sandbox Code Playgroud)
在MyDao中保存我正在使用的实体:
cassandraOperations.insert(sampleObject);
Run Code Online (Sandbox Code Playgroud)
确保数据库中不存在已生成的id的最佳实践是什么?我觉得这个同步块不是最有效的解决方案.或者也许还有其他方法可以确保只有在数据库中没有具有相同ID的实体时才插入实体?
cassandra ×4
atomic ×1
concurrency ×1
cql ×1
cql3 ×1
docker ×1
java ×1
kubernetes ×1
nosql ×1
spring-boot ×1
tcp ×1
uuid ×1