Redis Sentinel获取主服务器信息的监控指标
Redis Sentinel 概述
Redis Sentinel 是 Redis 的高可用性解决方案:由一个或多个 Sentinel 实例组成的 Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。
Sentinel 工作原理
- 监控(Monitoring):Sentinel 会不断地检查主服务器和从服务器是否运作正常。
- 通知(Notification):当被监控的某个 Redis 服务器出现问题时,Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
- 自动故障迁移(Automatic failover):当主服务器不能正常工作时,Sentinel 会开始一次自动故障迁移操作,它会将失效主服务器的其中一个从服务器升级为新的主服务器,并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时,集群也会向客户端返回新主服务器的地址,使得集群可以使用新主服务器代替失效服务器。
Redis Sentinel 获取主服务器信息
获取主服务器状态命令
Sentinel 提供了 SENTINEL GET-MASTER-ADDR-BY-NAME
命令来获取指定主服务器的当前地址。命令格式为:SENTINEL GET-MASTER-ADDR-BY-NAME <master-name>
,其中 <master-name>
是在 Sentinel 配置文件中定义的主服务器名称。
例如,假设在 Sentinel 配置文件中有如下配置:
sentinel monitor mymaster 127.0.0.1 6379 2
这里 mymaster
就是主服务器的名称。通过执行 SENTINEL GET-MASTER-ADDR-BY-NAME mymaster
命令,Sentinel 会返回主服务器的地址和端口,格式为 ip port
。
通过编程获取主服务器信息
- 使用 Python 和 redis - py 库
import redis
# 连接到 Sentinel
sentinel = redis.sentinel.Sentinel([('127.0.0.1', 26379)], socket_timeout = 0.1)
# 获取主服务器连接
master = sentinel.master_for('mymaster', socket_timeout = 0.1)
# 获取主服务器信息
master_info = master.info()
print(f"主服务器信息: {master_info}")
在上述代码中,首先通过 redis.sentinel.Sentinel
连接到 Sentinel 实例,然后使用 master_for
方法获取主服务器连接,最后通过 info
方法获取主服务器的详细信息。
- 使用 Java 和 Jedis 库
import redis.clients.jedis.*;
import java.util.HashSet;
import java.util.Set;
public class RedisSentinelExample {
public static void main(String[] args) {
Set<String> sentinels = new HashSet<>();
sentinels.add("127.0.0.1:26379");
JedisSentinelPool jedisSentinelPool = new JedisSentinelPool("mymaster", sentinels);
try (Jedis jedis = jedisSentinelPool.getResource()) {
Jedis sentinelJedis = new Jedis("127.0.0.1", 26379);
String[] masterAddr = sentinelJedis.sentinelGetMasterAddrByName("mymaster");
System.out.println("主服务器地址: " + masterAddr[0] + ":" + masterAddr[1]);
// 获取主服务器信息
Jedis masterJedis = new Jedis(masterAddr[0], Integer.parseInt(masterAddr[1]));
System.out.println("主服务器信息: " + masterJedis.info());
}
}
}
这段 Java 代码通过 JedisSentinelPool
连接到 Sentinel 系统,获取主服务器地址,然后再获取主服务器的详细信息。
Redis Sentinel 监控指标
主服务器基本信息指标
- 运行 ID(run_id):每个 Redis 实例都有一个唯一的运行 ID。主服务器的运行 ID 可以通过
INFO
命令获取,在 Sentinel 中通过获取主服务器连接后执行INFO
命令获取。运行 ID 用于识别特定的 Redis 实例,在故障迁移等操作中起到关键作用。例如在 Python 中:
import redis
sentinel = redis.sentinel.Sentinel([('127.0.0.1', 26379)], socket_timeout = 0.1)
master = sentinel.master_for('mymaster', socket_timeout = 0.1)
run_id = master.info()['run_id']
print(f"主服务器运行 ID: {run_id}")
- 版本信息(redis_version):主服务器的 Redis 版本号。了解版本信息对于兼容性和功能特性分析很重要。同样可以通过
INFO
命令获取,例如在 Java 中:
import redis.clients.jedis.*;
import java.util.HashSet;
import java.util.Set;
public class RedisVersionExample {
public static void main(String[] args) {
Set<String> sentinels = new HashSet<>();
sentinels.add("127.0.0.1:26379");
JedisSentinelPool jedisSentinelPool = new JedisSentinelPool("mymaster", sentinels);
try (Jedis jedis = jedisSentinelPool.getResource()) {
Jedis sentinelJedis = new Jedis("127.0.0.1", 26379);
String[] masterAddr = sentinelJedis.sentinelGetMasterAddrByName("mymaster");
Jedis masterJedis = new Jedis(masterAddr[0], Integer.parseInt(masterAddr[1]));
String version = masterJedis.info().get("redis_version");
System.out.println("主服务器 Redis 版本: " + version);
}
}
}
主服务器性能指标
- 内存使用情况
- used_memory:主服务器已使用的内存量(以字节为单位)。这是衡量 Redis 内存占用的重要指标。如果内存使用持续增长并接近系统内存限制,可能会导致 Redis 性能下降甚至崩溃。通过
INFO memory
子命令获取,在 Python 中可以这样实现:
- used_memory:主服务器已使用的内存量(以字节为单位)。这是衡量 Redis 内存占用的重要指标。如果内存使用持续增长并接近系统内存限制,可能会导致 Redis 性能下降甚至崩溃。通过
import redis
sentinel = redis.sentinel.Sentinel([('127.0.0.1', 26379)], socket_timeout = 0.1)
master = sentinel.master_for('mymaster', socket_timeout = 0.1)
used_memory = master.info('memory')['used_memory']
print(f"主服务器已使用内存: {used_memory} 字节")
- **used_memory_rss**:从操作系统角度,Redis 进程实际占用的物理内存(驻留集大小)。这一指标与 `used_memory` 可能存在差异,因为 Redis 采用了内存分配器,可能存在内存碎片等情况。同样通过 `INFO memory` 获取。
2. 网络连接指标
- connected_clients:当前连接到主服务器的客户端数量。过多的客户端连接可能会消耗大量资源,影响 Redis 的性能。可以通过 INFO clients
获取,在 Java 中:
import redis.clients.jedis.*;
import java.util.HashSet;
import java.util.Set;
public class ConnectedClientsExample {
public static void main(String[] args) {
Set<String> sentinels = new HashSet<>();
sentinels.add("127.0.0.1:26379");
JedisSentinelPool jedisSentinelPool = new JedisSentinelPool("mymaster", sentinels);
try (Jedis jedis = jedisSentinelPool.getResource()) {
Jedis sentinelJedis = new Jedis("127.0.0.1", 26379);
String[] masterAddr = sentinelJedis.sentinelGetMasterAddrByName("mymaster");
Jedis masterJedis = new Jedis(masterAddr[0], Integer.parseInt(masterAddr[1]));
int clients = Integer.parseInt(masterJedis.info("clients").get("connected_clients"));
System.out.println("主服务器连接的客户端数量: " + clients);
}
}
}
- **instantaneous_input_kbps** 和 **instantaneous_output_kbps**:分别表示主服务器当前的瞬时输入和输出带宽(以千字节每秒为单位)。这两个指标可以帮助了解 Redis 服务器的网络负载情况。通过 `INFO stats` 获取。
主服务器复制相关指标
- role:主服务器的角色,应该为
master
。通过INFO replication
获取,此指标用于确认当前服务器是否确实为主服务器,在故障迁移等操作后可以通过这个指标来判断服务器角色是否正确切换。例如在 Python 中:
import redis
sentinel = redis.sentinel.Sentinel([('127.0.0.1', 26379)], socket_timeout = 0.1)
master = sentinel.master_for('mymaster', socket_timeout = 0.1)
role = master.info('replication')['role']
print(f"主服务器角色: {role}")
- connected_slaves:连接到主服务器的从服务器数量。这一指标反映了主从复制架构的完整性。如果从服务器数量异常减少,可能意味着部分从服务器出现故障或者网络连接问题。通过
INFO replication
获取。 - master_repl_offset:主服务器的复制偏移量。主服务器每处理一个写命令,这个偏移量就会增加。从服务器通过复制偏移量来保持与主服务器的数据一致性。在故障恢复和数据同步过程中,复制偏移量起着关键作用。通过
INFO replication
获取。
Sentinel 自身对主服务器的监控指标
- sentinel_masters:Sentinel 所监控的主服务器数量。可以通过
SENTINEL INFO
命令获取,在这个命令返回的结果中包含sentinel_masters
字段。例如在 Redis 客户端中执行SENTINEL INFO
后,在返回结果中找到sentinel_masters:1
这样的信息,表示当前 Sentinel 监控了 1 个主服务器。 - sentinel_last_ping_time_sent_<master - name>:Sentinel 最后一次向指定主服务器发送 PING 命令的时间。这一指标可以反映 Sentinel 与主服务器之间的心跳检测情况。如果这个时间间隔过长,可能意味着 Sentinel 与主服务器之间的连接存在问题。同样通过
SENTINEL INFO
命令获取,在返回结果中找到类似sentinel_last_ping_time_sent_mymaster:1637934567
的字段,其中1637934567
是时间戳。
监控指标的实际应用
性能优化
- 内存优化:通过监控
used_memory
和used_memory_rss
指标,如果发现内存增长过快或者used_memory_rss
远大于used_memory
,可以考虑调整 Redis 的内存分配策略或者进行碎片整理。例如,可以启用 Redis 的内存回收机制,通过配置maxmemory - policy
参数来设置内存达到上限时的处理策略,如volatile - lru
(在设置了过期时间的键中使用最近最少使用算法淘汰键)。 - 网络优化:当
connected_clients
数量过多影响性能时,可以优化客户端连接管理。例如,采用连接池技术,减少不必要的连接创建和销毁。同时,如果instantaneous_input_kbps
或instantaneous_output_kbps
过高,可能需要检查网络带宽是否足够,或者优化数据传输方式,减少不必要的数据传输。
故障预警
- 主服务器故障:监控
role
指标,如果发现主服务器角色不再是master
,可能意味着发生了故障迁移或者服务器角色异常。结合connected_slaves
指标,如果从服务器数量突然减少,可能预示着主服务器即将出现问题,因为从服务器可能因为主服务器异常而断开连接。 - Sentinel 与主服务器连接故障:通过监控
sentinel_last_ping_time_sent_<master - name>
指标,如果这个时间间隔超过一定阈值,如 10 秒(可根据实际情况调整),可以发出预警,提示 Sentinel 与主服务器之间的连接可能存在问题,需要及时排查网络或者服务器本身的故障。
监控指标的可视化
使用 Grafana 和 Prometheus
- Prometheus 采集指标:可以使用 Redis - exporter 来采集 Redis 和 Sentinel 的指标,并将其提供给 Prometheus。Redis - exporter 是一个开源工具,能够定期从 Redis 和 Sentinel 实例中获取指标数据,并以 Prometheus 能够理解的格式暴露出来。例如,在安装并配置好 Redis - exporter 后,可以在 Prometheus 的配置文件中添加如下内容来采集 Redis 和 Sentinel 的指标:
scrape_configs:
- job_name:'redis'
static_configs:
- targets: ['127.0.0.1:6379']
metrics_path: /metrics
params:
module: [redis]
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 127.0.0.1:9121 # Redis - exporter 运行地址
- job_name:'sentinel'
static_configs:
- targets: ['127.0.0.1:26379']
metrics_path: /metrics
params:
module: [redis]
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 127.0.0.1:9121 # Redis - exporter 运行地址
- Grafana 可视化:在 Prometheus 采集到指标数据后,可以将其接入 Grafana 进行可视化展示。在 Grafana 中创建数据源,选择 Prometheus 作为数据源类型,并配置 Prometheus 的地址。然后可以创建仪表盘,添加各种图表来展示 Redis 和 Sentinel 的监控指标,如内存使用情况、连接数、复制状态等。例如,可以创建一个折线图来展示
used_memory
随时间的变化趋势,或者创建一个柱状图来展示不同时间点的connected_clients
数量。
使用其他监控工具
除了 Grafana 和 Prometheus 外,还有一些其他工具可以用于 Redis 和 Sentinel 监控指标的可视化,如 Datadog、New Relic 等。这些工具通常提供了更简单的配置和更丰富的可视化模板,但可能需要付费使用。例如 Datadog,只需要在 Redis 和 Sentinel 所在服务器上安装 Datadog agent,并进行简单配置,就可以自动采集 Redis 和 Sentinel 的监控指标,并在 Datadog 平台上进行可视化展示和分析。
总结监控指标的重要性
通过对 Redis Sentinel 获取主服务器信息的监控指标进行深入了解和有效监控,可以及时发现 Redis 主服务器在运行过程中存在的性能问题、故障隐患等。从基本信息指标到性能指标,再到复制相关指标以及 Sentinel 自身对主服务器的监控指标,每个指标都从不同角度反映了 Redis 主服务器的运行状态。通过合理应用这些指标进行性能优化和故障预警,并结合可视化工具进行直观展示,可以大大提高 Redis 系统的稳定性和可靠性,确保业务的正常运行。无论是在小型应用还是大型分布式系统中,对这些监控指标的重视和有效利用都是保障 Redis 服务质量的关键因素。