redis 4.14单机\哨兵模式搭建


环境

  • redis:4.0.14
  • linux
  • 1主2从

安装

下载redis

redis-4.0.14.tar.gz

配置redis

解压 tar -xzvf redis-4.0.14.tar.gz

编译
cd redis-4.0.14/

执行make

结束后,在redis-4.0.14新建config文件夹
mkdir config

拷贝redis配置文件

1
2
3
cp redis.conf ../config/redis-6301.conf
cp redis.conf ../config/redis-6302.conf
cp redis.conf ../config/redis-6303.conf

配置三个redis.conf

1
vim redis-6301.conf

主节点

1
2
3
4
5
6
7
8
9
10
11
12
//服务器ip
#bind 192.168.18.128
protected-mode no
port 6301
<!--后台启动-->
daemonize yes
supervised no
pidfile "/var/run/redis_6301.pid"
dbfilename "6301dump.rdb"
masterauth "redis"

slave-read-only no # 从节点不仅可以读,也可以写,yes为从节点只读

从节点添加

1
2
//主节点ip port
slaveof 192.168.18.128 6301

另外修改对应端口

启动

1
2
3
./redis-server ../config/redis-6301.conf
./redis-server ../config/redis-6302.conf
./redis-server ../config/redis-6303.conf

查看

1
2
3
4
5
6
7
./redis-cli -h 192.168.18.128 -p 6301

<!--验证-->
auth redis
<!--显示信息-->
info

显示主从信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Replication
role:master //主节点
connected_slaves:2
slave0:ip=192.168.18.128,port=6301,state=online,offset=6359422,lag=1
slave1:ip=192.168.18.128,port=6302,state=online,offset=6359279,lag=1
master_replid:82dd642ad60846cd858cfa20e86cda7c4a043881
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:6359565
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:5310990
repl_backlog_histlen:1048576

哨兵模式配置

配置项

1
2
3
4
5
6
7
8
9
10
port 26301
sentinel monitor mymaster 192.168.18.128 6301 2
sentinel auth-pass mymaster redis
sentinel down-after-milliseconds mymaster 15000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 80000
bind 192.168.18.128
protected-mode no
daemonize yes //允许后台启动

向config文件夹中拷贝三个配置文件

1
2
3
cp sentinel.conf ../config/sentinel-6301.conf
cp sentinel.conf ../config/sentinel-6302.conf
cp sentinel.conf ../config/sentinel-6303.conf

从节点修改端口26302,26303

启动

1
2
3
./redis-sentinel ../config/sentinel-26301.conf
./redis-sentinel ../config/sentinel-26302.conf
./redis-sentinel ../config/sentinel-26303.conf

结果验证

查看进程
ps -ef|grep redis

验证下主从同步

kill -9 13028
查看主节点变更情况

spring boot集成

配置文件application.yml

1
2
3
4
5
6
7
8
9
10
spring:
redis:
# url: 127.0.0.1 // 单机使用
# host: localhost
# port: 6379
timeout: 3600
password: redis
sentinel:
nodes: 192.168.18.128:26301,192.168.18.128:26302,192.168.18.128:26303
master: mymaster

WebMvcConfigurer配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Value("#{'${spring.redis.sentinel.nodes}'.split(',')}")
private List<String> nodes;
@Value("${spring.redis.password}")
private String redisPassword;
@Value("${spring.redis.sentinel.master}")
private String redisMaster;
@Autowired
private FastJsonHttpMessageConverter fastJsonHttpMessageConverter;


@Bean
public RestTemplateBuilder restTemplateBuilder() {
RestTemplateBuilder builder = new RestTemplateBuilder();
return builder.messageConverters(fastJsonHttpMessageConverter);
}

@Bean
public RestTemplate restTemplate() {
return restTemplateBuilder().build();
}


@Bean
JedisConnectionFactory jedisConnectionFactory() {
return new JedisConnectionFactory(sentinelConfiguration());
}
@Bean
public RedisSentinelConfiguration sentinelConfiguration(){
RedisSentinelConfiguration redisSentinelConfiguration = new RedisSentinelConfiguration();
//配置matser的名称
redisSentinelConfiguration.master(redisMaster);
//配置redis的哨兵sentinel
Set<RedisNode> redisNodeSet = new HashSet<>();
nodes.forEach(x->{
redisNodeSet.add(new RedisNode(x.split(":")[0],Integer.parseInt(x.split(":")[1])));
});
log.info("\nredisNodeSet -->{}",redisNodeSet);
redisSentinelConfiguration.setSentinels(redisNodeSet);
redisSentinelConfiguration.setPassword(RedisPassword.of(redisPassword));
return redisSentinelConfiguration;
}


@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(jedisConnectionFactory());
return template;
}
}

启动,连接成功会显示具体信息

1
2
3
redis.clients.jedis.JedisSentinelPool    : Trying to find master from available Sentinels...
redis.clients.jedis.JedisSentinelPool : Redis master running at 192.168.18.128:6303, starting Sentinel listeners...
redis.clients.jedis.JedisSentinelPool : Created JedisPool to master at 192.168.18.128:6303

连接异常情况

1
2
3
4
5
2019-04-04 09:55:44.961  INFO 24056 --- [           main] redis.clients.jedis.JedisSentinelPool    : Trying to find master from available Sentinels...
2019-04-04 09:55:44.973 WARN 24056 --- [ main] redis.clients.jedis.JedisSentinelPool : Cannot get master address from sentinel running @ 192.168.18.1281:26302. Reason: redis.clients.jedis.exceptions.JedisConnectionException: java.net.UnknownHostException: 192.168.18.1281. Trying next one.
2019-04-04 09:55:44.973 WARN 24056 --- [ main] redis.clients.jedis.JedisSentinelPool : Cannot get master address from sentinel running @ 192.168.18.1281:26301. Reason: redis.clients.jedis.exceptions.JedisConnectionException: java.net.UnknownHostException: 192.168.18.1281. Trying next one.
2019-04-04 09:55:44.973 WARN 24056 --- [ main] redis.clients.jedis.JedisSentinelPool : Cannot get master address from sentinel running @ 192.168.18.1281:26303. Reason: redis.clients.jedis.exceptions.JedisConnectionException: java.net.UnknownHostException: 192.168.18.1281. Trying next one.

注意事项

防火墙端口开启


文章作者: 苏叶新城
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 苏叶新城 !
  目录