本章是基于CentOS7下的Redis集群教程,包括:
●单机安装Redis
●Redis主从
●Redis分片集群
1.单机安装Redis
首先需要安装Redis所需要的依赖:
然后将课前资料提供的Redis安装包上传到虚拟机的任意目录:
redis-6.2.4.tar.gz(2.3 MB)
例如,我放到了/tmp目录:
/TMP
RUN
大小
文件名
SBIN
FONT-UNIX
ICE-UNIX
SRV
TEST-UNIX
SYS
X11-UNIX
TMP
XIM-UNIX
.FONT-UNIX
2.3 MB
REDIS-6.2.4.TAR.GZ
ICE-UNIX
解压缩:
解压后:
/TMP
RUN
文件名
大小
SBIN
FONT-UNIX
SRV
ICE-UNIX
TEST-UNIX
SYS
X11-UNIX
TMP
XIM-UNIX
FONT-UNIX
REDIS-6.2.4
ICE-UNIX
进入redis目录:
运行编译命令:
如果没有出错就安装成功。然后修改redis.conf文件中的一些配置(注意是四个0,不要额外的):
启动Redis:
停止redis服务(ctrl + c也可停止):
2.Redis主从集群
2.1.集群结构
我们搭建的主从集群结构如图:
SLAVE
读操作
REDISCLIENT
MASTER
写操作
读操作
SLAVE
共包含三个节点,一个主两个从。这里我们会在同一台虚拟机中开启3个redis实例,模拟主从集群,信息如下:
IP |
PORT |
角色 |
192.168.206.129 |
7001 |
master |
192.168.206.129 |
7002 |
slave |
192.168.206.129 |
7003 |
slave |
2.2.准备实例和配置
要在同一台虚拟机开启3个实例,必须准备三份不同的配置文件和目录,配置文件所在目录也就是工作目录。
确保下面的配置已经更改(位置也别错)
# LISTENS ON TWO SPECIFIC IPV4 ADDRESSES
# BIND 192.168,
1.100 10.0.0.1
# LISTENS ON LOOPBACK IPV4 AND IPV6
# BIND
127.0.0.1
:1
# LIKE THE DEFAULT, ALL AVAILABLE INTERFACES
# BIND
#
- IF THE COMPUTER RUNNING REDIS IS DIRECTLY EXPOSED TO THE
WARNING
# INTERNET, BINDING TO ALL THE INTERFACES IS DANGEROUS AND WILL E
LLEXPOSETHE
# INSTANCE TO EVERYBODY ON THE INTERNET. SO BY DEFAULT WE UNCOMMENT THE
# FOLLOWING BIND DIRECTIVE, THAT WILL FORCE REDIS TO LISTEN ONLY ON THE
CE ADDRESSES (THIS MEANS REDIS
# IPV4 AND IPV6 (IF AVAILABLE) LOOPBACK INTERFACE AD
# WILL ONLY BE ABLE TO ACCEPT CLIENT CONNECTIONS FROM THE SAME HOST THAT IT IS
# RUNNING ON).
井
# IF YOU ARE SURE YOU WANT YOUR INSTANCE TO LISTEN TO ALL THE INTERFACES
#
ST COMMENT OUT THE FOLLOWING LINE,
JUST C
BIND 0.0.0.0
# PROTECTED MODE IS A LAYER OF SECURITY PROTECTION, IN ORDER TO AVOID THA
VOID THAT
1)创建目录
我们创建三个文件夹,名字分别叫7001、7002、7003:
如图:
[ROOT@LOCALHOST TMP]# PWD
/TMP
[ROOT@LOCALHOST TMP]# 11
总用量
6月
9
ROOT ROOT
2
30
03:25 7001
DRWXR-XR-X.
6月
6
2 ROOT ROOT
DRWXR-XR-X.
30
03:25 7002
6月
6
3003:257003
2 ROOT ROOT
DRWXR-XR-X.
6月
DRWXRWXR-X.
7 ROOT ROOT 4096
30 03:25 REDIS-6.2.4
2)恢复原始配置
修改redis-6.2.4/redis.conf文件,将其中的持久化模式改为默认的RDB模式,AOF保持关闭状态。
3)拷贝配置文件到每个实例目录
然后将redis-6.2.4/redis.conf文件拷贝到三个目录中(在/tmp目录执行下列命令):
4)修改每个实例的端口、工作目录
修改每个文件夹内的配置文件,将端口分别修改为7001、7002、7003,将rdb文件保存位置都修改为自己所在目录(在/tmp目录执行下列命令):
5)修改每个实例的声明IP(注意IP需要修改)
虚拟机本身有多个IP,为了避免将来混乱,我们需要在redis.conf文件中指定每一个实例的绑定ip信息,格式如下(下面这个只是语法说明,别执行):
每个目录都要改,我们一键完成修改(在/tmp目录执行下列命令):
2.3.启动
为了方便查看日志,我们打开3个ssh窗口,分别启动3个redis实例,启动命令(在/tmp目录执行下列命令):
启动后:
192.168.150.1
LOGIN: WED JUN 30 10:50:36 2021 FROM
LAST
RUNNING IN STANDALONE BODE
[ROOT@IO
@LOCALHOST~]# CD /TMP/
[ROOT@LOCALHOST TMP]# 11
总用量8
HTTOS://REDIS.IO
246月
DRWXR-XR-X. 2 ROOT ROOT
30 09:20 7001
246月
30 09:21 7002
DRWXR-XR-X. 2 ROOT ROOT
246月
7003
30 09:21
DRWXR-XR-X. 2 ROOT ROOT
06月
APPENDONLY.AOF
30 10:18
-RW-R--R--, 1 ROOT ROOT
30 10:13
BOT ROOT40966月
REDIS-6.2.
DRWXRWXR-X. 7 ROOT R
34459:H 30 JUN 2821 10:59:42.988 5 MARNING; THE ICP BACKTOS SETTING OF S1L CANNOT BE ENFORCE /PROC/S/
926月
30 10:19
TEST.RDB
-RW-R-R--, 1 ROOT ROOT
NET/CORE/SONAXCONN IS SET TO THE LOWER VALUE OF 128.
[ROOT@LOCALHOST TMP]# &C
34459:H 30 JUN 2021 10:59:42.600 # SERVER INITIALIZED
[ROOT@LOCALHOST TMP]#
LAMNAND 'SYSCTL VM.OVERCONNIT.NENORYEL' FOR THIS TO TAKE OFFECT.
134459:H 30 JUN 2021 10:59:42.000 + READY TO ACCEPT CONNECTIONS
6.192.168.150.101(ROOT)
17.7001
PUNNING IN STANDALONE MODE
REDIS 6.2.4 (000000008/0) 64 BIT
PORT:7002
PID:34469
HTTPSS//REDIS.IO
HTTOST/RED S.IO
34469:M 30 JUN 2021 10:59:54.949 # WARNING: THE TCP BACKLOG
BACKLOG SETTING OF 511 CANNOT BE ENFORCED BECAUSE /PROC/SYS/N
ET/CORE/SOMAXCONN IS SET TO THE LOWER VALUE OF 128.
34469:M 30 JUN 2021 10:59:54.949 1 SERVER INITIALIZED
KGROUND SAVE NOY FAIL UNDER TAW NEARY CANDITIAN. T
NAND 'SYSCTL VM.OVERCOMMIT_NONORY L' FOR THIS TO TAKE EFFECT.
34469:H 30 JUN 2021 10:59:54.949* READY TO ACCEPT CONNECTIONS
34480:N 36 JUN 2021 11:00:83.745 * READY TO ACCEPT CONNECTIONS
9.7003
8.7002
如果要一键停止,可以运行下面命令:
2.4.开启主从关系
现在三个实例还没有任何关系,要配置主从可以使用replicaof 或者slaveof(5.0以前)命令。
新开窗口执行下述命令,一旦ctrl +c退出后,redis服务将中断
有临时和永久两种模式:
● 修改配置文件(永久生效)
○在redis.conf中添加一行配置:slaveof <masterip> <masterport>
● 使用redis-cli客户端连接到redis服务,执行slaveof命令(重启后失效):
注意:在5.0以后新增命令replicaof,与salveof效果一致。(注意IP需要修改)
这里我们为了演示方便,使用方式二(在/tmp目录执行下列命令)。通过redis-cli命令连接7002,执行下面命令:
执行完:exit,退出可继续执行后续命令。通过redis-cli命令连接7003,执行下面命令:
一定要在对应节点下面操作
[ROOT@LOCALHOST 7002]# CD ./7003
[ROOT@LOCALHOST 7003]# REDIS-CLI
7003
然后连接 7001节点,查看集群状态:
结果:
REPLICATION
127.0.0.1:7001> INF0
# REPLICATION
ROLE:MASTER
LAVES:2
CONNECTED
ISLAVEO:IP-192.168.150.101,PORT-7002,STATE-ONLINE,OFFSET-322,LAG-1
SLAVEL:IP-192.168.150.101,PORT-7003,S
S,STATEONLINE,OFFSET-322,LAG-0
MASTER_FAILOVER_STATE:NO-FAILOVER
MASTER_REPLID:F1C9374C417136BC462FD61A25EBEF77BB7A41B7
REPLID2:0000000000000000000000000000000000000000000
MASTER
_REPL_OFFSET:336
MASTER
_REPL_OFFSET:-1
SECOND
REPL_BACKLOG_ACTIVE:1
REPL_BACKLOG_SIZE:1048576
REPL_BACKLOG_FIRST_BYTE_OFFSET:1
REPL_BACKLOG_HISTLEN:336
2.5.测试
执行下列操作以测试:
● 利用redis-cli连接7001,执行set num 123
● 利用redis-cli连接7002,执行get num,再执行set num 666
● 利用redis-cli连接7003,执行get num,再执行set num 888
可以发现,只有在7001这个master节点上可以执行写操作,7002和7003这两个slave节点只能执行读操作。
3.搭建哨兵集群
3.1.集群结构
这里我们搭建一个三节点形成的Sentinel集群,来监管之前的Redis主从集群。如图:
SENTINEL
SENTINEL
SENTINEL
LLLLLLLLLLLLLA
监控集群状态
服务状态
变更通知
SLAVE
数据
REDISCLIENT
MASTER
同步
-
-
SLAVE
IIIIIILLIL
三个sentinel实例信息如下:
节点 |
IP |
PORT |
s1 |
192.168.206.129 |
27001 |
s2 |
192.168.206.129 |
27002 |
s3 |
192.168.206.129 |
27003 |
3.2.准备实例和配置
要在同一台虚拟机开启3个实例,必须准备三份不同的配置文件和目录,配置文件所在目录也就是工作目录。
我们创建三个文件夹,名字分别叫s1、s2、s3:
如图:
11
[ROOT@LOCALHOST THE
TMP]
总用量8
7月
DRWXR-XR-X.
107:11 7001
2
40
ROOT ROOT
40 7月
DRWXR-XR-X.
1 07:11 7002
2
ROOT
ROOT
40 7月
DRWXR-XR-X.
1 07:11 7003
ROOT
2
ROOT
7月
07:21
114
ROOT
1
A.TXT
1
ROOT
-RW-R--R--.
7月
1 07:20 REDIS-6.2.4
DRWXRWXR-X. 7 ROOT ROOT
4096
7月
107:14 S1
2 ROOT ROOT
DRWXR-XR-X.
27
1 07:14 S2
7月
DRWXR-XR-X. 2
27
2 ROOT ROOT
7月
DRWXR-XR-X. 2 ROOT ROOT
107:14S3
27
然后我们在s1目录创建一个sentinel.conf文件,添加下面的内容:
●cd /tmp/s1
●touch sentinel.conf
●vi sentinel.conf
●粘贴下述文本
解读:
●port 27001:是当前sentinel实例的端口
●sentinel monitor mymaster 192.168.206.129 7001 2:指定主节点信息
○mymaster:主节点名称,自定义,任意写
○192.168.206.129 7001:主节点的ip和端口
○2:选举master时的quorum值
然后将s1/sentinel.conf文件拷贝到s2、s3两个目录中(在/tmp目录执行下列命令):
修改s2、s3两个文件夹内的配置文件,将端口分别修改为27002、27003:
3.3.启动
为了方便查看日志,我们打开3个ssh窗口,分别启动3个redis实例,启动命令(在tmp目录执行):
启动后:
35750:X 01 JUL 2021 07:14:12.761
POSIX
LOCK:
CLOCK
MONOTONIC
GETTIME
PROTECTED-MODE NO
+@ALL
USER DEFAULT ON NOPASS ~* &* +@A
REDIS 6.2.4
(00000000/0)64 BIT
SENTINEL MYID 08CDED813704BC5B6A5643922719B90DB230CA61
SENTINEL CONFIG-EPOCH MYMASTER O
RUNNING IN SENTINEL MODE
PORT:27001
SENTINEL LEADER-EPOCH MYMASTER 0
PID:35750
SENTINEL CURRENT-EPOCH 0
STER 192.168.150.101 7002
SENTINEL KNOWN-REPLICA MYMASTER 1928
CA MYMASTER 192.168.150.101 7003
SENTINEL KNOWN-REPLICA ME
TER 192.168.150.101 27002 6
SENTINEL KNOWN-SENTINEL ME
6
ET MYMASTER
192.168.150.101 27003
SENTINEL KNOWN-SENTINEL MYMASTER
[ROOT@LOCALHOST TMP]
0]#
17.S1
2.192.168.150.101(ROOT)
135749:X 01 JUL 2021 07:14:12.718 * MONOTONIC CLOCK: POSIX CLOCK-GETTIME
35748:X 01 JUL 2021 07:14:12.505 * MONOTONIC CLOCK: POSIX CLOCK-GETTIME
REDIS 6.2.4(00000000/0)
REDIS 6.2.4 (0000000/0) 64 BIT
0/0) 64 BIT
RUNNING IN SENTINEL MODE
RUNNING IN SENTINET MODE
PORT:27002
PORT:27003
PID:35748
PID:35749
10.S3
19.S2
3.4.测试
●停止7001(当前主节点),此时会在多个哨兵中选举出一个哨兵的master,如下
○27001投给27002
○27002投给自己
○27003投给27002
○因此27002变成哨兵master
拖拽
PORT:27002
RUNNING IN SENTINEL MODE
PORT:27003
PID:40774
PORT: 27001
PID:41327
SET TO THE LO
11:5
NNOT
11:5
145C
11:5
001
3.206.130 700
11:5
11:09 # WARNING: THE TCP BACKLOG SETTING OF 511 CANNOT BE ENFORCED BECB4B5
3.206.130 700
ANTNG: THE TCP BACKLOG SETTING OF 511 CAMNOT BE ENFORCED BECA
22 # SENTINEL ID IS 180C5C5BD6461C84420E9DE 59B1099FAL48A5D9
WARNING: THE TCP BACKLOG SETTING OF 511 CANNOT BE ENFORCED L
4MONITOR MASTER MYMASTER 192.168.206.130 7001 QUORUM 2
TINEL ID IS C5E38B9372CC9405104D4397CE4145D2BF8A09EB
ITAR MASTAR MUMASTAR 100 169 108 13A 70AL RAINRIM 7
SENTINEL ID IS 974FE03FBC276E6CLFEB8E8B4B5D50A08661067
138K
10K ENS33
100K
69K
34K
40211:X 02 APR 2023 11:53:27.537 # +SDOWN MASTER MYMASTER 192.168.206.130 7001
本机
OMS
40211:X 02 APR 2023 11:53:27.610 # +NEW-EPOCH 1
0
40211;X 02 APR 2023 11:53:27.616 #+VOTE-FOR-LEADER 180CSC5BD6461C8442989D6E5961099FAL45AL48A5D9 1
40211;X 02 APR 2023 11:53:28.641# FODOWN MASTER MYMASTER 192,160,206,130 7001 #QUORUM 3/2
的BQ都
命令输入(按ALT键提示历史,TAB键路径,ESC键返回,双击CTRL切换)
可用/大小
路径
历史
选项
3.8G/3.8G
/DEV
3.8G/3.8G
/DEV/SHM
命令
文件
3.8G/3.8G
/RUN
●主观下线变客观下线
192.168.2
.206.130
2
ANNOUNCE
SENTINEL
3.9.8
3
192.168.206.130
7001
SENTINEL MONITOR
MYMASTER
4
SENTINEL DOWN-AFTER-MILLISECONDS MYMASTER 5000
5
206.
SENTINEL FAILOVER-TIMEOUT MYMASTER 6000
192.168.206.130 7003 @ MYMASTER 192.168.
DIR "/TMP/S1"
6
统信
684420E9D6E59B1099FA148A5D9 192.168.206,130
192.168.206.13
7CE4145D2BF8A09EB
405104D439
解读:
.66,0
PORT 27001:是当前SENTINEL实例的端口
三个都认为主观下线,超过配置的2
SENTINEL MONITOR MYMASTER 192.168.206.129 7001 2:指定主节点信息
所以变成了客观下线:ODOWN
MYMASTER:主节点名称,自定义,任意写
U
192.168.206.129 7001:主节点的IP和端口
1.7ISG
06.1307001
2:选举MASTER时的QUORUM值
1.7IS
1.7SSHD
41327:X 02 APR 2023 11:53:27.616 # +VOTE-FOR-LEADER 180CSC5C56D6A61C8442909D6E59B1099FAL4BA5D9
1.7ISSHD
41327:X 02 APR 2023 11:53:27.649 # +ODOWN MASTER MYMASTER 192,168.206.130 7001 #Q
01 #QUORUM 3/2
41327:X 02 APR 2023 11:53:27.649 # NEXT FAILOVER DELAY: I WILL R
A FAILOVER BEFOR
11:55:2
NOT START A F
OK
ENS33
A5D9 192.
68#+CONFIG-UPDATE-FROM SENTINEL
41327:X 02 APR 2023 11:53:28.668# +0
180C5C5BD6461C84420E9D6E5
6.130 7001
●哨兵master自己从当前集群中的slave节点中选出一个新的master,原则是:
L D330N /901 9998020GDGGA38D3 1T3939/ZZQ1603 14/6
JOT D
11:53:27.671 # +ELECTED-LEADER MASTER MYMASTER 192.168.206.130 70
07001
2023
APR
11:53:27,671 # +FAILOVER-STATE-SELEC
APR
2023
ITE-SELECT-SLAVE MASTER MYMASTER 192.168.206.130 7001
哨兵MASTER选举新的主节点
11:53:27.729# +SELECTED-SLAVE SLAY
RE SLAVE 192.168.206.13D:7002 192.168.206.130 7002
APR
02@MYMASTER192.168.206,1307001
2023
ENE 5LAVE 192.168.206.130:7002 192.168.206.130 7002 Q NYMASTER 192,168,206.130 700
11:53:27,729
FAILOVER-ST
2023
LAVEOF-NOONE
APR
STATE-SEND
变成主节点
●现有slave节点执行slave of,服从新的master节点
+FAILOVER-STATE-WAIT-PROMOTION SLAVE 192.168.206.130:7002 192.168.206.130 7002
7002 @ MYMASTER 192.168.206.130 7001
# +PROMOTED-SLAVE SLAVE 192.1
192.168.206.130:7002 192.168.206.130 7002 MYMASTER 192.168.206.130 7001
# +FAILOVER-STATE-RECONF-SLAVES MASTER MYMASTER 192.168.206.130 7
3.206,130 7001
NT SLAVE 192,168.206.130:7003 192.168.206.130 7
+SLAVE-RECONF-SENT
MYMASTER 192.168.206.130 7001
807003
+SLAVE-RECONF-INPROG SLAVE 192.168.206.130:7003 192.168.206.130 7
192.168.206.1307
07001
7003@MYMASTER
DONE SLAVE 192.168.206.130:7003 192.168.206.130 7003 Q
+SLAVE-RECONF-DONE SLA
80 7001
192,168.206.130
@MYMASTER 1
存活的7003会执行SLAVEOF变成现有MASTER的从节点
# +FAILOVER-END MASTER MYMASTER 192.168.206.130 7001
# +SWITCH-MASTER MYMASTER 192.168.206.130 7001 192.16
.168.206.130 7002
+SLAVE SLAVE 192.168.206.130:7003 192.168.206.130
7003
@ MYMASTER 192.168.206.130 7002
+SLAVE SLAVE 192.168.206.130:7001 192.168.206.130
7001
01 @ MYMASTER 192.168.206.130 702
192.168.206.130:7001 192.168.206.130 7001 & MYMASTER 192.168.206.130 70
SLAVE
+SDOWN
●其余哨兵得到哨兵msater的选举通知
LRONMAN
LRONMAN
X
IRONMAN
X
27001-哨兵(非主节点)
40211:X 02 APR 2023 11
23 11:53:27.537 # +SDOWN MASTER MYMASTER 192.168.206.130 7001
40211:X 02 APR 2023 11:53:27.610 # +NEW-EPOCH 1
40211;X 02 APR 2023 11:53:Z7.616 # +VOTE-FOR-LEADER 180C5C5BU6461C844284420890645961099FAL48ASD9 1
40211:X 02 APR 2023 11;53;28.641 # +ODOWN NASTER MYMASTER 192,168,206,130 7001 #QUORUM 3/Z
I1:S3:28,641 # NEXT FAILOVER DALAY: I VILL NOT START A FAILOVER BEFORE SUN APR 2 11:55:28 28 2023
40211:X 02 APR 2023 11:53:28.64
002@MYMAS
6.130 7001
40211:X 02 APR 2023 11:53:28.668 # +SWITCH-MA
+SWITCH-MASTER MYMASTER 192.168.206.130 7001 192.168.206.130 7002
492 139 702 402 302 192 38,28,28- 192 192 150,206 192 192 192 139 7003 192 139 709
192.168.206.130:7001 192.168.206.130 7001 Q 7001 MYMASTER 168.206.130 7002
40211:X 02 APR 2023 11:53:33.685 # +SDOWN SLAVE 19
接收哨兵MASTER选举之后的通知,得到7002变成MASTER,7001宏机的消息
●此时我们恢复7001,会发现会做一次全量同步
3 LRONMAN
2 LRONMAN
LRONMAN
4 LRONMAN
7001恢复
JUST A PARTIAL TRANSFER.
RONIZE WITH THE NEW MASTER WITH JUST -
TO MASTER 192.168,206,130:7002
129652:S 02 APR 2023 12:04:31.709 * CONNECTING TO
`-REPLICA SYNC STARTED
129652:S 02 APR 2023 12:04:31.709 * MASTER <-> RE
OLL-0 OMEMFOT
8 EVENTSER CMD-EXEC USER-DEFAULT REDIR:-1')
B 12:04:31.714 # CONFIG REWRITE EXECUTED WITH SUCCESS,
2 APR 2023 12:
129652:S 02 A
3 12:04:31.714 * NON BLOCKING CONNECT FOR SYNC FIRED THE EVENT.
129652:S
02
2023 1
APR
312:04:31.714* MASTER REPLIED
129652
TO PING, REPLICATION CAN CONTINUE...
APR 2023 12
02
S
3 12:04+31,714 * TIYING A PARTIAL RESYNCHRONIZATION (REQUEST DC4S2253EC42503661560626ALSB64AB6AB698:D
129652
2023 12:
02
APR
S
2023 12:04:31.750 * FULL RESYNC FROM MASTER; EA6BCABBCAB990CLAD7ADF3261085C4A3CF1LF281656:195891
129652:S
02
APR
3 12:04:31.750 * DISCARDING PREVIOUSLY
ER STATE.
129652:
2023
02
APR
REPLICASYR
200 BYTES FROM MASTER TO DISK
2023 12:04:31.767*MASTER
129652:
02
APR
S
3 12:04:31.767 * MASTER <-> REPLICA SYNC: FLUSHING OLD DATA
129652:
2023 12
02
APR
3 12:04:31.768 * MASTER <-> REPLICA SYNC: LOADING DB IN MEMORY
129652:S
02
2023
APR
12:04:31.770* LOADING RDB PRODUCED BY VERSION 6.2.4.
129652:S
2023
02
APR
尝试与新的MASTER节点做数据同步
RDB AGE 0 SECONDS
APR 2023 12:31.770*******
129652:S
02
2俱是新的节点变成了7002,与当前7001的REPLILD不一致,所以做全量同步
129652:S 02 APR
2023 12:04:31.770 * RDB MEMORY USAGE WHEN CREATED 2
2:S 02 APR 2023 12:04:31.770 * MASTER <> REPLICA SYNC: FINISHED WITH
129652:
SUCCESS
●新加入的节点,执行slave of服从当前master(此时是从配置文件中读取)
6
2 LRONMAN X
LRONMAN
X
3 LRONMANX
哨兵MASTER
8.619 # FFAILOVER-STATE-RECONF-SLAVES MASTER MYMASTER 192.168.206.130 7001
40774:X 02 APR 2023 11:53:28.619
+SLAVE-RECONF-SENT SLAVE 192.168.206.130:7003 192.192.168.206.130 7003 ( MYMASTER
2.168.206.130 7001
40774:X 02 APR 2023 11:53:28.667
192.1
+SLAVE-RECONF-INPROQ SLAVE 192.168.206.130:7003 192.168.206.130 7003
40774:X 02 APR 2023 11:53:29,671
192,168,206,130 7001
MYMASTE
ONE SLAVE 192.168.206.130:7003 192.168.206.130 7003
+SLAVE-RECONF-DONE SLA
192.168.206.130 7001
40774:X 02 APR 2023 11:53:29.671
MYMASTER
40774:X 02 APR 2023 11:53:29,727 # +FAIL
# +FAILOVER-END MASTER MYMASTER 192.168.206.130 7001
40774:X 02 APR 2023 11:53:29,727 # +SWITCH-MA
ER 192.168,206,130 7001 192,168,206.130 7002
IMASTER
MYMASTER 1
40774:X 02 APR 2023 11:53:29.727 * +SLAVE S
192.168.206.130:7003 192.168.206.130 7003 MYMASTER 192.168.206.130 7002
SLAVE
40774:X 02 APR 2023 11:53:29,727 * +SLAVE S
E SLAVE 192.168,206.130:7
130 7002
06.130:7001 192,168.206.130 7001 Q MYMASTER 192.168.206.130 7002
40774:X 02 APR 2023 11:53:34,736 # +SDOWN S
WN SLAVE 192.1
168,206,130:7
新加入节点,开始执行SLAVEOF变成当前集群中的从节点
40774:X 02 APR 2023 12:04:21.708
-SDOWN SLAVE 192,168,206,130:7001 192,168,206,130 7001 ( MYMASTER 192,168,206,130 7002
40774:X 02 APR 2023 12:04:31.708
ICONVERT-TO-SLAVE SLAVO 19Z, 168,296:130:730 7001 192,168,205,130 7001 ( MYMASTER 192,168,130 7002
4.搭建分片集群
4.1.集群结构
分片集群需要的节点数量较多,这里我们搭建一个最小的分片集群,包含3个master节点,每个master包含一个slave节点,结构如下
SLAVE
数据同步
MASTER
心跳
心跳
心跳
MASTER
MASTER
数据同步
数据同步
SLAVE
SLAVE
这里我们会在同一台虚拟机中开启6个redis实例,模拟分片集群,信息如下:
IP |
PORT |
角色 |
192.168.206.129 |
7001 |
master |
192.168.206.129 |
7002 |
master |
192.168.206.129 |
7003 |
master |
192.168.206.129 |
8001 |
slave |
192.168.206.129 |
8002 |
slave |
192.168.206.129 |
8003 |
slave |
4.2.准备实例和配置
停止原来的所有redis服务(哨兵也要停止),同时删除之前的7001、7002、7003这几个目录,重新创建出7001、7002、7003、8001、8002、8003目录:
在/tmp下准备一个新的redis.conf文件,内容如下:
●touch redis.conf
●vi redis.conf
[ROOT@LOCALHOST TMPL# CAT REDIS.CONF
PORT 6379
#开启集群功能
CLUSTER-ENABLED YES
在TMP路径下CAT,确认一下有下面的配置即可
集群的配置文件名称,不需要我们创建,由REDIS自己维护
CLUSTER-CONFIG-FILE /TMP/6379/NODES.CONF
#节点心跳失败的超时时间
CLUSTER-NODE-TIMEOUT 5000
#持久化文件存放目录
DIR/TMP/6379
#绑定地址(非常重要,别漏也别改)
BIND 0.0.0.0
#让REDIS后台运行
DAEMONIZE YES
#注册的实例IP
REPLICA-ANNOUNCE-IP 192.168.206.130
#保护模式
PROTECTED-MODE NO
将这个文件拷贝到每个目录下:
修改每个目录下的redis.conf,将其中的6379修改为与所在目录一致:
此时可以进到任意目录查看一下,确认是否都存在相关的配置文件
4.3.启动
因为已经配置了后台启动模式,所以可以直接启动服务:
通过ps查看状态:
发现服务都已经正常启动:
[ROOT@LOCALHOST
T TMP.
GREP
REDIS
PS -EF
REDIS-SERVER
[CLUSTER]
2362
0.0.0.0:7001
1 0 09:21
00:00:00
ROOT
[CLUSTER]
2368
1 0 09:21
00:00:00
. ?
-SERVER 0.0.0.0:7002
REDIS
ROOT
[CLUSTER]
-SERVER 0.0.0.0:7003
1 0 09:21
2374
00:00:00
REDIS
ROOT
CLUSTER]
1 0 09:21
REDIS-SERVER 0.0.0.0:8001
2380
00:00:00
ROOT
00:00:00 REDIS-SERVER 0.0.G
1 0 09:21 ?
CLUSTER
0.0.0:8002
2386
ROOT
1 0
00:00:00 REDIS-SERVER 0.0.0
09:21 ?
[CLUSTER]
.0:8003
2392
ROOT
如果要关闭所有进程,可以执行命令:
或者(推荐这种方式):
4.4.创建集群
●更多测试细节也可查看:https://www.yuque.com/xiankanpengyouquandisitiaodongtai/diods0/fzoohtlg0r8gz6cd#ecac7084
虽然服务启动了,但是目前每个服务之间都是独立的,没有任何关联。
我们需要执行命令来创建集群,在Redis5.0之前创建集群比较麻烦,5.0之后集群管理命令都集成到了redis-cli中。
1)Redis5.0之前(我们版本是之后,不适用这个)
Redis5.0之前集群命令都是用redis安装包下的src/redis-trib.rb来实现的。因为redis-trib.rb是有ruby语言编写的所以需要安装ruby环境。
然后通过命令来管理集群:
2)Redis5.0以后
我们使用的是Redis6.2.4版本,集群管理以及集成到了redis-cli中,格式如下:
命令说明:
●redis-cli --cluster或者./redis-trib.rb:代表集群操作命令
●create:代表是创建集群
●--replicas 1或者--cluster-replicas 1 :指定集群中每个master的副本个数为1,此时节点总数 ÷ (replicas + 1) 得到的就是master的数量。因此节点列表中的前n个就是master,其它节点都是slave节点,随机分配到不同master
运行后的样子:
--CLUSTER-REPLICAS 1 192.168.150.101:7001 192.168.150.101:7002
[ROOT@LOCALHOST TMP]# REDIS-CLI --CLUSTER CREATE
168.150.101:7003 192:168.150:101:8001 192:168:150:101:8002 168:150:150:15003
>>> PERFORMING HASH SLOTS ALLOCATION ON 6 NODES...
MASTER[0] -> SLOTS 0 - 5460
-> SLOTS 5461 - 10922
MASTER[1]
> SLOTS 10923 - 16383
MASTER[2]
REPLICA 192.168.150.101:8002 TO 192.168.150.101:7001
ADDING
01:8003 TO 192.168.150.101:7002
ADDING REPLICA
192.168.150.101:
192.168.150.101:8001 TO 192.168.150.101:7003
ADDING
REPLICA
ALLOCATION FOR ANTI-AFFINITY
SLAVES
TRYING TO OPTIMIZE
VVY
IN THE SAME HOST AS THEIR MASTER
[WARNING] SOME SLAVES ARE
M: F5FC58DEFBEBB957E47FB0D8327A09DC4F1678F5 192.168.150.101:7001
SLOTS:[0-5460] (5461 SLOTS) MASTER
M: AFAA70D6528FC72490EOF3F7B32731A12C126B8 192.168.150.101:7002
SLOTS:[5461-10922] (5462 SLOTS) MASTER
M: 1C00E5F9E158B169F199F15884AB43BC433B1A06 192
06 192.168.150.101:7003
33) (5461 SLOTS) MASTER
SLOTS:[10923-16383] (!
S: 7B6D5FFC9A985D614DC5AEB2EE3ABACLADFD3E22 192.168.150.101:8001
REPLICATES AFAA70D6528FC72490E0F3F7B32731A12C12C12BB8
S: 6EC60FB5AFD950A465F05C8024BF8F75D809B014 192.168.150.101:8002
REPLICATES 1C00E5F9E158B169F199F15884AB43BC433B1A06
S: 1FA6D68D590827C24C237B1C490B78E5C7FE2CA9 192.168.150.101:8003
REPLICATES F5FC58DEFBEBB957E47FBOD8327A09DC4F1678F5
CAN I SET THE ABOVE CONFIGURATION? (TVPE 'VES'
询问是否要按照上面列出的方式来创建集群?如果没问题,输入YES
S! TO ACCEPT):
这里输入yes,则集群开始创建:
NODES CONFIGURATION UPDATED
ASSIGN A DIFFERENT CONFIG
TO EACH NODE
EPOCH
SENDING
CLUSTER MEET MESSAGES TO JOIN THE CLUSTER
WAITING FOR THE CLUSTER TO JOIN
>>> PERFORMING CLUSTER CHECK (US
(USING NODE 192.168.150.101:7001)
F5FC58DEFBEBB957E47FB0D8327A09DC4F1678F5 192.168.150.101:7001
SLOTS:[0-5460] (5461 SLOTS) MASTER
1 ADDITIONAL REPLICA(S)
AFAA70D6528FC72490E0F3F7B32731A12C12C12BB8 192.168.150.101:7002
M:
SLOTS:[5461-10922] (5462 SLOTS) MASTER
1 ADDITIONAL REPLICA(S)
S: 1FA6D68D590827C24C237B1C490B78E5C7FE2CA9 192.168.150.101:8003
SLOTS: (0 SLOTS) SLAVE
REPLICATES F5FC58DEFBEBB957E47FBOD8327A09DC4F1678F5
S: 6EC60FB5AFD950A465F05C8024BF8F75D809B014 192.168.150.101:8002
SLOTS: (0 SLOTS) SLAVE
REPLICATES 1C00E5F9E158B169F199F15884AB43BC433BLA06
S: 7B6D5FFC9A985D614DC5AEB2EE3ABACLADFD3E22 192.168.150.101:8001
SLOTS: (0 SLOTS) SLAVE
LICATES AFAA70D6528FC72490E0F3F7B32731A12C12BB8
REPLICAT
M: 1C00E5F9E158B169F199F15884AB43BC433BLA06 192.168.150.101:7003
SLOTS:[10923-16383] (5461 SLOTS) MASTER
1
ADDITIONAL REPLICA(S)
UT SLOTS CONFIGURATION.
ABOUT
ALL
[OK]
NODES
AGREE
CHECK
FOR
VVV
SLOTS
OPEN
CHECK
SLOTS
VVV
COVERAGE
SLOTS
ALL
16384
[OK]
COVERED.
:0002
ON 6 NODES.
PERFORMING HASH SLOTS AL
TS ALLOCATION
MASTER[O]
5460
SLOTS
存储数据的HASH插槽
MASTER[1]
5461
SLOTS
10922
16383
MASTER[2]
SLOTS
10923
ADDING REPLICA 192,168.206.130:8002 1
192,168,206,130:7001
TO 1
ADDING REPLICA 197.168.206.130:8003
TO 192:168,206,130:7002
ADDING REPLICA 19
TO 192.168,206,130:7003
CA 192,168/206,130:8001
SLAYES ALLOCATION FOR ANTI-AFFINITY
TRYING TO OPTIMIZE
[WARNING]SOME SLAVES
AS THEIR MASTER
HOST A
AREINTHESAMEH
9FFA5F036ELF741927EEDFEE4ED68161C21E4905 192.192.168.206.130:7001
M:
主节点做插槽分配
SLOTS:[0-5460]/5461/SLOTS) MASTER
(0FE7431901FB715B8261899D08DBA501A5865DOD 192.168.206.130:7002
M:
SLOTS:[5461-10922]
(5462 SLOTS) MASTER
[1A8ABB2D724340DBCA5B8BD4BCFC99D968C6D469 192.168.206.130:7003
SLOTS:[10923-16383] (5461 SLOTS) MASTER
1446AC0C6357F5CCB24726DF6ELFA3F55LE8C47C5 192.168.206.130:8001
|REPLICATES 1A8ABB2D724340DBCA5B8BD4BCFC99D968C6D469
LA51E26ADODC783EBAB3296758840EB651143D171 192.168.206.130:8002
|REPLICATES 9FFA5F036ELF741927EEDFEE4ED68161C21E4905
3E46DAB76BD4F6D7E2526CAE495F9481A38DD137 192.168.206.130:8003
UREPLICATES OFE7431901FB715B8261899D08DBA501A5865DOD
CAN I SET THE ABOVE CONFIGURATION? (TYPE 'YES' TO ACCEPT):
通过命令可以查看集群状态(下面端口可以是集群中的任意端口都行):
0 7001 CLUSTER NODES
[ROOT@LOCALHOST TMP]# REDIS-CLI -P 700
F5FC58DEFBEBB957E47FB0D8327A09DC4F1678F5
192.168.150.101:7001E17001 MYSELF,MASTER - Q 162519145000 1 CONNECTED O-5460
192:105--50-101-101399337893 192519245 1 CON335555555553
1FA6D68D590827C24C237BLC490B78E5C7FE2CA9
7B6D5FFC9A985D614DC5AEB2EE3ABACLADFD3E22
192-168-150-101-101-3001A1261 STAVE AFA370D95528F5724999950F3J73532731A12658 0 192519145200 2 CCONECT
1C00E5F9E158B169F199F15884AB43BC433BLA06 192.168.150.101:7003E17003 MASTER
0 1625191452351 3 CONNECTED 10923-16383
其中的映射关系分析如下图
[ROOTQLOCALHOST TMP]# REDIS-CLI -P 7001 CLUSTER NODES
映射关系这样找
192.168.206.130:7001@17001 MYSELF,MASTER - 0 1680419357000 1 CONN
0001 CONNECTED 0-5460
9FFA5F036E1F741927EEDFEE4ED68161C21E4905 192
55 192, 198, 205, 130: 1301800L SLAVE LABA59353330DBCA558855855CT(995835836D+69 0 1560413358505 3 CO
46AC0C6357F5CCB24726DF6E1FA3F551E8C47C5
LABABB2D724340DBCA5B8BD4BCFC99D968C6D469 192.168.206.130:7003017003
3MASTER-01680419357000
10923-16383
CONNECTED
8002
109.
得到完整分片集群的架构端口映射关系
7001
7002
7003
8003
8001
呈图
4.5.测试
尝试连接7001节点,存储一个数据:
Shell
运行代码复制代码
1
2
3
4
5
6
7
8
# 连接
redis-cli -p 7001
# 存储数据
set num 123
# 读取数据
get num
# 再次存储
set a 1
结果悲剧了:
[ROOT@LOCALHOST TMP]# REDIS-CLI -P 70
7001
127.0.0.1:7001> SET NUM 123
OK
127.0.0.1:7001> GET NUM
"123"
127.0.0.1:7001> SET A 1
(ERROR)
MOVED
15495 192.168.150.101:7003
127.0.0.1:7001>
集群操作时,需要给redis-cli加上-c参数才可以:
Shell
运行代码复制代码
1
redis-cli -c -p 7001
这次可以了:
[ROOT@LOCALHOST TMP]
#[A
REDIS-CLI -C -P 7001
127.0.0.1:7001>
127.0.0.1:7001>
127.0.0.1:7001> GET NUM
"123
127.0.0.1:7001> SET A 1
REDIRECTED TO SLOT [15495] LOCATED AT 192.168.150.101:7003
OK
192.168.150.101:7003>
GET A
1"
192.168.150.101:7003>