1
lcy630409 2019-09-29 09:43:21 +08:00
|
2
rootww21 2019-09-29 09:49:31 +08:00
redis 集群轻松搞定
|
3
aganlengzi OP @lcy630409 不是只写一台,redis-A 会被写入,redis-B 也会被写入,两台被写入的内容可能不同,想做的是把写入增量想同步到另一台。
|
4
misaka19000 2019-09-29 09:51:05 +08:00
简单,写个中间层
|
5
Michaelssss 2019-09-29 09:51:16 +08:00
增量同步,首先全局自增 uid 要有,接着还要自己实现一个 redis-client。。。
|
6
winterfell30 2019-09-29 10:01:13 +08:00 via Android 1
搞双主的目的是写的时候低延迟?要保证强一致的话还是挺难搞的
|
7
andylsr 2019-09-29 10:05:42 +08:00 via Android
要求实时?
|
8
micean 2019-09-29 10:08:09 +08:00
做不到吧,逻辑上怎么保证 2 个 redis 写入同样的 key,以谁的为准?
|
9
aganlengzi OP @winterfell30 想实现的是不同机器上 web-server 的本地缓存 -> 不同机器上 web-server 的共享缓存
主要是现状只有一台机器上有 web-server+redis(只是 cache,不是 buffer),想的是如果能通过 redis 相关配置实现,上层不用关心同步,加一台机器改改配置就行了... ... 貌似这是个很原始很不好的想法... |
10
aganlengzi OP @micean 嗯
|
11
aganlengzi OP @andylsr 嗯
|
12
0NF09LJPS51k57uH 2019-09-29 10:17:25 +08:00 1
redisson 可以解决你这个问题,本质是发布订阅,注册一个监听器,自己实现监听事件的具体业务就可以了
|
13
0NF09LJPS51k57uH 2019-09-29 10:18:26 +08:00
另外集群肯定是需要的,cluster 模式还是 sentinel 模式要看你们自己架构
|
14
leviathan0992 2019-09-29 10:18:30 +08:00
@aganlengzi 逻辑上怎么保证 2 个 redis 写入同样的 key,以谁的为准? 这个你们考虑过吗?
|
15
abccccabc 2019-09-29 10:22:28 +08:00
楼主的意思是双主互相备份吗?但两台 redis 里面的 key 一样,值不一样,可就麻烦了。
|
16
aganlengzi OP @leviathan0992 这个在现有场景问题不大,redis 只是数据库的 cache,一般不会有一致性问题,如果不一致那说明前后两个操作中间数据库有写入操作,这个以新的和旧的数据都行,旧的数据会在超时后被改写,功能上可以接受。
|
17
aganlengzi OP @abccccabc 嗯,我们功能上这个问题可以接受,web-server 不改数据库。
|
18
zdt3476 2019-09-29 10:33:26 +08:00
没理解楼主这种需求的意义。 一个 Redis 不是照样能满足吗
|
19
aganlengzi OP @zdt3476 嗯,可以,想的是只访问本地内存,很快,没网络延迟;然后如果 redis 能互相同步,就很爽了...
|
20
Vegetable 2019-09-29 10:52:56 +08:00
那就写两次.两个服务器分别异步向两个缓存写,读只读自己本地这个.
优势是不需要引入太大的变动,也能满足你读取本地内存这个需求. 缺点是设计看起来比较蠢,如果 handler 不支持异步任务会比较麻烦 |
21
Tink 2019-09-29 11:07:30 +08:00 via iPhone
这个没办法吧
|
22
alamaya 2019-09-29 11:12:21 +08:00
搞不懂你这里执著写两台 redis 的意义是啥
|
23
xmh51 2019-09-29 11:14:23 +08:00
本地 cache 一致性问题很难搞。另外 redis 的性能已经非常高了 腾讯云实测 10wqps
|
24
df4VW 2019-09-29 11:15:29 +08:00
@aganlengzi 每台机子读同一台机子的 redis,你这架构就没法 scale。。
|
25
rrfeng 2019-09-29 11:16:58 +08:00 via Android 1
可以做双向同步,就是数据会有冲突,最简单的解决冲突就是覆写,后来的值为准,看你能不能接受了。
本地访问 Redis 带来的收益其实很小。除非你俩主机隔得很远 |
26
LeeSeoung 2019-09-29 11:18:21 +08:00 1
两个 redis 当成独立的,应用请求数据库后 写两份 redis,与其考虑 redis 同步,这样不是更方便?
|
27
arloor 2019-09-29 11:19:25 +08:00 via Android 1
做个伪 slave 去接受两个 redis 主节点的异步拷贝,然后发送给对方。你需要实现这个伪 slave,同时还是有一些问题难以解决的
1. 在网络波动下,redis 主会给伪 slave 发送全量同步的 rdb 文件,而 redis 没有暴露加载 rdb 的命令——当然可以通过修改 redis 源码然后重新编译安装实现暴露 rdb 命令 更多可以在 github 上搜 redis replicator 这个项目。 要深入理解,请看 redis 的 replicate.c 源码 说了很多,因为一句话根本说不清 |
28
lcy630409 2019-09-29 11:27:18 +08:00
你这样搞来搞去 两个服务器之间的网络连接始终存在,感觉没什么意义
或者如果有费用的话 推荐你 阿里云的高速通道,两台服务器专线连接 |
29
lisces 2019-09-29 12:19:42 +08:00 1
twemproxy 或者 codis 搞一个 proxy
|
30
dangyuluo 2019-09-29 12:22:16 +08:00 1
你可以了解一下分布式系统的 CAP 理论:
一个分布式系统最多只能同时满足一致性( Consistency )、可用性( Availability )和分区容错性( Partition tolerance )这三项中的两项。 |
31
xiaotianhu 2019-09-29 13:04:38 +08:00 1
简化一下这样干
每台机器 webserver+memcache 做本地缓存,sql/模板 /配置一类的 其他的走独立 redis 能解决你大部分场景了 |
32
aganlengzi OP @rrfeng 嗯,是这样.
|
33
aganlengzi OP |
34
aganlengzi OP |
35
aganlengzi OP @Vegetable 弄成一主一从,然后往主写,都读本地...差不多
|
36
aganlengzi OP |
37
pubby 2019-09-29 13:25:27 +08:00
另一个思路是:根据客户来源固定分配到某一台服务器
|
38
jhsea3do 2019-09-29 13:41:57 +08:00
lz 你考虑 redis cluster ha ?
|
39
jhsea3do 2019-09-29 13:45:59 +08:00
另外你如果对 kv 的高可用看重,而对 缓存速度 不看重的话,可以用 etcd / zookeeper, 这个主要做配置共享的。
|
40
passerbytiny 2019-09-29 13:55:03 +08:00
你既然叫缓存,那么你的主存储还是关系数据库,为何不从缓存策略上去考虑。两个一摸一样的 Redis 缓存不是没有意义,但效益成本比例低到可以忽略。
如果你要是单纯的追求访问(读)速度,并且做好了读写分离,那么应当做成镜像而不是缓存。 |
41
alamaya 2019-09-29 15:45:11 +08:00
@aganlengzi
看不出来有什么意义,你要更快的本地缓存,那用在同一个进程里面的 memcache 岂不是更快,何必用 redis,还搞同步,你两台机器也许还能搞,以后增加到三台四台十几台的时候还这么同步? |
42
julyclyde 2019-09-30 10:51:42 +08:00
从设计上就是错的
然后你问怎么把这个错误实现 |