docker实现redis集群
1.主从模式(Master-Slave)
1.1主从复制原理
主从复制是redis的一种基本的集群方式,它通过将一个Redis节点(主节点)的数据复制到一个或多个其他Redis节点来实现数据的冗余和备份
主节点负责处理客户端的写操作,同时从节点回自动同步主节点的数据。客户端可以从从节点读取数据,实现读取分离,提高系统效能。
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节点,它会监控主节点和从节点的运行状态,当主节点发生故障时,哨兵节点会自动从从节点中选出一个新的主节点,并通知其他从节点和客户端,实现故障转移。
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将所有的键值对数据分散在多个节点上,每个节点负责一部分数据,称之为槽位。通过数据分片,突破了单节点内存上限的限制,实现大规模的数据存储。
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)
docker实现redis集群的更多相关文章
- Docker Swarm redis 集群搭建
Docker Swarm redis 集群搭建 环境1: 系统:Linux Centos 7.4 x64 内核:Linux docker 3.10.0-693.2.2.el7.x86_64 Docke ...
- 基于Docker的redis集群搭建
Redis集群官方介绍:http://www.redis.cn/topics/cluster-tutorial.html 基于Docker搭建Redis集群 环境:6个节点,三主三从 制作Redis镜 ...
- docker 实现redis集群搭建
摘要:接触docker以来,似乎养成了一种习惯,安装什么应用软件都想往docker方向做,今天就想来尝试下使用docker搭建redis集群. 首先,我们需要理论知识:Redis Cluster是Re ...
- 基于Docker搭建Redis集群(主从集群)
基于Docker搭建Redis集群(主从集群) 最近陆陆续续有不少园友加我好友咨询 redis 集群搭建的问题,我觉得一定是之前写的这篇 <基于Docker的Redis集群搭建> 文章 ...
- 使用Docker构建redis集群--最靠谱的版本
1集群结构说明 集群中有三个主节点,三个从节点,一共六个结点.因此要构建六个redis的docker容器.在宿主机中将这六个独立的redis结点关联成一个redis集群.需要用到官方提供的ruby脚本 ...
- Docker:Docker搭建Redis集群(6)
国外的公有云实在是太慢了,经常time out 这里搜集几个国内出名的: hub.c.163.com (网易:https://c.163.com/hub#/m/home/) dev.aliyun.co ...
- 轻松构建 基于docker的 redis 集群
下面跟着我来 一步一步构建redis 集群吧. 集群的目录结构见GitHub源码(文章末尾) 1,安装docker环境,根据自身的操作系统,google下即可. 2,我们在服务器上,搭建所需目录结构. ...
- 利用docker部署redis集群
目录 一.首先配置redis.conf文件,... 1 1.获取配置文件... 1 2.修改各配置文件的参数... 2 二.下载redis镜像.启动容器... 2 1.创建网络... 2 2.拉取镜像 ...
- 利用Docker搭建Redis集群
Redis集群搭建 运行Redis镜像 分别使用以下命令启动3个Redis docker run --name redis-6379 -p 6379:6379 -d hub.c.163.com/lib ...
- docker实验--redis集群搭建
背景介绍: 我经常在做一些小项目的时候,采用了Redis来做缓存,但是都是基于单节点的,一旦redis挂了,整个项目就挂了.于是乎,想到了多节点集群的方式来使用,就开始折腾着怎么去搭建这个集群.在网上 ...
随机推荐
- CentOS 7.3离线安装 JDK,Mariadb
1.环境准备 #链接:https://pan.baidu.com/s/1rcLrELaLHBJI0pKQQFOnNA #提取码:f1a2 2.安装 # 离线文件位置 /home/bw/# 将目标机器系 ...
- homeassistant自动化记录ping追踪在家联动设备
2022年8月29日修改代码块 进入hass的配置文件,docker版从portainer中查看配置情况 文件名configuration.yaml 下述添加到最后 # ping根据ip追踪手机 de ...
- 阿里云CTF and 其他
RE复现 login_system 这个函数就是判断username,点进去发现是线性方程,用z3解 from z3 import * s=Solver() a=[0]*16 for i in ran ...
- ICMAN液位检测方案
TA是什么? ICMAN液位检测是基于双通道比较电容式液位检测原理,来判断容器中是否有液体或者液体是否达到一定高度. 有什么用? ICMAN液位检测可以实现非接触式检测,起到高低.不同液位提醒.缺水提 ...
- 五子棋AI:实现逻辑与相关背景探讨(下)
前文回顾 在上篇文章中,我们约定了一种衡量格子价值的方式,如下表. 综合价值排序 己方价值 敌方价值 对应的奖励数值 1 Lv1 ? \(2^{20}\) 2 ? Lv1 \(2^{16}\) 3 L ...
- 待补 重要思考:求给无向图定向使得其变为DAG的方案数
今天比赛考到了,不会,丢了 100 分. rk2,380 -> rk15,280 别问为什么 T4 没过,因为不会 T2. 方法一 \(O(3^n)\) 令 \(f_S\) 为子集 \(S\) ...
- 《Effective TypeScript》条款21 - 类型扩展
本文主要通过一些实际的代码示例,来帮助大家理解什么是类型扩展,本文主要内容如下: 什么是类型扩展 代码示例 总结 什么是类型扩展? TypeScript 需要从你指定的单一值中决定一组可能的值,这个过 ...
- 【笔记】理解CSS3之Flexbox布局
前言 先看一个例子,html代码如下: <ul> <li>1</li> <li>2</li> <li>3</li> ...
- [Tkey] 黑兔子,白兔子
CL-21 一般拿到这个题第一眼都应该能看出并查集,subtask1 是给并查集暴力修改的. 后面 subtask2 没有联通操作,是给纯线段树的,也算是启发正解了 再往下可以考虑操作 \(1\) 采 ...
- Linux部署东方通TongWeb7
一.软件版本 操作系统: CentOS 7.5.1804 JDK:1.8_201 东方通:TongWeb7.0.4.2 二.部署流程 2.1 安装JDK 2.1.1 下载JDK并发明回到/opt下解压 ...