欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

docker 搭建并测试Redis主从、哨兵和集群模式

程序员文章站 2024-03-21 11:04:46
...

一、Redis集群相关概念

可以参考以下几篇文章:
https://www.jianshu.com/p/8e1ed39fdab3
https://www.cnblogs.com/linuxk/p/10718153.html
https://blog.csdn.net/u014527619/article/details/88232178

二、docker创建redis容器

1.先拉取redis镜像最新版本,如果需要其他版本或者其他仓库的可以在pull后面加版本号

docker pull redis

2.这里以三个redis为例,使用以下命令启动3个redis服务

docker run --name redis-6380 -p 6380:6379 -d redis 
docker run --name redis-6381 -p 6381:6379 -d redis 
docker run --name redis-6382 -p 6382:6379 -d redis 

其中--name是对redis容器的命名,-p 6380:6379 第一个端口是宿主机的访问端口,第二个端口是容器内部的端口,-d表示后台启动容器。
更多的docker命令操作可以参考这篇文章
https://www.cnblogs.com/DeepInThought/p/10896790.html
使用 docker ps查看已经在运行的容器

docker 搭建并测试Redis主从、哨兵和集群模式
如图,可以看到三个redis服务已经启动
分别使用docker inspect 容器ID命令,查看redis在docker的网关地址
docker 搭建并测试Redis主从、哨兵和集群模式
记录一下三个redis服务的内网地址,打算把redis-6380当做主节点,其他两个当做从节点

redis-6380 172.17.0.3:6379 主节点
redis-6381 172.17.0.4:6379 从节点
redis-6382 172.17.0.5:6379 从节点

三、配置主从模式

1.进入redis容器内部

docker exec -it redis-6380 /bin/bash

2.连接redis服务端

redis-cli 

连接后使用info replication 可以查看redis的当时角色状态
docker 搭建并测试Redis主从、哨兵和集群模式
我这里是已经改过的,如果什么都没有配置,默认是master节点状态
3.设置另外两个节点的状态为从节点
主节点默认不动,分别在redis-6381和redis-6382使用 slaveof 172.17.0.3 6379 命令
这样子就搭建好了一主两从的模式了

四、测试主从模式

1.测试是否同步
使用主节点redis-6380容器输入redis-cli进入redis控制台
设置k1 123的值
docker 搭建并测试Redis主从、哨兵和集群模式
可以在从节点找到对应的值
docker 搭建并测试Redis主从、哨兵和集群模式

2.测试只有主库能读写、从库只能读
docker 搭建并测试Redis主从、哨兵和集群模式

redis集群主从其他模式
上面一主多从是经典的主从模型,还有比如树形结构的,在从节点后面还有从节点,这样子很大减少了主节点的同步压力,如图所示,可以给从节点再配置从节点

docker 搭建并测试Redis主从、哨兵和集群模式

五、配置哨兵模式

1.在宿主机上准备一个文件sentinel.conf,这个文件的文件名是任意取的,文件的配置规则如下

# 端口
port 26379

# 是否后台启动
daemonize yes

# pid文件路径
pidfile /var/run/redis-sentinel.pid

# 日志文件路径
logfile "/var/log/sentinel.log"

# 定义工作目录
dir /tmp

# 定义Redis主的别名, IP, 端口,这里的2指的是需要至少2个Sentinel认为主Redis挂了才最终会采取下一步行为
sentinel monitor mymaster 172.17.0.3 6379 2

# 如果mymaster 10秒内没有响应,则认为其主观失效
sentinel down-after-milliseconds mymaster 10000

# 如果master重新选出来后,其它slave节点能同时并行从新master同步数据的台数有多少个,显然该值越大,所有slave节点完成同步切换的整体速度越快,但如果此时正好有人在访问这些slave,可能造成读取失败,影响面会更广。最保守的设置为1,同一时间,只能有一台干这件事,这样其它slave还能继续服务,但是所有slave全部完成缓存更新同步的进程将变慢。
sentinel parallel-syncs mymaster 1

# 该参数指定一个时间段,在该时间段内没有实现故障转移成功,则会再一次发起故障转移的操作,单位毫秒
sentinel failover-timeout mymaster 180000

# 不允许使用SENTINEL SET设置notification-script和client-reconfig-script。
sentinel deny-scripts-reconfig yes

修改完配置后,分别把该文件从宿主机复制到三个容器中的根目录下面

docker cp /mydata/redis/sentinel.conf redis-6380:/

/mydata/redis/sentinel.conf是放在宿主机的文件位置

考虑到容器本身没有vim修改文件功能,如果安装vim包的话需要每个容器都需要修改镜像源/etc/apt/sources.list文件,可以用echo的方式追加文件文本内容,操作不太方便,所以从宿主机复制是最快的

docker 搭建并测试Redis主从、哨兵和集群模式
2.启动哨兵模式,在容器根目录下执行

redis-sentinel /sentinel.conf

3.查看哨兵状态

redis-cli -p 26379 info sentinel

docker 搭建并测试Redis主从、哨兵和集群模式
这里面的address就是表示哨兵认为的主节点ip和端口,如果去手动slaveof修改主从关系,而不修改哨兵的配置,哨兵发现主从变了之后,哨兵会根据之前 的address切回原来的主从关系,手动修改无效

六、测试哨兵模式

测试主节点挂了,哨兵选举
1.如果主节点挂了的话,会选举一个新的从节点当做主节点,当之前旧的主节点服务恢复了,会成为新的主节点的一个从节点,从日志中可以看出
docker 搭建并测试Redis主从、哨兵和集群模式
2.同时,哨兵文件配置会自动修改的,如图
docker 搭建并测试Redis主从、哨兵和集群模式
注意:这里是使用的是docker stop 主节点的容器名,除了把主节点的redis服务干掉了之外,主节点的哨兵也挂了,当使用docker start 刚stop的容器名启动容器后,redis的服务起来了,但是26379端口的哨兵服务没有启动,需要手动使用redis-sentinel /sentinel.conf启用哨兵模式

当之前旧的主节点服务恢复了,会成为新的主节点的一个从节点,但是该服务的哨兵服务没有自动启动,而哨兵服务的配置文件中监听的主节点也是旧的,这个时候恢复它的服务
会自动修改哨兵服务监听主节点的
至此,三个节点的三个哨兵服务都会去监听主节点的状态

请教一下,如何在docker启动redis容器的时候,同时启动哨兵服务?

七、配置集群模式(cluster)

上面搭建了一主二从,并加入了哨兵,任何一个节点挂掉都不影响正常使用,实现了高可用。仍然存在一个问题,一主二从每个节点都存储着全部数据,随着业务庞大,数据量会超过节点容量,即便是redis可以配置清理策略,但也有极限,于是需要搭建redis集群,将数据分别存储到不同的redis上,并且可以横向扩展。

基于上面的一主2从配置,我们再增加4个redis容器,他们的现在的关系如下

第一组主从
redis-6380 172.17.0.3:6379 从节点
redis-6381 172.17.0.4:6379 主节点
redis-6382 172.17.0.5:6379 从节点

第二组主从
redis-6480 172.17.0.6:6379 主节点
redis-6481 172.17.0.7:6379 从节点

第三组主从
redis-6580 172.17.0.8:6379 主节点
redis-6581 172.17.0.9:6379 从节点

搭建好7个redis容器后,这个树莓派的主板虽然没有电脑那么强,但是还是很给力的,如果想看使用树莓派主板搭建自己的个人永久服务器,可以查看该系列其他教程
docker 搭建并测试Redis主从、哨兵和集群模式
1.配置好三组redis 的主从和哨兵后,查看集群状态

cluster info  

docker 搭建并测试Redis主从、哨兵和集群模式
还没有配置集群,所以看不到

2.配置redis多主节点集群

需要修改redis容器内的/usr/local/redis/redis.conf文件

参考链接:
https://www.cnblogs.com/Tu9oh0st/p/11205281.html
https://www.cnblogs.com/DeepInThought/p/10896790.html
https://www.cnblogs.com/river2005/p/8503238.html
https://www.cnblogs.com/hmxs/p/12101921.html