Redis主从复制配置
从服务器
slaveof host port
info replication #查看信息
Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。具体步骤如下:
1)从服务器连接主服务器,发送SYNC命令;
2)主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;
3)主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;
4)从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;
5)主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
6)从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;
Redis哨兵模式配置
Redis Sentinel是一个分布式架构,其中包含若干个Sentinel节点和Redis数据节点,每个Sentinel节点会对数据节点和其余Sentinel节点进行监控,当它发现节点不可达时,会对节点做下线标识。如果被标识的是主节点,它还会和其他Sentinel节点进行“协商”,当大多数Sentinel节点都认为主节点不可达时,它们会选举出一个Sentinel节点来完成自动故障转移的工作,同时会将这个变化通知给Redis应用方。
编写sentinel.conf文件
sentinel monitor mymaster 127.0.0.1 6379 1
其中mymaster为监控对象起的服务器名称 1为至少有1个哨兵认为master宕机了才进行迁移
Redis集群
Redis集群
Redis集群实现了对Redis的水平扩容,即启动N个Redis节点,将整个数据库分布存储在N个节点中,每个节点存储1/N
Redis集群通过分区(Partition)来提供一定程度的可读性,即使集群中有一部分节点失效,或者无法进行通信,集群也可以继续处理命令请求。
集群搭建
yum -y install ruby 安装ruby依赖
yum install rubygems
[root@kafka myredis]# ll
total 28
-rw-r--r-- 1 root root 185 Apr 5 19:17 redis6379.conf
-rw-r--r-- 1 root root 185 Apr 5 19:17 redis6380.conf
-rw-r--r-- 1 root root 185 Apr 5 19:17 redis6381.conf
-rw-r--r-- 1 root root 185 Apr 5 19:17 redis6389.conf
-rw-r--r-- 1 root root 185 Apr 5 19:18 redis6390.conf
-rw-r--r-- 1 root root 185 Apr 5 19:18 redis6391.conf
-rw-r--r-- 1 root root 406 Apr 5 18:45 sentinel.conf
我使用的是一台服务器多redis实例
[root@kafka myredis]# cat redis6379.conf
include /data/redis-6.2.1/redis.conf
pidfile /var/run/redis6379.pid
port 6379
dbfilename dump6379.rdb
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000
[root@kafka myredis]# ps -ef | grep redis
root 16339 1 0 19:19 ? 00:00:02 redis-server 127.0.0.1:6379 [cluster]
root 16345 1 0 19:19 ? 00:00:02 redis-server 127.0.0.1:6380 [cluster]
root 16351 1 0 19:19 ? 00:00:02 redis-server 127.0.0.1:6381 [cluster]
root 16359 1 0 19:19 ? 00:00:02 redis-server 127.0.0.1:6389 [cluster]
root 16365 1 0 19:19 ? 00:00:02 redis-server 127.0.0.1:6390 [cluster]
root 16371 1 0 19:20 ? 00:00:02 redis-server 127.0.0.1:6391 [cluster]
root 16802 15620 0 19:38 pts/1 00:00:00 grep --color=auto redis
当所有节点起来之后
redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6389 127.0.0.1:6390 127.0.0.1:6391 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 127.0.0.1:6390 to 127.0.0.1:6379
Adding replica 127.0.0.1:6391 to 127.0.0.1:6380
Adding replica 127.0.0.1:6389 to 127.0.0.1:6381
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 6d8813e5c1f0f44420ac9e922b673e26f201f90a 127.0.0.1:6379
slots:[0-5460] (5461 slots) master
M: 18c025f1ef2212f0ce88d40cf802ff566a3ae7c6 127.0.0.1:6380
slots:[5461-10922] (5462 slots) master
M: 93e148b9b189450e1b1ab376f8ca2f8275c5451b 127.0.0.1:6381
slots:[10923-16383] (5461 slots) master
S: 37168d3d2fcd773048f8057935982c62cc76fcc2 127.0.0.1:6389
replicates 18c025f1ef2212f0ce88d40cf802ff566a3ae7c6
S: daa9f4a9080480c87c2a7c179d10ebfad083471a 127.0.0.1:6390
replicates 93e148b9b189450e1b1ab376f8ca2f8275c5451b
S: 54f6a15df42936082c165fa58bad5907cfe4cfea 127.0.0.1:6391
replicates 6d8813e5c1f0f44420ac9e922b673e26f201f90a
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
...
>>> Performing Cluster Check (using node 127.0.0.1:6379)
M: 6d8813e5c1f0f44420ac9e922b673e26f201f90a 127.0.0.1:6379
slots:[0-5460] (5461 slots) master
1 additional replica(s)
M: 18c025f1ef2212f0ce88d40cf802ff566a3ae7c6 127.0.0.1:6380
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: daa9f4a9080480c87c2a7c179d10ebfad083471a 127.0.0.1:6390
slots: (0 slots) slave
replicates 93e148b9b189450e1b1ab376f8ca2f8275c5451b
S: 37168d3d2fcd773048f8057935982c62cc76fcc2 127.0.0.1:6389
slots: (0 slots) slave
replicates 18c025f1ef2212f0ce88d40cf802ff566a3ae7c6
S: 54f6a15df42936082c165fa58bad5907cfe4cfea 127.0.0.1:6391
slots: (0 slots) slave
replicates 6d8813e5c1f0f44420ac9e922b673e26f201f90a
M: 93e148b9b189450e1b1ab376f8ca2f8275c5451b 127.0.0.1:6381
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
使用cluster nodes查看集群信息
127.0.0.1:6381> cluster nodes
37168d3d2fcd773048f8057935982c62cc76fcc2 127.0.0.1:6389@16389 slave 18c025f1ef2212f0ce88d40cf802ff566a3ae7c6 0 1617622631410 2 connected
6d8813e5c1f0f44420ac9e922b673e26f201f90a 127.0.0.1:6379@16379 master - 0 1617622631000 1 connected 0-5460
daa9f4a9080480c87c2a7c179d10ebfad083471a 127.0.0.1:6390@16390 slave 93e148b9b189450e1b1ab376f8ca2f8275c5451b 0 1617622629000 3 connected
93e148b9b189450e1b1ab376f8ca2f8275c5451b 127.0.0.1:6381@16381 myself,master - 0 1617622626000 3 connected 10923-16383
54f6a15df42936082c165fa58bad5907cfe4cfea 127.0.0.1:6391@16391 slave 6d8813e5c1f0f44420ac9e922b673e26f201f90a 0 1617622632415 1 connected
18c025f1ef2212f0ce88d40cf802ff566a3ae7c6 127.0.0.1:6380@16380 master - 0 1617622630406 2 connected 5461-10922
一个集群至少需要三个主节点 --replicas 1表示为每个主节点至少创建一个从节点
什么是slots
一个redis集群有若干个slots数据库中的每个键都属于这些slots中的一个,集群中的每个节点负责一部分slots
在redis-cli中每次录入查询键值,redis都会计算出这些key应该送往的插槽.如果不是客户端对应的插槽redis会报错.所以有
redis-cli -c参数实现了键值自动重定向
不在一个slots下的键值.不能使用mset,mget等多键操作
可以通过{}来定义组的概念,从而使key中{}内相应的内容放在一个slots中去
127.0.0.1:6379> set a{user} 1
-> Redirected to slot [5474] located at 127.0.0.1:6380
OK
127.0.0.1:6380> set aa{user} 2
OK
127.0.0.1:6380> set aaa{user} 3
OK
127.0.0.1:6380> set b b
-> Redirected to slot [3300] located at 127.0.0.1:6379
OK
可以看到有{user}组的参数都在6380负责的5474槽位上
CLUSTER KEYSLOT <key> 计算key落在那个槽位上
CLUSTER COUNTKEYSINSLOT <slot> 查看slot包含的键值对数量
CLUSTER GETKEYSINSLOT <slot> <count> 返回count个slot槽位中的键
127.0.0.1:6379> set a{user} 1
-> Redirected to slot [5474] located at 127.0.0.1:6380
OK
127.0.0.1:6380> set aa{user} 2
OK
127.0.0.1:6380> set aaa{user} 3
OK
127.0.0.1:6380> CLUSTER COUNTKEYSINSLOT 5474
(integer) 3
127.0.0.1:6380> CLUSTER COUNTKEYSINSLOT 3300
(integer) 0
127.0.0.1:6380> CLUSTER COUNTKEYSINSLOT 5474
(integer) 3
127.0.0.1:6380> CLUSTER GETKEYSINSLOT 5474 2
1) "aaa{user}"
2) "aa{user}"
127.0.0.1:6380> CLUSTER GETKEYSINSLOT 5474 3
1) "aaa{user}"
2) "aa{user}"
3) "a{user}"
127.0.0.1:6380> CLUSTER KEYSLOT K1
(integer) 14148
如果主节点下线从节点自从升级为主节点
主节点恢复后变为从节点
如果某段插槽对应的master和对应的slave都宕机 集群不可用
redis.conf中有一个cluster-require-full-coverage参数
只有所有slot都正常时才能正常对外提供服务