Redis集群

Redis主从复制配置

从服务器

slaveof host port
info replication #查看信息

Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。具体步骤如下:

1)从服务器连接主服务器,发送SYNC命令;

2)主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;

3)主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;

4)从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;

5)主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;

6)从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;


image.png

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都正常时才能正常对外提供服务

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,699评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,124评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,127评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,342评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,356评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,057评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,654评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,572评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,095评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,205评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,343评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,015评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,704评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,196评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,320评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,690评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,348评论 2 358

推荐阅读更多精彩内容