Redis 集群搭建

1. redis主从、哨兵功能不⾜

1.主库写压⼒太⼤
2.哨兵资源利⽤率不⾼
3.连接过程繁琐,效率低

2. 集群的重要概念

1.Redis集群,⽆论有⼏个节点,⼀共只有16384个槽位
2.所有的槽都必须被正确分配,哪怕有1个槽不正常,整个集群都不可⽤
3.每个节点的槽的顺序不重要,重要的是槽的数量
4.HASH算法⾜够平均,⾜够随机
5.每个槽被分配到数据的概率是⼤致相当的
6.集群的⾼可⽤依赖于主从复制
7.集群节点之间槽位的数量允许在2%的误差范围内
8.集群通讯会使⽤基础端⼝号+10000的端⼝,⾃动创建的,不是配置⽂件配置的,⽣产要注意的是防⽕墙注意要放开此端⼝

3. ⽬录规划

 

主节点 6380
从节点 6381

 

4. db01的操作(10.0.0.51)

 

复制代码
#1.发送SSH认证,⽅便后⾯传输
ssh-keygen
ssh-copy-id 10.0.0.52
ssh-copy-id 10.0.0.53
#2.创建⽬录
pkill redis
mkdir -p /opt/redis_{6380,6381}/{conf,logs,pid}
mkdir -p /data/redis_{6380,6381}#
3.⽣成主节点配置⽂件cat >/opt/redis_6380/conf/redis_6380.conf<<EOFbind 10.0.0.51port 6380

daemonize yes
pidfile "/opt/redis_6380/pid/redis_6380.pid"
logfile "/opt/redis_6380/logs/redis_6380.log"
dbfilename "redis_6380.rdb"
dir "/data/redis_6380/"
appendonly yes
appendfilename "redis.aof"
appendfsync everysec
cluster-enabled yes
cluster-config-file nodes_6380.conf
cluster-node-timeout 15000
EOF
===========================================================
集群配置参数:
cluster-enabled yes #打开集群模式
cluster-config-file nodes_6380.conf #集群成员间的配置文件名称
cluster-node-timeout 15000 #集群故障的时间(超过时间认为
改节点挂掉)
==========================================================
#4.复制主节点的配置⽂件到从节点并更改端⼝号
cd /opt/
cp redis_6380/conf/redis_6380.conf redis_6381/conf/redis_6381.conf
sed -i 's#6380#6381#g' redis_6381/conf/redis_6381.conf
#5.更改授权为redis
chown -R redis:redis /opt/redis_*
chown -R redis:redis /data/redis_*
#6.⽣成主节点的systemd启动⽂件
cat >/usr/lib/systemd/system/redis-master.service<<EOF
[Unit]
Description=Redis persistent key-value database
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
ExecStart=/usr/local/bin/redis-server /opt/redis_6380/conf/redis_6380.conf -
-supervised systemd
ExecStop=/usr/local/bin/redis-cli -h $(ifconfig eth0|awk 'NR==2{print$2}') -
p 6380 shutdown
Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target
EOF
#7.复制master节点的启动⽂件给slave节点并修改端⼝号
cd /usr/lib/systemd/system/
cp redis-master.service redis-slave.service
sed -i 's#6380#6381#g' redis-slave.service

#8.重载并启动集群节点
systemctl daemon-reload
systemctl start redis-master
systemctl start redis-slave
ps -ef|grep redis
[root@db01 /usr/lib/systemd/system20:18:30]# ps -ef|grep redis
redis 8007 1 1 20:18 ? 00:00:00 /usr/local/bin/redisserver 10.0.0.51:6380 [cluster]
redis 8017 1 0 20:18 ? 00:00:00 /usr/local/bin/redisserver 10.0.0.51:6381 [cluster]
root 8022 7886 0 20:18 pts/0 00:00:00 grep --color=auto redis
#9.把创建好的⽬录和启动⽂件发送给db02和db03
rsync -avz /opt/redis_638* 10.0.0.52:/opt/
rsync -avz /opt/redis_638* 10.0.0.53:/opt/
rsync -avz /usr/lib/systemd/system/redis-*.service
10.0.0.52:/usr/lib/systemd/system/
rsync -avz /usr/lib/systemd/system/redis-*.service
10.0.0.53:/usr/lib/systemd/system/

复制代码

 

5. db02的操作(10.0.0.52)

 

复制代码
#1.替换db01发送过来的⽂件并修改IP地址
pkill redis
find /opt/redis_638* -type f -name "*.conf"|xargs sed -i "/bind/s#51#52#g"
cd /usr/lib/systemd/system/
sed -i 's#51#52#g' redis-*.service
mkdir –p /data/redis_{6380,6381}
chown -R redis:redis /opt/redis_*
chown -R redis:redis /data/redis_*
systemctl daemon-reload
systemctl start redis-master
systemctl start redis-slave
ps -ef|grep redis
[root@db02 /usr/lib/systemd/system20:22:47]# ps -ef|grep redis
redis 7918 1 0 20:22 ? 00:00:00 /usr/local/bin/redisserver 10.0.0.52:6380 [cluster]
redis 7928 1 0 20:22 ? 00:00:00 /usr/local/bin/redisserver 10.0.0.52:6381 [cluster]
root 7934 7824 0 20:23 pts/0 00:00:00 grep --color=auto redis
复制代码

 

6. db03的操作(10.0.0.53)

 

复制代码
#1.替换db01发送过来的⽂件并修改IP地址
pkill redis
find /opt/redis_638* -type f -name "*.conf"|xargs sed -i "/bind/s#51#53#g"
cd /usr/lib/systemd/system/
sed -i 's#51#53#g' redis-*.service
mkdir –p /data/redis_{6380,6381}
chown -R redis:redis /opt/redis_*
chown -R redis:redis /data/redis_*
systemctl daemon-reload
systemctl start redis-master # 启动顺序不要错了,需要先启动主节点再启动从节点
systemctl start redis-slave
ps -ef|grep redis
[root@db03 /usr/lib/systemd/system20:25:48]# ps -ef|grep redis
redis 7675 1 0 20:25 ? 00:00:00 /usr/local/bin/redisserver 10.0.0.53:6380 [cluster]
redis 7685 1 3 20:25 ? 00:00:00 /usr/local/bin/redisserver 10.0.0.53:6381 [cluster]
root 7690 7581 0 20:25 pts/0 00:00:00 grep --color=auto redis
复制代码

 

7. 集群⼿动发现节点

 

复制代码
redis-cli -h 10.0.0.51 -p 6380 CLUSTER MEET 10.0.0.52 6380
redis-cli -h 10.0.0.51 -p 6380 CLUSTER MEET 10.0.0.53 6380
redis-cli -h 10.0.0.51 -p 6380 CLUSTER MEET 10.0.0.51 6381
redis-cli -h 10.0.0.51 -p 6380 CLUSTER MEET 10.0.0.52 6381
redis-cli -h 10.0.0.51 -p 6380 CLUSTER MEET 10.0.0.53 6381
redis-cli -h 10.0.0.51 -p 6380 CLUSTER NODES
#1.查看集群成员信息:(只有一个自己)
[root@db01 /usr/lib/systemd/system20:20:29]# redis-cli -h 10.0.0.51 -p 6380
CLUSTER NODES
42551e582a59ca3ee53b6b674af2ad166dad302a :6380@16380 myself,master - 0 0 0
connected
#2:执行redis-cli -h 10.0.0.51 -p 6380 CLUSTER MEET 10.0.0.51 6381 (发现两个集
群成员6380,6381)
[root@db01 /data/redis_638020:39:41]# redis-cli -h 10.0.0.51 -p 6380 CLUSTER
MEET 10.0.0.51 6381
OK
[root@db01 /data/redis_638020:40:53]# redis-cli -h 10.0.0.51 -p 6380 CLUSTER
NODES
42551e582a59ca3ee53b6b674af2ad166dad302a 10.0.0.51:6380@16380 myself,master
- 0 0 1 connected
8ccf1cb20a47fd581d564dbe66154947a3015031 10.0.0.51:6381@16381 master - 0
1614170470761 0 connected
#3.执行以下4条命令发现6个集群成员
redis-cli -h 10.0.0.51 -p 6380 CLUSTER MEET 10.0.0.52 6380
redis-cli -h 10.0.0.51 -p 6380 CLUSTER MEET 10.0.0.53 6380
redis-cli -h 10.0.0.51 -p 6380 CLUSTER MEET 10.0.0.52 6381
redis-cli -h 10.0.0.51 -p 6380 CLUSTER MEET 10.0.0.53 6381
[root@db01 /data/redis_638020:43:00]# redis-cli -h 10.0.0.51 -p 6380 CLUSTER
NODES
42551e582a59ca3ee53b6b674af2ad166dad302a 10.0.0.51:6380@16380 myself,master
- 0 1614170590000 1 connected
25f97ef17fab381ae6801182a88e74d0194dd6d7 10.0.0.53:6381@16381 master - 0
1614170590000 4 connected
1d631fd86e78b005ad42882c6a251f41c74e4079 10.0.0.52:6381@16381 master - 0
1614170592683 5 connected
8c31fa4ab1cab41916c23867e61ce4b8367d0778 10.0.0.52:6380@16380 master - 0
1614170592000 3 connected
8ccf1cb20a47fd581d564dbe66154947a3015031 10.0.0.51:6381@16381 master - 0
1614170593714 2 connected

d935faaafa5962a24f0f12a8b95fbdd501732a89 10.0.0.53:6380@16380 master - 0
1614170591658 0 connected

复制代码

 

8.集群⼿动分配槽位

 

复制代码
1. 槽位规划(节点总共16384个槽)
16384/3(节点)=5461 余1 所以db03就5462个,其它都是5461个
db01:6380 5461 0-5460
db02:6380 5461 5461-10921
db03:6380 5462 10922-16383
2. 分配槽位
redis-cli -h 10.0.0.51 -p 6380 CLUSTER ADDSLOTS {0..5460}
redis-cli -h 10.0.0.52 -p 6380 CLUSTER ADDSLOTS {5461..10921}
redis-cli -h 10.0.0.53 -p 6380 CLUSTER ADDSLOTS {10922..16383}
[root@db01 ~20:51:53]# redis-cli -h 10.0.0.51 -p 6380 CLUSTER ADDSLOTS
{0..5460}
OK
[root@db01 ~20:52:23]# redis-cli -h 10.0.0.52 -p 6380 CLUSTER ADDSLOTS
{5461..10921}
OK
[root@db01 ~20:52:23]# redis-cli -h 10.0.0.53 -p 6380 CLUSTER ADDSLOTS
{10922..16383}
OK
3. 查看集群状态
#1.这时集群对应节点标示出多少个槽
[root@db01 ~20:52:25]# redis-cli -h 10.0.0.51 -p 6380 CLUSTER NODES
42551e582a59ca3ee53b6b674af2ad166dad302a 10.0.0.51:6380@16380 myself,master
- 0 1614171204000 1 connected 0-5460
25f97ef17fab381ae6801182a88e74d0194dd6d7 10.0.0.53:6381@16381 master - 0
1614171202000 4 connected
1d631fd86e78b005ad42882c6a251f41c74e4079 10.0.0.52:6381@16381 master - 0
1614171202000 5 connected
8c31fa4ab1cab41916c23867e61ce4b8367d0778 10.0.0.52:6380@16380 master - 0
1614171204470 3 connected 5461-10921
8ccf1cb20a47fd581d564dbe66154947a3015031 10.0.0.51:6381@16381 master - 0
1614171202421 2 connected
d935faaafa5962a24f0f12a8b95fbdd501732a89 10.0.0.53:6380@16380 master - 0
1614171203446 0 connected 10922-16383
#2.检查集群状态情况
[root@db01 ~20:53:25]# redis-cli -h 10.0.0.51 -p 6380 CLUSTER INFO
cluster_state:ok #显示OK ,表示正常
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:5
cluster_my_epoch:1
cluster_stats_messages_ping_sent:849
cluster_stats_messages_pong_sent:820
cluster_stats_messages_meet_sent:5
cluster_stats_messages_sent:1674
cluster_stats_messages_ping_received:820
cluster_stats_messages_pong_received:854
cluster_stats_messages_received:1674
复制代码

 

9.⼿动分配复制关系

 

 

复制代码
1.先获取集群节点信息
[root@db01 ~20:52:25]# redis-cli -h 10.0.0.51 -p 6380 CLUSTER NODES
42551e582a59ca3ee53b6b674af2ad166dad302a 10.0.0.51:6380@16380 myself,master -
0 1614171204000 1 connected 0-5460
25f97ef17fab381ae6801182a88e74d0194dd6d7 10.0.0.53:6381@16381 master - 0
1614171202000 4 connected
1d631fd86e78b005ad42882c6a251f41c74e4079 10.0.0.52:6381@16381 master - 0
1614171202000 5 connected
8c31fa4ab1cab41916c23867e61ce4b8367d0778 10.0.0.52:6380@16380 master - 0
1614171204470 3 connected 5461-10921
8ccf1cb20a47fd581d564dbe66154947a3015031 10.0.0.51:6381@16381 master - 0
1614171202421 2 connected
d935faaafa5962a24f0f12a8b95fbdd501732a89 10.0.0.53:6380@16380 master - 0
1614171203446 0 connected 10922-16383
2. 过滤删除不必要的信息(做主从复制,只需要主库信息,即6380)
42551e582a59ca3ee53b6b674af2ad166dad302a 10.0.0.51:6380@16380
8c31fa4ab1cab41916c23867e61ce4b8367d0778 10.0.0.52:6380@16380
d935faaafa5962a24f0f12a8b95fbdd501732a89 10.0.0.53:6380@16380
4. 配置主从复制关系 (登录从库+CLUSTER REPLICATE+主库的ID号)
#a. 51的6381 复制52的6380
#b. 52的6381 复制53的6380
#c. 53的6381 复制51的6380
#集群(CLUSTER) 复制(REPLICATE)
redis-cli -h 10.0.0.51 -p 6381 CLUSTER REPLICATE db02的6380的ID
redis-cli -h 10.0.0.52 -p 6381 CLUSTER REPLICATE db03的6380的ID
redis-cli -h 10.0.0.53 -p 6381 CLUSTER REPLICATE db01的6380的ID
redis-cli -h 10.0.0.51 -p 6381 CLUSTER REPLICATE
8c31fa4ab1cab41916c23867e61ce4b8367d0778
redis-cli -h 10.0.0.52 -p 6381 CLUSTER REPLICATE
d935faaafa5962a24f0f12a8b95fbdd501732a89
redis-cli -h 10.0.0.53 -p 6381 CLUSTER REPLICATE
42551e582a59ca3ee53b6b674af2ad166dad302a
[root@db01 ~21:22:42]# redis-cli -h 10.0.0.51 -p 6381 CLUSTER REPLICATE
8c31fa4ab1cab41916c23867e61ce4b8367d0778
OK
[root@db01 ~21:22:45]# redis-cli -h 10.0.0.52 -p 6381 CLUSTER REPLICATE
d935faaafa5962a24f0f12a8b95fbdd501732a89
2ad166dad302aOK
[root@db01 ~21:22:45]# redis-cli -h 10.0.0.53 -p 6381 CLUSTER REPLICATE
42551e582a59ca3ee53b6b674af2ad166dad302a
OK
5. 检查复制关系
#再次查看时,可以看到3个主,3个从(没做主从之前是6个主)
[root@db01 ~21:22:47]# redis-cli -h 10.0.0.51 -p 6380 CLUSTER NODES
42551e582a59ca3ee53b6b674af2ad166dad302a 10.0.0.51:6380@16380 myself,master -
0 1614173011000 1 connected 0-5460
25f97ef17fab381ae6801182a88e74d0194dd6d7 10.0.0.53:6381@16381 slave
42551e582a59ca3ee53b6b674af2ad166dad302a 0 1614173013285 4 connected
1d631fd86e78b005ad42882c6a251f41c74e4079 10.0.0.52:6381@16381 slave
d935faaafa5962a24f0f12a8b95fbdd501732a89 0 1614173011000 5 connected
8c31fa4ab1cab41916c23867e61ce4b8367d0778 10.0.0.52:6380@16380 master - 0
1614173012274 3 connected 5461-10921
8ccf1cb20a47fd581d564dbe66154947a3015031 10.0.0.51:6381@16381 slave
8c31fa4ab1cab41916c23867e61ce4b8367d0778 0 1614173011261 3 connected
d935faaafa5962a24f0f12a8b95fbdd501732a89 10.0.0.53:6380@16380 master - 0
1614173010251 0 connected 10922-16383
复制代码

 

10.redis集群部署步骤

 

复制代码
#1.安装部署集群节点
#2.启动所有节点
#3.成员之间互相发现
redis-cli -h 10.0.0.51 -p 6380 CLUSTER MEET 10.0.0.52 6380
redis-cli -h 10.0.0.51 -p 6380 CLUSTER MEET 10.0.0.53 6380
redis-cli -h 10.0.0.51 -p 6380 CLUSTER MEET 10.0.0.51 6381
redis-cli -h 10.0.0.51 -p 6380 CLUSTER MEET 10.0.0.52 6381
redis-cli -h 10.0.0.51 -p 6380 CLUSTER MEET 10.0.0.53 6381
#4.分配槽位
redis-cli -h 10.0.0.51 -p 6380 CLUSTER ADDSLOTS {0..5460}
redis-cli -h 10.0.0.52 -p 6380 CLUSTER ADDSLOTS {5461..10921}
redis-cli -h 10.0.0.53 -p 6380 CLUSTER ADDSLOTS {10922..16383}
#5.确定复制关系
redis-cli -h 10.0.0.51 -p 6380 CLUSTER NODES
7c9908b6c901d9c056df958b69f22d4ea2bea783 10.0.0.51:6380
1536ba9a29723f43bcae46bfa885159197cf3241 10.0.0.53:6380
08de8f835db91a4eff242aaa7c29b91691b8b2e8 10.0.0.52:6380
redis-cli -h 10.0.0.51 -p 6381 CLUSTER REPLICATE db02的6380的ID
redis-cli -h 10.0.0.52 -p 6381 CLUSTER REPLICATE db03的6380的ID
redis-cli -h 10.0.0.53 -p 6381 CLUSTER REPLICATE db01的6380的ID
redis-cli -h 10.0.0.51 -p 6381 CLUSTER REPLICATE
8c31fa4ab1cab41916c23867e61ce4b8367d0778
redis-cli -h 10.0.0.52 -p 6381 CLUSTER REPLICATE
d935faaafa5962a24f0f12a8b95fbdd501732a89
redis-cli -h 10.0.0.53 -p 6381 CLUSTER REPLICATE
42551e582a59ca3ee53b6b674af2ad166dad302a
复制代码

 

posted @   Linux运维-Friend  阅读(88)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示