自己写的分布式缓存,求轻拍

2017-09-29 15:00:23 +08:00
 qiyue201707

最近写的一个分布式缓存, 感兴趣的可以

https://github.com/Leviathan1995/grape

兼容 Redis 协议, 因为 Redis 协议数据表现力很强, 但是集群的使用需要主从模式,所以考虑写一个完全 P2P 结构的分布式缓存, 通过一致性哈希分散数据, 使用客户端连接集群里任意节点就能进行服务,使用redis_cli新增节点和删除节点都特别简单.

TODO

目前支持的命令只有 SET,GET,后面慢慢加.

TTL

因为没有 master 的概念, 现在最主要的就是考虑如何实现节点的存活检测, 考虑要不要也像 Redis 加入哨兵机制,这个问题欢迎大家一起讨论...

4329 次点击
所在节点    程序员
26 条回复
NullMan
2017-09-29 15:40:33 +08:00
问个问题,用 redis_cli 删除一节点后,这被删除的节点的数据怎么个处理了?
qiyue201707
2017-09-29 15:44:34 +08:00
@NullMan 目前的情况是数据就没有了,但这个问题后面我会改成集群里存在备份节点,删除一个节点后,更新整个集群里所有的节点的路由表,之后每次的服务就移动到备份节点了, 因为是缓存,我觉得数据是允许丢失的
NullMan
2017-09-29 16:48:30 +08:00
@qiyue201707 我认为删除就是删除了,既然要删除一个节点,就说明已经容许数据丢失,就如你说的 “因为是缓存,我觉得数据是允许丢失的。”

当然,这是设计上的问题,主要看你怎么定义 “删除节点”。
qiyue201707
2017-09-29 16:50:02 +08:00
@NullMan 删除节点也有可能节点不可用了
Allianzcortex
2017-09-29 16:52:26 +08:00
LZ 在 infra 方向真是我辈楷模啊
qiyue201707
2017-09-29 16:55:04 +08:00
@Allianzcortex 楷模谈不上....本身就是个基础架构方向的新兵,现在还在学习阶段....
Allianzcortex
2017-09-29 17:03:03 +08:00
@qiyue201707 太谦虚了......新建了一个 V2 账号吗?
Allianzcortex
2017-09-29 17:03:36 +08:00
@NullMan @qiyue201707 我是觉得缓存这类本身的特性决定了要选择 C 而非 A,就算是穿透了也有后面的数据库兜底 /(ㄒoㄒ)/~~emmmmmm
qiyue201707
2017-09-29 17:07:56 +08:00
@Allianzcortex 是换了一个账号,不想暴露太多个人信息...
关于是否添加备份节点可以通过配置项让使用者自己决定,尽可能的提高容灾
neoblackcap
2017-09-29 17:22:29 +08:00
我想问一下使用问题
1. 是不是我连接的时候还是需要指定节点的 ip ?
2. 节点挂了是不是要自己重新连接?

还有就是这个缓存的数据一致性是怎么样?
qiyue201707
2017-09-29 17:26:18 +08:00
@neoblackcap 连接的时候指定集群中任意节点就行了, 节点挂了重启自动重新连接

数据没有一致性, 每个节点只存一份数据.
Allianzcortex
2017-09-29 17:44:07 +08:00
@neoblackcap 这个版本是 decentralized,所以没有类似 paxos/raft 的 master/slave 选主,所以数据只有 0 和 1 两种状态,是吧 @qiyue201707
qiyue201707
2017-09-29 17:49:07 +08:00
movistar
2017-09-29 17:49:46 +08:00
实际上就是对 key 做数据一致性哈希分桶?
存储节点互相独立,互不影响么
一般来说分布式服务都需要一个 meta server 吧,或者 name server
如何避免一台服务器宕机后导致的内存穿透问题呢
如果只是简单的做了分桶,为啥不直接在 client 侧根据 hash 结果选择不同 redis 连接呢
redis 还有主备,能保证一个节点宕机另一个可用
qiyue201707
2017-09-29 18:03:52 +08:00
@movistar 缓存穿透问题加备份节点就能尽可能解决
client 根据 hash 来选择 redis 连接, 这就需要 client 自己维护一个路由表对吗, 我想兼容 redis 协议,让使用的人直接用现有的 redis 的 client 来操作.
ihuotui
2017-09-29 18:38:33 +08:00
没有代理服务,就是客户端维护 redis 路由咯
monsterxx03
2017-09-29 18:38:45 +08:00
加入节点的时候用的是类似 gossip protocol 的方式吧,如果用原生的 redis client, 如果初始连接的 node 挂了,就连不上整个集群了,实际上用的人要自己封装一下,从一个初始 list 中去做尝试
deadblock
2017-09-29 18:39:25 +08:00
已经 star,不谢
qiyue201707
2017-09-29 18:40:16 +08:00
@monsterxx03 是的 类似 gossip protocol
monsterxx03
2017-09-29 19:02:05 +08:00
这样还有个问题,hash 是 server 端完成然后做 forward 的,这和 elasticsearch 的集群模式是一样的。 用原生 client 的话,你的 request 压力瓶颈其实全在一台机器上,这样集群的意义不大。要实际使用,至少要和 elasticsearch 的 client 一样,实现一个从集群中拉取全部 node 信息的逻辑

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

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

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

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

© 2021 V2EX