docker搭建redis哨兵集群并且整合springboot的实现

一   创建redis和sentinel

因为我们要存放docker-compose.yml文件,所以需要创建redis和sentinel两个文件夹

二   创建docker-compose.yml

docker-compose.yml

version: "3"
services:
master:
image: redis:latest
container_name: my_redis_master
command: redis-server --requirepass root
ports:
- 6379:6379
slave1:
image: redis:latest
depends_on:
- master
container_name: my_redis_slave1
command: redis-server --slaveof my_redis_master 6379 --requirepass root --masterauth root
ports:
- 6380:6379
slave2:
image: redis:latest
depends_on:
- master
container_name: my_redis_slave2
ports:
- 6381:6379
command: redis-server --slaveof my_redis_master 6379 --requirepass root --masterauth root
networks:
name: redis_net

三   sdocker-compose.yml文件、sentinel.conf配置文件

sdocker-compose.yml文件

version: '3'
services:
sentinel1:
image: redis
container_name: redis-sentinel-1
networks:
- redis_net
ports:
- 26379:26379
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
volumes:
- ./sentinel1.conf:/usr/local/etc/redis/sentinel.conf
sentinel2:
image: redis
container_name: redis-sentinel-2
networks:
- redis_net
ports:
- 26380:26379
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
volumes:
- ./sentinel2.conf:/usr/local/etc/redis/sentinel.conf
sentinel3:
image: redis
container_name: redis-sentinel-3
networks:
- redis_net
ports:
- 26381:26379
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
volumes:
- ./sentinel3.conf:/usr/local/etc/redis/sentinel.conf
networks:
redis_net:
external:
name: redis_net

sentinel配置文件

port 26379
dir /tmp
sentinel monitor mymaster 192.168.16.2 6379 2
sentinel auth-pass mymaster root 
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1

sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes

四   整合redis哨兵

依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<!-- 排除lettuce包,使用jedis代替-->
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.0.1</version>
</dependency>

配置

spring:
redis:
sentinel:
master: mymaster
nodes: 192.168.16.5:26379,192.168.16.6:26380,192.168.16.7:26381
max-idle: 8
min-idle: 0
max-wait: -1
max-active: 8
password: root

配置bean

@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringRedisSerializer);
redisTemplate.setHashKeySerializer(stringRedisSerializer);
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}

五   使用哨兵工作

5.1  哨兵的特点

· 哨兵每秒一次会向集群中的所有redis发送ping命令

· 如果ping命令的时间超过了
down-after-milliseconds设置的时间,哨兵会将其标记为主观下线

· 当Master被标记为了主观下线时,哨兵会以每秒一次的频率确认Master是否进入了主观下线状态

· 当大部分哨兵确认Master进入主观下线,那么Master就会被改为客观下线

· 如果哨兵不同意Master主服务器下线,master就不会进入客观下线状态

5.2  转移故障

·  选择优先级最高的

·  复制偏移量大的从节点

·  runid最小的

六   Redis-Cluster

6.1  特点

·  使用二进制连接

·  精密的检测

·  客户端只需要连接集群中任何一个节点即可

6.2  工作方式

redis-cluster引入了主从模式,一个主节点对应多个从节点,当超过半数的从节点ping主节点超时时,就会认为主节点宕机了

原创文章,作者:网友投稿,如若转载,请注明出处:https://www.cloudads.cn/archives/4143.html

发表评论

登录后才能评论