生产环境 TiDB 集群混合部署的实践经验
1313
2023-04-18
三台服务器使用Docker搭建Redis一主二从三哨兵,概念-搭建-整合Springboot
一、前言
redis在我们企业级开发中是很常见的,但是单个redis不能保证我们的稳定使用,所以我们要建立一个集群。redis有两种高可用的方案:
High availability with Redis Sentinel(哨兵)Scaling with Redis Cluster(分片集群)
第一个就是我们本次的要搭建的,就是高可用的哨兵,主redis挂掉,哨兵会进行投票进行故障转移!第二个就是分片集群,哨兵的一个缺点就是只能存在一个master节点,写的效率太低。分片集群就是解决哨兵的问题,可以水平扩展,提高redis的性能!
哨兵最低配是三哨兵,以奇数递增。分片集群最低配是三主三从。
二、准备
首先我们要准备:三台服务器(没有的条件的搭三个虚拟机),巧了小编就是虚拟机哈!
三台机器的ip和名称在表格里整理一下!
ip
redis节点名称
sentinel节点名称
192.168.239.131
redis-master
redis-sentinel-1
192.168.239.130
redis-slave-1
redis-sentinel-2
192.168.239.128
redis-slave-2
redis-sentinel-3
三、Sentinel概念
Redis Sentinel 在不使用Redis Cluster时为 Redis 提供高可用性。
Sentinel功能的完整列表:
监控:Sentinel 不断检查您的主实例和副本实例是否按预期工作。通知:Sentinel 可以通过 API 通知系统管理员或其他计算机程序,其中一个受监控的 Redis 实例出现问题。自动故障转移:如果 master 没有按预期工作,Sentinel 可以启动一个故障转移过程,其中一个副本被提升为 master,其他额外的副本被重新配置为使用新的 master,并且使用 Redis 服务器的应用程序被告知要使用的新地址连接时。自动更新配置:Sentinel 充当客户端服务发现的权威来源:客户端连接到 Sentinels 以询问负责给定服务的当前 Redis master 的地址。如果发生故障转移,Sentinels 将报告新地址。
官方哨兵搭建条件:
您至少需要三个 Sentinel 实例才能进行可靠的部署。三个 Sentinel 实例应该放置在被认为以独立方式发生故障的计算机或虚拟机中。因此,例如在不同可用区上执行的不同物理服务器或虚拟机。
四、一主二从搭建
话不多说,咱们直接开始搭建哈!
1、创建挂载目录
三台机器上新建目录:首先我们开启三个xshell窗口,然后同时操作三个窗口创建。
然后再左下角选择发送到全部窗口!
cd /mkdir mydatacd /mydatamkdir rediscd redismkdir datamkdir confcd conf
2、在`192.168.239.131`机器上编辑文件
vim redis.conf
输入以下内容:
# 任何都可以连接redisbind 0.0.0.0# 配置master密码requirepass 123456# 宕机后成为从要连接master的密码masterauth 123456# 开启持久化appendonly yes
3、在`192.168.239.130`机器上编辑文件
vim redis.conf
输入以下内容:
# 配置master的ip和端口号replicaof 192.168.239.131 6379# 任何都可以连接redisbind 0.0.0.0# 成为master后的密码requirepass 123456# 连接master密码masterauth 123456# 开启持久化appendonly yes
4、在`192.168.239.128`机器上编辑文件
vim redis.conf
输入以下内容:
# 配置master的ip和端口号replicaof 192.168.239.131 6379# 任何都可以连接redisbind 0.0.0.0# 成为master后的密码requirepass 123456# 连接master密码masterauth 123456# 开启持久化appendonly yes
5、`192.168.239.131`启动redis
docker run -p 6379:6379 --name redis-master \-v /mydata/redis/data:/usr/local/etc/redis/data \-v /mydata/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf \-d redis redis-server /usr/local/etc/redis/redis.conf
查看启动日志:
docker logs -f redis-master
6、`192.168.239.130`启动redis
docker run -p 6379:6379 --name redis-slave-1 \-v /mydata/redis/data:/usr/local/etc/redis/data \-v /mydata/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf \-d redis redis-server /usr/local/etc/redis/redis.conf
可以看到已经连接到master节点了!
7、`192.168.239.128`启动redis
docker run -p 6379:6379 --name redis-slave-2 \-v /mydata/redis/data:/usr/local/etc/redis/data \-v /mydata/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf \-d redis redis-server /usr/local/etc/redis/redis.conf
8、进入`192.168.239.130`容器查看
我们查看master日志,可以看到两个从节点已经加入进来了!
我们进入容器进行在次查看:
docker exec -it redis-master /bin/bash
连接redis:
redis-cli
登录redis:
auth 123456
查看从节点:
info
也是可以看到有两个从节点!
五、搭建三哨兵sentinel
1、创建挂载目录
还是三个虚拟机一起创建。
mkdir sentinelcd sentinelvim sentinel.conf
输入下面内容:
port 26379sentinel monitor redis-master 192.168.239.131 6379 2sentinel auth-pass redis-master 123456sentinel down-after-milliseconds redis-master 6000sentinel parallel-syncs redis-master 1sentinel failover-timeout redis-master 6000
第二行:Redis 监控一个名为redis-master的redis集群,我们可以随意写;后面就是ip,我们宿主机的ip即可,端口为主redis的端口;2为哨兵投票的票数,当主redis宕机,三个哨兵必须两个哨兵都投票的redis才会变为主!!第三行:配置master的密码第四行:Sentinel判断实例进入主观下线所需的时间,毫秒单位。第五行:限制在一次故障转移之后,每次向新的主节点同时发起复制操作节点个数,越大效率越慢。第六行:在指定的时间内未能完成failover故障转移,则任务故障转移失败。
2、运行`192.168.239.131`哨兵
docker run -p 26379:26379 --name redis-sentinel-1 \-v /mydata/redis/sentinel/sentinel.conf:/usr/local/etc/redis/sentinel.conf \-d redis redis-sentinel /usr/local/etc/redis/sentinel.conf
3、运行`192.168.239.130`哨兵
docker run -p 26379:26379 --name redis-sentinel-2 \-v /mydata/redis/sentinel/sentinel.conf:/usr/local/etc/redis/sentinel.conf \-d redis redis-sentinel /usr/local/etc/redis/sentinel.conf
4、运行`192.168.239.128`哨兵
docker run -p 26379:26379 --name redis-sentinel-3 \-v /mydata/redis/sentinel/sentinel.conf:/usr/local/etc/redis/sentinel.conf \-d redis redis-sentinel /usr/local/etc/redis/sentinel.conf
5、待解决问题
这里创建三个哨兵,查看却是有四个,不知道什么问题,换了虚拟机还是不行!有大佬懂的可以分享一下哈!!
六、测试主从和故障转移
1、测试主从复制
master节点创建一个键值对:
set a b
从查看key是否存在:
get a
主从没有问题哈!
2、测试故障转移
我们把master停掉,查看一个哨兵的日志:
docker stop redis-masterdocker logs -f redis-sentinel-1
我们看到192.168.239.130成为master!
重新启动原来的master:
docker restart redis-master
故障转移成功!!
七、整合springboot
1、导入依赖
小编的springboot版本为:2.7.4。
2、yml配置
password密码和sentinel同级,不然找不到密码,验证失败。
server: port: 8087spring: redis: # 密码和sentinel同级,不然找不到密码,验证失败 password: 123456 sentinel: # sentinel.conf里的集群名称 master: my-master # 我们只需要连哨兵即可,哨兵内部会帮我们找到redis nodes: - 192.168.239.131:26379 - 192.168.239.130:26379 - 192.168.239.128:26379
3、json序列化配置
/** * @author wangzhenjun * @date 2022/11/24 10:37 */@Configurationpublic class RedisConfig { @Bean @SuppressWarnings(value = { "unchecked", "rawtypes" }) public RedisTemplate
4、新建controller测试
/** * @author wangzhenjun * @date 2022/11/24 10:37 */@RestControllerpublic class TestController { @Autowired private RedisTemplate redisTemplate; @GetMapping("/redis") public void saveRedis(){ redisTemplate.opsForValue().set("test","看到我就成功了"); }}
5、测试
6、查看redis
八、总结
经过一天的搭建,终于完成了,虽然不是完美的,但是大体功能是没有问题的!但是不影响故障转移和主从复制!
唯一的遗憾:三个哨兵,查看就是四个!从第三个哨兵加入后变为4个!
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。