Docker 之部署Redis集群(一)

前言

本小节我们学习使用Docker部署Redis集群(标准的一主两从).

案例

  • 目录结构

    [root@iZ2ze8sm5upgi8z1dcazqeZ redis]# pwd
    /workspace/redis
    [root@iZ2ze8sm5upgi8z1dcazqeZ redis]# tree
    .
    ├── data
    │   ├── appendonly.aof
    │   ├── docker-compose.yml
    │   └── dump.rdb
    └── sentinel
        ├── config
        └── data
    
    4 directories, 3 files
    [root@iZ2ze8sm5upgi8z1dcazqeZ redis]# 
    
    
  • 拉取redis镜像

    docker pull redis
    
    [root@iZ2ze8sm5upgi8z1dcazqeZ redis]# docker images
    REPOSITORY                                                       TAG                  IMAGE ID            CREATED             SIZE
    redis                                                            latest               01a52b3b5cd1        4 hours ago         98.2MB
    
  • 编写docker-compose.yml文件实现redis一主二从

    version: '3.7'
    services:
      master:
        image: redis
        container_name: redis-master
        restart: always
        command: redis-server --port 6379 --requirepass Dustyone  --appendonly yes
        ports:
          - 6379:6379
        volumes:
          - /workspace/redis/data:/data
    
      slave1:
        image: redis
        container_name: redis-slave-1
        restart: always
        command: redis-server --slaveof 182.92.0.228 6379 --port 6380  --requirepass Dustyone --masterauth Dustyone  --appendonly yes
        ports:
          - 6380:6380
        volumes:
          - /workspace/redis/data:/data
    
    
      slave2:
        image: redis
        container_name: redis-slave-2
        restart: always
        command: redis-server --slaveof 182.92.0.228 6379 --port 6381  --requirepass Dustyone --masterauth Dustyone  --appendonly yes
        ports:
          - 6381:6381
        volumes:
          - /workspace/redis/data:/data
    

    version docker文件的版本
    image 指定容器镜像就是之前拉取的redis镜像
    container_name 给这个镜像起一个别名
    restart always:表名开机自启动
    command 相当于执行一些命令 (–requirepass 指定redis密码 --appendonly yes 这个命令是用于开启redis数据持久化)
    ports 端口映射,将容器的端口映射到对应宿主机的端口
    volumes 数据卷的映射.因为一旦容器停止了那么里面的数据也没有.所以我们需要把这个数据文件放在外面,然后映射到容器中

  • 启动redis,使用如下命令 -d 挂在后台

    docker-compose up -d
    

    查看redis是否启动成功,使用如下命令,看到红框中的三个并且状态是 UP 则表明启动redis成功

    [root@iZ2ze8sm5upgi8z1dcazqeZ redis]# docker ps -a
    CONTAINER ID        IMAGE                             COMMAND                  CREATED             STATUS              PORTS                                            NAMES
    a43bcfd77e5a        redis                             "docker-entrypoint.s…"   14 minutes ago      Up 14 minutes       6379/tcp, 0.0.0.0:6380->6380/tcp                 redis-slave-1
    19b10ac59405        redis                             "docker-entrypoint.s…"   14 minutes ago      Up 14 minutes       6379/tcp, 0.0.0.0:6381->6381/tcp                 redis-slave-2
    9acdc4bd4086        redis                             "docker-entrypoint.s…"   14 minutes ago      Up 14 minutes       0.0.0.0:6379->6379/tcp                           redis-master
    
  • 验证redis是否实现了一主二从的功能

    • 进入主redis容器中,使用如下命令

      docker exec -it redis-master bash
      

      链接Redis Client并对主Redis操作

      [root@iZ2ze8sm5upgi8z1dcazqeZ redis]# docker exec -it redis-master bash
      root@9acdc4bd4086:/data# redis-cli
      127.0.0.1:6379> auth Dustyone
      OK
      127.0.0.1:6379> set sales Dustyone
      OK
      127.0.0.1:6379> get sales
      "Dustyone"
      127.0.0.1:6379>
      
    • 进入任意从Redis并验证数据是否同步
      ctrl+c退出redis,输入exit如下命令退出容器。

      [root@iZ2ze8sm5upgi8z1dcazqeZ redis]# docker exec -it redis-slave-1 bash
      root@a43bcfd77e5a:/data# redis-cli -p 6380
      127.0.0.1:6380> auth Dustyone
      OK
      127.0.0.1:6380> keys *
      1) "broker"
      2) "sales"
      127.0.0.1:6380> get slave
      (nil)
      127.0.0.1:6380> get sales
      "Dustyone"
      127.0.0.1:6380> set sales Aron
      (error) READONLY You can't write against a read only replica.
      127.0.0.1:6380> 
      

      如上命令中我们尝试了在从Redis上做set操作,结果提示从Redis只有读的操作。

    如此我们便验证完毕了。

小结

  • 如果使用失败了,可以使用如下命令查看日志,观察是什么原因造成的

    docker logs -f 容器Id
    
  • 停止redis,使用如下命令

    docker-compose down
    
    docker stop 容器Id
    docker rm 容器Id
    
  • 停止并移除所有容器可以使用如下命令

    docker stop $(docker ps -a -q)
    docker rm $(docker ps -a -q)
    
  • 启动redis

    docker-compose up -d
    
  • 在使用Docker-compose 部署Docker集群式,在指定主机IP(主从)时,必须确保指定主机的端口在ECS上的安全组规则开启,否则在主Redis无法将数据同步至其他Slave上去。

    比如我们的主从部署在182.92.0.228的6379/6380/6381上,该ECS实例的安全组规则必须开放6379-6381

  • 本小节案例中是将Redis集群部署在同一服务器上的,如若需要将主从Redis部署在不同服务器上,按照本案例提供的思路,将各个配置项中的IP地址替换成相应的IP地址即可。

你可能感兴趣的:(Docker)