Redis主从加哨兵模式集群部署2

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Redis主从加哨兵模式集群部署2

3 主从复制

我们先来理解下主从同步,如下图:

1、Slave服务启动,主动连接Master,并发送SYNC命令,请求初始化同步;

2、Master收到SYNC后,执行BGSAVE命令生成RDB文件,并缓存该时间段内的写命令;

3、Master完成RDB文件后,将其发送给所有Slave服务器;

4、Slave服务器接收到RDB文件后,删除内存中旧的缓存数据,并装载RDB文件;

5、Master在发送完RDB后,即刻向所有Slave服务器发送缓存中的写命令;

我们可以用 DesktopManager 链接Redis集群,并测试数据,往redis集群添加2条数据,可以明显看到主从效果,效果如下:

上面是我们集群时随机创建的从节点,如果手动给指定节点添加从节点也是可以实现的,我们这里实现给 7001 添加一个从节点。

4 集群扩容收容

上面虽然创建了主从复制,但如果手动给节点添加一个从节点,有可能添加从节点,也有可能添加从节点,这是我们想要干的。接下来我们给集群节点添加指定的从节点。

我们安装 7007 、 7008 、 7009 几个Redis节点,然后将 7007 和 7008 作为主节点,添加到集群中, 7009 作为从节

点添加到集群中。

基于Docker安装Redis这里编写了一个脚本,安装脚本 redis-port.sh 如下:

#!/bin/bash
#在/usr/local/server/redis-cluster下生成conf和data目标,并生成配置信息
#换行
echo -e "\n"
#输入信息
read -p "请输入容器端口:" DOCKER_PORT
#输入端口赋值
port=$DOCKER_PORT;
echo -e "$port"
#创建配置文件
mkdir -p ./${port}/conf && PORT=${port} envsubst < ./redis-cluster.tmpl >
./${port}/conf/redis.conf && mkdir -p ./${port}/data;
#创建redis容器
docker run -d -it -p ${port}:${port} -p 1${port}:1${port} -v /usr/local/server/redis-
cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf -v /usr/local/server/redis-
cluster/${port}/data:/data --privileged=true --restart always --name redis-${port} --net
redis-net --sysctl net.core.somaxconn=1024 redis redis-server
/usr/local/etc/redis/redis.conf;
#查找ip
echo -n "启动$(docker inspect --format '{{ (index .NetworkSettings.Networks "redis-
net").IPAddress }}' "redis-${port}")":${port}" 成功!";
echo -e "\n"

我们执行 redis-port.sh 脚本,实现 7007,7008,7009 节点安装。

添加课执行权限:

chmod +x redis-port.sh

查看集群状态

主节点查看:

./redis-cli -p 7001 cluster nodes|grep master

主节点状态信息如下:

从节点查看:

./redis-cli -p 7001 cluster nodes|grep slave

从上面信息我们可以看出集群关系:

Master:7001 Slave:7005
Master:7002 Slave:7006
Master:7003 Slave:7004

4.1 添加集群主节点

我们需要给集群节点添加一个主节点,我们需要将 192.168.211.141:7007 节点添加到 192.168.211.141:7001 节

点所在的集群中,并且添加后作为主节点,添加命令行如下:

./redis-cli --cluster add-node 192.168.211.141:7007 192.168.211.141:7001

命令说明:

.将192.168.211.141:7007节点添加到192.168.211.141:7001节点所在的集群中

执行命令后,效果如下:

此时我们可以进入到集群节点之一查看此时的集群状态,我们进入到 7002 节点中输入 cluster node 查询,操作方法如下:

进入容器
docker exec -it redis-7002 /bin/bash
进入到redis-cli脚本目录
cd /usr/local/bin
登录7002节点
./redis-cli -p 7002 -c
查询集群状态
cluster nodes

效果如下:

4.2 哈希槽分配

从上面的集群节点信息我们可以看出一个问题,其他主节点都有一串数字范围,而刚才添加的 7007 节点没有这段数

字范围,这和Redis集群原理有关系,我们来讲解一下集群的原理,然后实现新增节点哈希槽(这段数字范围)的分配。

(Redis集群原理图)

Redis原理:

(1)Redis Cluster 特性之一是引入了槽的概念。一个redis集群包含 16384 个哈希槽。

(2)集群时,会将16384个哈希槽分别分配给每个Master节点,每个Master节点占16384个哈希槽中的一部分。

(3)执行GET/SET/DEL时,都会根据key进行操作,Redis通过CRC16算法对key进行计算得到该key所属Redis节点。

(4)根据key去指定Redis节点操作数据。

从原理上分析,因为之前 7001,7002,7003 已经瓜分了16384个哈希槽,所以再增加一个新节点是没有剩余哈希槽分配的,所以新增的 7007 节点没有分配到哈希槽。我们只能重新分配哈希槽,才能让新增节点分配到一定的哈希槽,

重新分配哈希槽后,我们还要考虑之前其他Redis节点中的数据迁移。

重新分配Hash槽

我们将 7001,7002,7003 中的 100 个哈希槽挪给 7007 ,命令如下:

./redis-cli --cluster reshard 192.168.211.141:7001 --cluster-from
c9687b2ebec8b99ee14fcbb885b5c3439c58827f,80a69bb8af3737bce2913b2952b4456430a89eb3,612e4af8ea
e48426938ce65d12a7d7376b0b37e3 --cluster-to 443096af2ff8c1e89f1160faed4f6a02235822a7 --
cluster-slots 100

命令说明:

将节点

c9687b2ebec8b99ee14fcbb885b5c3439c58827f

80a69bb8af3737bce2913b2952b4456430a89eb3

612e4af8eae48426938ce65d12a7d7376b0b37e3

中的100个哈希槽移动到

443096af2ff8c1e89f1160faed4f6a02235822a7中

参数说明:

--cluster-from:表示slot目前所在的节点的node ID,多个ID用逗号分隔
--cluster-to:表示需要新分配节点的node ID
--cluster-slots:分配的slot数量

将100个哈希槽挪给7007后,我们查询下节点信息:

效果如下:

4.3 添加集群从节点

我们需要往集群中给 7007 节点添加一个从节点 7008 ,添加从节点的主要目的是提高高可用,防止主节点宕机后该

节点无法提供服务。添加从节点命令如下:

./redis-cli --cluster add-node 192.168.211.141:7008 192.168.211.141:7007 --cluster-slave -- cluster-master-id 443096af2ff8c1e89f1160faed4f6a02235822a7

命令说明:

将192.168.211.141:7008节点添加到192.168.211.141:7007对应的集群中,并且加入的节点为从节点,对应的主节点

id是443096af2ff8c1e89f1160faed4f6a02235822a7

参数说明:

add-node: 后面的分别跟着新加入的slave和slave对应的master
cluster-slave:表示加入的是slave节点
--cluster-master-id:表示slave对应的master的node ID

执行命令后,效果如下:

集群信息查看:

4.4 缩容

1)数据迁移

2)哈希槽迁移

3)从节点删除

4)主节点删除

在真实生产环境中,我们也会跟着我们的业务和环境执行缩容处理,比如双十一过后,流量没有那么大了,我们往往

会缩容处理,服务器开销。

Redis实现缩容,需要哈希槽重新分配,将需要移除的节点所分配的所有哈希槽值分配给其他需要运行工作的节点,

还需要移除该节点的从节点,然后再删除该节点。

移除从节点

移除 7007 的从节点 7008 ,命令如下:

./redis-cli --cluster del-node 192.168.211.141:7008 98be71d8d6eff6bd40947fa0441e5a821dce20ae

参数说明:

del-node:删除节点,后面跟着slave节点的 ip:port 和node ID

删除后,我们再来查看集群节点,此时再无7008节点。

迁移Master的Slot

我们需要将 7007 节点的哈希槽迁移到 7001,7002,7003 节点上,仍然用上面用过的 redis-cli --cluster reshard

语法,命令如下:

第1次迁移:

./redis-cli --cluster reshard 192.168.211.141:7007 --cluster-from

443096af2ff8c1e89f1160faed4f6a02235822a7 --cluster-to

80a69bb8af3737bce2913b2952b4456430a89eb3 --cluster-slots 33 --cluster-yes

命令说明:

将192.168.211.141:7007节点所在集群中443096af2ff8c1e89f1160faed4f6a02235822a7节点的33个哈希槽迁移给

80a69bb8af3737bce2913b2952b4456430a89eb3节点,不回显需要迁移的slot,直接迁移。

效果如下:

查看集群节点:

我们再次迁移其他哈希槽到其他节点,将剩余的哈希槽迁移到7002和7003去。

第2次迁移:

./redis-cli --cluster reshard 192.168.211.141:7007 --cluster-from

443096af2ff8c1e89f1160faed4f6a02235822a7 --cluster-to

c9687b2ebec8b99ee14fcbb885b5c3439c58827f --cluster-slots 34 --cluster-yes

第3次迁移:

./redis-cli --cluster reshard 192.168.211.141:7007 --cluster-from

443096af2ff8c1e89f1160faed4f6a02235822a7 --cluster-to

612e4af8eae48426938ce65d12a7d7376b0b37e3 --cluster-slots 33 --cluster-yes

集群状态查询:

删除7007主节点

删除节点命令如下:

./redis-cli --cluster del-node 192.168.211.141:7007 443096af2ff8c1e89f1160faed4f6a02235822a7

效果如下:

集群节点查看:

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
4月前
|
存储 缓存 NoSQL
Redis常见面试题(二):redis分布式锁、redisson、主从一致性、Redlock红锁;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
redis分布式锁、redisson、可重入、主从一致性、WatchDog、Redlock红锁、zookeeper;Redis集群、主从复制,全量同步、增量同步;哨兵,分片集群,Redis为什么这么快,I/O多路复用模型——用户空间和内核空间、阻塞IO、非阻塞IO、IO多路复用,Redis网络模型
Redis常见面试题(二):redis分布式锁、redisson、主从一致性、Redlock红锁;Redis集群、主从复制,哨兵模式,分片集群;Redis为什么这么快,I/O多路复用模型
|
4月前
|
监控 NoSQL Redis
Redis 哨兵模式高可用
Redis 哨兵模式高可用
85 4
|
7天前
|
消息中间件 NoSQL Redis
【赵渝强老师】Redis消息的生产者消费者模式
消息队列在Redis中可通过List数据结构实现,支持发布者订阅者和生产者消费者两种模式。生产者通过`lpush`向List添加消息,消费者通过`rpop`或`brpop`消费消息,后者支持阻塞等待。示例代码展示了如何使用Redis的生产者消费者模式。
|
1月前
|
监控 NoSQL 算法
Redis Sentinel(哨兵)详解
Redis Sentinel(哨兵)详解
|
1月前
|
存储 缓存 NoSQL
大数据-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等
大数据-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等
60 4
|
1月前
|
存储 NoSQL 大数据
大数据-51 Redis 高可用方案CAP-AP 主从复制 一主一从 全量和增量同步 哨兵模式 docker-compose测试
大数据-51 Redis 高可用方案CAP-AP 主从复制 一主一从 全量和增量同步 哨兵模式 docker-compose测试
33 3
|
1月前
|
SQL 分布式计算 NoSQL
大数据-42 Redis 功能扩展 发布/订阅模式 事务相关的内容 Redis弱事务
大数据-42 Redis 功能扩展 发布/订阅模式 事务相关的内容 Redis弱事务
25 2
|
1月前
|
存储 缓存 NoSQL
大数据-46 Redis 持久化 RDB AOF 配置参数 混合模式 具体原理 触发方式 优点与缺点
大数据-46 Redis 持久化 RDB AOF 配置参数 混合模式 具体原理 触发方式 优点与缺点
56 1
|
2月前
|
存储 NoSQL Redis
SpringCloud基础7——Redis分布式缓存,RDB,AOF持久化+主从+哨兵+分片集群
Redis持久化、RDB和AOF方案、Redis主从集群、哨兵、分片集群、散列插槽、自动手动故障转移
SpringCloud基础7——Redis分布式缓存,RDB,AOF持久化+主从+哨兵+分片集群