Redis-哨兵和集群
哨兵:
基于主从复制,需要先将从服务器配置好slaveof 主redisip 6379
bind 172.16.1.109
port 26379
daemonize yes
logfile /opt/redis-6.0.10/redis_26379/logs/redis_26379.log
dir /data/redis/redis_26379
sentinel monitor mymaster 172.16.1.109 6379 2
sentinel down-after-milliseconds mymaster 3000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 18000
[root@Redis redis-6.0.10]# redis-cli -h 172.16.1.111 -p 26379
172.16.1.111:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=172.16.1.111:6379,slaves=2,sentinels=3
172.16.1.113:6379> CONFIG GET slave-priority
1) "slave-priority"
2) "100"
172.16.1.113:6379> CONFIG set slave-priority 0 #修改redis从的优先级
OK
[root@Redis redis-6.0.10]# redis-cli -h 172.16.1.111 -p 26379
172.16.1.111:26379> sentinel failover mymaster #强制切换redis主
OK
172.16.1.111:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=172.16.1.111:6379,slaves=2,sentinels=3
集群:
集群配置文件
bind 172.16.1.111
port 6380
daemonize yes
pidfile /opt/redis-6.0.10/redis_6380/pid/redis_6380.pid
logfile /opt/redis-6.0.10/redis_6380/logs/redis_6380.log
dbfilename redis_6380.rdb
dir /data/redis/redis_6380/
cluster-enabled yes #启动集群模式cluster
cluster-config-file nodes_6380.conf #集群的配置文件
cluster-node-timeout 15000 #集群的超时时间
查看集群节点
[root@Redis redis-6.0.10]# redis-cli -h 172.16.1.111 -p 6380
172.16.1.111:6380> CLUSTER nodes
b36eaca3ff7cc62074e71244a897cc6cded5e2a6 :6380@16380 myself,master - 0 0 0 connected
172.16.1.111:6380> cluster meet 172.16.1.112 6380
OK
172.16.1.111:6380> CLUSTER nodes
b36eaca3ff7cc62074e71244a897cc6cded5e2a6 172.16.1.111:6380@16380 myself,master - 0 0 0 connected
a01f5d491825ed7e74af4b4ef6ced3bb1884d59e 172.16.1.112:6380@16380 master - 0 1612279323393 1 connect
集群配置文件会自动发生变回,不要手动修改
172.16.1.111:6381> CLUSTER info #查看集群状态,一共16384个槽
cluster_state:fail
cluster_slots_assigned:0
cluster_slots_ok:0
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:0
cluster_current_epoch:5
cluster_my_epoch:3
cluster_stats_messages_ping_sent:605
cluster_stats_messages_pong_sent:636
cluster_stats_messages_meet_sent:1
cluster_stats_messages_sent:1242
cluster_stats_messages_ping_received:636
cluster_stats_messages_pong_received:606
cluster_stats_messages_received:1242
手动给每个主节点分配槽位
[root@Redis redis-6.0.10]# redis-cli -h 172.16.1.111 -p 6380 cluster addslots {0..5461}
OK
[root@Redis redis-6.0.10]# redis-cli -h 172.16.1.112 -p 6380 cluster addslots {5462..10922}
OK
[root@Redis redis-6.0.10]# redis-cli -h 172.16.1.113 -p 6380 cluster addslots {10923..16383}
OK
[root@Redis redis-6.0.10]# redis-cli -h 172.16.1.111 -p 6380 -c #启动集群模式
集群工具
参数:
redis-cli --cluster help
Cluster Manager Commands:
create host1:port1 ... hostN:portN #创建集群
--cluster-replicas <arg> #从节点个数
check host:port #检查集群
--cluster-search-multiple-owners #检查是否有槽同时被分配给了多个节点
info host:port #查看集群状态
fix host:port #修复集群
--cluster-search-multiple-owners #修复槽的重复分配问题
reshard host:port #指定集群的任意一节点进行迁移slot,重新分slots
--cluster-from <arg> #需要从哪些源节点上迁移slot,可从多个源节点完成迁移,以逗号隔开,传递的是节点的node id,还可以直接传递--from all,这样源节点就是集群的所有节点,不传递该参数的话,则会在迁移过程中提示用户输入
--cluster-to <arg> #slot需要迁移的目的节点的node id,目的节点只能填写一个,不传递该参数的话,则会在迁移过程中提示用户输入
--cluster-slots <arg> #需要迁移的slot数量,不传递该参数的话,则会在迁移过程中提示用户输入。
--cluster-yes #指定迁移时的确认输入
--cluster-timeout <arg> #设置migrate命令的超时时间
--cluster-pipeline <arg> #定义cluster getkeysinslot命令一次取出的key数量,不传的话使用默认值为10
--cluster-replace #是否直接replace到目标节点
rebalance host:port #指定集群的任意一节点进行平衡集群节点slot数量
--cluster-weight <node1=w1...nodeN=wN> #指定集群节点的权重
--cluster-use-empty-masters #设置可以让没有分配slot的主节点参与,默认不允许
--cluster-timeout <arg> #设置migrate命令的超时时间
--cluster-simulate #模拟rebalance操作,不会真正执行迁移操作
--cluster-pipeline <arg> #定义cluster getkeysinslot命令一次取出的key数量,默认值为10
--cluster-threshold <arg> #迁移的slot阈值超过threshold,执行rebalance操作
--cluster-replace #是否直接replace到目标节点
add-node new_host:new_port existing_host:existing_port #添加节点,把新节点加入到指定的集群,默认添加主节点
--cluster-slave #新节点作为从节点,默认随机一个主节点
--cluster-master-id <arg> #给新节点指定主节点
del-node host:port node_id #删除给定的一个节点,成功后关闭该节点服务
call host:port command arg arg .. arg #在集群的所有节点执行相关命令
set-timeout host:port milliseconds #设置cluster-node-timeout
import host:port #将外部redis数据导入集群
--cluster-from <arg> #将指定实例的数据导入到集群
--cluster-copy #migrate时指定copy
--cluster-replace #migrate时指定replace
创建集群
redis-cli --cluster create 172.16.1.111:6380 172.16.1.112:6380 172.16.1.113:6380 172.16.1.111:6381 172.16.1.112:6381 172.16.1.113:6381 --cluster-replicas 1
添加节点进集群
redis-cli --cluster add-node 172.16.1.111:6391 172.16.1.111:6380
将节点从集群移除
redis-cli --cluster del-node 172.16.1.111:6391 7196afc4bbe72fb872b196ef363fa6c9849b5d9
扩容,收缩集群
扩容,添加新的节点后,需要重新分配槽位
redis-cli --cluster reshard 172.16.1.111:6380
How many slots do you want to move (from 1 to 16384)? 4096 #每个节点分配多少个槽位
What is the receiving node ID? 5c491a9e1b96f49b2ac342c6e7839fb0e457e9ce #接收的节点,新加入的主节点
Source node #1:all 从哪些节点进行分配
收缩,将节点移除,进行槽位收缩
redis-cli --cluster reshard 172.16.1.111:6380
How many slots do you want to move (from 1 to 16384)? 1365 #要移除多少槽位,因为只能一个一个填写接收的节点,所以需要将总的熟练/接收节点数量
What is the receiving node ID? 5c491a9e1b96f49b2ac342c6e7839fb0e457e9ce
Please enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
Source node #1: 2206b5d4c30b34c21982c74a64d3f5c01bc84147
Source node #2: done
查看集群
检查集群节点槽位
redis-cli --cluster check 172.16.1.111:6381
检查集群误差
[root@Redis redis-6.0.10]# redis-cli --cluster rebalance 172.16.1.111:6380
>>> Performing Cluster Check (using node 172.16.1.111:6380)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
*** No rebalancing needed! All nodes are within the 2.00% threshold.
数据导入导出
不加copy参数相当于mv,老数据迁移成功就删掉了
redis-cli --cluster import 172.16.1.111:6380 --cluster-from 172.16.1.111:6379
添加copy参数相当于cp,老数据迁移成功后会保留
redis-cli --cluster import 172.16.1.111:6380 --cluster-copy --cluster-from 172.16.1.111:6379
添加replace参数会覆盖掉同名的数据,对新集群新增加的数据不受影响
redis-cli --cluster import 172.16.1.111:6380 --cluster-copy --cluster-replace --cluster-from 172.16.1.111:6379