redis集群再启动的问题
来源:5-1 Redis快速入门
Siletheart
2018-02-06
情况描述:配置好redis集群之后关闭了集群,之后又启动集群会出现Node ip:port is not empty的错误。错误的产生是由于我之前集群有保存数据库文件到本地,这就出现了这个错误。当然,直接删除数据库文件和AOF文件是可以解决这个问题。
我的问题:我现在是想把redis做成一个数据库,这样的话在运行过程中一定会有数据持久化到rdb文件中。但是上述情况导致机器重启之后整个集群就无法正常启动。对于删除之前的数据来重新启动集群的方法感到麻烦,有没有方法可以解决集群重启后数据加载的问题呢?如果不能解决,那重新启动一个空书籍的集群,需要怎样加载原有的rdb文件到新的集群呢?
2回答
-
Siletheart
提问者
2018-03-25
关于这个问题我最近又思考了一下,写在这里了,作为抛砖引玉还请各位有空的大佬们指教。♪(・ω・)ノ 实际上redis集群在CAP理论中,是弃了强一致性这个特性的。具体的CAP模型理论大家可以参考这篇博客我觉得写的很好。 “按照CAP理论来说,单机版的Redis属于保证CP(Consistency & Partition-Tolerancy)。有了Cluster功能后,Redis从一个单纯的NoSQL内存数据库变成了分布式NoSQL数据库,CAP模型也从CP变成了AP”。
经过上面两篇博客的介绍,我个人判断这个问题是redis cluster不支持强一致性而引发的,redis每个节点存储的值都不一样!(不知道我对强一致性的理解是否正确!) 一个简单的例子就是,假设集群的某个端口为x的节点出了问题,管理员发现问题后重新启动了x这个实例,然后再把它加入到集群中。在x实例启动到加入集群的这个时间段里面,实际上x实例是可以被写入数据的。在写入数据后再加入集群,就会造成集群的数据污染。所以新结点加入集群是需要为空的。当然这种情况不包含把集群的slot分配一部分到新结点这种情况。
实际上我的提问是建立在一种极端的情况下的,我假设了redis集群所有机器(结点)都挂了,想重启redis结点并恢复集群的数据。就类似像数据库一样使用!但是这种情况是极端地、小概率的事件。一般redis集群都会有master和slave,只要能有维持集群的节点那数据就不会丢失,这个时候只要监控集群的节点运行情况,在节点挂掉的情况下及时的加入新节点就不会造成数据丢失了。所以我感觉这个问题实际上在现实中没有太大的实际意义。= =|| 况且我判断这个问题是因为redis集群的AP模型引起的,如果能解决那不是推翻了CAP了。 w(゚Д゚)w。 贻笑大方了(꒦_꒦)按照这个思路,想解决这个问题只能是在重新启动集群之后再看下是否能加载原来集群的rdb文件来恢复数据或者使用其他办法了。
022018-03-25 -
Geely
2018-02-06
你好,同学,这是一个好问题,不过我没碰到过。如果非kill 正常走的reids命令来关闭shutdown。会如课程所说触发save命令,进行持久化,然后直接启动redis的时候会自动读取。。有没有具体的日志,发出来,详细点,咱们一起来看看那,不要在回复里回,直接在问答区的框框里回,可以排版一下。
042018-03-25
相似问题