Redis集群

一、摘要

看完本文你将掌握如下知识点:

  • redis集群的构建方法【redis-5.0.2】
  • redis早期的版本中使用基于ruby的redis-trib.rb命令进行集群创建,新版本推荐使用 redis-cli --cluster,本文就是通过redis-cli --cluster命令实现集群构建。

二、快速创建集群

redis为我们提供了快速创建集群的工具,安装好redis后,在其/redis-5.0.2/utils/create-cluster/目录下存在一个create-cluster命令,通过该命令可以快速创建一个基于本机端口30001~30006的三主三从的redis集群,可以通过修改端口号及服务数量来改变集群的配置。
1.启动6个redis服务,./create-cluster start
2.创建集群,./create-cluster create
3.关闭集群服务,./create-cluster stop
4.清除数据及日志文件,./create-cluster clean

三、源码分析

通过看源码可以很清楚其创建过程
1.启动6个reids服务,通过参数的方式进行启动,在生产环境中建议通过配置文件启动

if [ "$1" == "start" ]
then
    while [ $((PORT < ENDPORT)) != "0" ]; do
        PORT=$((PORT+1))
        echo "Starting $PORT"
        ../../src/redis-server --port $PORT --cluster-enabled yes --cluster-config-file nodes-${PORT}.conf --cluster-node-timeout $TIMEOUT --appendonly yes --appendfilename appendonly-${PORT}.aof --dbfilename dump
-${PORT}.rdb --logfile ${PORT}.log --daemonize yes
    done
    exit 0
fi

参数说明:

#端口:
port $PORT
#是否启用集群:
cluster-enabled yes
#集群关联文件路径,创建redis集群时自动创建
cluster-config-file nodes-${PORT}.conf
#集群节点间通信的超时时间,毫秒,建议2000,默认15000
cluster-node-timeout $TIMEOUT
#开启aof
appendonly yes
#aof文件名称,注意这里只能是文件名称,若要修改路径需要设置dir属性 ,如dir /home/hanqf/redis-dir/redis-5.0.2/cluster-conf/files/
appendfilename appendonly-${PORT}.aof
#rdb文件名称,同样只能是文件名称,同上路径共用dir属性
dbfilename dump-${PORT}.rdb
#日志文件路径
logfile ${PORT}.log
#后台运行模式启动
daemonize yes

2.构建集群,这里使用的就是redis-cli --cluster命令,可以看出与redis-trib.rb命令类似

if [ "$1" == "create" ]
then
    HOSTS=""
    while [ $((PORT < ENDPORT)) != "0" ]; do
        PORT=$((PORT+1))
        HOSTS="$HOSTS 127.0.0.1:$PORT"
    done
    ../../src/redis-cli --cluster create $HOSTS --cluster-replicas $REPLICAS
    exit 0
fi

create后根的$HOSTS就是redis服务列表

127.0.0.1:30001 127.0.0.1:30002 127.0.0.1:30003 127.0.0.1:30004 127.0.0.1:30005 127.0.0.1:30006

--cluster-replicas $REPLICAS,这里$REPLICAS值为1,表示为每一个master节点分配一个slave节点

四、实际应用

这里我们使用2台服务器,分别启动3个redis服务,来构建一个三主三从的redis集群。

1.服务器IP

  • 10.211.55.15
  • 10.211.55.16

2.端口设置

分别开启俩台服务器的如下端口,前面是redis服务端口,后面是集群通信端口(默认服务端口+10000)

6379,16379
6380,16380
6381,16381

3.redis-{port}.conf

这里需要按照上面的参数说明进行配置,如我们配置号redis-6379.conf后,可以通过如下命令进行复制

more redis-6379.conf | sed 's/6379/6380/g' > redis-6380.conf
more redis-6379.conf | sed 's/6379/6381/g' > redis-6381.conf

4.启动服务

#10.211.55.15
./redis-server redis-6379.conf
./redis-server redis-6380.conf
./redis-server redis-6381.conf


#10.211.55.16
./redis-server redis-6379.conf
./redis-server redis-6380.conf
./redis-server redis-6381.conf

5.构建集群

./redis-cli --cluster create 10.211.55.15:6379 10.211.55.15:6380 10.211.55.15:6381 10.211.55.16:6379 10.211.55.16:6380 10.211.55.16:6381  --cluster-replicas 1

五、集群相关命令

1.健康检查

# 后面可以是集群中任意节点
./redis-cli --cluster check 10.211.55.15:6380

输出如下,可以看到集群中的主从关系,以及每个master中含有key的数量:

10.211.55.15:6380 (c39c1e8a...) -> 2 keys | 5461 slots | 1 slaves.
10.211.55.16:6380 (3edc1dae...) -> 5 keys | 5461 slots | 1 slaves.
10.211.55.16:6379 (4dd31f17...) -> 2 keys | 5462 slots | 1 slaves.
[OK] 9 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 10.211.55.15:6380)
M: c39c1e8aa6e07e337aaab03eab3727f739201cd2 10.211.55.15:6380
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: a83903f50621d7627f3ce59f1210af4938b8acc4 10.211.55.15:6381
   slots: (0 slots) slave
   replicates 4dd31f17e83ef7aa6c7a36474f7f54d842e0ed64
M: 3edc1daeaf3a848156ad8cc601b1374dd0459d9c 10.211.55.16:6380
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: 4dd31f17e83ef7aa6c7a36474f7f54d842e0ed64 10.211.55.16:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: cb6a94201d6f5a4e016b1549afc8c976a1a3dda4 10.211.55.15:6379
   slots: (0 slots) slave
   replicates 3edc1daeaf3a848156ad8cc601b1374dd0459d9c
S: 3f41a95296cb2681ea599f47aaff9c662b3338ad 10.211.55.16:6381
   slots: (0 slots) slave
   replicates c39c1e8aa6e07e337aaab03eab3727f739201cd2
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

说明:此时如果关闭其中一个master节点,那么其对应的从节点就会升级为主节点,当重新启动原master节点后,则该节点会自动加入集群,并作为从节点。

2.集群扩容,即为集群添加新的主机和从机

2.1通过如下命令添加新的node

说明:10.211.55.15:6382 是新的服务地址,10.211.55.16:6380 是集群中任意一个的服务地址,添加后的服务类型为master。

此时我们通过健康检查可以看到新加入的服务没有分配槽点:

./redis-cli --cluster check 10.211.55.15:6380
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
Could not connect to Redis at 10.211.55.15:6379: Connection refused
10.211.55.15:6380 (a5f63b8e...) -> 2 keys | 5461 slots | 1 slaves.
10.211.55.16:6379 (15506850...) -> 2 keys | 5462 slots | 1 slaves.
10.211.55.15:6382 (316e068f...) -> 0 keys | 0 slots | 0 slaves.   #注意,这里新添加的主机没有分配槽(slot),需要先进行分配才能使用
10.211.55.16:6380 (d944c0b1...) -> 5 keys | 5461 slots | 0 slaves.
[OK] 9 keys in 4 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 10.211.55.15:6380)
M: a5f63b8e4f24a73d36da9e0bbf84988d7c5558d3 10.211.55.15:6380
  slots:[10923-16383] (5461 slots) master
  1 additional replica(s)
M: 15506850b235f4277306368533cacf4a5ec1bbd1 10.211.55.16:6379
  slots:[5461-10922] (5462 slots) master
  1 additional replica(s)
M: 316e068fd71ee228299198a271efd839d3493835 10.211.55.15:6382
  slots: (0 slots) master
S: b3c0e06da5b5d694c3a68408fb4c8f7607d7e9e0 10.211.55.16:6381
  slots: (0 slots) slave
  replicates a5f63b8e4f24a73d36da9e0bbf84988d7c5558d3
M: d944c0b19e92af325b882e3a86ff09c2b6b53f47 10.211.55.16:6380
  slots:[0-5460] (5461 slots) master
S: 4bce4c24959bda55d087296e86f58ec03186d3ae 10.211.55.15:6381
  slots: (0 slots) slave
  replicates 15506850b235f4277306368533cacf4a5ec1bbd1
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

2.2分配槽

./redis-cli --cluster reshard 10.211.55.15:6382

执行命令后会有如下设置:
1.问你是否从原有的1-16384个槽中分配多少到新的主节点,我们这里分配4000为例,回车
2:然后紧接着会询问你给id为谁的主节点分配,这里就是新加的节点10.211.55.15:6382,其对应的Id为:316e068fd71ee228299198a271efd839d3493835
3:询问你是从所有的空间去给这个节点分配空间还是从某一个节点分配,我这里输入all 回车继续
4:然后会给你分配出一个分配计划,输入yes开始分配。完成ok

此时再次运行健康检查可以看到槽点已经分配成功

./redis-cli --cluster check localhost:6380
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
localhost:6380 (a5f63b8e...) -> 1 keys | 4128 slots | 1 slaves.
10.211.55.16:6379 (15506850...) -> 2 keys | 4128 slots | 1 slaves.
10.211.55.15:6382 (316e068f...) -> 2 keys | 4000 slots | 0 slaves.
10.211.55.16:6380 (d944c0b1...) -> 4 keys | 4128 slots | 1 slaves.
[OK] 9 keys in 4 masters.
0.00 keys per slot on average.
………………………………

2.3平衡槽,就是均匀分配集群中的所有槽到所有的节点,该步非必须,只是看着好看点

./redis-cli --cluster rebalance --cluster-threshold 1 10.211.55.15:6382
./redis-cli --cluster info localhost:6380
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
localhost:6380 (a5f63b8e...) -> 1 keys | 4096 slots | 1 slaves.
10.211.55.16:6379 (15506850...) -> 2 keys | 4096 slots | 1 slaves.
10.211.55.15:6382 (316e068f...) -> 2 keys | 4096 slots | 0 slaves.
10.211.55.16:6380 (d944c0b1...) -> 4 keys | 4096 slots | 1 slaves.
[OK] 9 keys in 4 masters.
0.00 keys per slot on average.

2.4为新加入的master添加slave

同样需要先加入集群

 ./redis-cli --cluster add-node 10.211.55.16:6382 10.211.55.16:6380

之后不需要做分配和平衡槽的操作
登录这个redis, ./redis-cli -h 10.211.55.16 -p 6382

127.0.0.1:6382> cluster replicate 316e068fd71ee228299198a271efd839d3493835 #主节点的id
OK

3.删除节点

3.1删除主节点

删除节点前,节点上的槽要被清空

./redis-cli --cluster reshard 10.211.55.15:6382 #集群中任意ip即可

1.问你是否从原有的1-16384个槽中分配多少到新的主节点我们这里分配4096,即该节点上的槽数
2:然后紧接着会询问你给id为谁的主节点分配,这里我们分配给10.211.55.16:6379,即15506850b235f4277306368533cacf4a5ec1bbd1
3:询问你是从所有的空间去给这个节点分配空间还是从某一个节点分配
我这里输入要移出的节点ID ,即316e068fd71ee228299198a271efd839d3493835 回车继续 输入 done
4:然后会给你分配出一个分配计划,输入yes开始分配。完成ok

执行删除节点命令

./redis-cli --cluster del-node 10.211.55.16:6379 316e068fd71ee228299198a271efd839d3493835
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Removing node 316e068fd71ee228299198a271efd839d3493835 from cluster 10.211.55.16:6379
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.

说明:
删除节点会自动关闭被移出的redis服务,此时,该主节点的从节点会自动转为其它主节点的从节点,而不会升级为主节点

3.2删除从节点

直接执行节点删除命令

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

推荐阅读更多精彩内容