docker 安装 redis

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值