在测试环境搭建三主三从+哨兵的redis集群:
redis和ruby的安装就不多说了,redis版本是3.2.3,ruby是2.2.5。
redis.conf配置文件:
bind 192.168.xxx.47 #主机ip
protected-mode no #保护模式,搭集群的话要关掉
port 7000 #端口
requirepass redis #密码,需要所有节点保持一致
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
pidfile /home/mcbadm/conf/7000/log/redis-7000.pid
loglevel notice
logfile “/home/mcbadm/conf/7000/log/redis-7000.log” #日志文件
dir /home/mcbadm/conf/7000/info
dbfilename dump-7000.rdb
appendonly yes
appendfilename “appendonly-7000.aof”
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 15000
cluster-slave-validity-factor 10
cluster-require-full-coverage no
把所有节点都拉起:
redis-server redis.conf
确定所有节点都能互相访问(就是各个主机都连一下其他主机的redis)。然后开始创建集群,有两种方法,都是通过redis的src目录下的redis-trib.rb这个工具:
①
redis-trib.rb create --replicas 1 192.168.xxx.42:7000 192.168.xxx.43:7001 192.168.xxx.43:7000 192.168.xxx.44:7001 192.168.xxx.44:7000 192.168.xxx.42:7001
–replicas 1表示每个master分配一个slave,但是这种方法创建的好像是随机选定master和slave节点的,然后我看一些文章主从不能在一台主机上,防止服务器宕机时节点就完全不可用了,于是用第二张方法。
②
./redis-trib.rb create --replicas 0 192.168.xxx.46:7000 192.168.xxx.47:7000 192.168.xxx.48:7000
这里先创建了三个master节点,–replicas 0表示不为集群的master节点创建slave。然后再手动添加slave节点:
./redis-trib.rb add-node --slave --master-id 692b0f8da01a8735465090211313e494c7e6ee4e 192.168.xxx.47:7001 192.168.xxx.48:7000
./redis-trib.rb add-node --slave --master-id 880a4eea73258a4b2884587d7db36170209cf848 192.168.xxx.48:7001 192.168.xxx.46:7000
./redis-trib.rb add-node --slave --master-id 4328faa4d3fd385171afa6bf935a446c2bf90f1c 192.168.xxx.46:7001 192.168.xxx.47:7000
这个就可以指定对应的master节点和slave节点,master-id看创建master节点时的信息可以获得。
一开始在执行第一种方法的redis-trib.rb create构建集群的时候报了个错:
Creating cluster
[ERR] Sorry, can’t connect to node 192.168.xx.xxx:7001
搜了一下,发现有人做了总结了:
1、注释每个redis中redis.conf的requirepass,就是无密码
2、我是将bind绑定了自己虚拟机的唯一ip,可以在centos中使用ifconfig命令来查看自己ip,如果没有ifconfig,则使用yum install ifconfig安装下,应该都有(这个是大部分人的错误,我的也是这个问题)
我是centos7版本这里补充下,我的redis是4.0.9,但是gem确实redis-3.0.0.gem,找了半天新的没有找到新版本,个人老是喜欢用各种框架新的版本,所以经历了很多坑,不过这也是成长的过程。
3、还有人说是版本太低,我的应该不低,所以这个版本低可能有影响,但估计很多人都不是这个原因
4、还有人说将集群的每个redis的redis.conf文件中的protected-mode yes 改为protected-mode no,这个我也改了,Protected-mode 是为了禁止公网访问redis cache,由于这里不涉及这些问题就这样改了,具体可以参考下这篇帖子
https://blog.youkuaiyun.com/csdn_ds/article/details/72550898
5、创建集群的几个redis的bin文件不要有appendonly.aof 、dump.rdb、nodes.conf这三个文件,
原文:https://blog.youkuaiyun.com/snow_China/article/details/80574470
然后咧,我就挨个试了下,崩溃,还是不行啊啊啊啊!又把主机上边边角角的配置文件、生成的node相关文件删了又删改了又改,无济于事……只能搜索一个一个链接看,终于在这里找到了稍微不同的场景:https://www.oschina.net/question/1274548_2145683
这里的场景是各个节点设置了密码,然后问在创建集群的时候没有设置密码的命令怎么办,然后二楼的西湖加菲猫提出要修改gem的redis工具下的一个文件:/usr/lib/ruby/gems/1.8/gems/redis-3.2.1/lib/redis/client.rb,里面的password要改成跟所有节点一样的。我的问题是节点没有设置密码(按照上面的方法。。),但是构建就是说找不到redis,但是我服务确实起了,没有防火墙,ip绑定正常,我就想很有可能是密码不正确,无法访问到redis。然后我就去找这个文件,一开始还不好找,因为ruby的环境不是我搭的,locate client.rb还是比较方便地找到了。然后果然发现这里面的密码设置为redis了,然后我改了一个节点的密码,并且构建时把这个节点放在第一位,居然真的可以了,欲哭无泪的感觉,坑了我两天的时间!
:password => nil,
改成自己的密码即可。
哨兵配置文件,sentinel.conf:
port 26379
dir “/home/mcbadm/conf/sentinel”
sentinel monitor redis14 192.168.xxx.44 7000 2
sentinel config-epoch redis14 0
sentinel leader-epoch redis14 0
sentinel monitor redis13 192.168.xxx.43 7000 2
sentinel config-epoch redis13 0
sentinel leader-epoch redis13 0
sentinel monitor redis12 192.168.xxx.42 7000 2
sentinel config-epoch redis12 0
sentinel leader-epoch redis12 0
sentinel current-epoch 0
配置文件指定了主节点,以及多少个哨兵认为主节点不可用时failover,然后redis-sentinel sentinel.conf。