【Linux基础服务教程】Redis分片集群

一、关于分片集群

redis 3.x版本后开始支持
1.提高缓存数据读写速度
2.提高缓存数据的可用性、可靠性

1.工作原理

  • Redis集群使用哈希槽slot进行数据分片
  • Redis集群有16384哈希槽, 每个key通过CRC16校验后对16384取模来决定放置哪个槽, 集群的每个节点负责一部分hash槽

举个例子:
比如当前集群有3个节点。
那么:
节点 A 包含05500号哈希槽。
节点 B 包含550111000号哈希槽。
节点 C 包含1100116384号哈希槽。
数据究竟存放到哪个槽上?
数据做hash运算除以16384除余

redis01

二、部署Redis分片集群

1.环境描述

10.10.10.128 3集群模式实例 端口:700170027003
10.10.10.129 3集群模式实例 端口:700470057006

2.关闭防火墙、SElinux、同步时间

过程省略,时间一定要同步,否则会出现脑裂问题

3.二台服务器安装Redis

点我跳转Redis的安装教程

4.在第一台服务器上创建3个实例

[root@master ~]# mkdir -p /opt/700{1,2,3}/{conf,data}

[root@master ~]# cp  /usr/local/redis/conf/redis.conf /opt/7001/conf

A.修改配置文件

[root@master ~]# vim /opt/7001/conf/redis.conf

bind 10.10.10.128	#按照规划,更改为本机IP
port 7001	#按照规划,更改相应端口
daemonize yes	#启用后台运行
pidfile /var/run/redis_7001.pid	#按照规划,修改pid命名规则,方便后续区分
loglevel warning	#默认日志等级太低,修改高等级
logfile "/var/log/redis_7001.log"	#指定日志存放目录,并且为了区分加上相应的端口号
dbfilename dump_7001.rdb	#为了方便区分数据文件,修改命名规则
dir /opt/7001/data	#按照规划,修改默认数据文件存放目录
appendonly yes	#启动aof日志
appendfilename "appendonly_7001.aof"	#为了区分aof日志,修改命名规则

cluster-enabled yes	#启用集群模式
cluster-config-file nodes-7001.conf	#启动集群配置文件,为了方便区分,并修改命名规则
cluster-node-timeout 15000	#启用超时时间(单位毫秒),超过限定时间,则判定对面已挂掉

B.修改另外2个实例的配置文件

[root@master ~]# cp /opt/7001/conf/redis.conf /opt/7002/conf/
[root@master ~]# cp /opt/7001/conf/redis.conf /opt/7003/conf/	#快速拷贝修改好的配置文件
[root@master ~]# sed -ri 's|7001|7002|g' /opt/7002/conf/redis.conf 
[root@master ~]# sed -ri 's|7001|7003|g' /opt/7003/conf/redis.conf	#可以使用sed命令快速修改端口信息

C.启动第一台上的三个实例

[root@master ~]# redis-server /opt/7001/conf/redis.conf 
[root@master ~]# redis-server /opt/7002/conf/redis.conf 
[root@master ~]# redis-server /opt/7003/conf/redis.conf

D.可以使用netstat查看是否启动

如果提示没有netstat命令,可以使用yum install -y net-tools安装

[root@master ~]# netstat -tunlp | grep redis
tcp        0      0 10.10.10.128:17001      0.0.0.0:*               LISTEN      7474/redis-server 1 
tcp        0      0 10.10.10.128:17002      0.0.0.0:*               LISTEN      7479/redis-server 1 
tcp        0      0 10.10.10.128:17003      0.0.0.0:*               LISTEN      7484/redis-server 1 
tcp        0      0 10.10.10.128:7001       0.0.0.0:*               LISTEN      7474/redis-server 1 
tcp        0      0 10.10.10.128:7002       0.0.0.0:*               LISTEN      7479/redis-server 1 
tcp        0      0 10.10.10.128:7003       0.0.0.0:*               LISTEN      7484/redis-server 1

可以看到,除了我们创建好了三个实例redis还会自动创建一个端口+10000端口的进程,这个进程主要用于后续集群环境,内部互相通信,其中一个作用是:互相检测存活状态。

5.在第二台服务器上创建三个实例

如果没有tree命令,可以使用yum install -y tree安装

A.创建必要的数据目录

[root@node1 ~]# mkdir -p /opt/700{4,5,6}/{conf,data}
[root@node1 ~]# tree /opt
/opt
├── 7004
│   ├── conf
│   └── data
├── 7005
│   ├── conf
│   └── data
└── 7006
    ├── conf
    └── data

B.修改配置文件

[root@master ~]# scp /opt/7001/conf/redis.conf root@10.10.10.129:/opt/7004/conf
redis.conf                                                    100%   62KB   7.6MB/s   00:00		#可以回到第一个服务器上,快速拷贝配置文件
[root@master ~]# scp /opt/7001/conf/redis.conf root@10.10.10.129:/opt/7005/conf
redis.conf                                                    100%   62KB   6.2MB/s   00:00    
[root@master ~]# scp /opt/7001/conf/redis.conf root@10.10.10.129:/opt/7006/conf
redis.conf                                                    100%   62KB   8.6MB/s   00:00

可以使用sed命令,快速修改IP地址,这里使用了sed内的正则反向引用
关于sed命令反向引用:https://www.wsjj.top/archives/81

[root@node1 ~]# sed -ri 's|(10.10.10.)128|\1129|g' /opt/7004/conf/redis.conf
[root@node1 ~]# sed -ri 's|(10.10.10.)128|\1129|g' /opt/7005/conf/redis.conf 
[root@node1 ~]# sed -ri 's|(10.10.10.)128|\1129|g' /opt/7006/conf/redis.conf
[root@node1 ~]# sed -ri 's|7001|7004|g' /opt/7004/conf/redis.conf	#可以使用sed命令快速改文件内端口
[root@node1 ~]# sed -ri 's|7001|7005|g' /opt/7005/conf/redis.conf
[root@node1 ~]# sed -ri 's|7001|7006|g' /opt/7006/conf/redis.conf

C.启动第二台服务器上的三个实例

[root@node1 ~]# redis-server /opt/7004/conf/redis.conf 
[root@node1 ~]# redis-server /opt/7005/conf/redis.conf 
[root@node1 ~]# redis-server /opt/7006/conf/redis.conf

D.检查实例是否启动

如果提示没有netstat命令,可以使用yum install -y net-tools安装

[root@node1 ~]# netstat -tunlp | grep redis
tcp        0      0 10.10.10.129:17004      0.0.0.0:*               LISTEN      2730/redis-server 1 
tcp        0      0 10.10.10.129:17005      0.0.0.0:*               LISTEN      2748/redis-server 1 
tcp        0      0 10.10.10.129:17006      0.0.0.0:*               LISTEN      2743/redis-server 1 
tcp        0      0 10.10.10.129:7004       0.0.0.0:*               LISTEN      2730/redis-server 1 
tcp        0      0 10.10.10.129:7005       0.0.0.0:*               LISTEN      2748/redis-server 1 
tcp        0      0 10.10.10.129:7006       0.0.0.0:*               LISTEN      2743/redis-server 1

三、创建Redis分片集群

1.创建集群

[root@node1 ~]# redis-cli --cluster create \
> 10.10.10.128:7001 \
> 10.10.10.128:7002 \
> 10.10.10.128:7003 \
> 10.10.10.129:7004 \
> 10.10.10.129:7005 \
> 10.10.10.129:7006 \
> --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922		#redis会自动帮我们分配好哈希槽
Master[2] -> Slots 10923 - 16383
Adding replica 10.10.10.129:7006 to 10.10.10.128:7001
Adding replica 10.10.10.128:7003 to 10.10.10.129:7004
Adding replica 10.10.10.129:7005 to 10.10.10.128:7002
M: 6e108d11270632ca9af9202a6effb77ae11dbebe 10.10.10.128:7001	#默认随机分配主从M为主,S为从
   slots:[0-5460] (5461 slots) master
M: 3b7927dce6ad42ff2d5a24b331ee538f4dc745ff 10.10.10.128:7002
   slots:[10923-16383] (5461 slots) master
S: 17621d815c5169f30dc861c038efbe614815d602 10.10.10.128:7003
   replicates bddec0b161e908780d7e7953905322851b822b5e
M: bddec0b161e908780d7e7953905322851b822b5e 10.10.10.129:7004
   slots:[5461-10922] (5462 slots) master
S: 76ba74cdc067f05da20c86f56963ab08f539a7f8 10.10.10.129:7005
   replicates 3b7927dce6ad42ff2d5a24b331ee538f4dc745ff
S: cd7479781f15252cd3016837a398dc40761b0267 10.10.10.129:7006
   replicates 6e108d11270632ca9af9202a6effb77ae11dbebe
Can I set the above configuration? (type 'yes' to accept): yes	#如果这里选择no会重新分配主从

>>> 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 10.10.10.128:7001)
M: 6e108d11270632ca9af9202a6effb77ae11dbebe 10.10.10.128:7001
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 17621d815c5169f30dc861c038efbe614815d602 10.10.10.128:7003
   slots: (0 slots) slave
   replicates bddec0b161e908780d7e7953905322851b822b5e
M: bddec0b161e908780d7e7953905322851b822b5e 10.10.10.129:7004
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: cd7479781f15252cd3016837a398dc40761b0267 10.10.10.129:7006
   slots: (0 slots) slave
   replicates 6e108d11270632ca9af9202a6effb77ae11dbebe
M: 3b7927dce6ad42ff2d5a24b331ee538f4dc745ff 10.10.10.128:7002
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 76ba74cdc067f05da20c86f56963ab08f539a7f8 10.10.10.129:7005
   slots: (0 slots) slave
   replicates 3b7927dce6ad42ff2d5a24b331ee538f4dc745ff
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.	#成功创建集群

2.查看集群信息

[root@node1 ~]# redis-cli --cluster info 10.10.10.128:7001
10.10.10.128:7001 (6e108d11...) -> 0 keys | 5461 slots | 1 slaves.
10.10.10.129:7004 (bddec0b1...) -> 0 keys | 5462 slots | 1 slaves.
10.10.10.128:7002 (3b7927dc...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.

3.连接集群,测试读写数据

随机选择一个主节点登录即可,一定要加上-c参数,以集群模式登录!

[root@master ~]# redis-cli -h 10.10.10.128 -p 7001 -c
10.10.10.128:7001> set url https://www.wsjj.top
-> Redirected to slot [12521] located at 10.10.10.128:7002
OK
10.10.10.128:7002> get url
"https://www.wsjj.top"

以下是错误操作

不加-c参数,存储数据就会返回错误!

[root@master ~]# redis-cli -h 10.10.10.128 -p 7001
10.10.10.128:7001> set url https://www.wsjj.top
(error) MOVED 12521 10.10.10.128:7002