【1】gem install redis 报错

redis-cluster安装需要通过gem install redis来安装相关依赖。否则报错。
通过gem install redis执行后会出现两个问题:

1.1 缺少zlib依赖

问题:
  ERROR: Loading command: install (LoadError)
  cannot load such file -- zlib
  ERROR: While executing gem ... (NoMethodError)
  undefined method 'invoke_with_build_args' for nil:NilClass
解决:
  通过yum install zlib-devel 安装zlib库
  然后集成zlib库到ruby环境
    cd /usr/local/ruby-2.2.7/ext/zlib #这个路径,其实就是你的安装包解压路径
    ruby extconf.rb
  重要:ext/openssl/Makefile 增加 top_srcdir = ../..
  //这一步如果不修改,make时会爆出另外一个错误
  //make:*** No rule to make target '/include/ruby.h', needed by 'zlib.o'. Stop
    make && make install

1.2 缺少openssl库

问题:
  ERROR: While executing gem ... (Gem::Exception)
  Unable to require openssl, install OpenSSL and rebuild ruby (preferred) or use non-HTTPS sources
解决:
  通过yum install openssl-devel 安装openssl库
  然后集成到ruby环境
    cd /usr/local/ruby-2.2.7/ext/zlib
    ruby extconf.rb
  重要:ext/openssl/Makefile 增加 top_srcdir = ../..
  //修改Makefile中的$(top_srcdir)为../..
    make && make install

【2】can't connect to node 192.168.1.13:7001

当报无法连接的时候,通过telnet192.168.1.13:7001 是无法连接通,则说明配置的哪里有问题导致的

可能导致问题的原因

原因1:redis的配置文件,发现,在配置文件中配置bind 127.0.0.1这个地址,修改指定的IP地址,可以同时指定127.0.0.1,这样本机和ip地址都可以访问

参考:bind 192.168.1.13 127.0.0.1

当通过原因1解决后,发现还是报错,虽然telnet是可以正常连接了,但是还是报上面的错误

原因2:因为在复制集群的时候,原来安装好的Redis是配置了账号密码,必须要每个redis去掉密码后再配置集群,再在集群中配置账号密码

注释掉配置文件中的配置密码位置

  #requirepass 123456

【3】Node 192.168.135.173:7001 is not empty

错误详情:Node 192.168.135.173:7001 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.

意思是说,数据库已经有数据了,如果要构建新的集群,需要删掉这些数据。

  (1)把cluster-config-file生成的配置文件删除

  (2)将需要新增的节点下aof、rdb等本地备份文件删除;pid文件删除;如果还不行就登录进去 flushall

  (3)kill掉所有的Redis服务,重新启动。

  

在往redis cluster集群环境中添加节点时遇到一个问题,提示新增的Node不为空:
[root@slave2 redis]# redis-trib.rb add-node --slave 192.168.1.103: 192.168.1.102:
.......
[ERR] Node 192.168.1.103: is not empty. Either the nodealready knows other nodes (check with CLUSTER NODES) or
contains some key in database . 解决办法:(如果redis cluster所有节点同时断电同时宕机, 则节点重启后, 只能重新创建集群, 之前的集群数据全部丢失! 重新创建集群前,各节点要如下操作)
)将192.168.1.103节点机redis下的aof、rdb等本地备份文件全部删除
)同时将新Node的集群配置文件删除,也即是删除redis.conf里面cluster-config-file指定所在的文件;
)"redis-cli -c -h 192.168.1.103 -p 7004"登陆后,执行 "flushdb"命令进行清除操作
)重启reds服务
)最后再次执行节点添加操作

【4】[ERR] Not all 16384 slots are covered by nodes

由于redis clster集群节点宕机(或节点的redis服务重启),导致了部分slot数据分片丢失;在用check检查集群运行状态时,遇到错误;
[root@slave2 redis]# redis-trib.rb check 192.168.1.100:7000
........
[ERR] Not all 16384 slots are covered by nodes.
     
原因分析:
这个往往是由于主node移除了,但是并没有移除node上面的slot,从而导致了slot总数没有达到16384,其实也就是slots分布不正确。
所以在删除节点的时候一定要注意删除的是否是Master主节点。
     
解决办法:
官方是推荐使用redis-trib.rb fix 来修复集群。通过cluster nodes看到7001这个节点被干掉了。可以按照下面操作进行修复
[root@slave2 redis]# redis-trib.rb fix 192.168.1.100:7000
     
修复完成后再用check命令检查下是否正确(查看别的节点)
[root@slave2 redis]# redis-trib.rb check 192.168.1.101:7002
     
只要输入任意集群中节点即可,会自动检查所有相关节点。
可以查看相应的输出看下是否是每个Master都有了slots。
     
如果分布不均匀那可以使用下面的方式重新分配slot:
[root@slave2 redis]# redis-trib.rb reshard 192.168.1.100:7000
  
特别注意:
在部分节点重启后重新回到集群中的过程期间,在check集群状态的时候会出现"[ERR] Not all 16384 slots are covered by nodes."这个报错,
需要稍微等待一会,等重启节点完全回到集群中后,这个报错就会消失!
======================================================
 
=============================================================================================
温馨提示:
-  集群中只要有一组master-slave节点同时挂点,则集群服务也会挂掉;待该组master和slave节点的redis恢复后,这部分slot槽的数据也会丢失。
-  集群中1/2或master节点挂掉,则集群服务也会挂掉;待这些master节点服务重启后,会自动加入到集群中,需等待一段时间,集群恢复正常,数据不会丢失。
   
- 集群中master节点关闭,需要等待一小段时间,它对应的slave节点就会变成master节点,集群服务正常,数据会随之到新的maser节点的slot。
- master节点挂掉后,重启redis服务(一定要在原来的aof和nodes*.conf文件路径下启动),则会自动加入到cluster集群中,并会变成slave节点。
   
-  新添加的master节点的slot默认为0,master主节点如果没有slots,存取数据就都不会被选中! 故要为新增加的master节点进行reshard重新分配slot。
-  slave从节点的slot为0,数据不会存储在slave节点!只会存储在master主节点中,master节点才有slot数值。
 
======================================================
注意:每一组的master-slave节点不能同时挂掉或短时间内先后挂掉,否则这部分slot内的数据就会丢失。
比如说一主一从,当master节点挂掉后,数据都保存到slave节点内,稍过一会,slave节点就会被选举为新的master节点。
老的master节点重启后重新回到集群中,并自动变为它原来的slave(现在是新的master)的slave节点,并自动同步数据。
这个时候新的master节点如果挂掉,则数据同样会保存到新的slave节点中,新的slave节点过一段时间同样会被再次选举为新的master,如此类推....
如果master节点和它的slave节点同时挂掉,或者在其中一个挂掉后还没有来得及恢复到集群中,另一个就挂掉,这种情况下,这部分slot槽的数据肯定就没有了。
所以说,一般会重启一个节点,待该节点恢复到集群中后,再可以重启它对应的slave或master节点。
  
redis作为纯缓存服务时,数据丢失,一般对业务是无感的,不影响业务,丢失后会再次写入。但如果作为存储服务(即作为存储数据库),数据丢失则对业务影响很大。
不过一般业务场景,存储数据库会用mysql、oracle或mongodb。
 
======================================================

【5】[WARNING] Node 192.168.1.100:7000 has slots in importing state

 
redis cluster集群节点重启后,要想恢复集群状态,正确的做法是:
1)要在各个节点原来的appendonly.aof ,dump.rdb,nodes_*.conf 文件所在路径下重启redis服务。这样就能确保redis启动后用到之前的数据文件。
(可以使用find命令查找这些文件所在路径,然后在这个路径下启动redis服务)
2)各个节点的redis服务正常启动后,就可以直接查看redis cluster状态了,检查集群状态是否恢复。
       
注意:
一定要在原来的数据文件的路径下启动redis,如果启动的路径错误,则读取的数据文件就不是之前的了,这样集群就很难恢复了。这个时候就需要删除之前的数据文件,
重新创建集群了。(或者直接在/data/redis-4.0.6/redis-cluster/700*目录下的redis.conf文件里的cluster-config-file指定文件的绝对路径)
    
集群节点的redis服务重启后,check集群状态,如有下面告警信息,处理如下:
[root@redis-node01 redis-cluster]# /data/redis-4.0.6/src/redis-trib.rb check 192.168.1.100:7000
...........
...........
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
[WARNING] Node 192.168.1.100:7000 has slots in importing state (5798,11479).
[WARNING] Node 192.168.1.100:7001 has slots in importing state (1734,5798).
[WARNING] Node 192.168.1.101:7002 has slots in importing state (11479).
[WARNING] The following slots are open: 5798,11479,1734
>>> Check slots coverage...
[OK] All 16384 slots covered.
    
解决办法:
一定要登录到告警信息中的节点和对应的端口上进行操作。
执行"cluster setslot <slot> stable"命令,表示取消对槽slot 的导入( import)或者迁移( migrate)。
执行后,这部分slot槽的数据就没了。
[root@redis-node01 redis-cluster]# /data/redis-4.0.6/src/redis-cli -h 192.168.1.100 -c -p 7000
192.168.1.100:7000> cluster setslot 5798 stable
OK
192.168.1.100:7000> cluster setslot 11479 stable
OK
    
[root@redis-node01 redis-cluster]# /data/redis-4.0.6/src/redis-cli -h 192.168.1.100 -c -p 7001
192.168.1.100:7001> cluster setslot 1734 stable
OK
192.168.1.100:7001> cluster setslot 5798 stable
OK
    
[root@redis-node01 redis-cluster]# /data/redis-4.0.6/src/redis-cli -h 192.168.1.101 -c -p 7002
192.168.1.101:7002> cluster setslot 11479 stable
OK
    
再次检查redis cluster集群状态,就会发现一切正常了!
 

参考文件:

Redis(1.12)Redis cluster搭建常见错误的更多相关文章

  1. Wamp环境搭建常见错误问题解决

    第一点.对于apache + php + mysql 的版本的正确选择 问题:网上有些教学视频已经很早了,然后很多人照着来,完全和视频里讲的一样,但是结果就是搭建不成功. 出现问题原因:三件套的版本选 ...

  2. hadoop 2.2搭建常见错误

    http://blog.csdn.net/haidao2009/article/details/14897813 hadoop 2.2 搭建 http://blog.csdn.net/pelick/a ...

  3. cocos2d-lua 3.5 android搭建常见错误

    新建一个项目,就不说了,就是用命令行 cocos new HelloLua -p com.wwj.hellolua -l lua -d ~/Cocos2dxProj ,生成下 然后把项目导入eclip ...

  4. HBase分布式搭建常见错误

    [root@node001 bin]# hbase shell SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found bin ...

  5. redis单点、redis主从、redis哨兵sentinel,redis集群cluster配置搭建与使用

    目录 redis单点.redis主从.redis哨兵 sentinel,redis集群cluster配置搭建与使用 1 .redis 安装及配置 1.1 redis 单点 1.1.2 在命令窗口操作r ...

  6. Redis Cluster搭建方法简介22211111

    Redis Cluster搭建方法简介 (2013-05-29 17:08:57) 转载▼       Redis Cluster即Redis的分布式版本,将是Redis继支持Lua脚本之后的又一重磅 ...

  7. redis cluster搭建

    一 .准备文件: Ruby :http://www.ruby-lang.org/en/downloads/    redis-3.0.5.tar.gz Redis:http://www.redis.c ...

  8. redis常见错误处理

    --1]当内存不足引起  redis出错 先尝试下列语句,指定redis使用内存 redis-server.exe redis.windows.conf --maxheap 200mredis-ser ...

  9. Redis Sentinel 集群搭建常见注意事项

    我的配置: 1个master,1个slave,3个sentinel 搭建的过程网上已经有很多了,这里列几个重点关注: 修改sentinel.conf的protected-mode与redis.conf ...

随机推荐

  1. Unable to find the requested .Net Framework Data Provider

    换了个系统后发现VS2010和VS2012都有同样问题,在SQL EXPLORER 里连不上SQL Server,这也导致了打不开 dbml文件,会报错: The operation could no ...

  2. Java事务不回滚的原因总结

    1.首先要检查数据的引擎,InnoDB支持事务,MyIsam不支持事务 2.  默认spring事务只在发生未被捕获的 runtimeexcetpion时才回滚.     spring aop  异常 ...

  3. 用matlab脚本语言写M文件函数时用三种方法简单实现实现DFT(离散傅里叶变换)

    %用二重循环实现DFT: function xk=dt_0(xn); %define a function N=length(xn); %caculate the length of the vari ...

  4. JQuery动画之滑入滑出动画

    1. 滑入动画(类似于商店的卷帘门) $(selector).slideDown(speed, 回调函数); 解释: 此语句实现的功能为, 在XX时间内, 下拉动画, 显现元素. 当 slideDow ...

  5. Codeforces 959D. Mahmoud and Ehab and another array construction task(构造, 简单数论)

    Codeforces 959D. Mahmoud and Ehab and another array construction task 题意 构造一个任意两个数都互质的序列,使其字典序大等于a序列 ...

  6. Java中final、finally、finalize

    简述 final 可以用来修饰类.方法.变量,分别有不同的意义: final 修饰的 class 代表不可以继承扩展: final 的变量是不可以修改的:final 的方法也是不可以重写的(overr ...

  7. 去除ZERO WIDTH SPACE 零宽字符: 看不见却占位置的字符

    ZERO WIDTH SPACE 由于历史原因,编码方案中保留着该类编码 解决方案 1. 替换 ```js str.replace(/[\u200B-\u200D\uFEFF]/g, ''); ``` ...

  8. 16.合并两个排序的链表 Java

    题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 解题思路 两种解法:递归和非递归 参考代码 /* public class ListNode { ...

  9. C/C++程序基础-C++与C有什么不同

    1:C和C++的联系和区别? 答:C是一个结构化语言,它的重点在于算法和数据结构.对于语言本身而言,C是C++的子集.C程序的设计首先要考虑的是如何通过一个过程,对输入进行运算处理,得到输出.对于C+ ...

  10. mac 配置apache

    Apache配置 对httpd.conf文件的配置.首先打开 /etc/apache2/httpd.conf文件,也就是Apache2.4的相关配置文件. 连接php 首先我们将相应的PHP版本配置进 ...