Golang Go语言中,分布式环境下不借助第三方存储是否必须自己实现“存储”

发布于 1周前 作者 nodeper 来自 Go语言

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

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

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


Golang Go语言中,分布式环境下不借助第三方存储是否必须自己实现“存储”

更多关于Golang Go语言中,分布式环境下不借助第三方存储是否必须自己实现“存储”的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

你就不要给自己找事儿做了

云原生,分布式,弹性扩容,这些东西的前提就是有充分的其他服务
你非得剥开他们图个啥

更多关于Golang Go语言中,分布式环境下不借助第三方存储是否必须自己实现“存储”的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


比较流行的 kafka 消息队列服务目前采用的都是外挂一个 zookeeper 做这样的事。

但是,kafka 后期打算把 zookeeper 抛弃,自身实现一个 raft 集群,也就是你期望的那样,你可以去看看。




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

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

所以再不借助任何第三方存储的情况下, 需要自己实现一套复杂的 metadata 同步。对吧。

问题拆解一下,你的需求是需要一个分布式环境的存储,你的疑问是分布式存储的数据是如何分布并路由的。

回答你的疑问:数据分布和路由方式有关,广义上数据路由有两种方式,hash 和元数据中心结点。Hash 只需要知道 hash 算法和结点信息(很轻量和简单),根据 hash 算法计算请求的数据在哪个结点(你说的 redis ,以及 memcached 集群、ceph 的 crush ),而元数据中心结点的方式需要你请求元数据结点(一般是集群,元数据集群自己保证一致性,例如 zk ),元数据结点告诉你数据在哪,你再去请求(比如你提到的 tidb ,以及 GFS / HDFS 、HBase 等很多分布式系统)。这些系统本身就是分布式存储系统,自然不需要第三方存储集群(一般不需要)。

对于你的需求(记录集群链接数),你的服务是无状态的,方案有很多,比如每个实例都可以对外提供链接统计功能,然后一个外部服务遍历请求所有实例,或者不需要外部服务,直接请求任意一个实例,被请求的实例遍历其他实例也行,也可以用一个外部存储系统记录,要求不高的话一个 redis 实例就能满足,要求高的话上 redis 集群

在Golang中,分布式环境下是否必须自己实现“存储”,取决于具体的需求和系统架构设计。

首先,虽然Go语言具有构建高效存储节点的能力,且其并发模型和垃圾回收机制非常适合开发高性能的存储系统,但这并不意味着在分布式环境中必须亲自实现存储功能。是否亲自实现存储,很大程度上取决于项目的具体需求、团队的技术能力、以及对现有解决方案的评估。

其次,如果项目对存储的性能、一致性、可用性等方面有严格要求,且市场上没有现成的解决方案能满足这些要求,那么可能需要自己实现存储系统。然而,如果现有开源项目或第三方存储服务已经能满足需求,那么利用这些现有资源可能会更加高效和可靠。

最后,需要考虑到自己实现存储系统所带来的开发和维护成本。如果团队没有足够的资源和经验来支持这一开发任务,或者市场上的解决方案更加成熟和稳定,那么选择使用第三方存储服务可能是一个更明智的选择。

综上所述,在分布式环境下使用Golang时,是否必须自己实现存储取决于多种因素的综合考虑。

回到顶部