华为云征文|华为云Flexus X实例测试Redis集群部署方案
什么是华为云Flexus X实例
- 华为云Flexus云服务是新一代开箱即用、体验跃级、面向中小企业和开发者打造的高品价比云服务产品。Flexus云服务器X实例是华为云Flexus云服务的一个产品。
- Flexus云服务器X实例是新一代面向中小企业和开发者打造的柔性算力云服务器,可智能感知业务负载,适用于电商直播、企业建站、开发测试环境、游戏服务器、音视频服务等中低负载场景。相较于Flexus应用服务器L实例,Flexus云服务器X实例的优势包含:提供丰富的公共镜像、可灵活自定义vCPU内存配比、智能感知业务动态升降配,负载范围更高等。
使用华为云Flexus云服务器X实例
获取华为云Flexus云服务器X实例后,第一步就是先去云服务器控制台重置密码
连接华为云Flexus云服务器X实例
使用 ssh username@ip 命令行登录服务器,第一件事是先更新系统
使用华为云开源镜像站完成docker-ce安装
开源镜像站链接在此:https://mirrors.huaweicloud.com/home
查询docker-ce,这里有教我们如何完成软件安装
ok,至此我们已经完成了docker安装,并成功拉去redis镜像。接下来进入文章的主题,redis-集群部署方案的测试。
Redis集群部署方案
Redis 支持三种主要的集群部署方案,每种方案都有其特定的应用场景和优缺点。下面是这三种集群部署方案的概述:
- 主从复制(Master-Slave Replication)
主从复制是 Redis的一种简单而常用的高可用部署方案。它允许将数据从主节点(Master)复制到一个或多个从节点(Slave),以实现数据冗余和读写分离。
特点:
- 数据复制:主节点处理所有的写操作,并将数据同步到从节点。读取操作可以在主节点或从节点上执行,但写操作只能在主节点上执行。
- 读写分离:可以通过配置让客户端从从节点读取数据,减轻主节点的读负载。
- 高可用性:如果主节点发生故障,可以手动或使用工具(如 Redis Sentinel)将某个从节点提升为主节点,恢复服务。
优缺点:
- 优点:简单易用,适合读多写少的应用场景。
- 缺点:需要手动处理故障转移,扩展性有限(只能在一定程度上缓解读负载)。
- Redis Sentinel
Redis Sentinel 是一个用于管理 Redis 主从复制集群的高可用解决方案。它不仅能监控 Redis主从节点的健康状态,还能在主节点发生故障时自动进行故障转移(Failover)。
特点:
- 监控:Sentinel 节点持续监控主从节点的状态,检测是否有节点宕机。
- 自动故障转移:如果 Sentinel 检测到主节点宕机,会自动将从节点提升为主节点,并通知其他从节点进行数据复制。
- 通知:Sentinel 可以通知客户端新的主节点地址,确保服务的持续可用。
优缺点:
- 优点:提供了自动化的高可用性解决方案,减少了人为干预的需求。
- 缺点:Redis Sentinel 仍然基于主从复制架构,不能水平扩展写性能。
- Redis Cluster
Redis Cluster 是 Redis原生的分布式集群方案,支持数据的自动分片(sharding),从而实现水平扩展,处理大规模的数据和请求。
特点:
- 数据分片:Redis Cluster 将数据分片到多个节点上,每个节点负责处理不同的哈希槽(hash slot)。Redis
Cluster 默认有 16384 个哈希槽。
- 高可用性:每个数据分片可以有多个副本(主从结构),并支持自动故障转移。
- 无中心架构:Redis Cluster 没有中央控制节点,每个节点都存储自己的数据并负责相应的请求。
- 线性扩展:通过增加节点可以水平扩展集群的存储和处理能力。
优缺点:
- 优点:支持数据分片和水平扩展,可以处理非常大的数据集和高并发请求,适用于需要高扩展性的应用场景。
- 缺点:集群管理相对复杂,需要确保足够的节点来维持数据和服务的高可用性。此外,跨分片操作的性能较低。
# 创建网络
docker network create redis-net
1. 主从复制(Master-Slave Replication)
# 创建主节点
docker run -d --name redis-master --network redis-net -p 6379:6379 redis
# 创建从节点
docker run -d --name redis-slave --network redis-net -p 6380:6379 redis redis-server --slaveof redis-master 6379
验证配置
分别对 redis-master 和 redis-slave 执行以下命令。
# redis-master
docker exec -it redis-master redis-cli
info replication
set hostname flexusx-8425
# redis-slave
docker exec -it redis-slave redis-cli
info replication
get hostname
从图里我们,可以看到redis-master的role是master,而redis-slave的role是slave。
而我们在redis-master添加的键值对,在redis-slave里可以获得。
2. Redis Sentinel
主从搭建
# 创建主节点
docker run -d --name redis-master --network redis-net -p 6379:6379 redis
# 创建从节点1
docker run -d --name redis-slave1 --network redis-net -p 6380:6379 redis redis-server --slaveof redis-master 6379
# 创建从节点2
docker run -d --name redis-slave2 --network redis-net -p 6381:6379 redis redis-server --slaveof redis-master 6379
哨兵搭建
# sentinel.conf
port 26379
sentinel resolve-hostnames yes
sentinel deny-scripts-reconfig yes
sentinel monitor redis-sentinel redis-master 6379 2
sentinel down-after-milliseconds redis-sentinel 30000
sentinel parallel-syncs redis-sentinel 1
sentinel failover-timeout redis-sentinel 180000
# 创建哨兵1
docker run -d --name redis-sentinel1 --network redis-net -p 26379:26379 -v $PWD/sentinel.conf:/etc/redis/sentinel.conf redis redis-sentinel /etc/redis/sentinel.conf
# 创建哨兵2
docker run -d --name redis-sentinel2 --network redis-net -p 26380:26379 -v $PWD/sentinel.conf:/etc/redis/sentinel.conf redis redis-sentinel /etc/redis/sentinel.conf
# 创建哨兵3
docker run -d --name redis-sentinel3 --network redis-net -p 26381:26379 -v $PWD/sentinel.conf:/etc/redis/sentinel.conf redis redis-sentinel /etc/redis/sentinel.conf
验证配置
故障转移
这里我们把 redis-master 手动停止,模拟 主从点挂掉的情况,此时 redis-slave1 还是从节点,而主节点变成了redis-slave2
然后我们再把 redis-master 重启,发现 redis-master 以从节点的身份重新加入了集群
3. Redis Cluster
新建文件 docker-compose.yml, 将下面代码复制进去,然后执行 docker compose up -d
services:
redis-node-1:
image: redis
container_name: redis-node-1
ports:
- "7001:6379"
networks:
- redis-cluster
command: redis-server --cluster-enabled yes --cluster-config-file /data/nodes.conf --cluster-node-timeout 5000 --appendonly yes
redis-node-2:
image: redis
container_name: redis-node-2
ports:
- "7002:6379"
networks:
- redis-cluster
command: redis-server --cluster-enabled yes --cluster-config-file /data/nodes.conf --cluster-node-timeout 5000 --appendonly yes
redis-node-3:
image: redis
container_name: redis-node-3
ports:
- "7003:6379"
networks:
- redis-cluster
command: redis-server --cluster-enabled yes --cluster-config-file /data/nodes.conf --cluster-node-timeout 5000 --appendonly yes
redis-node-4:
image: redis
container_name: redis-node-4
ports:
- "7004:6379"
networks:
- redis-cluster
command: redis-server --cluster-enabled yes --cluster-config-file /data/nodes.conf --cluster-node-timeout 5000 --appendonly yes
redis-node-5:
image: redis
container_name: redis-node-5
ports:
- "7005:6379"
networks:
- redis-cluster
command: redis-server --cluster-enabled yes --cluster-config-file /data/nodes.conf --cluster-node-timeout 5000 --appendonly yes
redis-node-6:
image: redis
container_name: redis-node-6
ports:
- "7006:6379"
networks:
- redis-cluster
command: redis-server --cluster-enabled yes --cluster-config-file /data/nodes.conf --cluster-node-timeout 5000 --appendonly yes
networks:
redis-cluster:
driver: bridge
创建实例
实例集群
验证配置
集群信息
集群节点