作为一名资深运维工程师,了解 Redis 的不同架构模式及其优缺点是非常重要的。此外,监控 Redis 的关键指标也是确保其稳定运行的关键。以下是对这些问题的详细解答。
Redis有几种架构模式及优缺点,关心的监控指标
Redis 架构模式
Redis 主要有以下几种架构模式:
- 单实例模式(Standalone)
- 主从复制模式(Master-Slave Replication)
- 哨兵模式(Sentinel)
- 集群模式(Cluster)
1. 单实例模式(Standalone)
优点:
- 简单易用,部署和维护成本低。
- 性能高,单实例可以充分利用单台服务器的资源。
缺点:
- 单点故障,如果单个实例宕机,整个服务将不可用。
- 扩展性差,无法通过水平扩展来增加容量。
2. 主从复制模式(Master-Slave Replication)
优点:
- 提供数据冗余,提高系统的可用性。
- 可以通过读写分离来提高读取性能。
- 简单的备份和恢复机制。
缺点:
- 写操作仍然集中在主节点上,主节点成为瓶颈。
- 从节点的数据同步有一定的延迟。
- 如果主节点宕机,需要手动或自动切换到从节点,存在一定的切换时间。
3. 哨兵模式(Sentinel)
优点:
- 自动化的故障检测和故障转移。
- 高可用性,当主节点宕机时,哨兵会自动选择一个从节点作为新的主节点。
- 监控和通知功能,可以配置在发生故障时发送通知。
缺点:
- 配置相对复杂,需要额外的哨兵节点。
- 故障转移过程中可能会有短暂的服务中断。
- 仍然存在单点故障的风险,如果所有哨兵节点都宕机,则无法进行故障转移。
4. 集群模式(Cluster)
优点:
- 水平扩展,可以通过添加更多的节点来增加容量。
- 自动分片,数据分布在多个节点上,提高了整体的吞吐量。
- 高可用性,每个分片都有多个副本,提供了数据冗余和故障转移能力。
缺点:
- 配置和管理复杂,需要更多的运维工作。
- 一些命令不支持集群模式,需要使用特定的集群命令。
- 数据迁移和重新平衡可能会影响性能。
运维关心的监控指标
运维人员通常关心以下 Redis 的监控指标:
-
内存使用情况:
used_memory
:当前使用的内存量。used_memory_rss
:操作系统分配给 Redis 的内存量。mem_fragmentation_ratio
:内存碎片率,用于评估内存使用效率。
-
CPU 使用情况:
used_cpu_sys
:系统 CPU 使用时间。used_cpu_user
:用户 CPU 使用时间。used_cpu_sys_children
和used_cpu_user_children
:后台进程的 CPU 使用时间。
-
连接数:
connected_clients
:当前连接的客户端数量。blocked_clients
:阻塞的客户端数量。
-
网络流量:
instantaneous_ops_per_sec
:每秒执行的命令数。instantaneous_input_kbps
和instantaneous_output_kbps
:每秒输入和输出的网络流量(KB/秒)。
-
持久化状态:
rdb_last_save_time
和rdb_changes_since_last_save
:RDB 文件上次保存的时间和自上次保存以来的变化次数。aof_enabled
和aof_current_size
:AOF 是否启用以及当前 AOF 文件的大小。
-
键空间统计:
db0:keys=100,expires=20
:数据库 0 中的 key 数量和过期 key 的数量。
-
命中率:
keyspace_hits
和keyspace_misses
:键空间命中和未命中的次数。hit_rate
:计算公式为keyspace_hits / (keyspace_hits + keyspace_misses)
。
-
复制状态:
master_link_status
:主从复制的状态。slave_repl_offset
和master_repl_offset
:从节点和主节点的复制偏移量。
-
慢查询:
slowlog_len
:慢查询日志的长度。slowlog_get
:获取慢查询日志。
最佳获取方式
-
使用 Redis 自带的
INFO
命令:INFO all
:获取所有信息。INFO memory
:获取内存相关的信息。INFO clients
:获取客户端相关的信息。INFO server
:获取服务器相关的信息。INFO stats
:获取统计信息。INFO replication
:获取复制相关的信息。INFO cpu
:获取 CPU 使用情况。INFO persistence
:获取持久化相关的信息。INFO cluster
:获取集群相关的信息。
-
使用监控工具:
- Prometheus + Grafana:通过 Prometheus 收集 Redis 指标,并使用 Grafana 进行可视化展示。
- Redis Exporter:专门为 Prometheus 设计的 Redis 导出器,可以方便地收集 Redis 指标。
- Telegraf + InfluxDB + Grafana:Telegraf 用于收集 Redis 指标,InfluxDB 用于存储数据,Grafana 用于可视化展示。
-
使用 Redis 自带的监控工具:
MONITOR
:实时监控 Redis 服务器接收到的所有命令。注意,这个命令对性能影响较大,建议在测试环境中使用。SLOWLOG
:记录执行时间超过指定阈值的命令,可以帮助识别慢查询。
使用 Redis 命令行获取监控指标
以下是一些常用的 Redis 命令行命令,用于获取上述提到的监控指标:
-
内存使用情况:
redis-cli info memory
-
CPU 使用情况:
redis-cli info cpu
-
连接数:
redis-cli info clients
-
网络流量:
redis-cli info stats
-
持久化状态:
redis-cli info persistence
-
键空间统计:
redis-cli info keyspace
-
命中率:
redis-cli info stats | grep "keyspace"
-
复制状态:
redis-cli info replication
-
慢查询:
redis-cli slowlog get
通过这些命令,你可以获取到 Redis 的各种监控指标,并根据这些指标进行性能调优和故障排查。
Redis日常运维常用命令、工具
常用的 Redis 命令
-
基本信息
INFO [section]
:获取 Redis 服务器的各种信息,如内存使用情况、客户端连接数、持久化状态等。redis-cli INFO redis-cli INFO memory
-
键空间操作
KEYS pattern
:查找所有匹配给定模式的键。redis-cli KEYS "user:*"
SCAN cursor [MATCH pattern] [COUNT count]
:增量迭代键空间。redis-cli SCAN 0 MATCH user:* COUNT 10
-
数据操作
GET key
和SET key value
:获取和设置键值对。redis-cli SET mykey "Hello, Redis!" redis-cli GET mykey
DEL key [key ...]
:删除一个或多个键。redis-cli DEL mykey
-
持久化
SAVE
和BGSAVE
:手动触发 RDB 持久化。redis-cli SAVE redis-cli BGSAVE
LASTSAVE
:返回最近一次成功执行保存操作的时间戳。redis-cli LASTSAVE
-
复制
ROLE
:返回当前实例的角色(主节点、从节点或哨兵)。redis-cli ROLE
SLAVEOF host port
:将当前实例配置为指定主机的从节点。redis-cli SLAVEOF 192.168.1.100 6379
-
集群
CLUSTER INFO
:获取集群的信息。redis-cli CLUSTER INFO
CLUSTER NODES
:获取集群中所有节点的信息。redis-cli CLUSTER NODES
-
慢查询日志
SLOWLOG GET
:获取慢查询日志。redis-cli SLOWLOG GET
SLOWLOG RESET
:重置慢查询日志。redis-cli SLOWLOG RESET
-
客户端管理
CLIENT LIST
:列出所有连接的客户端。redis-cli CLIENT LIST
CLIENT KILL ip:port
:关闭指定 IP 和端口的客户端连接。redis-cli CLIENT KILL 192.168.1.100:55555
常用的 Redis 工具
-
Redis CLI (redis-cli)
- Redis 官方提供的命令行工具,用于与 Redis 服务器进行交互。
- 可以执行各种 Redis 命令,并支持脚本和管道操作。
-
Redis Sentinel (sentinel)
- 用于高可用性和自动故障转移的工具。
- 监控主节点和从节点的状态,当主节点发生故障时自动进行故障转移。
-
Redis Cluster (cluster)
- 用于水平扩展 Redis 的工具。
- 自动分片和负载均衡,提高系统的吞吐量和容量。
-
Redis Exporter (Prometheus Redis Exporter)
- 用于 Prometheus 的 Redis 导出器,可以收集 Redis 的指标并将其暴露给 Prometheus。
- 便于在 Grafana 中进行可视化监控。
-
RedisInsight
- 由 Redis Labs 提供的图形化管理工具。
- 支持 Redis 的各种功能,包括监控、数据查看、性能分析等。
-
Redis Desktop Manager
- 第三方的图形化管理工具。
- 提供直观的界面来管理和监控 Redis 实例。
-
Medis
- 另一个第三方的图形化管理工具。
- 界面简洁,易于使用,支持多种操作系统。
-
RDM (Redis Desktop Manager)
- 一个开源的 Redis 图形化管理工具。
- 提供了丰富的功能,包括数据查看、编辑、导入导出等。
在日常运维中,熟练掌握这些命令和工具是非常重要的。通过这些工具,你可以有效地监控 Redis 的运行状态,及时发现和解决问题,确保 Redis 服务的稳定性和高性能
命令行通过redis-cli连接数据库,执行CLIENT LIST返回结果解析
**CLIENT LIST
命令返回的每一行都包含了一个连接到 Redis 服务器的客户端的信息。每行信息由多个字段组成,每个字段提供了关于该客户端的不同细节。下面是对你提供的 CLIENT LIST
返回结果的解析:
id=88 addr=fd40:5d1f:3c:b803:6c3c:100:adc:7:3894 fd=95 name= age=51110 idle=51110 flags=P db=0 sub=1 psub=0 multi=-1 qbuf=0 qbuf-free=0 argv-mem=0 obl=0 oll=0 omem=0 tot-mem=20504 ow=0 owmem=0 events=r cmd=subscribe user=default lib-name= lib-ver= numops=3**
字段解析
-
id=88:
- 客户端的唯一标识符。在这个例子中,客户端 ID 是 88。
-
addr=fd40:5d1f:3c:b803:6c3c💯adc:7:3894:
- 客户端的 IP 地址和端口号。这里显示的是一个 IPv6 地址
fd40:5d1f:3c:b803:6c3c:100:adc:7
和端口号3894
。
- 客户端的 IP 地址和端口号。这里显示的是一个 IPv6 地址
-
fd=95:
- 文件描述符(File Descriptor)。这是操作系统用于管理网络连接的内部标识符。
-
name=:
- 客户端名称。这个字段是空的,表示客户端没有设置名称。
-
age=51110:
- 客户端连接的持续时间(以秒为单位)。这个客户端已经连接了 51110 秒(大约 14.2 小时)。
-
idle=51110:
- 客户端空闲的时间(以秒为单位)。这个客户端已经空闲了 51110 秒(大约 14.2 小时),表示自从上次发送命令以来已经过去了这么长时间。
-
flags=P:
- 客户端标志。这里的
P
表示这是一个主从复制中的主节点(Master)。其他可能的标志包括:N
:普通客户端。M
:监控模式(MONITOR)。S
:从节点(Slave)。O
:离线模式(Offline)。L
:正在等待阻塞命令(如 BLPOP)。R
:正在读取数据。W
:正在写入数据。u
:未认证(Unauthenticated)。x
:即将关闭连接。b
:后台任务。m
:多路复用(Multiplexing)。t
:跟踪模式(Tracing)。s
:订阅模式(Subscribed)。l
:正在加载数据。d
:脏数据(Dirty)。a
:已认证(Authenticated)。r
:正在读取查询缓冲区。w
:正在写入查询缓冲区。k
:被踢出(Kicked)。A
:异步客户端。f
:快速通道(Fast channel)。D
:断开连接(Disconnected)。
- 客户端标志。这里的
-
db=0:
- 客户端当前选择的数据库编号。这里是 0 号数据库。
-
sub=1:
- 客户端订阅的频道数量。这个客户端订阅了 1 个频道。
-
psub=0:
- 客户端订阅的模式匹配的数量。这个客户端没有订阅任何模式匹配。
-
multi=-1:
- 客户端是否处于事务状态。-1 表示不在事务中。
-
qbuf=0:
- 查询缓冲区中的字节数。这里是 0,表示没有待处理的数据。
-
qbuf-free=0:
- 查询缓冲区剩余的可用空间。这里是 0,表示缓冲区已满或未使用。
-
argv-mem=0:
- 最近一次命令参数占用的内存大小。这里是 0,表示最近一次命令没有使用额外的内存。
-
obl=0:
- 输出缓冲区列表中的字节数。这里是 0,表示没有待发送的数据。
-
oll=0:
- 输出列表长度。这里是 0,表示没有待发送的数据项。
-
omem=0:
- 输出缓冲区占用的内存大小。这里是 0,表示没有待发送的数据。
-
tot-mem=20504:
- 客户端总内存占用量。这里是 20504 字节。
-
ow=0:
- 输出缓冲区的写入次数。这里是 0,表示没有写入操作。
-
owmem=0:
- 输出缓冲区写入操作占用的内存。这里是 0,表示没有写入操作。
-
events=r:
- 事件类型。
r
表示可读事件(Read event)。
- 事件类型。
-
cmd=subscribe:
- 客户端执行的最后一个命令。这里是
SUBSCRIBE
,表示客户端订阅了一个频道。
- 客户端执行的最后一个命令。这里是
-
user=default:
- 连接的用户。这里是
default
用户。
- 连接的用户。这里是
-
lib-name=:
- 客户端库的名称。这个字段是空的,表示客户端没有提供库的名称。
-
lib-ver=:
- 客户端库的版本。这个字段是空的,表示客户端没有提供库的版本。
-
numops=3:
- 客户端执行的命令总数。这个客户端总共执行了 3 个命令。
通过这些字段,你可以了解客户端的详细信息,包括它的 IP 地址、连接时间、空闲时间、订阅状态、内存使用情况等。这对于监控和调试 Redis 服务器是非常有用的。
info 和 CLUSTER INFO 解析
INFO
和 CLUSTER INFO
是 Redis 中非常有用的命令,用于获取关于 Redis 服务器和集群的详细信息。下面是对这两个命令返回的信息的详细解析。
INFO
命令
INFO
命令提供了关于 Redis 服务器的各种统计信息和配置参数。你可以通过指定不同的部分来获取特定的信息,例如 INFO all
获取所有信息,或者 INFO memory
获取内存相关信息。
示例输出
# Server
redis_version:6.2.6
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:7a4e8c9f5b3d67d4
redis_mode:standalone
os:Linux 5.4.0-104-generic x86_64
arch_bits:64
multiplexing_api:epoll
atomicvar_api:atomic-builtin
gcc_version:9.3.0
process_id:12345
run_id:9a5e7c1b5c5e4b5c5e5c5e5c5e5c5e5c5e5c5e5c
tcp_port:6379
uptime_in_seconds:123456
uptime_in_days:1
hz:10
configured_hz:10
lru_clock:12345678
executable:/usr/local/bin/redis-server
config_file:/etc/redis/redis.conf# Clients
connected_clients:10
client_recent_max_input_buffer:2
client_recent_max_output_buffer:0
blocked_clients:0
tracking_clients:0
clients_in_timeout_table:0# Memory
used_memory:123456789
used_memory_human:117.75M
used_memory_rss:123456789
used_memory_rss_human:117.75M
used_memory_peak:123456789
used_memory_peak_human:117.75M
used_memory_overhead:123456789
used_memory_startup:123456789
used_memory_dataset:123456789
used_memory_dataset_perc:100.00%
total_system_memory:8388608000
total_system_memory_human:7.81G
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:1.00
mem_allocator:jemalloc-5.2.1# Persistence
rdb_changes_since_last_save:123456
rdb_bgsave_in_progress:0
rdb_last_save_time:1633072800
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:1
rdb_current_bgsave_time_sec:-1
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
aof_last_write_latency_us:0
aof_current_size:0
aof_base_size:0
aof_pending_rewrite:0
aof_buffer_length:0
aof_rewrite_buffer_length:0
aof_pending_bio_fsync:0
aof_delayed_fsync:0# Stats
total_connections_received:123456
total_commands_processed:123456789
instantaneous_ops_per_sec:123
total_net_input_bytes:123456789
total_net_output_bytes:123456789
instantaneous_input_kbps:123.45
instantaneous_output_kbps:123.45
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:12345
evicted_keys:0
keyspace_hits:123456789
keyspace_misses:0
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:0
migrate_cached_sockets:0# Replication
role:master
connected_slaves:0
master_replid:9a5e7c1b5c5e4b5c5e5c5e5c5e5c5e5c5e5c5e5c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:123456789
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:123456789
详细解析
- Server:包含 Redis 服务器的基本信息,如版本、运行模式(单实例或集群)、操作系统、进程 ID 等。
- Clients:显示当前连接的客户端数量、阻塞的客户端数量等。
- Memory:提供内存使用情况,包括已用内存、RSS 内存、峰值内存等。
- Persistence:显示持久化相关的状态,如 RDB 和 AOF 的状态和时间。
- Stats:统计信息,如处理的总命令数、每秒操作数、网络输入输出速率等。
- Replication:复制相关的信息,如主从角色、从节点数量、复制偏移量等。
CLUSTER INFO
命令
CLUSTER INFO
命令提供了关于 Redis 集群的状态信息。这个命令在集群模式下特别有用,可以用来检查集群的整体健康状况。
示例输出
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:3
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_sent:12345
cluster_stats_messages_received:12345
详细解析
- cluster_state:集群的状态,可能的值有
ok
(正常),fail
(故障)。 - cluster_slots_assigned:分配给节点的槽位总数(Redis 集群默认有 16384 个槽位)。
- cluster_slots_ok:状态正常的槽位数量。
- cluster_slots_pfail:疑似失败的槽位数量。
- cluster_slots_fail:确认失败的槽位数量。
- cluster_known_nodes:已知的节点数量。
- cluster_size:当前集群中的节点数量。
- cluster_current_epoch:当前的纪元号(epoch),每个配置变更都会增加这个值。
- cluster_my_epoch:当前节点的纪元号。
- cluster_stats_messages_sent 和 cluster_stats_messages_received:发送和接收的消息数量,用于集群内部通信。
INFO
和 CLUSTER INFO
命令是 Redis 运维中非常重要的工具,可以帮助你了解 Redis 服务器和集群的运行状态。通过这些信息,你可以监控性能、诊断问题并进行必要的调整。