• docker 安装 redis


    redis 单机版

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

    使用docker pull命令拉取镜像。

    docker pull redis:7.0
    
    • 1

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

    mkdir redisSave
    
    • 1

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5

    结果如下:

    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
    
    • 1
    • 2
    • 3

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

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

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

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

    现在宿主机的/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
    
    • 1
    • 2
    • 3
    • 4
    • 5

    结果如下所示:

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5

    结果如下所示:

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5

    结果如下:

    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 及

    • 指定当前 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

    sentinel monitor redis-master 192.168.11.10 6381 2
    
    sentinel announce-ip 192.168.11.10
    sentinel announce-port 26382
    
    • 1
    • 2
    • 3
    • 4

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

    sentinel monitor redis-master 192.168.11.10 6381 2
    
    sentinel announce-ip 192.168.11.10
    sentinel announce-port 26383
    
    • 1
    • 2
    • 3
    • 4

    现在宿主机的/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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    需要注意的是,这里的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
    
    • 1
    • 2

    然后再以 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    启动完成后使用 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
    
    • 1

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

    4. 查看节点信息

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

    image-20230917212806845

  • 相关阅读:
    LeetCode每日一题:1222. 可以攻击国王的皇后(2023.9.14 C++)
    如何利用最少的钱,快速打开淘宝流量入口?
    Nginx安装nginx-rtmp-module模块
    pandas基础笔记01|joyful Pandas学习
    阿里二面:SpringCloud 有几种服务调用方式?
    【小f的刷题笔记】(JS)数组 - 前缀和 LeetCode303 & LeetCode34
    HDU - 6225 Little Boxes(__int128的使用)
    XSS靶场中级绕过
    使用windeployqt.exe打包QT工程,windows系统可执行程序
    数组和字符串 --- 寻找数组的中心索引
  • 原文地址:https://blog.csdn.net/qq_54015483/article/details/132954451