redis在我们企业级开发中是使用很常见的,但是搭建单个redis不能保证我们的稳定使用,所以我们要建立一个集群。从哨
redis有两种高可用的方案:
第一个就是我们本次的要搭建的,就是高可用的哨兵,主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 |
Redis Sentinel 在不使用Redis Cluster时为 Redis 提供高可用性。
Sentinel功能的完整列表:
官方哨兵搭建条件:
详细介绍和使用:请见官网 --->官网详细文档:https://redis.io/docs/management/sentinel/
话不多说,咱们直接开始搭建哈!
三台机器上新建目录:
首先我们开启三个xshell窗口,然后同时操作三个窗口创建。
然后再左下角选择发送到全部窗口!
cd /
mkdir mydata
cd /mydata
mkdir redis
cd redis
mkdir data
mkdir conf
cd conf
vim redis.conf
输入以下内容:
# 任何都可以连接redis
bind 0.0.0.0
# 配置master密码
requirepass 123456
# 宕机后成为从要连接master的密码
masterauth 123456
# 开启持久化
appendonly yes
vim redis.conf
输入以下内容:
# 配置master的ip和端口号
replicaof 192.168.239.131 6379
# 任何都可以连接redis
bind 0.0.0.0
# 成为master后的密码
requirepass 123456
# 连接master密码
masterauth 123456
# 开启持久化
appendonly yes
vim redis.conf
输入以下内容:
# 配置master的ip和端口号
replicaof 192.168.239.131 6379
# 任何都可以连接redis
bind 0.0.0.0
# 成为master后的密码
requirepass 123456
# 连接master密码
masterauth 123456
# 开启持久化
appendonly yes
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
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节点了!
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
我们查看master日志,可以看到两个从节点已经加入进来了!
我们进入容器进行在次查看:
docker exec -it redis-master /bin/bash
连接redis:
redis-cli
登录redis:
auth 123456
查看从节点:
info
也是可以看到有两个从节点!
还是三个虚拟机一起创建。
mkdir sentinel
cd sentinel
vim sentinel.conf
输入下面内容:
port 26379
sentinel monitor redis-master 192.168.239.131 6379 2
sentinel auth-pass redis-master 123456
sentinel down-after-milliseconds redis-master 6000
sentinel parallel-syncs redis-master 1
sentinel failover-timeout redis-master 6000
第二行:Redis 监控一个名为redis-master的redis集群,我们可以随意写;后面就是ip,我们宿主机的ip即可,端口为主redis的端口;2为哨兵投票的票数,当主redis宕机,三个哨兵必须两个哨兵都投票的redis才会变为主!!
第三行:配置master的密码
第四行:Sentinel判断实例进入主观下线所需的时间,毫秒单位。
第五行:限制在一次故障转移之后,每次向新的主节点同时发起复制操作节点个数,越大效率越慢。
第六行:在指定的时间内未能完成failover故障转移,则任务故障转移失败。
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
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
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
这里创建三个哨兵,查看却是有四个,不知道什么问题,换了虚拟机还是不行!有大佬懂的可以分享一下哈!!
master节点创建一个键值对:
set a b
从查看key是否存在:
get a
主从没有问题哈!
我们把master停掉,查看一个哨兵的日志:
docker stop redis-master
docker logs -f redis-sentinel-1
我们看到192.168.239.130成为master!
重新启动原来的master:
docker restart redis-master
故障转移成功!!
小编的springboot版本为:2.7.4。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
password密码和sentinel同级,不然找不到密码,验证失败。
server:
port: 8087
spring:
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
/**
* @author wangzhenjun
* @date 2022/11/24 10:37
*/
@Configuration
public class RedisConfig {
@Bean
@SuppressWarnings(value = { "unchecked", "rawtypes" })
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory)
{
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);
// 使用StringRedisSerializer来序列化和反序列化redis的key值
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(serializer);
// Hash的key也采用StringRedisSerializer的序列化方式
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(serializer);
template.afterPropertiesSet();
return template;
}
}
/**
* @author wangzhenjun
* @date 2022/11/24 10:37
*/
@RestController
public class TestController {
@Autowired
private RedisTemplate redisTemplate;
@GetMapping("/redis")
public void saveRedis(){
redisTemplate.opsForValue().set("test","看到我就成功了");
}
}
http://localhost:8087/test/redis
经过一天的搭建,终于完成了,虽然不是完美的,但是大体功能是没有问题的!但是不影响故障转移和主从复制!
唯一的遗憾:三个哨兵,查看就是四个!从第三个哨兵加入后变为4个!
责任编辑:姜华 来源: 小王博客基地 Redisdocker(责任编辑:热点)
东方空间完成4亿元A轮融资 老股东鼎和高达、天府三江资本等机构持续加持
恒辉安防(300952.SZ)IPO定价11.72元/股 网下发行不再进行累计投标询价
百济神州(06160.HK)公布2020年第四季度和全年财务业绩 总收入有所增长
曼谷轨道交通项目正式实现闭环运营 惠及80万当地民众快捷出行
新三板创新层挂牌公司首季实现营收1198亿元 实现净利润55.89亿元