Redis集群搭建记录

集群搭建记录

版本 redis3.0 虚拟机centos764

搭建一个三节点的redis-cluster,为了保证集群的高可用,每个节点都附加一台备用节点。

准备6台虚拟机,其实是可以在一台机器上模拟集群的,但为了尽量真实的感受一下 还是准备了6个

在redis的源码解压包里有一个redis-trib.rb位于src下,这是redis的集群管理工具 可执行 在后面会用到

把这个redis-trib.rb拷贝到redis的安装目录下

cd redis-3.0.0/src/
cp redis-trib.rb /usr/local/redis/

查看redis安装目录

安装ruby   yum install ruby  yum install ruby gems

准备gem  链接 提取码:p0ah

上传到服务器并安装

gem install redis-3.0.0.gem

准备工作做完,克隆这台虚拟机 克隆6个

修改各自的配置文件vim bin/redis.conf

主要修改端口号及打开集群支持

port6001-6006 端口修改在45行左右

cluster-enable 630行 打开注释

步骤重复6002,6003,6004,6005,6006。。

配置完事依次启动redis

redis-6001

 

redis-6002

redis-6003

redis-6004

redis-6005

redis-6006

在redis1的bin目录下执行redis-trib.rb

./redis-trib.rb create --replicas 1 192.168.93.133:6001 192.168.93.132:6002 192.168.93.129:6003 192.168.93.134:6004 192.168.93.135:6005 192.168.93.136:6006

如果执行报错,删除生成的配置文件nodes.conf ,还不行把dump.rdb也删掉 然后重启redis 一般情况删掉就没问题了

再次执行 可以看到在6个节点上进行了哈希槽的分配

6001-6003是master节点 6004-6006是slave节点

询问是否可以按上面的配置,输入yes

这里遇到一个小插曲

一直在join  以为是要在其它节点上执行cluster meet命令(有的文章是这么说的)

试了下 不管用 还有说在redis.conf里bind ip地址的 试了下 都不好使

最后 开通总线端口就ok了 修改下iptables vim/etc/sysconfig/iptables

为了保险 不止集群端口 每个端口都加了1w。。。

依次添加 16001,16002,16003,16004,16005,16006

附6001完整iptables 其它只需要修改对应如6002 添加一条16002

# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 16001 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 6001 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 6002 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 6003 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 6004 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 6005 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 6006 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

连接各节点客户端 执行两个命令

flushall

cluster reset

重启防火墙

service iptables restart

redis各节点重启

./redis cli –p 600x shutdown

./redis-server redis.conf

再次执行命令 通过~~~

16384 slots 全部插入~

集群连接测试

./redis-cli -h 192.168.93.132 -p 6002 –c

可以在6001端口上任意连接其它节点 不论主从  其它节点也一样

存值测试

可以看到在6001节点set一个s值 然后切到6006节点也可以get到  get的时候回重定向到s值所属的slot3828即6001节点

查看集群节点信息cluster-nodes

可以看到节点信息 三个slave节点后面都标注着master的id

查询集群状态信息cluster info

状态ok,solt  ok 没有宕机的 已知node 6 消息发送消息接收等等

再次查看信息

可以看出来集群之间是会互相发送心跳的

 

搭建完成以后,测一下宕机会咋么样

随便连一个节点 存储一个string值

[root@localhost bin]# ./redis-cli -h 192.168.93.129 -p 6003 -c   
192.168.93.129:6003> set str hello
-> Redirected to slot [6928] located at 192.168.93.132:6002
OK
192.168.93.132:6002> get str
"hello"
192.168.93.132:6002> 

连接到6003节点后 存了一个string值 key=str value=hello 根据key值算出hash slot为6928 

可以看到“str”存到了6002节点  而6002节点的slave节点是6005,分配的solt是5461-10922

此时关闭6002节点 看看是否solt和值都分给了6005 及集群是否还可以正常工作

关闭之后连接到6003节点查看

[root@localhost bin]# ./redis-cli -p 6002 shutdown
[root@localhost bin]# ./redis-cli -h 192.168.93.129 -p 6003 -c
192.168.93.129:6003> get str
-> Redirected to slot [6928] located at 192.168.93.135:6005
"hello"
192.168.93.135:6005> 

可以看到 在关闭了6002节点后 再次查看“str”的时候 集群仍可用  只不过跳到了6005也就是6002的备份节点

再次查看节点状态

从图中可以看到master 6002 fail 断开连接 之前的slave 6005顶了上来并继承了6002的solt 5461-10922  且角色也变成了master

ps:redis集群中当一个主节点挂掉之后如果有备份节点 那么备份节点就会顶上来并继承主节点的slot

换句话说就是如果保证了16384个slots的完整,集群就可用。

ps:如果节点挂了的话 是不可以连接的 会提示Connection refused

 

另外还有之前存储的s  s的值存储在6001节点 6001节点对应的slave节点是6004

192.168.93.135:6005> get s
-> Redirected to slot [3828] located at 192.168.93.133:6001
"100"
192.168.93.133:6001> 

那么 现在如果6001也down掉呢?

./redis-cli -p 6001 shutdown

查看集群状态

可以看见master 6001 也fail了 同样 他的slave6004继承了他的solt 角色也变成了master 那么取值呢 之前存在6001的值现在会在6004吗

答案是肯定的。。。完美获取

继续获取“str” 也没问题

突然有个大胆的想法 如果最好一个master也挂了呢???

现在只有6003还存活着

可以看到 刚停的时候 心跳还没来得及发 是可以获得值 但马上就不行了

(error) CLUSTERDOWN The cluster is down 集群挂了

查看状态

好的 这下主节点都挂了 全部断开连接  而且当前状态下是没有slave的 全是master 只不过有三个是fail的

那现在还能不能获取值?

首先之前的三个主节点已经连不上了

连接备份节点试试

。。。

存值

换6006

也没问题

切6004

可以看到就算三个master全部挂掉  取值也完全没问题 只要备份机存在 集群就可正常运行 并且备份节点会各自继承主节点的slots并发生角色转换

总结:以上操作只限依次down机,如果是master同时挂掉半数以上 ,整个集群down,但如果是有间隔的挂(大概间隔5-6s)就是说当某个master挂掉后,他的slave及时接收了他的slots,保证了整个集群的16384个solts完整,那么集群继续工作不受影响。

重新启动之前的三个master

查看状态

可以看到角色完全发生了转变

原来的master 6001、6002、6003变成了salve

原来的slave 6004、6005、6006变成了master

到此,redis集群搭建及测试完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值