警告
本文最后更新于 2022-05-27 00:25,文中内容可能已过时。
1.安装redis 1
2
3
4
5
6
7
8
yum install -y gcc-c++
wget http://download.redis.io/releases/redis-5.0.5.tar.gz
tar xf redis-5.0.5.tar.gz -C /server
cd /server/redis-5.0.5
make
mkdir /usr/local/redis/{ etc,log} -p
make install PREFIX = /usr/local/redis
cp redis.conf sentinel.conf /usr/local/redis/etc/
修改环境变量
1
2
3
4
vim /etc/profile
export PATH = $PATH :/usr/local/redis/bin
source /etc/profile
2.redis模板配置文件 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
cat redis.conf.tpl >EOF
daemonize yes
port 7000
dir /usr/local/redis
dbfilename "7000.rdb"
cluster-enabled yes
cluster-config-file "/usr/local/redis/etc/redis-cluster-7000.conf"
cluster-node-timeout 50000
# 这个参数为no 表示当集群中一个节点故障时,集群整体可用,只有存在故障节点的数据不能查询写入
cluster-require-full-coverage no
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
bind 0.0.0.0
protected-mode no
save ""
appendonly no
logfile "/usr/local/redis/log/7000.log"
EOF
client-output-buffer-limit 参数含义:
Redis为了解决输出缓冲区消息大量堆积的隐患,设置了一些保护机制,主要采用两种限制措施:
大小限制,当某一客户端缓冲区超过设定值后直接关闭连接;
持续性限制,当某一客户端缓冲区持续一段时间占用过大空间时关闭连接。
后面三个参数分别表示 最大限制 最小限制 最小限制的持续时间
不同客户端有不同策略,策略如下:
对于普通客户端来说,限制为0,也就是不限制。因为普通客户端通常采用阻塞式的消息应答模式,何谓阻塞式呢?如:发送请求,等待返回,再发送请求,再等待返回。这种模式下,通常不会导致Redis服务器输出缓冲区的堆积膨胀; 对于Pub/Sub客户端(也就是发布/订阅模式),大小限制是32M,当输出缓冲区超过32M时,会关闭连接。持续性限制是,当客户端缓冲区大小持续60秒超过8M,则关闭客户端连接; 对于slave客户端来说,大小限制是256M,持续性限制是当客户端缓冲区大小持续60秒超过64M,则关闭客户端连接。 修改其他实例配置
1
2
for i in { 7000..7005} ; do cp redis.conf.tpl redis-$i .conf; done
for i in { 7001..7005} ; do sed -i s#7000#$i # redis-$i.conf; done
3.启动所有实例 1
for i in { 7000..7005} ; do redis-server redis-$i .conf; done
4.初始化集群 1
2
# 指定所有节点的地址,并且声明需要一个副本。最终结果是3主3从,每个主带一个从。
redis-cli --cluster create --cluster-replicas 1 10.23.40.38:7000 10.23.40.38:7001 10.23.40.38:7002 10.23.40.38:7003 10.23.40.38:7004 10.23.40.38:7005
5.测试 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[ root@localhost etc] # redis-cli -c -p 7000
127.0.0.1:7000> set name soulchild
-> Redirected to slot [ 5798] located at 10.23.40.38:7001
OK
10.23.40.38:7000> get name
-> Redirected to slot [ 5798] located at 10.23.40.38:7001
"soulchild"
# 停止7001主节点
redis-cli -p 7001 shutdown
# 查看key,可以看到已经到7005节点了
[ root@10-23-40-38 ~] # redis-cli -c -p 7000
127.0.0.1:7000> get name
-> Redirected to slot [ 5798] located at 10.23.40.38:7005
"soulchild"
6.扩容节点 配置好后启动redis,添加到集群的方法如下
1
2
3
4
5
6
7
8
# 主节点身份加入
# 第一个地址是新节点地址。第二个地址是集群中已存在的节点,可以是集群中的任意一个节点
redis-cli --cluster add-node 10.23.40.38:7006 10.23.40.38:7001
# 从节点身份加入
# --cluster-slave表示从节点身份加入
# --cluster-master-id指定跟随哪个主节点,id可以通过cluster nodes获取
redis-cli --cluster add-node 10.23.40.38:7007 10.23.40.38:7001 --cluster-slave --cluster-master-id d67d00c2741f89ddee5a17f8c0715f29690b12c2
分配槽位
后加入集群的节点是没有分配槽位的,不会有数据写到新的节点,所以需要为新节点分配槽位75807-1am09rzy4q5.png
7.删除节点 瓜分要删除节点的槽位
1
2
3
4
5
6
7
8
9
# 连接地址是集群中任意节点
# --cluster-from要瓜分哪个节点的槽位
# --cluster-to 要瓜分给谁
# --cluster-slots 要瓜分多少个
redis-cli --cluster reshard 10.23.40.38:7000 --cluster-from d67d00c2741f89ddee5a17f8c0715f29690b12c2 --cluster-to 79b6fe95c1284b8d868850e41ad01fc778030f5b --cluster-slots 1365
redis-cli --cluster reshard 10.23.40.38:7000 --cluster-from d67d00c2741f89ddee5a17f8c0715f29690b12c2 --cluster-to bc23087af4d92032f02bd096df6c663933b74938 --cluster-slots 1366
redis-cli --cluster reshard 10.23.40.38:7000 --cluster-from d67d00c2741f89ddee5a17f8c0715f29690b12c2 --cluster-to 7e333cb6b22bf0f81a6bdf72a217c9713bd319f5 --cluster-slots 1365
删除节点
1
2
# id通过cluster nodes获取
redis-cli --cluster del-node 10.23.40.38:7000 d67d00c2741f89ddee5a17f8c0715f29690b12c2
8.常用命令 cluster相关命令: https://redis.io/commands/#cluster
集群节点状态
显示格式: ip:port@cport …
集群状态