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搞起来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫二哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值