首页 > 数据库 >docker实现redis集群

docker实现redis集群

时间:2024-11-07 17:42:36浏览次数:5  
标签:-- redis 19 集群 conf docker 节点

1.主从模式(Master-Slave)

1.1主从复制原理

主从复制是redis的一种基本的集群方式,它通过将一个Redis节点(主节点)的数据复制到一个或多个其他Redis节点来实现数据的冗余和备份

主节点负责处理客户端的写操作,同时从节点回自动同步主节点的数据。客户端可以从从节点读取数据,实现读取分离,提高系统效能。

image

1.2主从复制的优缺点

优点:

  • 配置简单、易于实现
  • 实现了数据冗余,提高数据可靠性
  • 读写分离,提高系统能效性

缺点:

  • 主节点单点故障时,需要手动切换到从节点,故障恢复时间长,并且整个redis集群的写操作将中断
  • 写操作无法负载均衡,主节点承担所有的写操作,可能成为性能瓶颈
  • 无法实现数据分片,受单节点内存限制
  • 数据延迟,主从节点的操作是异步的,这种方式可能会使得从节点的数据落后于主节点,产生读写不一致的问题,在高并发或网络延迟的场景下,这种问题会更加显著
  • 复制性能开销,每个从节点都需要从主节点读取数据,同步复制会增加主节点的开销
  • 维护成本增加
  • 网络分区问题,如果主从节点网络中断,那么从节点无法继续同步主节点的数据

1.3主从复制场景应用

适用于以下场景:

  • 数据备份和容灾恢复
  • 读写分离
  • 在线升级和扩展

1.4实现

实现主从分离的集群模式,在主节点的conf文件不需要添加什么,在从节点中需要配置以下选项

port 6380
masterauth MelonTe #连接主节点的密码
repicaof 127.0.0.1 6379 #监听主节点

在docker使用以下命令,创建从节点

docker run -d --name myredisslave -p 6380:6380 -v C:/Users/minat/Desktop/Note/StudyNote/vocation/redis2.conf:/usr/local/etc/redis/redis.conf redis:7.0.12 redis-server /usr/local/etc/redis/redis.conf

使用docker进行主从分离时,监听的主节点IP需要通过该docker指令查看

docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis-master

成功启动主从分离后,在主节点使用以下命令查询是否开通成功:

INFO replication

成功

此时我们在主节点写一个key,通过以下命令连接从节点

redis-cli -h 127.0.0.1 -p 6380

此时进行Get,可以查看成功

2.哨兵模式(Sentinel)

2.1原理

哨兵模式是在主从复制基础上加入了哨兵节点,实现了自动故障转移。哨兵是一种特殊的Redis节点,它会监控主节点和从节点的运行状态,当主节点发生故障时,哨兵节点会自动从从节点中选出一个新的主节点,并通知其他从节点和客户端,实现故障转移。

image

2.2优缺点

优点:

  • 自动故障转移,提高系统的高可用性
  • 具有主从分离的所有优点

缺点:

  • 配置和管理会更复杂
  • 无法实现数据分片,受单节点内存限制

2.3哨兵模式场景应用

  • 高可用性要求较高的场景:通过自动故障转移实现高可用性
  • 数据备份和容灾恢复

2.4实现

配置redis-master.conf文件如下

bind 0.0.0.0
protected-mode no
port 6379
requirepass MelonTe

实现docker命令启动该redis,并且加入到redis-net同一个网络中

docker run -d --name redis-master --network redis-net -p 6379:6379 -v C:/Users/minat/Desktop/Note/StudyNote/vocation/redis-master.conf:/usr/local/etc/redis/redis.conf redis:7.0.12 redis-server /usr/local/etc/redis/redis.conf

配置redis-slave1.conf如下

bind 0.0.0.0
protected-mode no
port 6380
replicaof redis-master 6379
masterauth MelonTe

启动redis从节点:

docker run -d --name redis-slave1 --network redis-net -p 6380:6380 -v C:/Users/minat/Desktop/Note/StudyNote/vocation/redis-slave1.conf:/usr/local/etc/redis/redis.conf redis:7.0.12 redis-server /usr/local/etc/redis/redis.conf

同理配置一个slave2出来

接着,需要配置sentinel.conf

#Sentinel 通过这个端口来接收其他 Sentinel、客户端和 Redis 实例的通信。
port 26379
# sentinel monitor 被监控主节点名称 主节点IP 主节点端口 quorum表示至少有几个Sentinel认为主节点不可用时,进行故障转移
sentinel monitor redis-master (HOST) 6379 2 
sentinel auth-pass mymaster MelonTe
#如果Sentine在5000ms内无法和主节点进行通信,则认为该节点失效
sentinel down-after-milliseconds redis-master 5000
#在故障转移(failover)期间,最多允许 1 个从节点同时与新的主节点进行同步。
sentinel parallel-syncs mymaster 1
#在这个时间范围内会尝试进行故障转移。如果在此时间内无法完成故障转移,则会认为故障转移失败。
sentinel failover-timeout redis-master 10000

启动3个sentinel容器,确保在出现故障时,Sentinel可以达到投票所需的法定人数。

docker run -d --name redis-sentinel1 --network redis-net -p 26379:26379 -v C:/Users/minat/Desktop/Note/StudyNote/vocation/sentinel.conf:/usr/local/etc/redis/sentinel.conf redis:7.0.12 redis-sentinel /usr/local/etc/redis/sentinel.conf

docker run -d --name redis-sentinel2 --network redis-net -p 26380:26379 -v C:/Users/minat/Desktop/Note/StudyNote/vocation/sentinel.conf:/usr/local/etc/redis/sentinel.conf redis:7.0.12 redis-sentinel /usr/local/etc/redis/sentinel.conf

docker run -d --name redis-sentinel3 --network redis-net -p 26381:26379 -v C:/Users/minat/Desktop/Note/StudyNote/vocation/sentinel.conf:/usr/local/etc/redis/sentinel.conf redis:7.0.12 redis-sentinel /usr/local/etc/redis/sentinel.conf

全部容器启动成功后,使用该指令进行检测

docker exec -it redis-sentinel1 redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster

该命令用于通过Redis哨兵查询主节点的IP地址,mymaster是主节点的名称。返回以下信息

1) "172.18.0.2"
2) "6379"

接下来我们关闭主节点,检查是否完成了故障转移。

redis-salve1的log中显示如下信息:

2024-09-19 19:33:43 1:S 19 Sep 2024 11:33:43.379 * MASTER <-> REPLICA sync started
2024-09-19 19:33:43 1:S 19 Sep 2024 11:33:43.379 * Non blocking connect for SYNC fired the event.
2024-09-19 19:33:43 1:S 19 Sep 2024 11:33:43.379 * Master replied to PING, replication can continue...
2024-09-19 19:33:43 1:S 19 Sep 2024 11:33:43.380 # Unable to AUTH to MASTER: -ERR AUTH <password> called without any password configured for the default user. Are you sure your configuration is correct?
2024-09-19 19:33:44 1:S 19 Sep 2024 11:33:44.386 * Connecting to MASTER 172.18.0.4:6381
2024-09-19 19:33:44 1:S 19 Sep 2024 11:33:44.387 * MASTER <-> REPLICA sync started
2024-09-19 19:33:44 1:S 19 Sep 2024 11:33:44.387 * Non blocking connect for SYNC fired the event.
2024-09-19 19:33:44 1:S 19 Sep 2024 11:33:44.387 * Master replied to PING, replication can continue...
2024-09-19 19:33:44 1:S 19 Sep 2024 11:33:44.388 # Unable to AUTH to MASTER: -ERR AUTH <password> called without any password configured for the default user. Are you sure your configuration is correct?
2024-09-19 19:33:45 1:S 19 Sep 2024 11:33:45.391 * Connecting to MASTER 172.18.0.4:6381

可以看到是发生了故障转移尝试的,但是因为从节点的配置文件中,设置了masterauth 密码,但是从节点没有设置密码导致失败。因此在实际中,因此在实际中,应该使用相同的密码方便统一管理。

3.Cluster模式(集群)

3.1Cluster模式原理

Redis Cluster是一种分布式的Redis架构,用于在多个Redis实例之间自动分布数据和请求,以实现更高的扩展性和可用性。这种架构通过数据分片和分布式存储实现了负载均衡和高可用性,在Cluster模式下,Redis将所有的键值对数据分散在多个节点上,每个节点负责一部分数据,称之为槽位。通过数据分片,突破了单节点内存上限的限制,实现大规模的数据存储。

image

3.2核心架构

1.数据分片(Sharding)

  • Redis Cluster将数据分片分布在多个节点上,而不是集中在单一节点。
  • 它通过一致性哈希和哈希槽(Hash Slot)机制实现数据分片,整个数据空间被分为16384个slot,每个节点会被分配到一定数量的slot,当数据发送给cluster的时候,会通过哈希函数映射到对应的槽位,再把数据发到相对应的节点中。

2.去中心化架构

  • Cluster模式是一个去中心化的架构,不需要像Sentinel模式那样需要独立的管理工具,每个节点都保存集群的部分数据,不需要了解其他节点的信息。
  • 所有节点通过Gossip协议交换数据分布和节点状态信息

3.主从复制

可以结合主从复制结构,每一个主节点可以有多个从节点,实现数据复制和故障转移

3.3优缺点分析

优点:

  • 数据分片,实现大规模数据存储
  • 负载均衡,提高系统性能
  • 自动故障转移,提高高可用性

缺点:

  • 配置和管理复杂
  • 多键操作可能受到限制

3.4使用场景

  • 大规模数据存储
  • 高性能要求
  • 高可用性要求

3.5配置

首先先创建一个docker网络

docker network create redis-cluster-network

接着创建redis-cluster.conf模板

cluster-enabled yes
#表示cluster节点信息默认存储在nodes.conf上
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

启动redis容器,需要启动6个

docker run -d --name redis-node1 --net redis-cluster-network -v C:/Users/minat/Desktop/Note/StudyNote/vocation/cluster.conf:/usr/local/etc/redis/redis.conf redis:7.0.12 redis-server /usr/local/etc/redis/redis.conf --port 6379

docker run -d --name redis-node2 --net redis-cluster-network -v C:/Users/minat/Desktop/Note/StudyNote/vocation/cluster.conf:/usr/local/etc/redis/redis.conf redis:7.0.12 redis-server /usr/local/etc/redis/redis.conf --port 6380

docker run -d --name redis-node3 --net redis-cluster-network -v C:/Users/minat/Desktop/Note/StudyNote/vocation/cluster.conf:/usr/local/etc/redis/redis.conf redis:7.0.12 redis-server /usr/local/etc/redis/redis.conf --port 6381

docker run -d --name redis-node4 --net redis-cluster-network -v C:/Users/minat/Desktop/Note/StudyNote/vocation/cluster.conf:/usr/local/etc/redis/redis.conf redis:7.0.12 redis-server /usr/local/etc/redis/redis.conf --port 6382

docker run -d --name redis-node5 --net redis-cluster-network -v C:/Users/minat/Desktop/Note/StudyNote/vocation/cluster.conf:/usr/local/etc/redis/redis.conf redis:7.0.12 redis-server /usr/local/etc/redis/redis.conf --port 6383

docker run -d --name redis-node6 --net redis-cluster-network -v C:/Users/minat/Desktop/Note/StudyNote/vocation/cluster.conf:/usr/local/etc/redis/redis.conf redis:7.0.12 redis-server /usr/local/etc/redis/redis.conf --port 6384

接着需要收集所有容器的IP地址

docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis-node1
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis-node2
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis-node3
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis-node4
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis-node5
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis-node6

创建redis cluster

docker exec -it redis-node1 redis-cli --cluster create 172.19.0.2:6379 172.19.0.3:6380 172.19.0.4:6381 172.19.0.5:6382 172.19.0.6:6383 172.19.0.7:6384 --cluster-replicas 1

--cluster-replicas 1 表示每一个主节点含有一个从节点

使用以下命令查询集群状态

docker exec -it redis-node1 redis-cli -p 6379 cluster info
docker exec -it redis-node1 redis-cli -p 6379 cluster nodes

成功。

参考博客:详解Redis三大集群模式,轻松实现高可用! - 一灯架构 - 博客园 (cnblogs.com)

标签:--,redis,19,集群,conf,docker,节点
From: https://www.cnblogs.com/MelonTe/p/18533657

相关文章

  • Linxu 安装 Redis
    1、下载redis官网地址:https://redis.io/downloads/#redis-stack-downloads或wget直接获取:wgethttps://download.redis.io/redis-stable.tar.gz2、安装(不清楚linux命令的可以自行查询,make编译源文件,makeinstall安装)1#mkdir/usr/local/redis2#tarxfredis-stable.ta......
  • 面试官:讲讲redis的zset原理
    在Redis中,zset(有序集合)是一种既能保存元素的唯一性,又能通过分数进行排序的数据结构。zset的内部实现基于两种数据结构的组合:跳表(skiplist)和哈希表(hashtable),这两者结合实现了高效的数据存储和快速的排名操作。1.跳表(skiplist)跳表是一种层级化的链表结构,可以理解为多个“......
  • docker安装配置dnsmasq
    docker下载安装参考:docker安装、卸载、配置、镜像如果是低版本的额ubuntu,比如ubuntu16.04.7LTS,为了加快下载速度,参考:Ubuntu16.04LTS安装Docker。docker安装dnsmasq下载dnsmasq镜像首先镜像我们可以选择带web页面的,也可选择不带的,这里选择带web也免的,方便不懂技术的人配置。dock......
  • 基于Centos7.X部署mysql8.4集群(主备)
    1、目标    将在主库的数据变更同步到从库,从而保证主库和从库的数据一致。2、原理    2.1主库会把数据变更记录在二进制日志文件Binlog中    2.2从库连接主库,读取binlog日志,并写入自身中继日志relaylog    2.3slave重做中继日志,将改变......
  • 使用 Redis 进行数据同步
    在Java中使用Redis进行数据同步主要涉及到以下几个方面:数据存储与读取:使用Redis作为缓存或数据库,将数据存储到Redis中并在需要时从Redis中读取。数据一致性:确保主存储(通常是数据库)与Redis缓存之间的一致性。分布式锁:用于保证在高并发场景下对共享资源的操作是......
  • win11中使用docker-nacos连接容器中的mysql实例记录
     二.方式11.拉取nacosdockerpullnacos/nacos-server2.在dockerdesktop中进行配置如下图相比较’方式2‘这种方式更简单,mysqlip地址需要使用ipv4地址,具体的自己查看ipconfig的ipv4地址(注意:localhsot/127.0.0.1/容器名称都是不行的)下面这几个参数在application.proper......
  • Redis内存管理——针对实习面试
    目录Redis内存管理Redis的内存淘汰机制有哪些?说说过期的数据的删除策略?Redis是如何判断数据是否过期的?Redis如何处理大Key问题?Redis内存管理Redis的内存淘汰机制有哪些?Redis的内存淘汰机制主要包括以下几种策略:noeviction:这是默认策略,当内存使用达到限制时,Red......
  • docker命令1
     dockerrun--privileged-d--restart=always--namexxx_video_service--net=host-v/docker/data/video/xxx:/mnt/data/xxx-v/docker/data/video/testVideo:/root/testVideo192.168.21.237:50000/xyxy-amd/xxx_video_service:V1.1.1.20100531_Alpha 有的宿主机......
  • GPU 环境搭建指南:如何在裸机、Docker、K8s 等环境中使用 GPU
    本文主要分享在不同环境,例如裸机、Docker和Kubernetes等环境中如何使用GPU。跳转阅读原文:GPU环境搭建指南:如何在裸机、Docker、K8s等环境中使用GPU1.概述仅以比较常见的NVIDIAGPU举例,系统为Linux,对于其他厂家的GPU设备理论上流程都是一样的。省流:对于裸......
  • 5个维度对Kubernetes集群优化
    5个维度对Kubernetes集群优化一、节点配额和内核参数调整对于公有云上的Kubernetes集群,规模大了之后很容器碰到配额问题,需要提前在云平台上增大配额。这些需要增大的配额包括:虚拟机个数vCPU个数内网IP地址个数公网IP地址个数安全组条数路由表条数持久化存储大小......