【Linux基础服务教程】Redis分片集群
一、关于分片集群
redis 3.x
版本后开始支持
1.提高缓存数据读写速度
2.提高缓存数据的可用性、可靠性
1.工作原理
Redis
集群使用哈希槽slot
进行数据分片Redis
集群有16384
个哈希槽
, 每个key
通过CRC16
校验后对16384
取模来决定放置哪个槽, 集群的每个节点负责一部分hash槽
举个例子:
比如当前集群有3
个节点。
那么:
节点A
包含0
到5500
号哈希槽。
节点B
包含5501
到11000
号哈希槽。
节点C
包含11001
到16384
号哈希槽。
数据究竟存放到哪个槽上?
数据做hash运算
除以16384
除余
二、部署Redis分片集群
1.环境描述
10.10.10.128
3
个集群模式
实例 端口:7001
、7002
、7003
10.10.10.129
3
个集群模式
实例 端口:7004
、7005
、7006
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