Redis主从集群的Sentinel配置

1、概述

Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端)都没有实现自动进行主备切换,而Redis-sentinel本身也是一个独立运行的进程,它能监控多个master-slave集群,发现master宕机后能进行自动切换。

具体Redis Sentinel的机制和用法参照:

https://segmentfault.com/a/1190000002680804

https://www.cnblogs.com/duanxz/p/4701831.html

此文只讲redis的主从配置,以及sentinel的配置,关于redis的安装,可以参照我写的博客:

http://blog.csdn.net/csdn_ds/article/details/53395512

 

2、配置

2.1、集群环境       

 

因笔者搭建环境有限,先在一台centos服务器上,模拟redis的sentinel集群。

redis服务:

ip                        port:

10.116.79.44     6479(主)

10.116.79.44     6480(从)

10.116.79.44     6481(从)

sentinel服务:

ip                        port:

10.116.79.44     26479

10.116.79.44     26480

10.116.79.44     26481

此处设置,redis服务器的密码为:redis123

真实环境建议redis服务最少部署3个,每个服务在一台服务器上,sentinel服务可以部署在一台上,也可以部署在多台上,但建议sentinel服务最少部署3个。

2.2、配置并启动Redis的主从集群

1、Redis主节点配置

redis_6479.conf的配置

#端口
port 6479

#设置密码
requirepass "redis123"

#后台运行
daemonize yes

#进程文件
pidfile "/etc/redis/simpleConf/run/redis_6479.pid"

#日志级别
loglevel notice

#日志文件
logfile "/etc/redis/simpleConf/log/redis_6479.log"

###############################持久化#####################################
# 快照配置
# 注释掉“save”这一行配置项就可以让保存数据库功能失效
# 设置redis进行数据库镜像的频率。
# 900秒(15分钟)内至少1个key值改变(则进行数据库保存--持久化)
# 300秒(5分钟)内至少10个key值改变(则进行数据库保存--持久化)
# 60秒(1分钟)内至少10000个key值改变(则进行数据库保存--持久化)
save 900 1
save 300 10
save 60 10000

#rdb文件的名称
dbfilename "dump_6479.rdb"

#数据目录,数据库的写入会在这个目录。rdb、aof文件也会写在这个目录
dir "/etc/redis/simpleConf/data"

##############################主从配置#####################################

#如果master设置了requirepass,那么slave要连上master,需要有master的密码才行。masterauth就是用来配置master的密码,这样可以在连上master后进行认证。
#在这里,主也要配置,因为如果进行主从切换,主可能就要变成从,从连接主,需要认证。
masterauth "redis123"

此处说明一下:如果redis设置了密码,主节点也需要设置masterauth,因为如果进行主从切换,主可能就要变成从,从连接主,需要认证。

redis_6480.conf的配置

#端口
port 6480

#设置密码
requirepass "redis123"

#后台运行
daemonize yes

#进程文件
pidfile "/etc/redis/simpleConf/run/redis_6480.pid"

#日志级别
loglevel notice

#日志文件
logfile "/etc/redis/simpleConf/log/redis_6480.log"

###############################持久化#####################################
# 快照配置
# 注释掉“save”这一行配置项就可以让保存数据库功能失效
# 设置redis进行数据库镜像的频率。
# 900秒(15分钟)内至少1个key值改变(则进行数据库保存--持久化)
# 300秒(5分钟)内至少10个key值改变(则进行数据库保存--持久化)
# 60秒(1分钟)内至少10000个key值改变(则进行数据库保存--持久化)
save 900 1
save 300 10
save 60 10000

#rdb文件的名称
dbfilename "dump_6480.rdb"

#数据目录,数据库的写入会在这个目录。rdb、aof文件也会写在这个目录
dir "/etc/redis/simpleConf/data"

##############################主从配置#####################################
#复制选项,slave复制对应的master。
slaveof 10.116.79.44 6479
#如果master设置了requirepass,那么slave要连上master,需要有master的密码才行。masterauth就是用来配置master的密码,这样可以在连上master后进行认证。
masterauth "redis123"

redis_6481.conf的配置

#端口
port 6481

#设置密码
requirepass "redis123"

#后台运行
daemonize yes

#进程文件
pidfile "/etc/redis/simpleConf/run/redis_6481.pid"

#日志级别
loglevel notice

#日志文件
logfile "/etc/redis/simpleConf/log/redis_6481.log"

###############################持久化#####################################
# 快照配置
# 注释掉“save”这一行配置项就可以让保存数据库功能失效
# 设置redis进行数据库镜像的频率。
# 900秒(15分钟)内至少1个key值改变(则进行数据库保存--持久化)
# 300秒(5分钟)内至少10个key值改变(则进行数据库保存--持久化)
# 60秒(1分钟)内至少10000个key值改变(则进行数据库保存--持久化)
save 900 1
save 300 10
save 60 10000

#rdb文件的名称
dbfilename "dump_6481.rdb"

#数据目录,数据库的写入会在这个目录。rdb、aof文件也会写在这个目录
dir "/etc/redis/simpleConf/data"

##############################主从配置#####################################
#复制选项,slave复制对应的master。
slaveof 10.116.79.44 6479
#如果master设置了requirepass,那么slave要连上master,需要有master的密码才行。masterauth就是用来配置master的密码,这样可以在连上master后进行认证。
masterauth "redis123"

从节点的配置和主节点的配置基本一样,只是多了一个slaveof的配置,此配置指定了主节点的地址和端口。

 

说明一下:关于从对主的配置,如果主从在一台服务器上,此处的ip地址不能写成127.0.0.1。因为sentinel服务是通过主节点找到的从节点,如果此处配置成127.0.0.1,那么sentinel会认为从节点的ip为127.0.0.1,如果进行主从切换时,主的ip地址就变成了127.0.0.1,那么redis集群就不能进行远程连接了。所以建议配置slaveof时,ip地址写成真实地址。

 

3、查看主从关系

通过redis_server启动redis服务,此时在10.116.79.44服务器上通过redis_cli连接redis,使用info命令查看:

[root@iZwz96uh8912ewkgg2iwg0Z conf]# redis-cli -h 10.116.79.44 -p 6479 -a redis123 info Replication
# Replication
role:master
connected_slaves:2
slave0:ip=10.116.79.44,port=6480,state=online,offset=197,lag=0
slave1:ip=10.116.79.44,port=6481,state=online,offset=197,lag=0
master_repl_offset:197
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:196

在从服务上通过info命令查看:

6480节点:

 

[root@iZwz96uh8912ewkgg2iwg0Z conf]# redis-cli -h 10.116.79.44 -p 6480 -a redis123 info Replication
# Replication
role:slave
master_host:10.116.79.44
master_port:6479
master_link_status:up
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_repl_offset:407
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

6481节点:

[root@iZwz96uh8912ewkgg2iwg0Z conf]# redis-cli -h 10.116.79.44 -p 6481 -a redis123 info Replication
# Replication
role:slave
master_host:10.116.79.44
master_port:6479
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:547
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

如果此时能够查看到上述信息,恭喜你,redis的主从配置已经大功告成!

4、sentinel配置

 

此时我们可以从下载的redis中copy一份sentinel.conf,按照如下配置(主要配置):

sentinel_26479.conf的配置

#端口
port 26479

#后台运行
daemonize yes

#不设置保护模式
protected-mode no
#日志
logfile "/etc/redis/simpleConf/log/sentinel_26479.log"

#Sentinel去监视一个名为mymaster的主redis实例,这个主实例的IP地址为本机地址10.116.79.44,端口号为6479,而将这个主实例判断为失效至少需要2个 Sentinel进程的同意
,只要同意Sentinel的数量不达标,自动failover就不会执行
sentinel monitor mymaster 10.116.79.44 6479 2
#设置主的密码
sentinel auth-pass mymaster redis123

sentinel_26480.conf的配置

 

#端口
port 26480

#后台运行
daemonize yes

#不设置保护模式
protected-mode no
#日志
logfile "/etc/redis/simpleConf/log/sentinel_26480.log"

#Sentinel去监视一个名为mymaster的主redis实例,这个主实例的IP地址为本机地址10.116.79.44,端口号为6479,而将这个主实例判断为失效至少需要2个 Sentinel进程的同意
,只要同意Sentinel的数量不达标,自动failover就不会执行
sentinel monitor mymaster 10.116.79.44 6479 2
#设置主的密码
sentinel auth-pass mymaster redis123

 

sentinel_26481.conf的配置

#端口
port 26481

#后台运行
daemonize yes

#不设置保护模式
protected-mode no
#日志
logfile "/etc/redis/simpleConf/log/sentinel_26481.log"

#Sentinel去监视一个名为mymaster的主redis实例,这个主实例的IP地址为本机地址10.116.79.44,端口号为6479,而将这个主实例判断为失效至少需要2个 Sentinel进程的同意
,只要同意Sentinel的数量不达标,自动failover就不会执行
sentinel monitor mymaster 10.116.79.44 6479 2
#设置主的密码
sentinel auth-pass mymaster redis123

此处说明一下:笔者在做实验时,因没有配置protected-mode no,导致sentinel节点之间不能通信,不能进行判断主服务是否客观下线(ODOWN),不能进行failover,再次提醒一下,如果出现这种问题,尝试配置protected-mode no,看能否解决问题。

5、启动sentinel集群

redis-sentinel sentinel_26479.conf

redis-sentinel sentinel_26480.conf

redis-sentinel sentinel_26481.conf

启动服务后,sentinel服务会分配一个唯一标识,同时sentinel集群之间会进行通信,在各自的配置文件中记录其它sentinel服务的地址、端口、唯一标识,以及redis服务的从地址和端口。



6、测试集群服务
现关闭6479的redis服务,看看是否进行了主从切换。

 

 

 

查看26479的日志:

 

 

现在的主变成了6480。

 

 

 

查看6480的info信息:

 

[root@iZwz96uh8912ewkgg2iwg0Z conf]# redis-cli -h 10.116.79.44 -p 6480 -a redis123 info Replication
# Replication
role:master
connected_slaves:1
slave0:ip=10.116.79.44,port=6481,state=online,offset=88057,lag=1
master_repl_offset:88196
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:88195
[root@iZwz96uh8912ewkgg2iwg

现再次启用6479,查看6480的info信息

[root@iZwz96uh8912ewkgg2iwg0Z ~]# redis-cli -h 10.116.79.44 -p 6480 -a redis123 info Replication
# Replication
role:master
connected_slaves:2
slave0:ip=10.116.79.44,port=6481,state=online,offset=2097215,lag=0
slave1:ip=10.116.79.44,port=6479,state=online,offset=2097215,lag=1
master_repl_offset:2097215
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1048640
repl_backlog_histlen:1048576

曾经的主,变成了从。

至此,redis主从集群的sentinel配置就讲完了。

关于如果sentinel服务出现宕机的情况,会不会影响主的选举,希望读者可以做实验,探索一下。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是Spring Boot集成Redis主从集群配置方法: 1.在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 2.在application.properties文件中添加以下配置: ```properties # Redis节点配置 spring.redis.master.host=127.0.0.1 spring.redis.master.port=6379 spring.redis.master.password=123456 # Redis节点配置 spring.redis.slave.nodes=127.0.0.1:6380,127.0.0.1:6381 spring.redis.slave.password=123456 ``` 3.创建RedisConfig类,配置RedisTemplate和JedisConnectionFactory: ```java @Configuration public class RedisConfig { @Value("${spring.redis.master.host}") private String masterHost; @Value("${spring.redis.master.port}") private int masterPort; @Value("${spring.redis.master.password}") private String masterPassword; @Value("${spring.redis.slave.nodes}") private String slaveNodes; @Value("${spring.redis.slave.password}") private String slavePassword; @Bean public RedisTemplate<String, Object> redisTemplate() { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(jedisConnectionFactory()); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); return redisTemplate; } @Bean public JedisConnectionFactory jedisConnectionFactory() { RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration() .master("mymaster") .sentinel("127.0.0.1", 26379) .sentinel("127.0.0.1", 26380) .sentinel("127.0.0.1", 26381) .setPassword(masterPassword); JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(sentinelConfig); jedisConnectionFactory.setUsePool(true); jedisConnectionFactory.setPoolConfig(jedisPoolConfig()); return jedisConnectionFactory; } @Bean public JedisPoolConfig jedisPoolConfig() { JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); jedisPoolConfig.setMaxTotal(100); jedisPoolConfig.setMaxIdle(50); jedisPoolConfig.setMinIdle(20); jedisPoolConfig.setMaxWaitMillis(3000); return jedisPoolConfig; } } ``` 4.在需要使用Redis的类中注入RedisTemplate即可使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值