Docker下配置redis主从复制详细过程

环境
  • 同一宿主机两个docker容器,请提前安装好docker
  • master:172.17.0.2
  • slave:172.17.0.3
配置redis.conf
[root@server1 ~]# tar zxf redis-4.0.8.tar.gz
[root@server1 ~]# cd redis-4.0.8/
[root@server1 ~]# mkdir -p /mnt/redis/conf.d
[root@server1 ~]# cp redis.conf /mnt/redis/conf.d/redis-master.conf
[root@server1 ~]# cp redis.conf /mnt/redis/conf.d/redis-slave.conf
  • 主节点 redis-master.conf

    [root@server1 ~]# cd /mnt/redis/conf.d/
    vim redis-master.conf
      69 bind 0.0.0.0                                 # 连接开放
      88 protected-mode no                            # 保护模式关闭 
     136 daemonize yes                                # 服务后台运行  
     814 cluster-enabled yes
     822 cluster-config-file nodes-6379.conf
     827 cluster-node-timeout 15000
    
  • 从节点 redis-slave.conf

    [root@server1 conf.d]# vim redis-slave.conf
      69 bind 0.0.0.0                                 # 连接开放
      88 protected-mode no                            # 保护模式关闭 
     136 daemonize yes                                # 服务后台运行 
    
redis-master容器搭建
  • 获取镜像,创建容器

    [root@server1 ~]# docker pull redis
    [root@swarm1 conf.d]# docker run -it --name redis-master -v /mnt/redis/conf.d/redis-master.conf:/usr/local/etc/redis/redis.conf -d -p 6300:6379 redis /bin/bash
    [root@swarm1 conf.d]# docker inspect redis-master | grep IPA   # 挂载.conf文件,宿主机端口6300
          "SecondaryIPAddresses": null,
          "IPAddress": "172.17.0.2",
                  "IPAMConfig": null,
                  "IPAddress": "172.17.0.2",
    [root@swarm1 conf.d]# docker attach redis-master
    root@077db232f8b1:/data# redis-server /usr/local/etc/redis/redis.conf
    root@077db232f8b1:/data# redis-cli
    127.0.0.1:6379> info replication
    # Replication
    role:master
    connected_slaves:0
    
  • redis-master写入数据时报错:(error)CLUSTERDOWN Hash slot not served”
    在这里插入图片描述
    原因: 运行容器时挂载的 /mnt/redis/conf.d/redis-master.conf 文件中开启了cluster-enable,注释该内容后重新运行容器

    [root@server1 ~]# cd /mnt/redis/conf.d/
    [root@server1 conf.d]# vim redis-master.conf
     814 #cluster-enabled yes
    [root@swarm1 conf.d]# docker run -it --name redis-master -v /mnt/redis/conf.d/redis-master.conf:/usr/local/etc/redis/redis.conf -d -p 6300:6379 redis /bin/bash
    077db232f8b1d257185190e7f21b694e8db8df0ba9ccf497d82bfe5ebf08bad3
    [root@swarm1 conf.d]# docker attach redis-master 
    root@077db232f8b1:/data# redis-server /usr/local/etc/redis/redis.conf
    root@077db232f8b1:/data# redis-cli
    127.0.0.1:6379> set new old                           # 测试数据创建成功
    OK
    
redis-slave容器搭建
  • 容器创建

    [root@swarm1 conf.d]# docker run -it --name redis-slave -v /mnt/redis/conf.d/redis-slave.conf:/usr/local/etc/redis/redis.conf -d -p 6301:6379 redis /bin/bash
    [root@swarm1 conf.d]# docker inspect redis-slave | grep IPA
          "SecondaryIPAddresses": null,
          "IPAddress": "172.17.0.3",
                  "IPAMConfig": null,
                  "IPAddress": "172.17.0.3",
    [root@swarm1 conf.d]# docker attach redis-master
    root@077db232f8b1:/data# redis-server /usr/local/etc/redis/redis.conf
    root@574c798128ee:/data# redis-cli
    127.0.0.1:6379> slaveof 172.17.0.2 6379              # 链接到master节点,因同一宿主机中的容器通过docker0进行网络
    OK                                                   # 通信,即就相当于同属于一个子网中,所以直接连接容器内服务端口
    127.0.0.1:6379> info replication
    # Replication
    role:slave                                    # 该容器redis服务为从节点
    master_host:172.17.0.2                        # 主节点 
    master_port:6300
    master_link_status:down
    
  • 主节点查看

    127.0.0.1:6379> info replication
    # Replication
    role:master
    connected_slaves:1
    slave0:ip=172.17.0.3,port=6379,state=online,offset=28,lag=1             # slave容器ip
    127.0.0.1:6379> get new                              # 测试数据成功 
    "old"
    

你可能感兴趣的:(学习笔记)