这段时间正在学习redis和容器相关的内容,因此想通过docker搭建一套redis主从系统来加深理解。看这篇文章可能你需要一定的docker基础,以及对redis主从和哨兵机制有所了解。
这次实验准备了三台云主机,系统为debian,ip分别为:
首先分别在这三台主机上安装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系统上,其他系统相应参考官网上的方法。
启动docker ce
docker是以客户端和服务器模型运行的,因此需要先运行docker的服务器,服务器以daemon的形式运行。docker ce是docker的社区版本。
验证docker是否安装成功
下面的这条命令是从docker的官方仓库拉取一个名为hello-world的镜像,并通过这个镜像启动一个容器。
如果运行结果如下,出现了hello from docker!,说明docker安装成功了
启动容器搭建主从
docker安装成功后,可以开始部署redis服务了。先从docker官方公共仓库拉取redis镜像,然后修改redis服务的配置文件,最后启动容器,启动redis服务器。在多台机器上运行redis服务器,并建立主从关系。
redis的主从是实现redis集群和redis哨兵高可用的基础,redis的主从结构使从可以复制主上的数据,如果从与主之间网络断开,从会自动重连到主上。
获取redis镜像
下面的命令会拉取最新的官方版本的redis镜像
查看镜像
获取并修改redis配置文件
redis官方提供了一个配置文件样例,通过wget工具下载下来。我用的root用户,就直接下载到/root目录里了。
打开下载下来的文件后,可以看到配置有很多。我只是搭建服务进行试验所以只修改必要的几项。如果要运用到线上,那必须所有的配置都按需求进行修改。
其中redis服务器的master和slave角色使用的配置文件还会有些不同,下面分别进行说明。
对于master而言,配置文件修改以下几项
对于slave而言,配置文件修改以下几项:
启动容器
分别在主机和从机上按照上面的方法建立好配置文件,检查无误后就可以开始启动容器了。
我们在三台机器上分别将容器别名指定为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。
上面已经启动了容器,接下来进入容器里启动redis服务器。
验证主从复制
主从搭建成功后,可以通过在master上写入一个key-value值,查看是否会同步到slave上,来验证主从同步是否能成功。
运行一个redis-cli,向test_key写入一个值
在任意slave机器上进入容器,也运行一个redis-cli,查询这个key的值。如果能查询到这个值,且与主机上的值相同,说明主从同步成功。经测试,主动同步成功。
添加哨兵
主从结构搭建成功了,系统的可用性变高了,但是如果主发生故障,需要人工手动切换从机为主机。这种切换工作不仅浪费人力资源,更大的影响是主从切换期间这段时间redis是无法对外提供服务的。因此,哨兵系统被开发出来了,哨兵可以在主发生故障后,自动进行故障转移,从从机里选出一台升级为主机,并持续监听着原来的主机,当原来的主机恢复后,会将其作为新主的从机。
哨兵先监听主,通过对主发送info命令,获取到从的信息,然后也会监听到从。另外哨兵都会像主订阅__sentinel__:hello频道,当有新的哨兵加入时,会向这个频道发送一条信息,这条信息包含了该哨兵的ip和端口等信息,那么其他已经订阅了该频道的哨兵就会收到这条信息,就知道有一个新的哨兵加入。
这些哨兵会与新加入和哨兵建立连接,选主是需要通过这个连接来进行投票。这个关系可以用下面这个图来描述
获取并修改sentinel配置文件
通过wget命令获取sentinel的配置文件
修改配置文件以下几项
启动容器
与启动redis容器类似,启动一个别名为sentinel的容器
运行哨兵
在另外两台机器上按照同样的方法在一个容器中运行sentinel,sentinel都使用相同的配置文件。
验证failover(故障转移)
为了验证哨兵机制下的自动主从切换,我们将主上的redis进程kill掉。
稍等几秒钟后,就有另外一台从升级为主机,实验时是第三台机器,也就是redis-3升级为了主,用info命令查询可以看到redis-3服务器的角色变成的master。说明自动主从切换成功。
然后重新启动之前被kill掉的master服务器,启动后用info命令查看,可以发现其变成了redis-3的从服务器。
下面这段日志,描述了35.236.172.131作为主启动,执行故障转移的master sentinel选举,执行故障转移,建立新的主从关系。
总结
redis通过主从复制来实现高可用,但是发生故障时需要人工进行主从切换,效率低下。哨兵机制实现了redis主从的自动切换,提高了redis集群的可用性,提高了redis集群的故障转移效率。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/weixin_38405253/article/details/100552874