云服务器Redis Sentinel部署及客户端公网IP连接

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 目录1、配置文件(1) Redis主节点配置文件(2) Redis从节点配置文件(3) Sentinel(哨兵)配置文件2、启动Redis服务和哨兵(1) 启动3个Redis服务(2) 启动3个哨兵3、客户端连接(1) 客户端哨兵读写分离配置(2) 故障转移测试用例(3) 停掉master节点模拟宕机

目录

1、配置文件

(1) Redis主节点配置文件

(2) Redis从节点配置文件

(3) Sentinel(哨兵)配置文件

2、启动Redis服务和哨兵

(1) 启动3个Redis服务

(2) 启动3个哨兵

3、客户端连接

(1) 客户端哨兵读写分离配置

(2) 故障转移测试用例

(3) 停掉master节点模拟宕机

1、配置文件

Redis版本为6.0.4,准备了6个配置文件,3个Redis服务配置文件,3个哨兵配置文件,部署方式为一主二从三哨兵。

(1) Redis主节点配置文件

redis-6380.conf

# 配置文件进行了精简,完整配置可自行和官方提供的完整conf文件进行对照。端口号自行对应修改
#后台启动的意思
daemonize yes
#端口号(如果同一台服务器上启动,注意要修改为不同的端口)
port 6380
# IP绑定,redis不建议对公网开放,直接绑定0.0.0.0没毛病
bind 172.17.0.13 127.0.0.1
# 日志文件
logfile "/redis/logs/redis-6380.log"
# 工作目录,用来存储持久化文件
dir "/redis/workingDir"


(2) Redis从节点配置文件

redis-6381.conf、redis-6382.conf

# 配置文件进行了精简,完整配置可自行和官方提供的完整conf文件进行对照。端口号自行对应修改
#后台启动的意思
daemonize yes
#端口号(如果同一台服务器上启动,注意要修改为不同的端口)
port 6381
# IP绑定,redis不建议对公网开放,直接绑定0.0.0.0没毛病
bind 172.17.0.13 127.0.0.1
# 日志文件
logfile "/redis/logs/redis-6381.log"
# 工作目录,用来存储持久化文件
dir "/redis/workingDir"
# 复制选项
replicaof 122.51.151.130 6380


如果客户端是通过公网ip连接,replicaof 122.51.151.130 6380从节点复制配置要特别注意,改成公网ip而不是私网ip,由于从节点是通过公网ip和主节点通信,因此相关端口在安全组中一定要放开。

下面哨兵配置监控的也是公网ip,复制项如果配的私网ip,会导致哨兵切主时失败。这里比较奇怪,哨兵选出了晋升的从节点,但从节点角色还是role。如果复制项的主节点ip和哨兵监控的主节点ip都为公网或私网ip,则不会出现这种情况。

(3) Sentinel(哨兵)配置文件

#配置文件:Sentinel.conf,在sentinel运行期间是会被动态修改的
# sentinel如果重启时,根据这个配置来恢复其之前所监控的redis集群的状态
# 绑定IP
bind 172.17.0.13 127.0.0.1
# 后台运行
daemonize yes
# 默认yes,没指定密码或者指定IP的情况下,外网无法访问
protected-mode no
# 哨兵的端口,客户端通过这个端口来发现redis
port 26381
# 哨兵自己的IP,手动设定也可自动发现,用于与其他哨兵通信
# sentinel announce-ip
# 工作目录
dir "/redis/workingDir"
# 日志
logfile "/redis/logs/sentinel-26381.log"
# sentinel监控的master的名字叫做mymaster,初始地址为 127.0.0.1 6380,2代表两个及以上哨兵认定为死亡,才认为是真的死亡
sentinel monitor mymaster 122.51.151.130 6380 2
# 发送心跳PING来确认master是否存活
# 如果master在“一定时间范围”内不回应PONG 或者是回复了一个错误消息,那么这个sentinel会主观地(单方面地)认为这个master已经不可用了
sentinel down-after-milliseconds mymaster 1000
# 如果在该时间(ms)内未能完成failover操作,则认为该failover失败
sentinel failover-timeout mymaster 3000
# 指定了在执行故障转移时,最多可以有多少个从Redis实例在同步新的主实例,在从Redis实例较多的情况下这个数字越小,同步的时间越长,完成故障转移所需的时间就越长
sentinel parallel-syncs mymaster 1


2、启动Redis服务和哨兵

(1) 启动3个Redis服务

redis-server redis-6380.conf
redis-server redis-6381.conf
redis-server redis-6382.conf


启动完成后,查看主从复制信息:

[universe@VM_0_13_centos sentinel]$ redis-cli -p 6380
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=122.51.151.130,port=6381,state=online,offset=14821,lag=1
slave1:ip=122.51.151.130,port=6382,state=online,offset=14821,lag=1
master_replid:ced7289a3295ce73e9b538b0d69a7ce1e7bfdb54
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:15241
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:15241

现在主从复制是okay的,当前6380为主节点,6381和6382为从节点。

(2) 启动3个哨兵

redis-sentinel sentinel-26380.conf
redis-sentinel sentinel-26381.conf
redis-sentinel sentinel-26382.conf
[universe@VM_0_13_centos sentinel]$ redis-cli -p 26381
127.0.0.1:26381> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=122.51.151.130:6380,slaves=2,sentinels=3

3、客户端连接

(1) 客户端哨兵读写分离配置

@Configuration
public class RedisSentinelConfig {
  @Bean
  public RedisConnectionFactory redisConnectionFactory() {
    LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder()
      .readFrom(ReadFrom.REPLICA_PREFERRED)
      .build();
    // 指定监控的master以及哨兵地址、端口
    RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration()
            .master("mymaster")
            .sentinel("122.51.151.130", 26380)
            .sentinel("122.51.151.130", 26381)
            .sentinel("122.51.151.130", 26382);
    return new LettuceConnectionFactory(sentinelConfig, clientConfig);
  }
}


(2) 故障转移测试用例

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class RedisSentinelTest {
  @Autowired
  private StringRedisTemplate stringRedisTemplate;
  /**
   * 期间关掉master,哨兵会进行自动故障切换,客户端重连到新的master
   * @throws InterruptedException
   */
  @Test
  public void automaticFailoverTest() throws InterruptedException {
    int count = 0;
    while (true) {
      try {
        stringRedisTemplate.opsForValue().set("count", String.valueOf(++count));
      } catch (RedisSystemException e) {
        System.out.println("可能发生切主,命令被取消,重连.....");
        stringRedisTemplate.opsForValue().set("count", String.valueOf(++count));
      }
      System.out.println("修改count的值,当前值为:" + count);
      Thread.sleep(2000);
      System.out.println("获取count的值,当前值为:" + stringRedisTemplate.opsForValue().get("count"));
    }
  }
}

(3) 停掉master节点模拟宕机

把当前主节点6380干掉后,哨兵会进行切主,我们可以再次查看哨兵状态信息:

[universe@VM_0_13_centos sentinel]$ redis-cli -p 26380
127.0.0.1:26380> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=122.51.151.130:6382,slaves=2,sentinels=3


主节点6380挂掉后程序还是是正常运行的,程序运行结果如下:

修改count的值,当前值为:1
获取count的值,当前值为:1
修改count的值,当前值为:2
获取count的值,当前值为:2
修改count的值,当前值为:3
获取count的值,当前值为:3
修改count的值,当前值为:4
获取count的值,当前值为:4
修改count的值,当前值为:5
获取count的值,当前值为:5
修改count的值,当前值为:6
获取count的值,当前值为:6
修改count的值,当前值为:7
获取count的值,当前值为:7
修改count的值,当前值为:8
2020-09-02 16:14:07.785  INFO 13140 --- [xecutorLoop-1-2] i.l.core.protocol.ConnectionWatchdog     : Reconnecting, last destination was /122.51.151.130:6380
获取count的值,当前值为:8
2020-09-02 16:14:08.885  WARN 13140 --- [ioEventLoop-6-3] i.l.core.protocol.ConnectionWatchdog     : Cannot reconnect to [122.51.151.130:6380]: Connection refused: no further information: /122.51.151.130:6380
2020-09-02 16:14:09.084  INFO 13140 --- [xecutorLoop-1-3] i.l.core.protocol.ConnectionWatchdog     : Reconnecting, last destination was /122.51.151.130:6382
2020-09-02 16:14:09.118  INFO 13140 --- [ioEventLoop-6-1] i.l.core.protocol.ReconnectionHandler    : Reconnected to 122.51.151.130:6382
2020-09-02 16:14:09.985  INFO 13140 --- [xecutorLoop-1-4] i.l.core.protocol.ConnectionWatchdog     : Reconnecting, last destination was /122.51.151.130:6381
2020-09-02 16:14:10.016  INFO 13140 --- [ioEventLoop-6-2] i.l.core.protocol.ReconnectionHandler    : Reconnected to 122.51.151.130:6381
2020-09-02 16:14:13.684  INFO 13140 --- [xecutorLoop-1-4] i.l.core.protocol.ConnectionWatchdog     : Reconnecting, last destination was 122.51.151.130:6380
2020-09-02 16:14:14.086  WARN 13140 --- [ioEventLoop-6-4] i.l.core.protocol.ConnectionWatchdog     : Cannot reconnect to [122.51.151.130:6380]: java.util.concurrent.CancellationException
可能发生切主,命令被取消,重连.....
修改count的值,当前值为:10
获取count的值,当前值为:10
修改count的值,当前值为:11
获取count的值,当前值为:11
修改count的值,当前值为:12
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
2月前
|
弹性计算 监控 负载均衡
|
22天前
|
NoSQL Java 关系型数据库
Liunx部署java项目Tomcat、Redis、Mysql教程
本文详细介绍了如何在 Linux 服务器上安装和配置 Tomcat、MySQL 和 Redis,并部署 Java 项目。通过这些步骤,您可以搭建一个高效稳定的 Java 应用运行环境。希望本文能为您在实际操作中提供有价值的参考。
107 26
|
12天前
|
NoSQL 应用服务中间件 API
Redis是如何建立连接和处理命令的
本文主要讲述 Redis 是如何监听客户端发出的set、get等命令的。
|
2月前
|
弹性计算 开发工具 git
2分钟在阿里云ECS控制台部署个人应用(图文示例)
作为一名程序员,我在部署托管于Github/Gitee的代码到阿里云ECS服务器时,经常遇到繁琐的手动配置问题。近期,阿里云ECS控制台推出了一键构建部署功能,简化了这一过程,支持Gitee和GitHub仓库,自动处理git、docker等安装配置,无需手动登录服务器执行命令,大大提升了部署效率。本文将详细介绍该功能的使用方法和适用场景。
2分钟在阿里云ECS控制台部署个人应用(图文示例)
|
2月前
|
监控 NoSQL 网络协议
【Azure Redis】部署在AKS中的应用,连接Redis高频率出现timeout问题
查看Redis状态,没有任何异常,服务没有更新,Service Load, CPU, Memory, Connect等指标均正常。在排除Redis端问题后,转向了AKS中。 开始调查AKS的网络状态。最终发现每次Redis客户端出现超时问题时,几乎都对应了AKS NAT Gateway的更新事件,而Redis服务端没有任何异常。因此,超时问题很可能是由于NAT Gateway更新事件导致TCP连接被重置。
|
2月前
|
NoSQL Linux PHP
如何在不同操作系统上安装 Redis 服务器,包括 Linux 和 Windows 的具体步骤
本文介绍了如何在不同操作系统上安装 Redis 服务器,包括 Linux 和 Windows 的具体步骤。接着,对比了两种常用的 PHP Redis 客户端扩展:PhpRedis 和 Predis,详细说明了它们的安装方法及优缺点。最后,提供了使用 PhpRedis 和 Predis 在 PHP 中连接 Redis 服务器及进行字符串、列表、集合和哈希等数据类型的基本操作示例。
69 4
|
2月前
|
NoSQL 容灾 MongoDB
MongoDB主备副本集方案:两台服务器使用非对称部署的方式实现高可用与容灾备份
在资源受限的情况下,为了实现MongoDB的高可用性,本文探讨了两种在两台服务器上部署MongoDB的方案。方案一是通过主备身份轮换,即一台服务器作为主节点,另一台同时部署备节点和仲裁节点;方案二是利用`priority`设置实现自动主备切换。两者相比,方案二自动化程度更高,适合追求快速故障恢复的场景,而方案一则提供了更多的手动控制选项。文章最后对比了这两种方案与标准三节点副本集的优缺点,指出三节点方案在高可用性和数据一致性方面表现更佳。
|
2月前
|
PHP 数据库 数据安全/隐私保护
布谷直播源码部署服务器关于数据库配置的详细说明
布谷直播系统源码搭建部署时数据库配置明细!
|
3月前
|
关系型数据库 MySQL Linux
基于阿里云服务器Linux系统安装Docker完整图文教程(附部署开源项目)
基于阿里云服务器Linux系统安装Docker完整图文教程(附部署开源项目)
547 3
|
3月前
|
NoSQL 网络协议 算法
Redis 客户端连接
10月更文挑战第21天
45 1