Redis运维的复制、哨兵、集群与可视化工具CacheCloud
1. 基本操作
- 查看服务
info server
- 查看状态
info replication
- 日志标识 M主节点 S从节点 C子进程 Redis3.0版本以后的日志提供该标识
- 客户端信息
client list
查看复制相关客户端信息,flags=M为主节点,flags=S为从节点 - 设置自动重定向
redis-cli -p 6379 -c
2. 复制
命令行
- 主从复制
slaveof 127.0.0.1 6387
- 断开复制
slaveof no one
- 重载RDB并保持id不变
debug reload
该命令会阻塞当前节点,对于大数据量和无法容忍阻塞环境谨慎使用 - 全量复制(不知道id)
psync ? -1
- 全量复制(知道id)
psync {id} -1
- 部分复制
psync {id} {offset}
配置信息
- 只读模式
slave-read-only yes
默认只读 - 传输延迟
repl-disable-tcp-nodelay no
默认关闭 - 设置密码
requirepass
默认注释,主节点设置了密码,从节点复制必须配置masterauth参数 - 设置超时
repl-timeout
大数据量(大于6G)同步时一定注意设置超时,默认超时时间60秒 - 缓存溢出
client-output_buffer_limit slave 256MB 64MB 60
60秒内连续超过64mb溢出,单次超过256mb溢出,溢出情况主节点自动关闭复制,同步失败 - 响应命令
slave-serve-stale-data
默认开启,开启后从节点响应全部命令,即使从节点正在执行复制 - 请求频率
repl-ping-slave-period
控制主节点发送ping命令给从节点的频率 - 从节点数量
min-slaves-to-write
- 从节点延迟性功能
min-slaves-max-lag
3. 哨兵
命令行
- 启动sentinel节点
redis-sentinel redis-sentinel-26379.conf
或者redis-server redis-sentinel-26379.conf --sentinel
- 展示监控的全部主节点信息
sentinel masters
- 展示监控的指定主节点的信息
sentinel master <主节点别名>
- 展示指定主节点的全部从节点的信息
sentinel slaves <主节点别名>
- 展示指定主节点的哨兵节点集合
sentinel sentinels <主节点别名>
- 查看sentinel相关信息
redis-cli -h 127.0.0.1 -p 26379 info sentinel
- 动态修改配置
sentinel set <param> <value>
支持一下参数设置
参数 | 使用方法 |
---|---|
quorum | sentinel set mymaster quorum 2 |
down-after-milliseconds | sentinel set mymaster down-after-milliseconds 30000 |
failover-timeout | sentinel set mymaster failover-timeout 360000 |
parallel-syncs | sentinel set mymaster parallel-syncs 2 |
notification-script | sentinel set mymaster notification-script /opt/xx.sh |
client-reconfig-script | sentinel set mymaster client-reconfig-script /opt/yy.sh |
auth-pass | sentinel set mymaster auth-pass masterPassword |
`sentinel set` 命令只对当前sentinel节点有效
`sentinel set` 命令执行完成后立即生效,无需使用 `config rewrite` 刷新配置
`sentinel` 对外不支持 `config` 命令
- 返回指定主节点的IP地址和端口
sentinel get-master-addr-by-name <master-name>
- 当前sentinel节点对符合规则的主节点的配置重置
sentinel reset <pattern>
包含清除主节点的相关状态,重新发现从节点和sentinel节点 - 对指定主节点执行强制故障转移
sentinel failover <master-name>
故障转移完成后其他sentinel节点按照故障转移结果更新自身配置 - 检测当前可用sentinel节点总数是否达到设置的
quorum
数量sentinel ckquorum <master-name>
- 将sentinel节点的配置强制刷到磁盘上
sentinel flushconfig
- 取消当前sentinel节点对指定主节点的监控
sentinel remove <master-name>
- 以命令行方式完成sentinel节点对指定主节点的监控
sentinel monitor <master-name> <ip> <port> <quorum>
- sentinel节点之间交换对主节点是否下线的判断
sentinel is-master-down-by-addr <ip> <port> <current_epoch> <runid>
`ip` 主节点ip
`port` 主节点端口
`current_epoch` 当前配置纪元
`runid` 当为'*'时,sentinel节点直接交换对主节点下线的判定。当为当前sentinel节点的runid时,作用是当前sentinel节点希望目标sentinel节点统一自己成为领导者的请求
- 获取sentinel对应主节点的信息
sentinel get-master-addr-by-name master-name
配置信息
redis-sentinel-26379.conf
port 26379
daemonize yes
logfile "26379.log"
dir /opt/soft/redis/data
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel
节点默认端口 26379sentinel monitor <主节点别名> <主节点地址> <主节点端口> <主节点失败后至少需要多少哨兵节点同意才能升级为主节点的数量>
port
代表sentinel节点的端口dir
代表sentinel节点的工作目录down-after-milliseconds
sentinel节点连接主节点的超时时间parallel-syncs
从节点对新主节点发起复制操作的从节点个数failover-timeout
故障转移超时时间,作用于故障转移的每个阶段sentinel auth-pass <master-name> <password>
如果主节点设置了密码,哨兵节点同样需要设置相同密码才能访问sentinel notification-script <master-name> <script-path>
配置故障转移期间通过指定的脚本发送一些告警级别的时间信息,其中script-path是脚本路径sentinel client-reconfig-script <master-name> <script-path>
故障转移结束后触发指定的脚本
4.集群
命令行
- 查看集群信息
cluster nodes
- 节点握手
cluster meet {ip} {port}
- 集群模式下让一个节点成为从节点
cluster replicate {nodeId}
该命令必须在对应的从节点上执行 - 批量分配槽
redis-cli -h 127.0.0.1 -p 6379 cluster addslots {0...5461}
- 数据迁移
5.1 目标节点准备导入槽的数据cluster setslot {slot} importing {sourceNodeId}
5.2 源节点准备迁出槽的数据cluster setslot {slot} migrating {targetNodeId}
5.3 源节点循环执行获取count个属于槽{slot}的键cluster getkeysinslot {slot} {count}
5.4 批量键迁移(3.0.6版本以上提供)migrate {targetIp} {targetPort} "" 0 {timeout} keys {keys...}
5.5 重复执行步骤3和步骤4知道槽下所有的键值数据迁移到目标节点
5.6 向集群内所有主节点发送命令cluster setslot {slot} node {targetNodeId}
通知槽分配给目标节点 - 忘记节点(不再与下线节点通信,不建议线上操作)
cluster forget {downNodeId}
- 查看当前key对应的槽
cluster keyslot {key}
- 初始化槽和节点映射关系
cluster slots
- 查询nodeId对应主节点下全部从节点信息
cluster slaves {nodeId}
- 在指定节点地址上执行
cluster failover
完成手动故障迁移 - 强制选举
cluster failover force
一般用于主节点宕机后无法执行自动故障迁移 - 强制迁移
cluster failover takeover
一般用于集群内超过一半以上主节点故障场景,慎用
redis-trib.rb 工具使用
- 创建集群
redis-trib.rb create --replicas 1 127.0.0.1:6481 127.0.0.1:6482 127.0.0.1:6483 127.0.0.1:6484 127.0.0.1:6485 127.0.0.1:6486
- 检查集群完整性
redis-trib.rb check 127.0.0.1:6481
- 为现有集群添加新节点,并直接添加为从节点
redis-trib.rb add-node new_host:new_port existing_host:existing_port --slave --master-id <arg>
- 添加新节点,正式环境建议使用该语句,添加后会自动检测新节点状态
redis-trib.rb add-node 127.0.0.1:6385 127.0.0.1:6379
- 槽重分片功能
redis-trib.rb reshard host:port --from <arg> --to <arg> --slots <arg> --yes --timeout <arg> --pipeline <arg>
- host:port 必传参数,集群内任意节点地址,用来获取整个集群信息
- --from 制定源节点的id,如果有多个源节点,使用逗号分割,如果是all源节点变为集群内所有主节点,在迁移过程中提示用户输入
- --to 需要迁移的目标节点的id,目标节点只能填写一个,在迁移过程中提示用户输入
- --slots 需要迁移槽的总数量,在迁移过程中提示用户输入
- --yes 当打印出reshard执行计划时,是否需要用户输入yes确认后在执行reshard
- --timeout 控制每次migrate操作的超时时间,默认为60000毫秒
- --pipeline 控制每次批量迁移键的数量,默认是10
- 检查节点均衡性
redis-trib.rb rebalance
- 设置节点均衡性
redis-trib.rb rebalance 127.0.0.1:6379
- 忘记节点(下线节点,不再通信)
redis-trib.rb del-node {主节点host:主节点port} {从节点downNodeId}
- 查看指定节点的信息
redis-trib.rb info 127.0.0.1:6379
- 单机数据迁移到集群中
redis-trib.rb import host:port --from <arg> --copy --replace
Notes:
- 迁移只能从单机节点向集群环境导入数据
- 不支持在线迁移数据,迁移数据的时候应用方必须停写,无法平滑迁移数据
- 迁移过程中途如果出现超时等错误,不支持断点续传只能重新全量导入
- 使用单线程进行数据迁移,大数据量迁移速度过慢
- 推荐使用唯品会开发的redis-migrate-tool
配置信息
- redis-6379.conf
# 节点端口
port 6379
# 开启集群模式
cluster-enabled yes
# 节点超时时间,单位毫秒
cluster-node-timeout 15000
# 集群内部配置文件
cluster-config-file "nodes-6379.conf"
- 关闭故障转移集群不可用状态
cluster-require-full-coverage no
5.Redis监控运维云平台 CacheCloud
- 监控统计: 提供了机器、应用、实例下各个维度数据的监控和统计界面。
- 一键开启: Redis Standalone、Redis Sentinel、Redis Cluster三种类型的应用,无需手动配置初始化。
- Failover: 支持哨兵,集群的高可用模式。
- 伸缩: 提供完善的垂直和水平在线伸缩功能。
- 完善运维: 提供自动运维和简化运维操作功能,避免纯手工运维出错。
- 方便的客户端 方便快捷的客户端接入。
- 元数据管理: 提供机器、应用、实例、用户信息管理。
- 流程化: 提供申请,运维,伸缩,修改等完善的处理流程
- 一键导入: 一键导入已经存在Redis