一 创建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