请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

redis集群再启动的问题

情况描述:配置好redis集群之后关闭了集群,之后又启动集群会出现Node ip:port is not empty的错误。错误的产生是由于我之前集群有保存数据库文件到本地,这就出现了这个错误。当然,直接删除数据库文件和AOF文件是可以解决这个问题。

我的问题:我现在是想把redis做成一个数据库,这样的话在运行过程中一定会有数据持久化到rdb文件中。但是上述情况导致机器重启之后整个集群就无法正常启动。对于删除之前的数据来重新启动集群的方法感到麻烦,有没有方法可以解决集群重启后数据加载的问题呢?如果不能解决,那重新启动一个空书籍的集群,需要怎样加载原有的rdb文件到新的集群呢?

正在回答 回答被采纳积分+3

2回答

提问者 Siletheart 2018-03-25 21:51:04

     关于这个问题我最近又思考了一下,写在这里了,作为抛砖引玉还请各位有空的大佬们指教。♪(・ω・)ノ 实际上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文件来恢复数据或者使用其他办法了。

0 回复 有任何疑惑可以回复我~
  • Geely #1
    必须给同学点个赞!!很深度的思考~~一般用master和slave的最多,这个解决方案成本低,效果好~~slave来备份master的数据~~增加心跳检查。一旦挂掉,我们可以通过slave来恢复数据,而且增加定时任务,定期进行save操作。
    必须赞同学!!通过你的调研~~可以看出来真的花费了很大的精力来思考这个问题~~这对一个工程师的成长是非常非常有利的!!!加油!
    回复 有任何疑惑可以回复我~ 2018-03-25 22:33:06
  • 提问者 Siletheart 回复 Geely #2
    ⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄
    回复 有任何疑惑可以回复我~ 2018-03-25 23:04:05
Geely 2018-02-06 23:03:24

你好,同学,这是一个好问题,不过我没碰到过。如果非kill 正常走的reids命令来关闭shutdown。会如课程所说触发save命令,进行持久化,然后直接启动redis的时候会自动读取。。有没有具体的日志,发出来,详细点,咱们一起来看看那,不要在回复里回,直接在问答区的框框里回,可以排版一下。

0 回复 有任何疑惑可以回复我~
  • 提问者 Siletheart #1
    暂时没有日志,重点是也没时间,在另一个项目救火呢。年后找时间解决这个问题吧。祝老师新年快乐。祝各位同学新年快乐。
    回复 有任何疑惑可以回复我~ 2018-02-12 19:22:53
  • Geely 回复 提问者 Siletheart #2
    嗯好的,先救火吧,等你年后再看,我们再一起来解决它~~谢谢同学,祝siletheart同学新年快乐~(づ ̄ 3 ̄)づ
    回复 有任何疑惑可以回复我~ 2018-02-13 14:32:10
  • 提问者 Siletheart 回复 Geely #3
    关于这个问题我最近又思考了一下,写在这里了,作为抛砖引玉还请各位有空的大佬们指教。♪(・ω・)ノ
    实际上redis集群在CAP理论中,是弃了强一致性这个特性的。具体的CAP模型理论大家可以参考这篇博客https://blog.csdn.net/zhangyuan19880606/article/details/51143628我觉得写的很好。
    “按照CAP理论来说,单机版的Redis属于保证CP(Consistency & Partition-Tolerancy)。有了Cluster功能后,Redis从一个单纯的NoSQL内存数据库变成了分布式NoSQL数据库,CAP模型也从CP变成了AP”(来自:http://www.cnblogs.com/kevingrace/p/7846324.html)。
    经过上面两篇博客的介绍,我个人判断这个问题是redis cluster不支持强一致性而引发的,redis每个节点存储的值都不一样!(不知道我对强一致性的理解是否正确!)
    一个简单的例子就是,假设集群的某个端口为x的节点出了问题,管理员发现问题后重新启动了x这个实例,然后再把它加入到集群中。在x实例启动到加入集群的这个时间段里面,实际上x实例是可以被写入数据的。在写入数据后再加入集群,就会造成集群的数据污染。所以新结点加入集群是需要为空的。当然这种情况不包含把集群的slot分配一部分到新结点这种情况。
    实际上我的提问是建立在一种极端的情况下的,我假设了redis集群所有机器(结点)都挂了,想重启redis结点并恢复集群的数据。就类似像数据库一样使用!但是这种情况是极端地、小概率的事件。一般redis集群都会有master和slave,只要能有维持集群的节点那数据就不会丢失,这个时候只要监控集群的节点运行情况,在节点挂掉的情况下及时的加入新节点就不会造成数据丢失了。所以我感觉这个问题实际上在现实中没有太大的实际意义。= =||
    况且我判断这个问题是因为redis集群的AP模型引起的,如果能解决那不是推翻了CAP了。 w(゚Д゚)w。
    贻笑大方了(꒦_꒦)
    回复 有任何疑惑可以回复我~ 2018-03-25 21:42:45
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信