redis的集群搭建与添加节点
Posted 猫二哥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis的集群搭建与添加节点相关的知识,希望对你有一定的参考价值。
1背景
参考https://redis.io/topics/cluster-tutorial 官方redis集群创建
环境:
redis-3.2.8
虚拟机centos6.5
ip:192.168.247.135
单机目录,前提已经把redis的单机环境配置过哈
/usr/local/redis
集群目录结构,分别代表的是端口号7000-7005
/usr/local/rediscluster
/usr/local/rediscluster/redis7000
/usr/local/rediscluster/redis7001
/usr/local/rediscluster/redis7002
/usr/local/rediscluster/redis7003
/usr/local/rediscluster/redis7004
/usr/local/rediscluster/redis7005
redis集群管理工具redis-trib.rb
2安装
2.1安装ruby
yum install ruby
yum install rubygems
gem install redis
2.2安装redis集群,工具准备
把上面的目录创建好,并且把redis的环境拷贝到集群目录下:
cp -r /usr/local/redis/* /usr/local/rediscluster/redis7000
cp -r /usr/local/redis/* /usr/local/rediscluster/redis7001
cp -r /usr/local/redis/* /usr/local/rediscluster/redis7002
cp -r /usr/local/redis/* /usr/local/rediscluster/redis7003
cp -r /usr/local/redis/* /usr/local/rediscluster/redis7004
cp -r /usr/local/redis/* /usr/local/rediscluster/redis7005
/usr/local/redis/这里是单个实列
并且修改redis的配置文件
cd /usr/local/rediscluster/redis7000/bin
vim redis.conf
port 7000
cluster-enabled yes
cluster-node-timeout 5000
appendonly yes
bind 192.168.247.135
进入每个目录,修改配置文件,除了端口,不一样,其他一样哈,端口分布式7000-7005。
然后把创建集群的ruby脚本cp到/usr/local/rediscluster/
cp /home/dowload/redis-3.2.8/src/redis-trib.rb /usr/local/rediscluster/
接着自己创建一个shell,分别启动六个redis实列
vim start-all.sh
#!/bin/bash
cd /usr/local/rediscluster/redis7000/bin/
/usr/local/rediscluster/redis7000/bin/redis-server /usr/local/rediscluster/redis7000/bin/redis.conf
cd /usr/local/rediscluster/redis7001/bin/
/usr/local/rediscluster/redis7001/bin/redis-server /usr/local/rediscluster/redis7001/bin/redis.conf
cd /usr/local/rediscluster/redis7002/bin/
/usr/local/rediscluster/redis7002/bin/redis-server /usr/local/rediscluster/redis7002/bin/redis.conf
cd /usr/local/rediscluster/redis7003/bin/
/usr/local/rediscluster/redis7003/bin/redis-server /usr/local/rediscluster/redis7003/bin/redis.conf
cd /usr/local/rediscluster/redis7004/bin/
/usr/local/rediscluster/redis7004/bin/redis-server /usr/local/rediscluster/redis7004/bin/redis.conf
cd /usr/local/rediscluster/redis7005/bin/
/usr/local/rediscluster/redis7005/bin/redis-server /usr/local/rediscluster/redis7005/bin/redis.conf
加执行权限:chmod +x start-all.sh
最后修改防火墙
vim /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7000 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7001 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7002 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7003 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7004 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7005 -j ACCEPT
重启防火墙
service iptables restart
上面把准备工作做完之后,运行start-all.sh
cd /usr/local/rediscluster/
./start-all.sh
然后是用ps -ef | grep redis看是否运行成功
2.3使用rb脚本创建集群
./redis-trib.rb create –replicas 1 192.168.247.135:7000 192.168.247.135:7001 192.168.247.135:7002 192.168.247.135:7003 192.168.247.135:7004 192.168.247.135:7005
显示如上图片,集群成功。
下面分析下,创建集群时的信息
3个主节点:
192.168.247.135:7000 192.168.247.135:7001 192.168.247.135:7002
3个从节点
192.168.247.135:7003 192.168.247.135:7004 192.168.247.135:7005
这里节点和进程其实是一个意思,因为是使用进程模拟节点哈。
0-5460槽在7000进程中(应该是节点)
5461-10922槽在7001中
10923-16383槽在7002中
3测试
3.1命令行测试
连接集群
./redis7000/bin/redis-cli -h 192.168.247.135 -p 7000
包如下错误
因为这种方式不是连接集群的,是连接单机的,所以跳转不到其他的节点。
加-c就可以了
./redis7000/bin/redis-cli -h 192.168.247.135 -p 7000 -c
这里进入任何一个目录都是可以连接集群的哈,只要使用了-c
可以看出set a 100,把a是放在了7002节点上的,并不是本机节点,所以集群测试成功.
这里在来一个停止所有redis实列的shell
vim stop-all.sh
#!/bin/bash
/usr/local/rediscluster/redis7000/bin/redis-cli -h 192.168.247.135 -p 7000 shutdown
/usr/local/rediscluster/redis7001/bin/redis-cli -h 192.168.247.135 -p 7001 shutdown
/usr/local/rediscluster/redis7002/bin/redis-cli -h 192.168.247.135 -p 7002 shutdown
/usr/local/rediscluster/redis7003/bin/redis-cli -h 192.168.247.135 -p 7003 shutdown
/usr/local/rediscluster/redis7004/bin/redis-cli -h 192.168.247.135 -p 7004 shutdown
/usr/local/rediscluster/redis7005/bin/redis-cli -h 192.168.247.135 -p 7005 shutdown
chmod +x stop-all.sh
3.2 与业务代码结合
已经在单机环境上运行了的,这里就直接说结果吧
先修改与spring的整合,因为单机和机器的整合xml不一样
<bean id="redisClient" class="redis.clients.jedis.JedisCluster">
<constructor-arg name="nodes">
<set>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.247.135"></constructor-arg>
<constructor-arg name="port" value="7000"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.247.135"></constructor-arg>
<constructor-arg name="port" value="7001"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.247.135"></constructor-arg>
<constructor-arg name="port" value="7002"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.247.135"></constructor-arg>
<constructor-arg name="port" value="7003"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.247.135"></constructor-arg>
<constructor-arg name="port" value="7004"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.247.135"></constructor-arg>
<constructor-arg name="port" value="7005"></constructor-arg>
</bean>
</set>
</constructor-arg>
<constructor-arg name="poolConfig" ref="jedisPoolConfig"></constructor-arg>
</bean>
<bean id="jedisClientCluster" class="com.j.rest.dao.JedisClientCluster"></bean>
输入url从redis集群中取数,如果没有,那么就把信息存入redis集群。、
可以得到返回数据,登录redis集群,看数据是否存入了redis集群
./redis7000/bin/redis-cli -h 192.168.247.135 -p 7000 -c
可以从redis集群中get到数据,id也一样,说明测试成功。
所以redis单机和redis集群,可以做到无缝切换,开发环境可以使用单机本,等待上线的时候,修改配置文件就可以了,非常方便。
4 redis集群节点的添加和删除
首先启动集群
4.1添加主节点
1新建一个目录作为新的一个节点
cd /usr/local/rediscluster
cp -r redis7005 redis7006
cd redis7006/bin
修改配置文件
vim redis.conf
这里吧端口改了就好了,因为是复制的,其他配置已经修改哈
2启动新节点
cd /usr/local/rediscluster/redis7006/bin
./redis-server redis.conf
先查看下现在已经管理的集群节点
./redis-cli -h 192.168.247.135 -p 7001 cluster nodes
这里的Myself就是自己从哪个机器登陆的哈,这里看出一共有6个节点哈。
3添加新节点到集群
首先删除新节点的文件,然后重启新节点的,不然报错如下:
./redis-trib.rb add-node 192.168.247.135:7006 192.168.247.135:7000
这里的第一个参数为新增节点,第二个参数为集群中已存在节点(随便那个)
查看所有集群节点,已经成功,但是,里面没有slots槽啊,这里需要resharding,之后,新增的节点才是主节点
./redis-trib.rb reshard 192.168.247.135:7000
填写要移动的槽数,这里是1000
要移到那个节点上,这里是id,就是图下这个
选择从槽的来源,all表示,从所有已经存在的主节点中移动出来。这里选择all
在来看看哈,新节点已经有槽了哈
./redis-cli -h 192.168.247.135 -p 7001 cluster nodes
这种方式,是添加一个主节点。
4.2添加从节
把192.168.247.135:7006作为 后面id的节点的从节点,这里就不演示了哈,很简单的
redis-cli -c -h 192.168.247.135 -p 7006 cluster replicate 40ee4e7ed538952636fe66714536c08969e03b71
4.3删除节点
如果是主节点
删除节点之前,需要把该节点的槽移动到其他节点,官网说,删除主节点的话,那么主节点一定要是空的。所以要先移动槽,并且只能手工做哈。
命令是一样的。
./redis-trib.rb reshard 192.168.247.135:7000
要移动的槽数1000
接受槽的节点,这里点7000节点的id
ab583d5d94493f97523945729bbd1e19892181e3
这里填,从那个节点中移除,这里是7006的id
579a3a26fe5d1e40b4a4c2f01a378bd9d37a8f0d
done表示结束
槽已经移除成功了哈
7006节点已经删除清空了哈,并且7000多了槽
最后槽为空的主节点哈
./redis-trib.rb del-node 192.168.247.135:7000 579a3a26fe5d1e40b4a4c2f01a378bd9d37a8f0d
已经移除成功了哈
如果是从节点
直接删除就好了
./redis-trib del-node 192.168.247.135:7000 `579a3a26fe5d1e40b4a4c2f01a378bd9d37a8f0d
前面的参数为集群中的任意节点,后面的参数为要删除的节点id
麻蛋,命令行搞维护太麻烦了,听说codis很方便,下一步把codis搞起来。
以上是关于redis的集群搭建与添加节点的主要内容,如果未能解决你的问题,请参考以下文章