如何用Docker部署高可用的redis集群?

  1. 实现目标
    image.png
  2. 创建流程

    # 创建网卡
    docker network create redis --subnet 172.38.0.0/16
    
    # 通过脚本创建六个redis配置
    for port in $(seq 1 6); \
    do \
    mkdir -p /mydata/redis/node-${port}/conf
    touch /mydata/redis/node-${port}/conf/redis.conf
    cat << EOF >/mydata/redis/node-${port}/conf/redis.conf
    port 6379
    bind 0.0.0.0
    cluster-enabled yes
    cluster-config-file nodes.conf
    cluster-node-timeout 5000
    cluster-announce-ip 172.38.0.1${port}
    cluster-announce-port 6379
    cluster-announce-bus-port 16379
    appendonly yes
    EOF
    done
    
    #启动六个容器
    for port in $(seq 1 6); \
    do \
    docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port} \
    -v /mydata/redis/node-${port}/data:/data \
    -v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
    -d --net redis --ip 172.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf; \
    done
    
    # 进入一个redis,注意这里是 sh命令
    docker exec -it redis-1 /bin/sh
    
    # 创建集群
    redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379\
    172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379\
    --cluster-replicas 1
    
    # 连接集群
    redis-cli -c
    
    # 查看集群信息
    cluster info
    
    # 查看节点
    cluster nodes
    
    # set a b
    # 停止到存值的容器
    # 然后再次get a,发现依旧可以获取值
    # 查看节点,发现高可用完全没问题
    
  3. 心得体会

不用哨兵模式,构建的集群可以有多个master!

redis如何搭建集群?

  1. 首先要启动多个redis-server
    通过conf文件标识身份:ip地址:端口号
  2. 所有的server启动好了过后,通过以下命令制定自己的master,每台服务器启动的时候默认都是自己为master

    slaveof [ip] [端口]
  3. 查看主从复制信息

    info replication
  4. 自己不想当slave了,用一个命令恢复到master身份

    slaveof no one

    redis的哨兵模式如何实现?

  5. 增加配置文件“sentinel.conf”,文件内容一句话搞定!

    #myredis是为设定的redis master主服务器起的别名
    #127.0.0.1是master的ip
    #1 是投票权重
    sentinel monitor myredis 127.0.0.1 6381 1
  6. 启动模式

    redis-sentinel myredis/sentinel.conf
  7. 怎么制定谁是哨兵?
    随开启的哨兵模式谁就是哨兵
  8. 哨兵之间是如何通信的?
    通过发布订阅模式,哨兵监听master,订阅master,master发布消息给哨兵,在master内部存储有订阅者的身份标识(ip:端口),所以每个哨兵都能通过这种方式感知到其他哨兵!
  9. 楼主目前实验来看,一旦启用哨兵模式,集群就只能有一个master,不能有多个

redis 主从复制?

  1. slave 只能读master的信息不能写信息,尽管他也有自己的slave
  2. 发布订阅模式也是一样,只有master可以发布频道,slave即使可以发布信息,其他订阅该频道的用户也无法收到,反正slave只能读的权利,没有写的权利!
  3. 发布订阅的命令?
    下述命令的执行者是redis-cli
subscribe channel [channel....]
publish channel1 message

自由自在像小鸟
4 声望1 粉丝