分布式环境下,不借助任何第三方存储的前提下,是不是必须要自己实现一个“存储”

2022-07-12 01:28:09 +08:00
 dzdh

不借助 redis 、mysql 等第三方存储。

想维护一个集群的当前连接,是不是只能靠 raft 等机制实现自己的一个存储,而且一定是依靠主从的?

比如一个 websocket 集群环境。我想知道当前整个集群中一共有多少连接活跃和连接详情(假设是 map[uid:string]server-ip )而不借助第三方存储(比如 redis 计数)是不是只能自己把每个节点的连接信息上报到当前集群的 leader 中(所谓 metadata )同时所有节点除了维护自身连接外,同样也接受备份存储。

1882 次点击
所在节点    Go 编程语言
4 条回复
realpg
2022-07-12 05:35:11 +08:00
你就不要给自己找事儿做了

云原生,分布式,弹性扩容,这些东西的前提就是有充分的其他服务
你非得剥开他们图个啥
asilin
2022-07-12 09:32:15 +08:00
比较流行的 kafka 消息队列服务目前采用的都是外挂一个 zookeeper 做这样的事。

但是,kafka 后期打算把 zookeeper 抛弃,自身实现一个 raft 集群,也就是你期望的那样,你可以去看看。
dzdh
2022-07-12 09:44:51 +08:00
@realpg
@asilin

这样的。看到 cockroachdb 就一个二进制文件,直接启动就可以组成集群,分布式存储。
又看到 tidb 需要借助一个 pd 来同步 metadata ,多个 pd 还有主从。
又看到 redis 集群也是 redis-trib create 就完事了
都没借助到第三方存储集群信息。

拿 redis 来说,redis 集群是任何一个 key 不是所有节点都有的。但是连接任意一个节点都能读到任意一个 key ,所以他实现了按照 crc16 和 slots 取余的分片存储,每次根据 key 先判断在数据应该在哪个 slot 在根据 slot 判断在哪个节点。然后再去读对应的节点。

所以再不借助任何第三方存储的情况下, 需要自己实现一套复杂的 metadata 同步。对吧。
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 集群

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/865551

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX