docker 安装 redis

2023-09-17 21:34:58

redis 单机版

1. 拉取redis镜像并创建数据卷目录

使用docker pull命令拉取镜像。

docker pull redis:7.0

在当前目录下创建redisSave目录用来持久化redis的数据。

mkdir redisSave

2. 复制和修改redis.conf

复制一份 redis 核心配置文件 redis.conf 到宿主机目录/root/redisSave 中。注:/opt/redis下面的redis.conf是之间学习redis基础时就有的。

image-20230917160415844

现在要修改redis.conf文件。包括:

  1. 解除 IP 绑定:将 bind 行注释掉,以解除 Redis 对访问者 IP 的绑定。
  2. 关闭保护模式:将protected-mode设置为no。
  3. 关闭守护模式:将daemonize设置为no。
  4. 指定持久化目录:指定 RDB 或 AOF 的持久化目录(dir)为 /data 。后面也会指定容器中的/data 目录为数据卷挂载点目录。

修改完成后保存退出。

3. 启动redis容器

docker run --name redis7 \
-v /root/redisSave/redis.conf:/etc/redis/redis.conf \
-v /root/redisSave/data:/data \
-dp 6379:6379 redis:7.0 \
redis-server /etc/redis/redis.conf

结果如下:

image-20230917162522426

这里指定了两个数据卷,其中一个是文件,一个是目录:

  • -v /root/redisSave/redis.conf:/etc/redis/redis.conf

  • -v /root/redisSave/data:/data

对于该启动命令需要注意的是,其后面运行的命令为 redis-server,且加载的配置文件为挂载点目录/etc/redis 中的 redis.conf。

4. 进入容器并连接redis

通过 docker exec 命令进入 Redis 容器后,就可通过 redis-cli 客户端连接上这个 Redis,然后执行 Redis 命令了。

image-20230917164500960

redis 一主两从集群搭建

现要搭建一个“一主两从”的 Redis 集群。这三个容器的端口号都保持默认,但对外暴露出的端口号分别为 6381、6382、6383。其中,6381 的为 master,另外两个为 slave。

1. 复制三份 redis.conf

现仍在前面的/root/redisSave 目录中完成配置。复制 redis.conf 并重命名为 redis6381.conf,并在文件最后添加如下配置,以对外宣布当前 redis 的 IP 与端口。注意,该 IP 为 docker 宿主机的 IP,端口号为当前 redis 对外暴露的端口号。

# 在redis6381.conf文件的末尾添加如下内容:
slave-announce-ip 192.168.11.10
slave-announce-port 6381

同理,再复制并修改 redis6382.conf。

# 在redis6382.conf文件的末尾添加如下内容:
slave-announce-ip 192.168.11.10
slave-announce-port 6382

同理,再复制并修改 redis6383.conf。

# 在redis6383.conf文件的末尾添加如下内容:
slave-announce-ip 192.168.11.10
slave-announce-port 6383

现在宿主机的/root/redisSave目录的内容如下:

image-20230917173258317

2. 启动master和slave

启动master:

docker run --name redis-master \
-v /root/redisSave/redis6381.conf:/etc/redis/redis.conf \
-v /root/redisSave/data/6381:/data \
-dp 6381:6379 redis:7.0 \
redis-server /etc/redis/redis.conf

结果如下所示:

image-20230917173736069

接下来就是启动两个slave,需要注意:在启动 slave 的命令中需要指出其 slaveof 于谁。

docker run --name redis-slave1 \
-v /root/redisSave/redis6382.conf:/etc/redis/redis.conf \
-v /root/redisSave/data/6382:/data \
-dp 6382:6379 redis:7.0 \
redis-server /etc/redis/redis.conf --slaveof 192.168.11.10 6381

结果如下所示:

image-20230917174040605

接下来还剩最后一个slave。

docker run --name redis-slave2 \
-v /root/redisSave/redis6383.conf:/etc/redis/redis.conf \
-v /root/redisSave/data/6383:/data \
-dp 6383:6379 redis:7.0 \
redis-server /etc/redis/redis.conf --slaveof 192.168.11.10 6381

结果如下:

image-20230917174227978

3. 查看关系和数据测试

查看这三个容器节点的 info replication,可以看到它们间的主从关系已经建立。

image-20230917174658291 image-20230917174752416 image-20230917174820521

可以看到master和slave之间的关系没有问题。现在插入数据进行测试。

image-20230917175036876

发现数据测试也没问题,master节点可读可写,slave节点只能读。

redis 高可用集群搭建

主从集群存在的问题是,其容灾方式只能采用冷处理方案,无法在生产中使用。所以,这里要搭建一个“一主两从三哨兵”的高可用集群,以达到热处理的容灾方案。

对于“一主两从”集群,仍使用前面的即可。下面直接搭建三个 Sentinel 节点的集群。这三个容器的端口号都保持默认(26379),但对外暴露出的端口号分别为 26381、26382、26383。

1. 复制三份 sentinel.conf

复制 sentinel.conf 文件并重命名为 sentinel26381.conf。仅修改两处:

  • 指定其要监视的 master 及<quorum>。

  • 指定当前 sentinel 对外宣布的 IP 与端口号。其中 IP 为 docker 宿主机的 IP,端口号为其对外暴露的端口号。

# 下面配置的数字 2 有两层含义。
# 第一层:当master节点宕机后,还剩两个节点,这两个节点要有过半数量的节点认为master宕机,才会被判定为master客观宕机。
# 第二层:在master宕机后,在三个sentinel节点中,有一个会成为leader,成为leader的条件就是要有过半数量的sentinel认为某个sentinel能当上leader。
sentinel monitor redis-master 192.168.11.10 6381 2

sentinel announce-ip 192.168.11.10
sentinel announce-port 26381

同理,再复制并修改 sentinel26382.conf。内容如下:

sentinel monitor redis-master 192.168.11.10 6381 2

sentinel announce-ip 192.168.11.10
sentinel announce-port 26382

同理,再复制并修改 sentinel26383.conf。内容如下:

sentinel monitor redis-master 192.168.11.10 6381 2

sentinel announce-ip 192.168.11.10
sentinel announce-port 26383

现在宿主机的/root/redisSave目录的内容如下:

image-20230917195604231

2. 启动 sentinel

启动三个 sentinel 容器。命令如下:

# sentinel1的启动
docker run --name sentinel1 \
-v /root/redisSave/sentinel26381.conf:/etc/redis/sentinel.conf \
-dp 26381:26379 redis:7.0 \
redis-sentinel /etc/redis/sentinel.conf

# sentinel2的启动
docker run --name sentinel2 \
-v /root/redisSave/sentinel26382.conf:/etc/redis/sentinel.conf \
-dp 26382:26379 redis:7.0 \
redis-sentinel /etc/redis/sentinel.conf

# sentinel3的启动
docker run --name sentinel3 \
-v /root/redisSave/sentinel26383.conf:/etc/redis/sentinel.conf \
-dp 26383:26379 redis:7.0 \
redis-sentinel /etc/redis/sentinel.conf

需要注意的是,这里的master节点的名字是redis-master,所以sentinel文件中所有的master名字要和其保持一致。运行完成后查看运行的容器如下:

image-20230917202045733

并且还可以通过sentinel查看集群的关系等信息。

image-20230917202628263

3. 故障转移测试

为了验证高可用性,现将充当 master 的容器 redis-master 停掉。

image-20230917203048325

此时,再查看另外两个 redis 容器的状态数据,发现 redis-slave1 成为了 redis-slave2 的 slave,即 redis-slave2 成为了新的 master。

image-20230917203117645

image-20230917203141803

此时再次将 redis-master 容器启动(docker start redis-master)。并查看 redis-master 的状态数据,发现其成为了 redis-slave2 的 slave。

image-20230917203830114

image-20230917203607630

redis 分布式集群搭建

Redis 集群的每个节点中的保存的数据都是相同的。而 Redis 分布式系统的节点中存放的数据可以是不同的。当有数据写入请求到达分布式系统后,系统会采用虚拟槽分区算法将数据写入到相应节点。

下面要搭建一个三主三从的 Redis 分布式系统。

序号角色容器名称网络模式暴露地址
1masterredis1host192.168.192.101:6381
2masterredis2host192.168.192.101:6382
3masterredis3host192.168.192.101:6383
4slaveredis4host192.168.192.101:6384
5slaveredis5host192.168.192.101:6385
6slaveredis6host192.168.192.101:6386

1. 准备工作

在/root 中 mkdir 一个名称为 cluster 的目录,并将前面的配置文件/root/redisSave/redis.conf复制到这里。也就是 cluster 目录下要有一个redis.conf文件。接下来需要复制六份 redis.conf 文件。复制 redis.conf 为 redis1.conf,并在其中将下面两个配置前的注释符号去掉。这两项配置,一个是用于开启 cluster 功能,即分布式系统功能;一个是指定其需要的配置文件名称。

cluster-enabled yes
cluster-config-file nodes-6379.conf

然后再以 redis1.conf 为模板复制出 5 份,分别为 redis2.conf、redis3.conf、redis4.conf、redis5.conf、redis6.conf。这 6 份配置文件内容完全相同。完成后cluster目录内容如下:

image-20230917205908141

2. 启动redis

启动 6 个 Redis 容器。命令如下:

# 启动redis1
docker run --name redis1 --network host \
-v /root/cluster/redis1.conf:/etc/redis/redis.conf \
-v /root/cluster/data/6381:/data \
-d redis:7.0 \
redis-server /etc/redis/redis.conf --port 6381

# 启动redis2
docker run --name redis2 --network host \
-v /root/cluster/redis2.conf:/etc/redis/redis.conf \
-v /root/cluster/data/6382:/data \
-d redis:7.0 \
redis-server /etc/redis/redis.conf --port 6382

# 启动redis3
docker run --name redis3 --network host \
-v /root/cluster/redis3.conf:/etc/redis/redis.conf \
-v /root/cluster/data/6383:/data \
-d redis:7.0 \
redis-server /etc/redis/redis.conf --port 6383

# 启动redis4
docker run --name redis4 --network host \
-v /root/cluster/redis4.conf:/etc/redis/redis.conf \
-v /root/cluster/data/6384:/data \
-d redis:7.0 \
redis-server /etc/redis/redis.conf --port 6384

# 启动redis5
docker run --name redis5 --network host \
-v /root/cluster/redis5.conf:/etc/redis/redis.conf \
-v /root/cluster/data/6385:/data \
-d redis:7.0 \
redis-server /etc/redis/redis.conf --port 6385

# 启动redis6
docker run --name redis6 --network host \
-v /root/cluster/redis6.conf:/etc/redis/redis.conf \
-v /root/cluster/data/6386:/data \
-d redis:7.0 \
redis-server /etc/redis/redis.conf --port 6386

启动完成后使用 docker ps --format “table {{.ID}}\t{{.Names}}\t{{.Status}}” 命令查看状态等信息。如下所示:

image-20230917211025246

3. 创建系统

6 个节点启动后,它们仍是 6 个独立的 Redis,通过 redis-cli --cluster create 命令可将 6个节点创建为一个分布式系统。–cluster-replicas 1 指定每个 master 会带有一个 slave 副本。命令如下:

docker exec -it redis1 redis-cli --cluster create --cluster-replicas 1 192.168.11.10:6381 192.168.11.10:6382 192.168.11.10:6383 192.168.11.10:6384 192.168.11.10:6385 192.168.11.10:6386

输入命令再回车后即可看到一个计划日志,输入yes,就能把集群搭建完成。

4. 查看节点信息

通过 cluster nodes 命令可以查看到系统中各节点的关系及连接情况。只要能看到每个节点给出 connected,就说明分布式系统已经成功搭建。

image-20230917212806845

更多推荐

MySQL学习系列(5)-每天学习10个知识

目录1.锁(Locking)和乐观锁与悲观锁2.分布式系统中保证数据一致性3.MySQL的复制延迟问题及解决方法4.索引比全表扫描更快的情况5.分区剪枝(PartitionPruning)6.使用`LIMIT`和`OFFSET`的技巧7.使用`EXPLAIN`语句分析查询性能8.MySQL事务隔离级别9.死锁(Dead

char s[]和char *s的区别,数组和指针的,堆和栈指针的一些思考

最近在学习的时候看到一个概念,数组不等价于指针,很合理但又很难理解。例如chars[]和char*s有什么区别,前者是数组,后者是指针,个人学习成果如下:1.chars[]和char*s的区别chars[]:①数组,chars[]定义了一个字符数组②内存分配:内存在栈上分配。③大小固定:一旦定义,数组的大小就不能改变。

WMS系统库存分类以优化仓储管理

1.定义库存分类是指根据一定的规则和标准,将仓库中的货物按照特定的属性、特征或需求进行分类和分组的过程。通过库存分类,可以实现对仓库中货物的有序摆放、快速检索、有效管理和合理分配。2.目的库存分类在WMS系统中的应用具有以下目的:-优化空间利用:通过合理分类,将相似属性的货物放置在一起,最大限度地利用仓库空间,提高仓储

群狼调研(长沙顾客满意度调查)开展食品安全群众满意度调查

本文由群狼调研(长沙电信运营商满意度调查)出品,欢迎转载,请注明出处。食品安全群众满意度调查的内容应该涵盖广泛的食品安全领域,从食品产地到生产过程,再到食品标签、监管政策等多个方面。以下是可能包括在食品安全群众满意度调查中的内容:1.食品产地和生产过程:了解公众对食品产地、生产工艺、生产环境等方面的信任程度和满意度。2

征战MINI学习路线

征战MINI学习路线征战MINI与ACX720开发板的具体差异1.时钟电路管脚约束一样,仅仅是位号名称不同,ACX720的晶振位号是U2,征战MINI的位号是X1,如下图所示:2.拨码开关电路管脚约束一样,仅仅是位号名称不同,如下图所示:3.EEPROM电路管脚约束一样,仅仅是位号名称不同,如下图所示:4.LED灯电路

Linux常用命令 - 网络管理与通信命令

网络管理命令ifconfig功能:配置和显示Linux的网络接口和参数。最前面是网卡名。flags里面分别是:UP:表示接口已经启用BROADCAST:表示主机支持广播RUNNING:表示接口在工作中MULTICAST:表示主机支持多播mtu:最大传输单元,1500字节。inet:网卡的IP地址netmask:网络掩码

使用 sklearn 进行数学建模的通用模板

前言无论是本科和研究生都会有的数学建模含金量还是很高的,下面将介绍一下进行数学建模的一些基本操作方法,这里主要是利用sklearn进行建模,包括前期的一些数据预处理以及一些常用的机器学习模型以及一些简单粗暴的通用建模步骤,仅代表我自己意见。一、数学建模常见的问题类型常见的问题类型只有三种:分类、回归、聚类。而明确具体问

数据包络分析(DEA)——CCR模型

写在前面:博主本人大学期间参加数学建模竞赛十多余次,获奖等级均在二等奖以上。为了让更多学生在数学建模这条路上少走弯路,故将数学建模常用数学模型算法汇聚于此专栏,希望能够对要参加数学建模比赛的同学们有所帮助。目录1.模型原理1.1模型介绍1.2数据包络分析的CCR模型1.2.1投入导向的CCR模型1.2.2产出导向的CC

cocosCreator 之 Graphics绘制基础图形,五角星,线型图,柱形图

版本:3.4.0环境:MacGraphics组件Graphics组件主要用于绘画使用,属于渲染组件。继承结构:#mermaid-svg-WHveKVDzMTXmCbpg{font-family:"trebuchetms",verdana,arial,sans-serif;font-size:16px;fill:#333

【数据结构】二叉树的前序遍历(七)

题目:二叉树的前序遍历题目详情:给你二叉树的根节点root,返回它节点值的前序遍历;我们先来看几个示例:输入:root=[1,null,2,3]输出:[1,2,3]示例2:输入:root=[1,2]输出:[1,2]示例三:输入:root=[]输出:[]提示:树中结点数目在范围【0,100】内-100<=Node.val

正则表达式新解

文章目录是什么?正则用法匹配单个字符匹配一组字符其他元字符核心函数贪婪匹配和非贪婪匹配正则练习是什么?正则表达式(RegularExpression)是一种文本模式,包括普通字符(例如,a到z之间的字母)和特殊字符(称为"元字符"),可以用来描述和匹配字符串的特定模式。正则表达式是一种用于模式匹配和搜索文本的工具。正则

热文推荐