• 基于Docker搭建Redis一主两从三哨兵


    参考链接:

    https://cloud.tencent.com/developer/article/1474195

    https://juejin.im/post/5d26b03de51d454fa33b1960

    环境:

    1、CentOS Linux release 7.6.1810 (Core)

    2、三台主机:192.168.3.103、192.168.3.80、192.168.3.81

    3、安装好的docker:Docker version 19.03.4, build 9013bf583a

    4、redis为最新版本(latest)

    框架与思路:

     

    启动搭建容器主从

    从docker官方公共仓库拉取redis镜像,然后修改redis服务的配置文件,最后启动容器,启动redis服务器。在多台机器上运行redis服务器,并建立主从关系。

    redis的主从是实现redis集群和redis哨兵高可用的基础,redis的主从结构使从可以复制主上的数据,如果从与主之间网络断开,从会自动重连到主上。

      

    获取最新redis镜像

    #docker pull redis

    查看镜像:

    #docker image ls

      

    注:三台机器都做上述操作

    获取并修改redis配置文件

    redis官方提供了一个配置文件样例,通过wget工具下载下来。我用的root用户,就直接下载到/root目录里了

    注:无wget命令,需提前下载

    #yum -y install wget

    #wget http://download.redis.io/redis-stable/redis.conf

    打开下载下来的文件后,可以看到配置有很多。我只是搭建服务进行试验所以只修改必要的几项。如果要运用到线上,那必须将所有配置都按需求进行修改。

    其中redis服务器的master和slave角色使用的配置文件还会有些不同,下面分别进行说明。

    对于master而言,配置文件修改以下几项

    # 注释这一行,表示Redis可以接受任意ip的连接

    # bind 127.0.0.1 

    # 关闭保护模式

    protected-mode no 

    # 让redis服务后台运行

    daemonize yes 

    # 设定密码(可选,如果这里开启了密码要求,slave的配置里就要加这个密码. 只是练习配置,就不使用密码认证了)

    # requirepass masterpassword 

    # 配置日志路径,为了便于排查问题,指定redis的日志文件目录

    logfile "/var/log/redis/redis.log"

    对于slave而言,配置文件修改以下几项:

    # 注释这一行,表示Redis可以接受任意ip的连接

    # bind 127.0.0.1

     # 关闭保护模式

    protected-mode no

     # 让redis服务后台运行

    daemonize yes

     # 设定密码(可选,如果这里开启了密码要求,slave的配置里就要加这个密码)

    requirepass masterpassword 

    # 设定主库的密码,用于认证,如果主库开启了requirepass选项这里就必须填相应的密码

    masterauth <master-password> 

    # 设定master的IP和端口号,redis配置文件中的默认端口号是6379

    # 低版本的redis这里会是slaveof,意思是一样的,因为slave是比较敏感的词汇,所以在redis后面的版本中不在使用slave的概念,取而代之的是replica

    # 将192.168.3.103作为主,其余两台机器做从。ip和端口号按照机器和配置做相应修改。

    replicaof 192.168.3.103 6379 

    # 配置日志路径,为了便于排查问题,指定redis的日志文件目录

    logfile "/var/log/redis/redis.log"

    启动redis对应的容器

    三台机器上分别将容器别名指定为

    192.168.3.103 ------>redis_master

    192.168.3.80 -------->redis_slave1

    192.168.3.81 -------->redis_slave2

    要注意master的配置文件和slave不同。不过首先要启动主服务器,也就是r redis_master容器。

    启动redis_master

    # docker run --name redis_master -v /redis/redis.conf:/usr/local/etc/redis/redis.conf -d -p 6379:6379 redis

     

    # 通过ps命令查看容器的状态,可以看到redis_master已经启动

      

    启动redis_slave1

    #docker run --name redis_slave1 -v /redis/redis.conf:/usr/local/etc/redis/redis.conf -d -p 6379:6379 redis

    # 通过ps命令查看容器的状态,可以看到redis_slave1已经启动

       

    启动redis_slave2

    # docker run --name redis_slave2 -v /redis/redis.conf:/usr/local/etc/redis/redis.conf -d -p 6379:6379 redis

    # 通过ps命令查看容器的状态,可以看到redis_slave2已经启动

      

    上面已经启动了容器,接下来进入容器里启动redis服务器

    # 以交互模式进入容器redis_master

    #docker exec -it redis_master

    # 创建日志文件目录

    #mkdir -p /var/log/redis/

    #touch /var/log/redis/redis.log

    # 启动redis服务器,如果没有任何输出,就说明成功了

    #redis-server /usr/local/etc/redis/redis.conf

    # 在容器里启动一个redis客户端

    #redis-cli

    # 执行info命令,查看服务器状态

    127.0.0.1:6379> info

    ...

    # 如果是主,这里的role的值会是master,如果是从,这里的role的值会是slave

    role:slave

    # 对于slave,还要查看master_link_status这个属性值。slave上这个属性值为up就说明主从复制是OK的,否者就有问题。如果从机状态不为up,首先排查主机的端口是否被限,然后查看redis日志排查原因

    master_link_status:up

    ...

    #最后退出容器

    #exit

    注:

    另外两台机器操作同上

    设置redis主从关系

    分别进入redis_slave1/ redis_slave2(两者操作相同)

    [root@localhost ~]# docker exec -it redis_slave1 bash

    root@aa5bad0f8fea:/data# redis-cli

    127.0.0.1:6379> SLAVEOF 192.168.3.103 6379

    OK

    查看确认:

    在redis_master中输入info查看

    docker exec -it redis_master bash

    redis-cli

    info

     在redis_slave1中输入info查看

    docker exec -it redis_slave1 bash

    redis-cli

    info

     

    redis_slave2中输入info查看

    docker exec -it redis_slave2 bash

    redis-cli

    info

      

    验证主从复制

    主从搭建成功后,可以通过在master上写入一个key-value值,查看是否会同步到slave上,来验证主从同步是否能成功。

    # 以交互模式进入容器redis_master中

    #docker exec -it redis_master bash

    运行一个redis-cli,向test_key写入一个值

    redis-cli

    set test_key hello-world

    OK

     

    在任意slave机器上进入容器,也运行一个redis-cli,查询这个key的值。如果能查询到这个值,且与主机上的值相同,说明主从同步成功。经测试,主动同步成功。

      

    添加哨兵

    主从结构搭建成功了,系统的可用性变高了,但是如果主发生故障,需要人工手动切换从机为主机。这种切换工作不仅浪费人力资源,更大的影响是主从切换期间这段时间redis是无法对外提供服务的。因此,哨兵系统被开发出来了,哨兵可以在主发生故障后,自动进行故障转移,从从机里选出一台升级为主机,并持续监听着原来的主机,当原来的主机恢复后,会将其作为新主的从机。

    哨兵先监听主,通过对主发送info命令,获取到从的信息,然后也会监听到从。另外哨兵都会像主订阅__sentinel__:hello频道,当有新的哨兵加入时,会向这个频道发送一条信息,这条信息包含了该哨兵的IP和端口等信息,那么其他已经订阅了该频道的哨兵就会收到这条信息,就知道有一个新的哨兵加入。这些哨兵会与新加入和哨兵建立连接,选主是需要通过这个连接来进行投票。这个关系可以用下面这个图来描述

      

    获取并修改sentinel配置文件

    通过wget命令获取sentinel的配置文件

    wget http://download.redis.io/redis-stable/sentinel.conf

    修改配置文件以下几项(三台机器的sentinel.conf的配置文件相同)

    # 让sentinel服务后台运行

    daemonize yes

     # 修改日志文件的路径

    logfile "/var/log/redis/sentinel.log"

    # 修改监控的主redis服务器

    # 最后一个2表示,两台机器判定主被动下线后,就进行failover(故障转移)

    sentinel monitor mymaster 192.168.3.103 6379 2

    启动容器

    与启动redis容器类似,启动一个别名为sentinel的容器

    sentinel_master

    docker run -it --name sentinel_master -p 26379:26379 -v /root/sentinel.conf:/usr/local/etc/redis/sentinel.conf -d redis

    sentinel_slave1

    docker run -it --name sentinel_slave1 -p 26379:26379 -v /root/sentinel.conf:/usr/local/etc/redis/sentinel.conf -d redis

    sentinel_slave2

    docker run -it --name sentinel_slave1 -p 26379:26379 -v /root/sentinel.conf:/usr/local/etc/redis/sentinel.conf -d redis

    运行哨兵

    # 进入容器

    #docker exec -it sentinel_master bash

    # 创建日志目录和文件

    # mkdir -p /var/log/redis

    #touch /var/log/redis/sentinel.log

    #启动哨兵

    redis-sentinel /usr/local/etc/redis/sentinel.conf

    注:

    在另外两台机器上按照同样的方法在一个容器中运行sentinelsentinel都使用相同的配置文件。

    验证failover(故障转移)

    为了验证哨兵机制下的自动主从切换,我们将主上的redis进程kill掉(或docker stop redis_master)。

    稍等几秒钟后,就有另外一台从升级为主机,实验时是第三台机器,也就是redis_slave2升级为了主,用info命令查询可以看到redis_slave2服务器的角色变成的master。说明自动主从切换成功。

    然后重新启动之前被kill掉的master服务器,启动后用info命令查看,可以发现其变成了redis_slave2的从服务器。

    可以查看/var/log/redis/sentinel.log日志

    总结

    redis通过主从复制来实现高可用,但是发生故障时需要人工进行主从切换,效率低下。哨兵机制实现了redis主从的自动切换,提高了redis集群的可用性,提高了redis集群的故障转移效率。

  • 相关阅读:
    [NOI2012] 美食节
    [NOI2008] 志愿者招募
    P3834 【模板】可持久化线段树 2(主席树)
    P3919 【模板】可持久化线段树 1(可持久化数组)
    P4168 [Violet]蒲公英
    轻重链剖分
    沉舟侧畔千帆过 病树前头万木春
    P2119 魔法阵 (0.1s 虐杀过程)
    两行虐杀儒略历
    CSP2020 S-2 爆零(日)记 (已完结)
  • 原文地址:https://www.cnblogs.com/ly2020/p/12322875.html
Copyright © 2020-2023  润新知