docker redis-sentinel哨兵集群及java实战
一、docker环境准备
1、VM安装centos-7
安装详情见https://blog.youkuaiyun.com/chaojiangroke/article/details/108660782
2、安装centos-7版docker
安装详细见https://blog.youkuaiyun.com/chaojiangroke/article/details/108666791
3、为redis集群自定义网段
docker network create --subnet=172.18.0.0/16 net-redis
二、redis主从(一主两从)
1、下载redis镜像
docker pull redis:version
2、查看镜像
docker images
3、修改准备好的redis.conf配置文件
具体配置详见:https://blog.youkuaiyun.com/chaojiangroke/article/details/108485270
讲解几个重要配置:
1)bind配置,如果bind选项为空或0.0.0.0的话,那会接受所有来自于可用网络接口的连接
bind 0.0.0.0
2)守护进程的方式进行启动:daemonize yes
3)配置密码: requirepass 123456
4)配置docker宿主机IP作为哨兵模式暴露的ip
cluster-announce-ip 192.168.233.128 #我的docker宿主机ip
Master:
端口:port 6379
关闭镜像rdb持久化,注释掉所有的save配置;
#save 900 1
#save 300 10
#save 60 10000
关闭aof持久化,appendonly no
Slave:
端口:port 6380 和 6381
开启rdb持久化和aof持久化;
save 900 1
save 300 10
save 60 10000
配置master: replicaof masterIp masterPort
配置master的访问密码:masterauth 123456
配置从只读:replica-read-only yes
4、分别启动启动redis redis-slave1 redis-slave2
docker run -p 6379:6379 --name redis -v /home/docker/redis/conf/redis.conf:/etc/redis/redis.conf -v /home/docker/redis/data:/data -d redis:6.0.7 redis-server /etc/redis/redis.conf --restart=always
docker run -p 6380:6380 --name redis-slave1 -v /home/docker/redis1/conf/redis.conf:/etc/redis/redis.conf -v /home/docker/redis1/data:/data -d redis:6.0.7 redis-server /etc/redis/redis.conf --restart=always
docker run -p 6381:6381 --name redis-slave2 -v /home/docker/redis2/conf/redis.conf:/etc/redis/redis.conf -v /home/docker/redis2/data:/data -d redis:6.0.7 redis-server /etc/redis/redis.conf --restart=always
启动后进入一个slave1
查看主从信息
#进入容器
[root@localhost ~]# docker exec -ti redis-slave2 /bin/bash
#进入redis客户端
root@4d0073ebf147:/data# redis-cli
#获取权限
127.0.0.1:6379> auth 123456
OK
#查询主从信息
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:172.17.0.3
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:1
master_link_down_since_seconds:1600420233
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:67e5639423b505a3e15942a1f65acef248a6acaf
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
可以看到这台主的ip是172.17.0.3
然后自行验证
三、sentinel哨兵集群
哨兵可多个配置几乎一致,这里只举例一个哨兵
- 修改准备好的sentinel.conf配置文件
1)bind配置,如果bind选项为空或0.0.0.0的话,那会接受所有来自于可用网络接口的连接
bind 0.0.0.0
2)配置master地址 sentinel monitor <master-name> <ip> <port> <quorum>
sentinel monitor mymaster 192.168.233.128 6379 1
Sentinel节点会定期监控主节点,所以从配置上必然也会有所体现,本
配置说明Sentinel节点要监控的是一个名字叫做,ip地址和端
口为的主节点。代表要判定主节点最终不可达所需要的票数。一
般建议将其设置为Sentinel节点的一半加1。
同时还与Sentinel节点的领导者选举有关,至少要有max(quorum,num(sentinels)/2+1)个Sentinel节点参与选举,才能选出领导者Sentinel,从而完成故障转移。例如有5个Sentinel节点,quorum=4,那么至少要有max(quorum,num(sentinels)/2+1)=4个在线Sentinel节点才可以进行领导者选举
3)配置密码:requirepass 123456
4)配置master的访问密码:sentinel auth-pass mymaster 123456
5)protected-mode yes开启保护模式 (需要密码访问,jedis在这种模式下无法运行)
6)port 26379
4、启动redis-sentinel
docker run -p 26379:26379 --name redis-sentinel -v /home/docker/redis-sentinel/conf:/etc/redis -v /home/docker/redis-sentinel/data:/data -d redis:6.0.7 redis-sentinel /etc/redis/sentinel.conf --restart=always
四、spring boot继承redis sentinel
1、下载依赖包
#单元测试jar
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
#spring boot redis sentinel依赖jar
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2、配置文件
spring:
redis:
#哨兵配置
sentinel:
#主节点名称
master: mymaster
#sentinel密码
password: 123456
#节点ip:port 多个以逗号隔开
nodes: 192.168.233.128:26379
jedis:
@线程池配置
pool:
max-active: 8
min-idle: 0
max-idle: 8
max-wait: 1
#访问密码
password: 123456
3、redis服务类
@Service
public class RedisService {
@Resource //
private StringRedisTemplate stringRedisTemplate;
@Resource // RedisTemplate,可以进行所有的操作
private RedisTemplate<Object,Object> redisTemplate;
public void set(String key, String value){
stringRedisTemplate.opsForValue().set(key, value);
}
public String get(String key){
return stringRedisTemplate.opsForValue().get(key);
}
}
4、测试类
@SpringBootTest
class RedisSentinelApplicationTests {
@Autowired
private RedisService redisService;
@Test
void redsSentinel() throws InterruptedException {
int i = 0;
while (true) {
redisService.set("sentinel测试"+(++i), i+"");
System.out.println(redisService.get("sentinel测试"+i));
Thread.sleep(500);
}
}
}
5、测试
开始执行redsSentinel方法
停掉master
发现短暂连接埠上后主从切换,又可以正常使用了,至此哨兵集群搭建完毕