本文是在一台服务器上搭建多个redis的伪集群方式来进行讲解,后续要换成多台步骤类似。
Redis5.0前采用redis-trib进行集群的创建和管理,需要ruby支持
Redis5.0可以直接使用Redis-cli进行集群的创建和管理。本文用的是redis版本5.0.5
cd /
yum install -y gcc-c++
yum install -y wget
wget http://download.redis.io/releases/redis-5.0.5.tar.gz
tar -zxf redis-5.0.5.tar.gz
安装之前,先创建好/redis/redis-cluster/7001的文件
进入src目录
make install PREFIX=/redis/redis-cluster/7001
cp /redis-5.0.5/redis.conf /redis/redis-cluster/7001/bin
进入到redis的bin目录中进行启动
./redis-server redis.conf
客户端连接进行操作
./redis-cli -h 192.168.0.102 -p 7001
mkdir 7002
mkdir 7003
mkdir 7004
mkdir 7005
mkdir 7006
mkdir 7007
mkdir 7008
cp -r /redis/redis-cluster/7001/* /redis/redis-cluster/7002
cp -r /redis/redis-cluster/7001/* /redis/redis-cluster/7003
cp -r /redis/redis-cluster/7001/* /redis/redis-cluster/7004
cp -r /redis/redis-cluster/7001/* /redis/redis-cluster/7005
cp -r /redis/redis-cluster/7001/* /redis/redis-cluster/7006
cp -r /redis/redis-cluster/7001/* /redis/redis-cluster/7007
cp -r /redis/redis-cluster/7001/* /redis/redis-cluster/7008
复制完成后,对每个目录下的配置文件进行修改,修改对应端口就可以了
回到redis-cluster目录下创建启动文件
创建启动文件
touch start.sh
编辑启动文件
vim start.sh
cd 7001/bin
./redis-server redis.conf
cd ..
cd ..
cd 7002/bin
./redis-server redis.conf
cd ..
cd ..
cd 7003/bin
./redis-server redis.conf
cd ..
cd ..
cd 7004/bin
./redis-server redis.conf
cd ..
cd ..
cd 7005/bin
./redis-server redis.conf
cd ..
cd ..
cd 7006/bin
./redis-server redis.conf
cd ..
cd ..
#授权
chmod u+x start.sh
启动前可以检查一下redis的线程是不是有已经启动的了,使用kill命令全部关闭。
./start.sh
#查看启动的线程情况
ps -ef|grep redis
进入到一个redis,bin目录下执行命令。cluster-replicas后面的1表示一个主机有几个从机,因为现在只有一个因此是1,工作中是2。
./redis-cli --cluster create 192.168.0.102:7001 192.168.0.102:7002 192.168.0.102:7003 192.168.0.102:7004 192.168.0.102:7005 192.168.0.102:7006 --cluster-replicas 1
注意:-c 表示是以redis集群方式进行连接
./redis-cli -h 192.168.0.102 -p 7001 -c
cluster info
cluster nodes
从7001添加数据看看(如何选择和分配槽位slot的原理看一下)
从7002查询数据
(1)新节点加入
(2)节点下线
(3)负载不均衡需要调整slot分布
进入7007/bin/目录,并且启动redis
./redis-server redis.conf
添加节点 7007 去meet7001申请加入集群
./redis-cli --cluster add-node 192.168.0.102:7007 192.168.0.102:7001
#连接集群
./redis-cli -h 192.168.0.102 -p 7007 -c
#查看集群信息
cluster info
#查看是否加入集群
cluster nodes
在集群的节点中能看到7007,但是现在已经连接,还没有分配hash槽
./redis-cli --cluster reshard 192.168.0.102:7007
(1)输入要分配槽数量
(2)输入接收槽的节点id
这里根据自己机器上的7007的id进行填写
(3)输入节点id后再输入all就完事了
(4)输入yes开始移动槽到目标结点id
(5)查询节点
#连接集群
./redis-cli -h 192.168.0.102 -p 7007 -c
#查看集群信息
cluster info
#查看是否加入集群
cluster nodes
(1)首先启动7008
#进入7008/bin/目录
#启动
./redis-server redis.conf
(2)添加7008从结点,将7008作为7007的从结点
./redis-cli --cluster add-node 新节点的ip和端口 旧节点ip和端口 --cluster-slave -cluster-master-id 主节点id
./redis-cli --cluster add-node 192.168.0.102:7008 192.168.0.102:7007 --cluster-slave --cluster-master-id 2d17e4ccce0e5bf54ab893782d81d21214662ce1
(3)7008节点登入集群,查看节点信息
#连接集群
./redis-cli -h 192.168.0.102 -p 7008 -c
#查看集群信息
cluster info
#查看是否加入集群
cluster nodes
(1)缩容命令
./redis-cli --cluster del-node 192.168.0.102:7008 5cc3b1ef0bf018435e65f93939d81acba6fbd603
删除已经占有hash槽的结点会失败,必须先分出去否则报错如下:
[ERR] Node 127.0.0.1:7008 is not empty! Reshard data away and try again.
进入7008/bin/目录,开始hash槽重新分配—参考上面hash槽分配步骤
./redis-cli --cluster reshard 192.168.0.102:7008
当出现这个错误代表要删除的节点不是master节点,重新到主节点7007去执行删除
*** The specified node (5cc3b1ef0bf018435e65f93939d81acba6fbd603) is not known or not a master, please retry.
./redis-cli --cluster del-node 192.168.0.102:7007 2d17e4ccce0e5bf54ab893782d81d21214662ce1
./redis-cli --cluster del-node 192.168.0.102:7008 5cc3b1ef0bf018435e65f93939d81acba6fbd603
(1)关闭所有redis进程
#查看所有redis进程
ps -ef|grep redis
#直接杀死所有进程(直接暴力)
kill -9 $(pidof redis-server)
#停止所有节点(这个关闭也行,不暴力)
redis-cli -h 172.17.97.2 -p 7001 shutdown
redis-cli -h 172.17.97.2 -p 7002 shutdown
redis-cli -h 172.17.97.2 -p 7003 shutdown
redis-cli -h 172.17.97.2 -p 7004 shutdown
redis-cli -h 172.17.97.2 -p 7005 shutdown
redis-cli -h 172.17.97.2 -p 7006 shutdown
(2)删除每个节点对应的配置文件
集群节点的配置信息文件node*.conf,aof和 rdb是存储文件,都删除。
如果不知道自己的文件在哪儿 ,可以使用find命令全局进行查找
find / -name node*.conf
rm -rf /redis/redis-cluster/7001/bin/nodes.conf
rm -rf /redis/redis-cluster/7002/bin/nodes.conf
rm -rf /redis/redis-cluster/7003/bin/nodes.conf
rm -rf /redis/redis-cluster/7004/bin/nodes.conf
rm -rf /redis/redis-cluster/7005/bin/nodes.conf
rm -rf /redis/redis-cluster/7006/bin/nodes.conf
rm -rf /redis/redis-cluster/7007/bin/nodes.conf
rm -rf /redis/redis-cluster/7008/bin/nodes.conf
也可以使用批量删除
#删除节点下面的所有相关文件(这个是批量删除的操作)
rm -f ./*/nodes-*.conf ./*/appendonly.aof ./*/dump.rdb
分别进入7007和7008的bin目录,修改配置文件redis.conf,添加内容如下
# 指定主服务器
replicaof 192.168.0.102 7001
./redis-server redis.conf
可以看到从服务器的启动报错了,因为在集群模式下不允许使用replicaof指令,可以在配置文件里把集群模式关掉,把三台服务器的都设置为no
./redis-cli -h 192.168.0.107 -p 7001
使用info命令查看,可以看到有两个slave从redis服务器了
(1)主服务器7001存入值
(2)从服务器7007和7008分别测试查询
到此,主从复制配置成功,测试成功
在上面的主从关系中,如果主机宕机了,需要手动皮质一个从机顶替上来,并且还要修改其他从机与其他服务器的关系,配置新的主从关系。
通过哨兵模式我们可以实现自动替换主机。
哨兵主要是用来监听主服务器的,所以一般把哨兵部署在从服务器上监听,哨兵只需要配置其中一个从机即可!
在7008/bin/目录下新建文件sentinel.conf,在其中添加如下内容
#关闭保护模式,使外网能访问
protected-mode no
#后台运行
daemonize yes
#配置哨兵需要监控的主节点ip和端口,最后的2代表,如果有2个哨兵主观认为主节点down了,那么就客观认为主节点down掉了,开始发起投票选举新主节点的操作。多个主节点配置多个
sentinel monitor master 192.168.0.107 7001 1
#配置多少毫秒后没收到主节点的反馈,则主观认为主节点down了
sentinel down-after-milliseconds master 5000
#failover过期时间。当failover开始后,在此时间内仍然没有触发任何failover操作,当前sentinel将会认为此次failoer失败。
sentinel failover-timeout master 30000
mastername 监控主数据的名称,自定义
192.16.0.107:监控主数据库的IP;
7001:端口
1:最低通过票数
在启动哨兵之前保证redis服务器已经启动。
哨兵可以理解为一个监控的进程。既然要监控,那么首先需要先有监控的对象,即主从机需要先启动。就按照先前的启动方式启动即可。
./redis-sentinel sentinel.conf
启动之后同样查看进程,如果出现sentinel进程说明已经启动成功!
(1)查询配置文件sentinel.conf中生成的内容
启动后可观察sentinel.conf,可以发现,sentinel会向sentinel.conf文件中拼接主从信息,哨兵节点信息。
kill -9 1449