docker 镜像修改的配置文件自动还原_基于Docker搭建Redis一主两从三哨兵

作者丨oscarwin来源:https://juejin.im/post/5d26b03de51d454fa33b1960

这段时间正在学习Redis和容器相关的内容,因此想通过docker搭建一套redis主从系统来加深理解。看这篇文章可能你需要一定的docker基础,以及对redis主从和哨兵机制有所了解。

这次实验准备了三台云主机,系统为Debian,ip分别为:

35.236.172.131 ,35.201.200.251,34.80.172.42。

首先分别在这三台主机上安装docker,然后每台主机上启动一个redis容器,运行redis-server服务,其中35.236.172.131作为master,另外两台机器作为slave,最后在三台主机上再分别启动一个redis容器,运行redis-sentinel。为什么还是redis容器呢?因为sentinel实际上还是一个redis-server,只不过是以sentinel模式执行,只能处理sentinel需要的一些命令。

安装docker

docker的安装有很多种方法,这里就不介绍了。本次使用脚本安装docker,Debian系统脚本安装如下,其他系统可以参考Docker官网的安装方法:

https://docs.docker.com/install/linux/docker-ce/debian/

不过下面的命令在官网命令的基础上修改镜像源为阿里云,因为国内镜像往往会快一些。

脚本安装docker

在物理主机或者云虚拟主机上运行下面的命令就可以完成docker安装了,当然我是在Debian系统上,其他系统相应参考官网上的方法。

$ curl -fsSL https://get.docker.com -o get-docker.sh$ sudo sh get-docker.sh --mirror Aliyun

启动docker CE

docker是以客户端和服务器模型运行的,因此需要先运行docker的服务器,服务器以daemon的形式运行。docker CE是docker的社区版本。

$ sudo systemctl enable docker$ sudo systemctl start docker

验证docker是否安装成功

下面的这条命令是从docker的官方仓库拉取一个名为hello-world的镜像,并通过这个镜像启动一个容器。

$ docker run hello-world

如果运行结果如下,出现了Hello from Docker!,说明docker安装成功了

43b59ba99b85424bf74066a292974a2a.png

启动容器搭建主从

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

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

97d26ff669390f63f45efaab7f2eecc3.png

获取Redis镜像

下面的命令会拉取最新的官方版本的redis镜像

$ docker pull redis

查看镜像

b78e2678886ce960fe06027db03cb031.png

获取并修改redis配置文件

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

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

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

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

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

f35b1ad2d4539f0b65fd9109ccc003ff.png

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

ff7fb7955cdb4c41cf5539bcc4bfb4a4.png

启动容器

分别在主机和从机上按照上面的方法建立好配置文件,检查无误后就可以开始启动容器了。

我们在三台机器上分别将容器别名指定为redis-1, redis-2, redis-3,这样便于区分与说明,docker通过--name参数来指定容器的别名。redis-1是master上容器的别名,redis-2和redis-3是两个slave上的别名。

下面以运行redis-3容器为例说明容器的启动过程。另外两台机器上的容器redis-1和redis-2操作是相同的,只是要注意master的配置文件和slave不同。不过首先要启动主服务器,也就是redis-1容器。然后再启动redis-2和redis-3。

b26db23b9d2994bee770f6a0071e4a7f.png

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

6a2596c40cdf9ad0c271b04446a2efa1.png

验证主从复制

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

# 以交互模式进入容器redis-1中$ docker exec -it redis-1 bash

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

$ redis-cli127.0.0.1:6379> set test_key hello-worldOK

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

127.0.0.1:6379> get test_key "hello-world"

添加哨兵

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

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

这些哨兵会与新加入和哨兵建立连接,选主是需要通过这个连接来进行投票。这个关系可以用下面这个图来描述

c359dd9541767517ae66b8521e7cf694.png

获取并修改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

启动容器

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

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

运行哨兵

6c54e488b642593d6c99ecd106f56375.png

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

验证failover(故障转移)

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

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

127.0.0.1:6379> info...# Replicationrole:master...

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

下面这段日志,描述了35.236.172.131作为主启动,执行故障转移的master sentinel选举,执行故障转移,建立新的主从关系。

9af707376f3843b689637a243a309bf7.png

总结

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值