redis哨兵模式环境搭建

硅谷探秘者 Md redis 679 0 0

介绍

  单机版的Redis存在性能瓶颈,Redis通过提高主从复制实现读写分离,提高了了Redis的可用性,另一方便也能实现数据在多个Redis直接的备份。

  通过配置Redis的主从复制机制可以提高Redis的可用性,但是一旦主节点出现问题,就需要运维手工切换主从服务节点,即增加了人工成本,且容易出错,而且无法自动化切换,Redis的哨兵机制就能实现自动的主从切换,以及实现对Redis服务的切换。

准备

  本次测试环境搭建一主两从,三台虚拟机分别是192.168.127.14(主)、192.168.127.101(从)、192.168.127.102(从)。系统环境centos7。

  单机搭建redis环境之前的文章中已经提到过,这里不再叙述,参考:http://www.jiajiajia.club/blog/artical/4ngaxn9dyq0t/537
,我们在此文章的基础上继续。

master主库配置

介绍单机安装的时候redis.conf已经配置了如下参数:

# 绑定的主机,注释掉后允许所有主机登陆
#bind 127.0.0.1 

# 关闭保护模式
protected-mode no

# 端口,默认为6379
port 6379

# 开启后台运行模式
daemonize yes

# redis日志文件路径
logfile "/usr/local/redis/log/redis.log"

# 持久化数据文件路径
dir "/usr/local/redis/data"

# 登陆redis数据库的密码认证
requirepass "123456"

# 开启AOF持久化模式
appendonly yes

配置哨兵模式时需要在redis.conf配置文件中增加一项配置如下:

# 哨兵模式中设定主库密码与当前库密码同步,保证从库能够提升为主库
masterauth "123456"

/etc/redis/目录下创建 sentinel.conf 哨兵配置文件,该配置文件和redis.conf在同一个目录(非必须,随意)

# 关闭保护模式
protected-mode no

# sentinel默认端口
port 26379

# 允许后台运行
daemonize yes

# pid文件 默认就好
pidfile "/var/run/redis-sentinel.pid"

# sentinel日志文件
logfile "/usr/local/redis/log/sentinel.log"

# 监听redis主节点是否失效
# sentinel monitor <master-redis-name> <master-redis-ip> <master-redis-port> <quorum>
# quorum是一个数字:指明当有多少个sentinel认为一个master失效时(值一般为:sentinel总数/2 + 1),master才算真正失效。
# mymaster这个名字随便取,客户端访问时会用到
sentinel monitor mymaster 192.168.127.14 6379 2

sentinel auth-pass mymaster 123456
sentinel announce-ip "192.168.127.14"

启动master节点的redis和sentinel

[root@localhost log]# /usr/local/bin/redis-server /etc/redis/redis.conf 
[root@localhost log]# /usr/local/bin/redis-sentinel /etc/redis/sentinel.conf

启动客户端,执行一下命令说明启动成功

[root@localhost log]# /usr/local/bin/redis-cli 
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> ping
PONG
127.0.0.1:6379>

三台服务器都记得开放6379和26379端口

firewall-cmd --zone=public --add-port=6379/tcp --permanent && firewall-cmd --zone=public --add-port=26379/tcp --permanent && firewall-cmd --reload

slave从库配置

  从库的服务安装和配置基本和主库一致,redis.conf和sentinel.conf配置文件可以直接从主库复制过来,做一些修改即可。两台从库的配置是一样的。

在redis.conf配置文件中增加一项配置:

# 配置主从关系
slaveof 192.168.127.14 6379

修改sentinel.conf配置文件

sentinel announce-ip 192.168.127.101 这项配置中的ip更换为本机ip,其余配置可不用更改,如果有sentinel myid配置要将它删除。

启动redis和sentinel,方式和启动master节点一样。

待master节点和两台slave节点启动完成后,可以查看集群信息

[root@localhost log]# /usr/local/bin/redis-cli 
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> info replication
# Replication
role:master  # 节点角色,这个是主节点
connected_slaves:2
slave0:ip=192.168.127.101,port=6379,state=online,offset=172847,lag=1   # 从节点信息
slave1:ip=192.168.127.102,port=6379,state=online,offset=172991,lag=1   # 从节点信息
master_replid:5e9f379fedf9502122ea1bf0667fa135024958db
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:173278
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:173278
127.0.0.1:6379>

至此,redis的一主两从三哨兵架构搭建完成。

springboot配置redis哨兵模式

pom文件添加配置

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>

application.yml配置文件

server:
  port: 8080
spring:
  redis:
    database: 0
    password: 123456
    timeout: 3000
    sentinel:    #哨兵模式
      master: mymaster #主服务器所在集群名称
      nodes: 192.168.127.101:26379,192.168.127.102:26379,192.168.127.14:26379
    lettuce:
      pool:
        max-idle: 50
        min-idle: 10
        max-active: 100
        max-wait: 1000

测试

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController
public class TestController {

    @Resource
    private RedisTemplate redisTemplate;

    @GetMapping("set")
    public boolean set(String key,String value){
        final ValueOperations valueOperations = redisTemplate.opsForValue();
        valueOperations.set(key,value);
        return true;
    }

    @GetMapping("get")
    public Object get(String key){
        final ValueOperations valueOperations = redisTemplate.opsForValue();
        final Object o = valueOperations.get(key);
        return o;
    }
}

  正常情况下测试,通过接口或者客户端在任意一台服务中添加一个key、value,都会同步到另外两台服务。

如果我们手动关闭主节点的redis服务。

2023-01-13 16:50:59.626  INFO 9192 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2023-01-13 16:50:59.626  INFO 9192 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2023-01-13 16:50:59.630  INFO 9192 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 4 ms
2023-01-13 16:54:10.211  INFO 9192 --- [xecutorLoop-1-5] i.l.core.protocol.ConnectionWatchdog     : Reconnecting, last destination was /192.168.127.14:6379
2023-01-13 16:54:12.233  WARN 9192 --- [ioEventLoop-4-4] i.l.core.protocol.ConnectionWatchdog     : Cannot reconnect to [192.168.127.14:6379]: Connection refused: no further information: /192.168.127.14:6379
2023-01-13 16:54:16.497  INFO 9192 --- [ecutorLoop-1-11] i.l.core.protocol.ConnectionWatchdog     : Reconnecting, last destination was 192.168.127.14:6379
2023-01-13 16:54:18.512  WARN 9192 --- [oEventLoop-4-10] i.l.core.protocol.ConnectionWatchdog     : Cannot reconnect to [192.168.127.14:6379]: Connection refused: no further information: /192.168.127.14:6379
2023-01-13 16:54:22.799  INFO 9192 --- [xecutorLoop-1-5] i.l.core.protocol.ConnectionWatchdog     : Reconnecting, last destination was 192.168.127.14:6379
2023-01-13 16:54:24.815  WARN 9192 --- [ioEventLoop-4-4] i.l.core.protocol.ConnectionWatchdog     : Cannot reconnect to [192.168.127.14:6379]: Connection refused: no further information: /192.168.127.14:6379
2023-01-13 16:54:29.898  INFO 9192 --- [ecutorLoop-1-11] i.l.core.protocol.ConnectionWatchdog     : Reconnecting, last destination was 192.168.127.14:6379
2023-01-13 16:54:31.910  WARN 9192 --- [oEventLoop-4-10] i.l.core.protocol.ConnectionWatchdog     : Cannot reconnect to [192.168.127.14:6379]: Connection refused: no further information: /192.168.127.14:6379
2023-01-13 16:54:37.097  INFO 9192 --- [xecutorLoop-1-3] i.l.core.protocol.ConnectionWatchdog     : Reconnecting, last destination was 192.168.127.14:6379
2023-01-13 16:54:39.116  WARN 9192 --- [ioEventLoop-4-2] i.l.core.protocol.ConnectionWatchdog     : Cannot reconnect to [192.168.127.14:6379]: Connection refused: no further information: /192.168.127.14:6379
2023-01-13 16:54:43.298  INFO 9192 --- [xecutorLoop-1-5] i.l.core.protocol.ConnectionWatchdog     : Reconnecting, last destination was 192.168.127.14:6379
2023-01-13 16:54:43.307  INFO 9192 --- [ioEventLoop-4-4] i.l.core.protocol.ReconnectionHandler    : Reconnected to 192.168.127.102:6379

  主节点(192.168.127.14)关闭后,业务服务进行重连,重连6次失败后连接到从服务器(192.168.127.102)


评论区
请写下您的评论...
暂无评论...
猜你喜欢
java 1634 oauth2.0密码框架(demo)附sql脚本和测试代码1.项目目录项目说明请搜索http://www.jiajiajia.club/search?str=oauth2.0密码框架
框架 1742 oauth2.0密码框架(java)项目源码下载地址:http://www.jiajiajia.club/file/info/8GG7iM/109一、什么是oauth协议OAuth(开放授权
spring/springmvc 2619 spring+springmvc+mybatis+maven项目(2)在spring+springmvc+mybatis+maven项目(1)中我们了基本的maven,并且可以运行项
rabbitmq,mqtt协议 481 集群目的就是为了实现rabbitmq的高可用性,集群分为2种普通集群:主备架构,只是实现主备方案,不至于主节点宕机导致整个服务无法使用镜像集群:同步结构,基于普通集群实现的队列同步普通集群  slave节点复制master节点的所有数据和状态,除了队列数据,队列数据只存在master节点,但是Rabbitmqslave节点可以实现队列的转发,也就是说消息消费者可以连接到slave节点,但是slav
official 834 1、安装jdkzookeeper需要依赖java,所以需要先安装jdk参考:http://www.jiajiajia.club/blog/artical/yjw520/212、下载
spring/springmvc 2182 spring+springmvc+mybatis+maven项目(1)首先在配置好maven仓库的情况下:1.创父项目file-new-mavenprojectnextgroup为父项目坐标
其他 2386 windows下开机自启动tomcat1.保证tomcat在本机正确安装,即双击startup.bat能够正常开启tomcat服务保证正常后双击shutdown.bat将服务关闭2.设置变量
其他 2423 linux下开机自启动tomcat1.修改脚本文件rc.local这个脚本是使用者自定的开机启动程序,可以在里面添加想在系统启动之后执行的脚本或者脚本执行命令vim/etc/rc.d
归档
2018-11  12 2018-12  33 2019-01  28 2019-02  28 2019-03  32 2019-04  27 2019-05  33 2019-06  6 2019-07  12 2019-08  12 2019-09  21 2019-10  8 2019-11  15 2019-12  25 2020-01  9 2020-02  5 2020-03  16 2020-04  4 2020-06  1 2020-07  7 2020-08  13 2020-09  9 2020-10  5 2020-12  3 2021-01  1 2021-02  5 2021-03  7 2021-04  4 2021-05  4 2021-06  1 2021-07  7 2021-08  2 2021-09  8 2021-10  9 2021-11  16 2021-12  14 2022-01  7 2022-05  1 2022-08  3 2022-09  2 2022-10  2 2022-12  5 2023-01  3 2023-02  1 2023-03  4 2023-04  2 2023-06  3 2023-07  4 2023-08  1 2023-10  1 2024-02  1 2024-03  1
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo vue 导入导出 软件使用 idea插件 协议 无聊的知识 jenkins springboot mqtt协议 keepalived minio mysql ensp 网络基础 xxl-job rabbitmq haproxy srs 音视频 webrtc javascript
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。