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

前言:你总是想的太多而读书太少

最近这段时间学习了Redis,之前呢也将docker的基础给学习了一遍,不过时间长了有点忘了。正好借助这个机会,完成一个基于Docker搭建Redis一主两从三哨兵,算是对于docker的复习,也是对Redis做一个笔记。
文章有借鉴:微信公众号 "Java知音”

本文默认已配置好了docker环境。若优未安装的可以csdn搜索其他博主的安装教程。
接下来便开启表演
在这里插入图片描述

启动容器搭建主从

docker安装成功后,可以开始部署redis服务了。先从docker官方公共仓库拉取redis镜像,然后修改redis服务的配置文件,最后启动容器,启动redis服务器。在多台机器上运行redis服务器,并建立主从关系。

redis的主从是实现redis集群和redis哨兵高可用的基础,redis的主从结构使从可以复制主上的数据,如果从与主之间网络断开,从会自动重连到主上
在这里插入图片描述
获取Redis镜像
docker命令拉去镜像

docker pull redis

查看镜像
在这里插入图片描述
获取并修改redis配置文件
redis官方提供了一个配置文件样例,通过wget工具下载下来。我用的root用户,就直接下载到/root目录里了。

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

redis.conf文件想必学过Redis的同学都知道其用途 ,所以在此不做过多说明。在此只做配置主从关系的必要修改

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

首先说明一下,正常情况下配置主从关系需要多台机器,但现实往往不允许。所以现在在一台机器上模拟。

  • 将下载下来的redis.conf复制三份,分别命名为
    redis-master.conf,redis-slave01.conf,redis-slave02.conf
  • 将三个配置文件放入root目录下的redisconf目录
  • 对不同的目录进行不同的配置
  • 在这里插入图片描述

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

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

# 关闭保护模式
protected-mode no 

# 让redis服务后台运行
daemonize yes 

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

# 配置日志路径,为了便于排查问题,指定redis的日志文件目录
logfile "/root/redis/logs/redis.log"

接下来便是修改从机redis-slave01.conf, redis-slave02.conf

# 注释这一行,表示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
# 将35.236.172.131做为主,其余两台机器做从。ip和端口号按照机器和配置做相应修改。
replicaof 35.236.172.131 6379

# 配置日志路径,为了便于排查问题,指定redis的日志文件目录
logfile "/var/redis/logs/redis.log"

启动容器

在配置好配置文件后便可启动容器
分别创建出三个容器,命名为redis-master,redis-salve01,redis-salve02.
注意需要先创建出 主服务器

 docker run -it --name redis-master -v /root/redisconf/redis-master.conf:/usr/local/redis/redis.conf -d -p 6379:6379 redis /bin/bash

创建从服务器

docker run -it --name redis-salve01 -v /root/redisconf/redis-salve01.conf:/usr/local/redis/redis.conf -d -p 6380:6379 redis /bin/bash

创建完成
在这里插入图片描述

在此需要注意端口的映射

进入容器里启动redis服务器。

# 以交互模式进入容器redis-master, 进入从服务器一样
 docker exec -it redis-master bash
 
 # 创建日志文件目录
mkdir /root/local/redis/logs/
touch /redis.log

#启动redis服务器,如果没有任何输出,就说明成功了
redis-server /usr/local/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

验证主从复制

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

添加哨兵

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

哨兵先监听主,通过对主发送info命令,获取到从的信息,然后也会监听到从。另外哨兵都会像主订阅__sentinel__:hello频道,当有新的哨兵加入时,会向这个频道发送一条信息,这条信息包含了该哨兵的IP和端口等信息,那么其他已经订阅了该频道的哨兵就会收到这条信息,就知道有一个新的哨兵加入。

简单而言就是

  • 监控主数据库和从数据库是否正常运行
  • 主数据库出现故障时自动将从数据库转换为主数据库

哨兵是一个独立的进程,使用哨兵的典型结构图如下:
在这里插入图片描述
在一主多从的Redis系统中,可以使用多个哨兵进行监控任务以保证系统的问题。
在这里插入图片描述
实现哨兵模式
获取并修改sentinel配置文件

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

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

修改配置文件以下几项

# 让sentinel服务后台运行
daemonize yes 

# 修改日志文件的路径
logfile "/var/log/redis/sentinel.log"

# 修改监控的主redis服务器
# 最后一个2表示,两台机器判定主被动下线后,就进行failover(故障转移)
sentinel monitor mymaster 35.236.172.131 6379 2

接下来就是验证了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值