美文网首页
Redis主从 && Sentinel哨兵

Redis主从 && Sentinel哨兵

作者: 流月汐志 | 来源:发表于2019-04-29 16:17 被阅读0次

    Replication (主从复制)

    1. docker pull redis

    2. docker run redis master

    docker run -it -p 6370:6379 \
            -v $(pwd)/redis-master.conf:/etc/redis/redis.conf \
            -v $(pwd)/data:/data \
            --name redis-master redis bash
    ### --appendonly yes开启持久化存储
    docker run -d -p 6370:6379 \
            -v /root/myredis/redis-master.conf:/etc/redis/redis.conf \
            -v /root/myredis/data:/data \
            --name redis-master redis \
            redis-server  /etc/redis/redis.conf --appendonly yes
    

    3. docker run redis slave1

    docker run -it -p 6371:6379 \
            -v $(pwd)/redis-slave1.conf:/etc/redis/redis.conf \
            -v $(pwd)/data:/data \
            --name redis-slave1 redis bash
    
    docker run -d -p 6371:6379 \
            -v $(pwd)/redis-slave1.conf:/etc/redis/redis.conf \
            --link redis-master:master \
            --name redis-slave1 redis \
            redis-server /etc/redis/redis.conf
    

    4. docker run redis slave2

    docker run -it -p 6372:6379 \
            -v $(pwd)/redis-slave2.conf:/etc/redis/redis.conf \
            -v $(pwd)/data:/data --name redis-slave2 redis bash
    
    docker run -d -p 6372:6379 \
            -v $(pwd)/redis-slave2.conf:/etc/redis/redis.conf \
            --link redis-master:master \
            --name redis-slave2 redis \
            redis-server /etc/redis/redis.conf
    

    主从测试

    1. 查看所有运行的容器

    [root@tyler myredis]# docker ps -a
    
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    
    2d467545dff1 redis "docker-entrypoint.s…" 15 seconds ago Up 14 seconds 0.0.0.0:6372->6379/tcp redis-slave2
    
    19d467dd6f02 redis "docker-entrypoint.s…" 50 seconds ago Up 50 seconds 0.0.0.0:6371->6379/tcp redis-slave1
    
    8062fd7cc873 redis "docker-entrypoint.s…" 17 minutes ago Up 17 minutes 0.0.0.0:6370->6379/tcp redis-master
    
    [root@tyler myredis]#
    

    2. 修改配置

    # 到这步,我把两个从 redis 数据库 连接上了主 redis 数据库,配置文件中的 master ip 填写的 master(主机名) ,修改配置如下
    
    bind 0.0.0.0
    
    port 6379
    
    replicaof master 6379
    

    3. 测试结果

    # 在 6370 存入一个值
    127.0.0.1:6370> set name tyler
    OK
    127.0.0.1:6370>
    
    # 在 6371 取这个值
    127.0.0.1:6371> get name
    "tyler"
    127.0.0.1:6371>
    
    # 在 6372 取这个值
    127.0.0.1:6372> get name
    "tyler"
    127.0.0.1:6372>
    

    4. 尝试在slave节点写入数据

    127.0.0.1:6371> set age 18
    
    (error) READONLY You can't write against a read only replica.
    
    127.0.0.1:6371>
    

    5. 目前架构

    redis主从复制.jpg

    Redis Sentinel

    1、准备配置文件

    port 26379<26380|26381>
    
    logfile "/tmp/sentinel.log"
    
    sentinel monitor mymaster master 6379 2
    
    # Default is 3 minutes.
    
    sentinel down-after-milliseconds mymaster 3000
    
    sentinel failover-timeout mymaster 1800
    

    2、创建三个 sentinel

    docker run -d -p 26379:26379 \
            -v $(pwd)/sentinel01.conf:/etc/redis/sentinel.conf \
            --link redis-master:master \
            --name redis-sentinel01 redis:latest \
            redis-sentinel /etc/redis/sentinel.conf
    
    docker run -d -p 26380:26380 \
            -v $(pwd)/sentinel02.conf:/etc/redis/sentinel.conf \
            --link redis-master:master \
            --name redis-sentinel02 redis:latest \
            redis-sentinel /etc/redis/sentinel.conf
    
    docker run -d -p 26381:26381 \
            -v $(pwd)/sentinel03.conf:/etc/redis/sentinel.conf \
            --link redis-master:master \
            --name redis-sentinel03 redis:latest \
            redis-sentinel /etc/redis/sentinel.conf
    

    3、启动关联成功检查

    # 挂载的配置文件结尾会自动生成,关联到的 sentinel && redis

    sentinel config-epoch mymaster 1

    sentinel leader-epoch mymaster 1

    sentinel known-replica mymaster 172.17.0.2 6379

    sentinel known-replica mymaster 172.17.0.4 6379

    sentinel known-sentinel mymaster 172.17.0.7 26381 b60aa97dd73c072109914fbd89b7f49a0402308c

    sentinel known-sentinel mymaster 172.17.0.6 26380 05e77020b08088c2054401ae1f33f2a8308989f3

    sentinel current-epoch 1

    # sentinel的日志

    1:X 14 Feb 2019 07:43:06.173 # +monitor master mymaster 172.17.0.2 6379 quorum 2

    1:X 14 Feb 2019 07:43:06.173 * +slave slave 172.17.0.4:6379 172.17.0.4 6379 @ mymaster 172.17.0.2 6379

    1:X 14 Feb 2019 07:43:06.180 * +slave slave 172.17.0.5:6379 172.17.0.5 6379 @ mymaster 172.17.0.2 6379

    1:X 14 Feb 2019 07:43:27.304 * +sentinel sentinel 05e77020b08088c2054401ae1f33f2a8308989f3 172.17.0.6 2

    1:X 14 Feb 2019 07:43:27.304 * +sentinel sentinel 05e77020b08088c2054401ae1f33f2a8308989f3 172.17.0.6 26380 @ mymaster 172.17.0.2 6379

    1:X 14 Feb 2019 07:43:45.408 * +sentinel sentinel b60aa97dd73c072109914fbd89b7f49a0402308c 172.17.0.7 26381 @ mymaster 172.17.0.2 6379

    4、故障转移测试

    # 停止 master 节点
    
    docker stop redis-master
    

    5、 查看 sentinel 日志

    1:X 14 Feb 2019 07:45:26.791 # +sdown master mymaster 172.17.0.2 6379 (检测到主观不可用)
    1:X 14 Feb 2019 07:45:26.879 # +new-epoch 1
    1:X 14 Feb 2019 07:45:26.881 # +vote-for-leader 05e77020b08088c2054401ae1f33f2a8308989f3 1 (推选 sentinel leader)
    1:X 14 Feb 2019 07:45:27.884 # +odown master mymaster 172.17.0.2 6379 #quorum 3/2 (投票多数判定,客观不可用)
    1:X 14 Feb 2019 07:45:27.884 # Next failover delay: I will not start a failover before Thu Feb 14 07:45:31 2019
    1:X 14 Feb 2019 07:45:27.966 # +config-update-from sentinel 05e77020b08088c2054401ae1f33f2a8308989f3 172.17.0.6 26380 @ mymaster
    172.17.0.2 6379 (sentinel leader 更新 配置文件)
    1:X 14 Feb 2019 07:45:27.966 # +switch-master mymaster 172.17.0.2 6379 172.17.0.5 6379 (切换172.17.0.2 --> 172.17.0.5 为 master)
    1:X 14 Feb 2019 07:45:27.968 * +slave slave 172.17.0.4:6379 172.17.0.4 6379 @ mymaster 172.17.0.5 6379 (切换*.0.4 为 .0.5 的 slave)
    1:X 14 Feb 2019 07:45:27.968 * +slave slave 172.17.0.2:6379 172.17.0.2 6379 @ mymaster 172.17.0.5 6379 (切换
    .0.2 为 .0.5 的 slave)
    1:X 14 Feb 2019 07:45:31.002 # +sdown slave 172.17.0.2:6379 172.17.0.2 6379 @ mymaster 172.17.0.5 6379 (检测到
    .0.4 为主观不可用)

    6、 启动原 master 节点

    docker start redis-master
    

    7、 查看 sentinel 日志

    1:X 14 Feb 2019 07:46:59.274 # -sdown slave 172.17.0.2:6379 172.17.0.2 6379 @ mymaster 172.17.0.5 6379
    1:X 14 Feb 2019 07:47:09.260 * +convert-to-slave slave 172.17.0.2:6379 172.17.0.2 6379 @ mymaster 172.17.0.5 6379

    8、 架构 (3sentinel + 1master + 2slave)

    Redis Sentinel 架构结构图.jpg

    相关文章

      网友评论

          本文标题:Redis主从 && Sentinel哨兵

          本文链接:https://www.haomeiwen.com/subject/dhgynqtx.html