前言
- 系统版本:CentOS 7
- redis版本:redis6.2.4,官方tar.gz包
- 两台服务器:
- 172.50.11.11
- 端口7002、7004、7006
- 172.50.12.11
- 端口7001、7003、7005
(PS:基于docker搭建redis cluster可参考 博客园 - 使用docker-compose搭建redis-cluster集群)
编译安装redis
# 提示缺什么依赖就装什么依赖 yum install -y gcc gcc-c++ tcl make tar xf redis-6.2.4.tar.gz cd redis-6.2.4 make make install PREFIX=/home/web/redis # 测试 make test
make test常见错误
- You need tcl 8.5 or newer in order to run the Redis test
yum install -y tcl
- NOREPLICAS Not enough good slaves to write
vim tests/integration/replication-2.tcl # 增加after的值,比如10000 # 改了后如果还是报错并且直接停止测试,可以再执行一次make test
- Slave should be able to synchronize with the master...
# 再执行一次make test
创建redis配置环境
cd /home/web/redis mkdir -p ./nodes/redis700{1,2,3,4,5,6}/{bin,etc,var} for i in `seq 1 6`;do cp ./bin/* ./nodes/redis700${i}/bin ;done
编辑redis.conf,内容如下:
# 绑定的服务器ip,即其他服务访问redis使用的ip bind 172.50.12.11 # 服务端口 port 7001 # redis服务密码 requirepass 123456 # master节点认证密码 masterauth 123456 # 后台运行 daemonize yes # 关闭保护模式 protected-mode no # 开启集群 cluster-enabled yes # 设置请求超时时间,默认为15秒,可以自行修改 cluster-node-timeout 15000 # aof日志开启,会每次进行写操作都记录一条日志 appendonly yes # cluster-config-file cluster-config-file nodes_7001.conf # pidfile pidfile /var/run/redis-server-7001.pid # logfile logfile /home/web/redis/nodes/redis7001/var/redis.log # 用来描述”在多少秒期间至少多少个变更操作”触发snapshot,snapshot最终将生成新的dump.rdb文件,例如save 300 1表示5分钟内至少一个key变更,触发snapshot save 900 9999999999 save 300 9999999999 save 60 9999999999 # dbfilename dbfilename dump.rdb # dir dir /home/web/redis/nodes/redis7001/var # 60秒自动释放连接 tcp-keepalive 60 # 复制对应的master(哨兵模式从节点配置、主节点不需要配置) maxmemory 10GB maxmemory-policy volatile-ttl appendonly no
复制redis.conf:
# 复制 for i in `seq 1 6`;do cp ./redis.conf ./nodes/redis700${i}/etc ;done # 修改端口 for i in `seq 1 6`;do sed -i "s/7001/700${i}/g" ./nodes/redis700${i}/etc/redis.conf ;done
将/home/web/redis/nodes目录拷贝到另一台服务器,用sed命令批量改一下redis.conf文件中bind的IP地址。
启动
172.50.12.11上执行:
/home/web/redis/nodes/redis7001/bin/redis-server /home/web/redis/nodes/redis7001/etc/redis.conf /home/web/redis/nodes/redis7003/bin/redis-server /home/web/redis/nodes/redis7003/etc/redis.conf /home/web/redis/nodes/redis7005/bin/redis-server /home/web/redis/nodes/redis7005/etc/redis.conf
172.50.11.11上执行:
/home/web/redis/nodes/redis7002/bin/redis-server /home/web/redis/nodes/redis7002/etc/redis.conf /home/web/redis/nodes/redis7004/bin/redis-server /home/web/redis/nodes/redis7004/etc/redis.conf /home/web/redis/nodes/redis7006/bin/redis-server /home/web/redis/nodes/redis7006/etc/redis.conf
创建集群
注意根据实际情况修改密码、IP、端口
/home/web/redis/bin/redis-cli -a 123456 --cluster create 172.50.12.11:7001 172.50.11.11:7002 172.50.12.11:7003 172.50.11.11:7004 172.50.12.11:7005 172.50.11.11:7006 --cluster-replicas 1
--cluster-replicas 1
表示一个主节点配置一个从节点
创建集群后会自动分配主从关系和槽位
验证状态
验证slave状态
/home/web/redis/bin/redis-cli -a 123456 -h 172.50.11.11 -p 7006 # 在redis控制台执行 info replication
如果role为slave
,确认master_link_status
为up
验证master状态
/home/web/redis/bin/redis-cli -a 123456 -h 172.50.12.11 -p 7001 # 在redis控制台执行 info replication
如果role
为master
,查看是否有类似slave0:ip=172.50.11.11,port=7006,state=online,offset=1400,lag=1
的信息。
验证集群状态
/home/web/redis/bin/redis-cli -a 123456 -h 172.50.12.11 -p 7001 # 在redis控制台执行 cluster info
结果应该类似下面这样:
cluster_state:ok cluster_slots_assigned:16384 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:6 cluster_size:3 cluster_current_epoch:6 cluster_my_epoch:1 cluster_stats_messages_ping_sent:1074 cluster_stats_messages_pong_sent:1054 cluster_stats_messages_sent:2128 cluster_stats_messages_ping_received:1049 cluster_stats_messages_pong_received:1074 cluster_stats_messages_meet_received:5 cluster_stats_messages_received:2128
或者在终端执行:
/home/web/redis/bin/redis-cli -a 123456 --cluster check 172.50.12.11:7001
查看集群node对应关系
redis控制台执行:
cluster nodes
后期维护
增加节点和删除节点会涉及到已有的槽位重新分配及数据迁移。
添加节点
# 配置模板 redis-cli -a 123456 --cluster add-node new_host:new_port existing_master_host:existing_master_port
假设新加两个节点:172.50.13.11:7007(主)和172.50.13.11:7008(从),两个节点均已启动,已有集群的其中一个主节点为172.50.12.11:7001
# 添加节点 redis-cli -a 123456 --cluster add-node 172.50.13.11:7007 172.50.12.11:7001
新加的节点没有被分配的槽位,需要重新分槽
redis-cli -a 123456 --cluster reshard 172.50.13.11:7007 # 提示how many slots do you want to move,可以输入4096,即16383 / 4 的约数 # 提示 waht is the receiving node id,输入172.50.13.11:7007的node id # 提示 source node,输入 all,表示从所有redis节点中分配槽位
添加节点时,默认为主节点,可以手动设置为从节点:
redis-cli -a 123456 --cluster add-node 172.50.13.11:7008 172.50.12.11:7001
登录到新节点:
redis-cli -a 123456 -h 172.50.13.11 -p 7008
获取master的id,比如172.50.13.11:7007的id为qwertyuiop12345
# 查看节点id cluster nodes # 配置为172.50.13.11:7007的从节点 cluster replication qwertyuiop12345
删除节点
删除节点就是添加节点的逆操作,先重新分配槽位,再删节点。
登录非被删节点的一个master节点。
提示source node的时候填需要被删除节点的node id,然后输入done。
添加节点为add-node,删除为del-node