不借助 redis 、mysql 等第三方存储。
想维护一个集群的当前连接,是不是只能靠 raft 等机制实现自己的一个存储,而且一定是依靠主从的?
比如一个 websocket 集群环境。我想知道当前整个集群中一共有多少连接活跃和连接详情(假设是 map[uid:string]server-ip )而不借助第三方存储(比如 redis 计数)是不是只能自己把每个节点的连接信息上报到当前集群的 leader 中(所谓 metadata )同时所有节点除了维护自身连接外,同样也接受备份存储。
1
realpg 2022-07-12 05:35:11 +08:00
你就不要给自己找事儿做了
云原生,分布式,弹性扩容,这些东西的前提就是有充分的其他服务 你非得剥开他们图个啥 |
2
asilin 2022-07-12 09:32:15 +08:00
比较流行的 kafka 消息队列服务目前采用的都是外挂一个 zookeeper 做这样的事。
但是,kafka 后期打算把 zookeeper 抛弃,自身实现一个 raft 集群,也就是你期望的那样,你可以去看看。 |
3
dzdh OP @realpg
@asilin 这样的。看到 cockroachdb 就一个二进制文件,直接启动就可以组成集群,分布式存储。 又看到 tidb 需要借助一个 pd 来同步 metadata ,多个 pd 还有主从。 又看到 redis 集群也是 redis-trib create 就完事了 都没借助到第三方存储集群信息。 拿 redis 来说,redis 集群是任何一个 key 不是所有节点都有的。但是连接任意一个节点都能读到任意一个 key ,所以他实现了按照 crc16 和 slots 取余的分片存储,每次根据 key 先判断在数据应该在哪个 slot 在根据 slot 判断在哪个节点。然后再去读对应的节点。 所以再不借助任何第三方存储的情况下, 需要自己实现一套复杂的 metadata 同步。对吧。 |
4
realrojeralone 2022-07-12 13:46:36 +08:00
@dzdh 问题拆解一下,你的需求是需要一个分布式环境的存储,你的疑问是分布式存储的数据是如何分布并路由的。
回答你的疑问:数据分布和路由方式有关,广义上数据路由有两种方式,hash 和元数据中心结点。Hash 只需要知道 hash 算法和结点信息(很轻量和简单),根据 hash 算法计算请求的数据在哪个结点(你说的 redis ,以及 memcached 集群、ceph 的 crush ),而元数据中心结点的方式需要你请求元数据结点(一般是集群,元数据集群自己保证一致性,例如 zk ),元数据结点告诉你数据在哪,你再去请求(比如你提到的 tidb ,以及 GFS / HDFS 、HBase 等很多分布式系统)。这些系统本身就是分布式存储系统,自然不需要第三方存储集群(一般不需要)。 对于你的需求(记录集群链接数),你的服务是无状态的,方案有很多,比如每个实例都可以对外提供链接统计功能,然后一个外部服务遍历请求所有实例,或者不需要外部服务,直接请求任意一个实例,被请求的实例遍历其他实例也行,也可以用一个外部存储系统记录,要求不高的话一个 redis 实例就能满足,要求高的话上 redis 集群 |