【Docker】搭建部署Redis高可用集群实验

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 【Docker】搭建部署Redis高可用集群实验

一、示意图



二、创建Redis网络


执行命令


docker network ls
docker network create redis --subnet 192.168.100.0/24
docker network inspect redis


执行命令结果


[root@docker ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
d000c2d78106   bridge    bridge    local
9fd62dbfb07f   host      host      local
27700772b8f7   none      null      local
[root@docker ~]# docker network create redis --subnet 192.168.100.0/24
75c42ccdfaff7291081a73cf6f28eeb629c80da12b1ec55153a8171d2bc98155
[root@docker ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
d000c2d78106   bridge    bridge    local
9fd62dbfb07f   host      host      local
27700772b8f7   none      null      local
75c42ccdfaff   redis     bridge    local
[root@docker ~]# docker network inspect redis
[
    {
        "Name": "redis",
        "Id": "75c42ccdfaff7291081a73cf6f28eeb629c80da12b1ec55153a8171d2bc98155",
        "Created": "2022-05-11T00:09:44.013536884+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.100.0/24",
                    "Gateway": "192.168.100.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]
[root@docker ~]#


三、创建Redis配置文件


执行脚本创建redis配置文件命令


for port in $(seq 1 6); \
do \
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF >/mydata/redis/node-${port}/conf/redis.conf 
port 6379
bind 0.0.0.0
cluster-enabled yes 
cluster-config-file nodes.conf 
cluster-node-timeout 5000 
cluster-announce-ip 192.168.100.1${port} 
cluster-announce-port 6379 
cluster-announce-bus-port 16379 
appendonly yes
EOF
done


执行命令结果


[root@docker ~]# for port in $(seq 1 6); \
> do \
> mkdir -p /mydata/redis/node-${port}/conf
> touch /mydata/redis/node-${port}/conf/redis.conf
> cat << EOF >/mydata/redis/node-${port}/conf/redis.conf
> port 6379
> bind 0.0.0.0
> cluster-enabled yes
> cluster-config-file nodes.conf
> cluster-node-timeout 5000
> cluster-announce-ip 172.36.0.1${port}
> cluster-announce-port 6379
> cluster-announce-bus-port 16379
> appendonly yes
> EOF
> done
[root@docker ~]# ll /mydata/redis/
total 0
drwxr-xr-x 3 root root 18 May 11 23:07 node-1
drwxr-xr-x 3 root root 18 May 11 23:07 node-2
drwxr-xr-x 3 root root 18 May 11 23:07 node-3
drwxr-xr-x 3 root root 18 May 11 23:07 node-4
drwxr-xr-x 3 root root 18 May 11 23:07 node-5
drwxr-xr-x 3 root root 18 May 11 23:07 node-6
[root@docker ~]# cat /mydata/redis/node-1/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.36.0.11
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
[root@docker ~]#



四、启动Redis容器


执行六条命令,分别创建六个redis容器


# 第一个节点配置命令
docker run -p 6371:6379 -p 16371:16379 --name redis-01 \
-v /mydata/redis/node-1/data:/data \
-v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 192.168.100.11 redis:6-alpine3.15 redis-server /etc/redis/redis.conf 
# 命令参数解释:
# -p 6371:6379 对外端口
# -p 16371:16379 Redis内部通信端口
# -v /mydata/redis/node-1/data:/data 绑定挂载卷(容器内外挂载路径)
# -d 在后台运行容器并打印容器ID
# --net redis 使用自定义redis网络
# --ip 指定IP地址
# redis:6-alpine3.15 指定Redis版本号
# 第二个节点配置命令
docker run -p 6372:6379 -p 16372:16379 --name redis-02 \
-v /mydata/redis/node-2/data:/data \
-v /mydata/redis/node-2/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 192.168.100.12 redis:6-alpine3.15 redis-server /etc/redis/redis.conf 
# 第三个节点配置命令
docker run -p 6373:6379 -p 16373:16379 --name redis-03 \
-v /mydata/redis/node-3/data:/data \
-v /mydata/redis/node-3/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 192.168.100.13 redis:6-alpine3.15 redis-server /etc/redis/redis.conf 
# 第四个节点配置命令
docker run -p 6374:6379 -p 16374:16379 --name redis-04 \
-v /mydata/redis/node-4/data:/data \
-v /mydata/redis/node-4/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 192.168.100.14 redis:6-alpine3.15 redis-server /etc/redis/redis.conf 
# 第五个节点配置命令
docker run -p 6375:6379 -p 16375:16379 --name redis-05 \
-v /mydata/redis/node-5/data:/data \
-v /mydata/redis/node-5/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 192.168.100.15 redis:6-alpine3.15 redis-server /etc/redis/redis.conf 
# 第六个节点配置命令
docker run -p 6376:6379 -p 16376:16379 --name redis-06 \
-v /mydata/redis/node-6/data:/data \
-v /mydata/redis/node-6/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 192.168.100.16 redis:6-alpine3.15 redis-server /etc/redis/redis.conf 



查看部署的Redis容器


[root@docker ~]# docker ps
CONTAINER ID   IMAGE                COMMAND                  CREATED          STATUS          PORTS                                                                                      NAMES
34864cf361ab   redis:6-alpine3.15   "docker-entrypoint.s…"   4 minutes ago    Up 4 minutes    0.0.0.0:6376->6379/tcp, :::6376->6379/tcp, 0.0.0.0:16376->16379/tcp, :::16376->16379/tcp   redis-06
cb3667596bd8   redis:6-alpine3.15   "docker-entrypoint.s…"   4 minutes ago    Up 4 minutes    0.0.0.0:6375->6379/tcp, :::6375->6379/tcp, 0.0.0.0:16375->16379/tcp, :::16375->16379/tcp   redis-05
190ca9226db4   redis:6-alpine3.15   "docker-entrypoint.s…"   4 minutes ago    Up 4 minutes    0.0.0.0:6374->6379/tcp, :::6374->6379/tcp, 0.0.0.0:16374->16379/tcp, :::16374->16379/tcp   redis-04
cd9fae883a1f   redis:6-alpine3.15   "docker-entrypoint.s…"   4 minutes ago    Up 4 minutes    0.0.0.0:6373->6379/tcp, :::6373->6379/tcp, 0.0.0.0:16373->16379/tcp, :::16373->16379/tcp   redis-03
6784b9a3fa94   redis:6-alpine3.15   "docker-entrypoint.s…"   5 minutes ago    Up 5 minutes    0.0.0.0:6372->6379/tcp, :::6372->6379/tcp, 0.0.0.0:16372->16379/tcp, :::16372->16379/tcp   redis-02
884dd21979fb   redis:6-alpine3.15   "docker-entrypoint.s…"   11 minutes ago   Up 11 minutes   0.0.0.0:6371->6379/tcp, :::6371->6379/tcp, 0.0.0.0:16371->16379/tcp, :::16371->16379/tcp   redis-01



五、创建Redis集群


执行命令


docker exec -it redis-01 /bin/sh
redis-cli --cluster create 192.168.100.11:6379 192.168.100.12:6379 192.168.100.13:6379 192.168.100.14:6379 192.168.100.15:6379 192.168.100.16:6379 --cluster-replicas 1


执行命令结果



六、查看Redis集群


执行命令


# 进入集群
redis-cli -c
# 查看集群内节点
cluster nodes


执行命令结果



七、测试Redis集群高可用


模拟redis集群中某台节点丢失,例如,将Redis-03节点停止服务。


执行命令


# 查看节点
docker ps
# 停止redis-03节点
docker stop redis-03


执行命令结果



查看Redis集群中,节点变化情况,是否实现集群高可用



重新启动redis-03节点


docker start redis-03
docker exec -it redis-01 /bin/sh



九、学习链接


Redis - Official Image | Docker Hub


【狂神说Java】Docker最新超详细版教程通俗易懂_哔哩哔哩_bilibili

相关实践学习
基于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
相关文章
|
9天前
|
NoSQL 算法 Redis
docker高级篇(大厂进阶):安装redis集群
docker高级篇(大厂进阶):安装redis集群
61 24
|
16天前
|
NoSQL Java 关系型数据库
Liunx部署java项目Tomcat、Redis、Mysql教程
本文详细介绍了如何在 Linux 服务器上安装和配置 Tomcat、MySQL 和 Redis,并部署 Java 项目。通过这些步骤,您可以搭建一个高效稳定的 Java 应用运行环境。希望本文能为您在实际操作中提供有价值的参考。
89 26
|
22天前
|
存储 NoSQL Redis
redis主从集群与分片集群的区别
主从集群通过主节点处理写操作并向从节点广播读操作,从节点处理读操作并复制主节点数据,优点在于提高读取性能、数据冗余及故障转移。分片集群则将数据分散存储于多节点,根据规则路由请求,优势在于横向扩展能力强,提升读写性能与存储容量,增强系统可用性和容错性。主从适用于简单场景,分片适合大规模高性能需求。
34 5
|
1月前
|
监控 NoSQL 网络协议
【Azure Redis】部署在AKS中的应用,连接Redis高频率出现timeout问题
查看Redis状态,没有任何异常,服务没有更新,Service Load, CPU, Memory, Connect等指标均正常。在排除Redis端问题后,转向了AKS中。 开始调查AKS的网络状态。最终发现每次Redis客户端出现超时问题时,几乎都对应了AKS NAT Gateway的更新事件,而Redis服务端没有任何异常。因此,超时问题很可能是由于NAT Gateway更新事件导致TCP连接被重置。
|
2月前
|
NoSQL Linux Redis
Docker学习二(Centos):Docker安装并运行redis(成功运行)
这篇文章介绍了在CentOS系统上使用Docker安装并运行Redis数据库的详细步骤,包括拉取Redis镜像、创建挂载目录、下载配置文件、修改配置以及使用Docker命令运行Redis容器,并检查运行状态和使用Navicat连接Redis。
345 3
|
2月前
|
存储 NoSQL 大数据
大数据-51 Redis 高可用方案CAP-AP 主从复制 一主一从 全量和增量同步 哨兵模式 docker-compose测试
大数据-51 Redis 高可用方案CAP-AP 主从复制 一主一从 全量和增量同步 哨兵模式 docker-compose测试
45 3
|
2月前
|
消息中间件 NoSQL Kafka
Flink-10 Flink Java 3分钟上手 Docker容器化部署 JobManager TaskManager Kafka Redis Dockerfile docker-compose
Flink-10 Flink Java 3分钟上手 Docker容器化部署 JobManager TaskManager Kafka Redis Dockerfile docker-compose
72 4
|
7月前
|
机器学习/深度学习 NoSQL Redis
Redis高可用之集群架构(第三部分)
Redis高可用之集群架构(第三部分)
|
Kubernetes NoSQL Redis
教你在 Kubernetes 上部署 Redis 高可用集群?
教你在 Kubernetes 上部署 Redis 高可用集群?
281 0
|
存储 缓存 监控
Redis高可用之主从复制、哨兵、cluster集群
Redis高可用之主从复制、哨兵、cluster集群
255 0