Java小强个人技术博客站点    手机版
当前位置: 首页 >> 软件 >> Centos7上Redis主从集群

Centos7上Redis主从集群

25522 软件 | 2022-1-25

REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。

Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。

Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。


# 删除旧的,避免配置干扰
rm -rf 7001 7002 7003
# 创建目录
mkdir 7001 7002 7003 8001 8002 8003


准备一个新的redis.conf文件,内容如下:

port 6379
# 开启集群功能
cluster-enabled yes
# 集群的配置文件名称,不需要我们创建,由redis自己维护
cluster-config-file /root/redis/6379/nodes.conf
# 节点心跳失败的超时时间
cluster-node-timeout 5000
# 持久化文件存放目录
dir /root/redis/6379
# 绑定地址
bind 0.0.0.0
# 让redis后台运行
daemonize yes
# 注册的实例ip
replica-announce-ip 192.168.3.22
# 保护模式
protected-mode no
# 数据库数量
databases 1
# 日志
logfile /root/redis/6379/run.log


将这个文件拷贝到每个目录下:

echo 7001 7002 7003 8001 8002 8003 | xargs -t -n 1 cp redis.conf


修改每个目录下的redis.conf,将其中的6379修改为与所在目录一致

printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t sed -i 's/6379/{}/g' {}/redis.conf


启动服务

printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t redis-server /root/redis/{}/redis.conf
ps -ef | grep redis


关闭所有进程,可以执行命令:

ps -ef | grep redis | awk '{print $2}' | xargs kill
# 或者(推荐这种方式)
printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t redis-cli -p {} shutdown


Redis5.0以后,集群管理以及集成到了redis-cli中,格式如下:

redis-cli --cluster create --cluster-replicas 1 192.168.3.22:7001 192.168.3.22:7002 192.168.3.22:7003 192.168.3.22:8001 192.168.3.22:8002 192.168.3.22:8003

命令说明:

- `redis-cli --cluster`:代表集群操作命令

- `create`:代表是创建集群

- `--replicas 1`或者`--cluster-replicas 1` :指定集群中每个master的副本个数为1,此时`节点总数 ÷ (replicas + 1)` 得到的就是master的数量。因此节点列表中的前n个就是master,其它节点都是slave节点,随机分配到不同master。

输出内容为redis即将分配的节点信息,输入yes进行下一步

>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.3.22:8002 to 192.168.3.22:7001
Adding replica 192.168.3.22:8003 to 192.168.3.22:7002
Adding replica 192.168.3.22:8001 to 192.168.3.22:7003
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: e332154d4c091ebe757e32931e03d11c3005a342 192.168.3.22:7001
   slots:[0-5460] (5461 slots) master
M: 454222018bec479ffc33209296287ad95cbd8f30 192.168.3.22:7002
   slots:[5461-10922] (5462 slots) master
M: 248616ebb7959cda67dc975282ee81c56eb26d18 192.168.3.22:7003
   slots:[10923-16383] (5461 slots) master
S: 0e4edb04379ca7fd152c89de72229ebb77030673 192.168.3.22:8001
   replicates e332154d4c091ebe757e32931e03d11c3005a342
S: c757128a130008a4d92a47322b48ca9745613ecb 192.168.3.22:8002
   replicates 454222018bec479ffc33209296287ad95cbd8f30
S: 431d6bc41d9a105720d338dec227835d556d22b2 192.168.3.22:8003
   replicates 248616ebb7959cda67dc975282ee81c56eb26d18
Can I set the above configuration? (type 'yes' to accept):

然后看到redis的插槽分配情况

>>> 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 192.168.3.22:7001)
M: e332154d4c091ebe757e32931e03d11c3005a342 192.168.3.22:7001
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 431d6bc41d9a105720d338dec227835d556d22b2 192.168.3.22:8003
   slots: (0 slots) slave
   replicates 248616ebb7959cda67dc975282ee81c56eb26d18
M: 454222018bec479ffc33209296287ad95cbd8f30 192.168.3.22:7002
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: c757128a130008a4d92a47322b48ca9745613ecb 192.168.3.22:8002
   slots: (0 slots) slave
   replicates 454222018bec479ffc33209296287ad95cbd8f30
S: 0e4edb04379ca7fd152c89de72229ebb77030673 192.168.3.22:8001
   slots: (0 slots) slave
   replicates e332154d4c091ebe757e32931e03d11c3005a342
M: 248616ebb7959cda67dc975282ee81c56eb26d18 192.168.3.22:7003
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.


查看集群状态

redis-cli -p 7001 cluster nodes

输出:

431d6bc41d9a105720d338dec227835d556d22b2 192.168.3.22:8003@18003 slave 248616ebb7959cda67dc975282ee81c56eb26d18 0 1643112653189 3 connected
e332154d4c091ebe757e32931e03d11c3005a342 192.168.3.22:7001@17001 myself,master - 0 1643112651000 1 connected 0-5460
454222018bec479ffc33209296287ad95cbd8f30 192.168.3.22:7002@17002 master - 0 1643112653081 2 connected 5461-10922
c757128a130008a4d92a47322b48ca9745613ecb 192.168.3.22:8002@18002 slave 454222018bec479ffc33209296287ad95cbd8f30 0 1643112654273 2 connected
0e4edb04379ca7fd152c89de72229ebb77030673 192.168.3.22:8001@18001 slave e332154d4c091ebe757e32931e03d11c3005a342 0 1643112652111 1 connected
248616ebb7959cda67dc975282ee81c56eb26d18 192.168.3.22:7003@17003 master - 0 1643112653000 3 connected 10923-16383


集群操作时,需要给`redis-cli`加上`-c`参数才可以

redis-cli -c -p 7001


当我们放入一个值时,控制台会自动切换到存放值的节点,比如:

[root@localhost redis]# redis-cli -c -p 7001
127.0.0.1:7001> set z z
-> Redirected to slot [8157] located at 192.168.3.22:7002
OK
192.168.3.22:7002>

可以看到因为这个值放入到7002了,所以控制台也跟着进行了切换。



集群时无需再进行配置哨兵模式,集群会进行自动故障转移

如下7002停机时8002上升为master,7002启动后自动添加为8002的从节点

监控节点状态:

watch redis-cli -p 7001 cluster nodes

新开窗口执行7002的停机和重新启动

QQ截图20220125213140.jpg


QQ截图20220125213235.jpg

推荐您阅读更多有关于“ 集群 CentOS redis 主从 哨兵 ”的文章

上一篇:Centos7上Redis主从集群,增加节点 下一篇:Centos7配置Redis哨兵

猜你喜欢

发表评论:

评论:

回复 Java小强 评论于 2022-01-25 22:06
开放防火墙
firewall-cmd --zone=public --add-port=7001/tcp --permanent
firewall-cmd --zone=public --add-port=7002/tcp --permanent
firewall-cmd --zone=public --add-port=7003/tcp --permanent
firewall-cmd --zone=public --add-port=8001/tcp --permanent
firewall-cmd --zone=public --add-port=8002/tcp --permanent
firewall-cmd --zone=public --add-port=8003/tcp --permanent
firewall-cmd --reload
回复 Java小强 评论于 2022-01-25 20:25
散列插槽
Redis会把每一个master节点映射到0~16383共16384个插槽(hash slot)上,查看集群信息时就能看到:
数据key不是与节点绑定,而是与插槽绑定。redis会根据key的有效部分计算插槽值,分两种情况:
key中包含"{}",且“{}”中至少包含1个字符,“{}”中的部分是有效部分
key中不包含“{}”,整个key都是有效部分
例如:key是num,那么就根据num计算,如果是{javacui}num,则根据javacui计算。计算方式是利用CRC16算法得到一个hash值,然后对16384取余,得到的结果就是slot值。