codis icon indicating copy to clipboard operation
codis copied to clipboard

codis如何保证redis节点间的一致性?

Open richardor opened this issue 6 years ago • 20 comments

我看到有单独的一个项目codis-ha,但是说实在我还是没明白它是如何保证redis节点间数据的一致性的。 比如master节点崩溃后,我们接下来会访问到slave节点,那怎么保证此时slave节点的数据与master节点的数据是一致的呢?谢谢

richardor avatar Apr 19 '18 01:04 richardor

@richardor 数据一致性不是Codis实现的功能,其次Redis的主从复制模式本身就是无法保证master 与 slave间数据同步的绝对一致性。所以这个问题是无法解决。

zhongjimax avatar Apr 19 '18 02:04 zhongjimax

@zhongjimax 那你有好的建议吗?如何保证master和slave的数据一致性

richardor avatar Apr 19 '18 06:04 richardor

如果master和slave的数据不一致时,如果读取slave时,出现读取不到情况,有没有办法解决?

fangping1004 avatar Apr 19 '18 07:04 fangping1004

如果你了解 Redis 主从复制机制就不会考虑在Redis 上做读写分离了。

zhongjimax avatar Apr 19 '18 07:04 zhongjimax

codis3.2集群,通过proxy读取数据时,是怎么样的原理?会从slave节点读取数据吗?

fangping1004 avatar Apr 19 '18 07:04 fangping1004

无论是Codis系统也好,twproxy也好,或是网易,搜狐自己研发的 proxy,都只会访问master节点。slave节点只是用作备用设备,并在master无法提供服务的时候,提升slave为master节点。

zhongjimax avatar Apr 19 '18 07:04 zhongjimax

@zhongjimax 谢谢

fangping1004 avatar Apr 19 '18 08:04 fangping1004

作者,我想问一个问题。我在网上查找了一些文章,我现在的部署如下: 172.16.6.197 zookeeper redis-master 6379 redis-slave 6380 redis-sentinel 26379 26380 26381 dashboard proxy fe 172.16.6.198 zookeeper redis-master 6379 redis-slave 6380 redis-sentinel 26379 26380 26381 172.16.6.199 zookeeper redis-master 6379 redis-slave 6380 redis-sentinel 26379 26380 26381 我现在环境是没有问题了,关于sentinel的问题,因为我现在的sentinel是配置好了,只监控当前主机的redis group. 当我在fe界面配置了sentinel就会乱掉,导致数据不一样。 那么这样应该怎么实现自动切换主从呢?

huang19910425 avatar May 03 '18 09:05 huang19910425

@huang19910425 为什么redis-sentinel起了三个端口? 建议sentinel不要任何配置,默认就可以。sentinel起来后通过dashboard加入到codis,codis会自动告知三个master,sentinel会自动info master去获取slave,完成master-slave维护,回写配置文件。

weilinqwe avatar May 04 '18 01:05 weilinqwe

@weilinqwe 你的意思只要启动3个sentinel默认配置,只要启动后,通过dashboard加入到sentinel后,就可以了。 后续他会自动监控master并且切换主从是吗?

huang19910425 avatar May 04 '18 02:05 huang19910425

@huang19910425 对的

weilinqwe avatar May 04 '18 02:05 weilinqwe

@weilinqwe 我尝试下,有问题随时沟通。

huang19910425 avatar May 04 '18 02:05 huang19910425

默认sentinel的配置文件如下: port 26379 dir /tmp sentinel monitor mymaster 127.0.0.1 6379 2 sentinel down-after-milliseconds mymaster 30000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 180000 按照上面,我有三组redis group, redis master 端口为6381 redis slave 端口为6382 。 那这里的sentinel配置文件也不用改吗?

huang19910425 avatar May 04 '18 03:05 huang19910425

@weilinqwe

huang19910425 avatar May 04 '18 03:05 huang19910425

@weilinqwe 可以加下微信,或者QQ 方便沟通吗?

huang19910425 avatar May 04 '18 03:05 huang19910425

默认配置,只要前两行就可以了

weilinqwe avatar May 04 '18 04:05 weilinqwe

配置文件修改成这个即可: port 26379 dir /tmp protected-mode no logfile "/data/app/codis/logs/sentinel.log"

huang19910425 avatar May 04 '18 05:05 huang19910425

@weilinqwe seninel已经没问题了,谢谢。

huang19910425 avatar May 04 '18 05:05 huang19910425

@zhongjimax ,你提到:

无论是Codis系统也好,twproxy也好,或是网易,搜狐自己研发的 proxy,都只会访问master节点。slave节点只是用作备用设备,并在master无法提供服务的时候,提升slave为master节点。

我赞同这个,我也没有使用读写分离。我的问题是,如果master挂了,这时会将slave提上来做为新的master。这个过程中,codis是如何保证数据的强一致性的?我在网上看到说,codis设计之初就是为了保证数据的强一致性,做了哪些事情呢? 我不知道你是不是codis的开发人员,不知道这样问你合不合适,谢谢

richardor avatar May 09 '18 06:05 richardor

@zhongjimax ,你提到:

无论是Codis系统也好,twproxy也好,或是网易,搜狐自己研发的 proxy,都只会访问master节点。slave节点只是用作备用设备,并在master无法提供服务的时候,提升slave为master节点。

我赞同这个,我也没有使用读写分离。我的问题是,如果master挂了,这时会将slave提上来做为新的master。这个过程中,codis是如何保证数据的强一致性的?我在网上看到说,codis设计之初就是为了保证数据的强一致性,做了哪些事情呢? 我不知道你是不是codis的开发人员,不知道这样问你合不合适,谢谢

基于我目前的认知,codis 无法保证主从上数据的一致,当然这不是 codis 的问题,是所有异步主从复制系统都有的问题;

moooofly avatar Mar 06 '20 06:03 moooofly