server
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 BGREWRITEAOF BGSAVE CLIENT GETNAME CLIENT SETNAME CLINENT LIST 以下是域的含义: • addr :客户端的地址和端口 • fd :套接字所使用的文件描述符 • age :以秒计算的已连接时长 • idle :以秒计算的空闲时长 • flags :客户端 flag (见下文) • db :该客户端正在使用的数据库 ID • sub :已订阅频道的数量 • psub :已订阅模式的数量 • multi :在事务中被执行的命令数量 • qbuf :查询缓存的长度(0 表示没有查询在等待) • qbuf-free :查询缓存的剩余空间(0 表示没有剩余空间) • obl :输出缓存的长度 • oll :输出列表的长度(当输出缓存没有剩余空间时,回复被入队到这个队列里) • omem :输出缓存的内存占用量 • events :文件描述符事件(见下文) • cmd :最近一次执行的命令 客户端 flag 可以由以下部分组成: • O :客户端是 MONITOR 模式下的附属节点(slave ) • S :客户端是一般模式下(normal)的附属节点 • M :客户端是主节点(master ) • x :客户端正在执行事务 • b :客户端正在等待阻塞事件 • i :客户端正在等待 VM I/O 操作(已废弃) • d :一个受监视(watched)的键已被修改,EXEC 命令将失败 • c : 在将回复完整地写出之后,关闭链接 • u : 客户端未被阻塞(unblocked) • A : 尽可能快地关闭连接 • N : 未设置任何 flag 文件描述符事件可以是: • r : 客户端套接字(在事件 loop 中)是可读的(readable) • w : 客户端套接字(在事件 loop 中)是可写的(writeable) CLIENT KILL CONFIG GET redis> CONFIG GET s* CONFIG SET CONFIG RESETSTAT • Keyspace hits (键空间命中次数) • Keyspace misses (键空间不命中次数) • Number of commands processed (执行命令的次数) • Number of connections received (连接服务器的次数) • Number of expired keys (过期 key 的数量) • Number of rejected connections (被拒绝的连接数量) • Latest fork(2 ) time(最后执行 fork(2 ) 的时间) • The aof_delayed_fsync counter(aof_delayed_fsync 计数器的值) CONFIG REWRITE DBSIZE DEBUG OBJECT FLUSHALL FLUSHDB INF O LASTSAVE MONITOR PSYNC SAVE SHUTDOWN SLAVEOF •SLAVEOF NO ONE 对一个从属服务器执行命令 将使得这个从属服务器关闭复制功能,并从从属服务器 转变回主服务器,原来同步数据不会丢失 •以将当前服务器转变为指定服务器的从属服务器 (slave server)。 如果当前服务器已经是某个主服务器 (master server ) 的从属服务器,那么执行 SLAVEOF host port 将使当 前服务器停止对旧主服务器的同步,丢弃旧数据集,转而开始对新主服务器进行同步。 SLOWLOG Slow log 是 Redis 用来记录查询执行时间的日志系统 [Replication](https://redis.io/topics/replication) SYNC 符串是当前这一秒钟已经逝去的微秒数。
connection 1 2 3 4 5 6 7 8 AUTH CONFIG SET requirepass 可以使用密 码来保护 Redis 服务器 ECHO PING QUIT SELECT 切换到指定的数据库,数据库索引号 用数字值指定,以 作为起始索引值。默认使用号数据库
部分常用命令 1)获取sentinel的状态
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 (1 )info 查看sentinel 的zhuangtai (2 )sentinel masters 获取sentinel 中监控的所有master 的节点 (3 )sentinel master 获取master-name 节点redis 的状态信息 (4 )sentinel slaves 获取master-name 节点下所有的slaves 的状态信息。 (5 ) SENTINEL get-master-addr-by-name 通过sentinel 中的节点名获取其ip 地址
2)添加或删除监控节点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 (1)sentinel monitor name: sentinel中节点的名字 port ip : 被监控的redis master实例 quorum : failover时,需要的法定人数。 (2)sentinel reset 重置redis name匹配制定的状态,包括正在failover的master。 该操作会删除该节点上的slave信息、已经发现和关联的sentinel节点信息。 sentinel将会重新发现sentinel和redis slave节点。 (3) sentinel remove 删除master节点,sentinel不再监控该节点。
redis安装 此处略去,参考官方文档 https://redis.io/
实验过程 复制功能的运作原理 无论是初次连接还是重新连接,当建立一个从服务器时,从服务器都将向主服务器发送一个SYNC 命令。 接到SYNC 命令的主服务器将开始执行BGSAVE ,并在保存操作执行期间,将所有新执行的写入命令都保 存到一个缓冲区里面。 当BGSAVE 执行完毕后,主服务器将执行保存操作所得的 .rdb 文件发送给从服务器,从服务器接收这个 .rdb 文件,并将文件中的数据载入到内存中。 之后主服务器会以 Redis 命令协议的格式,将写命令缓冲区中积累的所有内容都发送给从服务器。
可用telnet测试
1 2 3 4 5 6 7 Trying 192.168.0.15 ... Connected to 192.168.0.15 . Escape character is '^]' . sync$98 REDIS0007dis-ver3.2 .3edis-bitsctimeYed-mem
参考官方文档
1.主备复制 环境:192.168.0.15为主节点,192.168.0.12-13为从节点
Master redis的配置redis.conf
修改如下配置即可,其他保存默认。
1 2 3 4 5 6 7 8 master redis 绑定的IP地址 bind 192.168 .0.15 监听的端口,使用默认的 2679 port 6379 daemonize yes logfile "/logfile/var/log/redis/redis.log"
Slaveof redis的配置redis.conf
#另一节点的slave修改绑定IP即可。
1 2 3 4 5 6 7 8 9 10 bind 192.168.0.12 port 6379 daemonize yeslogfile "/logfile/var/log/redis/redis.log" slaveof 192.168.0.15 6379
修改好配置后,先后启动 master redis 和 slave redis:
1 # redis-server /etc/ redis.conf
主备复制完成
2.配置 Sentinel Redis 源码中包含了一个名为sentinel.conf
的文件, 这个文件是一个带有详细注释的 Sentinel 配置文件示例。
运行一个 Sentinel 所需的最少配置如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 bind 192.168.0.15 port 26379 sentinel monitor mymaster 192.168.0.15 6379 2 sentinel down-after-milliseconds mymaster 30000 sentinel failover-timeout mymaster 180000 sentinel parallel-syncs mymaster 1
各个选项的功能如下:
sentinel monitor mymaster 192.168.0.15 6379 2
mymaster是主数据的别名,考虑到故障恢复后主数据库的地址和端口号会发生变化,哨兵提供了命令可以通过别名获取主数据库的地址和端口号。 其中的数字 2 表示判断这个服务器失效,至少需要2 个Sentinel 同意. master redis 只要同意 Sentinel 的数量不达标,自动故障迁移就不会执行,-2该参数用来表示执行故障恢复操作前至少需要几个哨兵节点同意,一般设置为N/2+1(N为哨兵总数).此标记客观下线(objectively down, 简称 ODOWN )
down-after-milliseconds` 选项指定了 Sentinel 认为服务器已经断线所需的毫秒数。
如果服务器在给定的毫秒数之内, 没有返回 Sentinel 发送的 PING 命令的回复, 或者返回一个错误, 那么 Sentinel 将这个服务器标记为主观下线 (subjectively down,简称 SDOWN
)。
不过只有一个 Sentinel 将服务器标记为主观下线并不一定会引起服务器的自动故障迁移: 只有在足够数量的 Sentinel 都将一个服务器标记为主观下线之后, 服务器才会被标记为客观下线 (objectively down, 简称 ODOWN
), 这时自动故障迁移才会执行。
将服务器标记为客观下线所需的 Sentinel 数量由对主服务器的配置决定。
parallel-syncs
选项指定了在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步, 这个数字越小, 完成故障转移所需的时间就越长。
其他节点同上配置,其中只修改本机绑定IP地址
配置完成,启动
1 $ redis-sentinel redis-sentinel.conf
#### 常用代码
1 2 3 4 5 6 7 8 9 ps aux |grep redis |awk '{print $2}' |xargs kill -9 redis> DEBUG SEGFAULT/home/ work/xxx/ bin/redis-server / home/work/ xxx/etc/ redis.conf $ ./redis-benchmark -h 127.0 .0.1 -p 端口 -a 密码 -c 1000 -n 10000000 -d 1024 -r 100000 -t set,get,incr,del
验证 这里直接关闭主数据库,终端输入:
1 redis -cli -p 7000 shutdown
1 2 3 4 5 6 +sdown 表示哨兵主观认为数据库下线 +odown 表示哨兵客观认为数据库下线 +try-failover 表示哨兵开始进行故障恢复 +failover-end 表示哨兵完成故障修复,其中包括了领头哨兵的选举、备选从数据库的选择等等较为复杂的过程 +switch-master表示主数据库从51服务器迁移到52服务器 +slave列出了新的主数据库的2个从数据库,而哨兵并没有彻底清除51服务器的实力信息,这是因为停止的实例有可能会在将来恢复,哨兵会让其重新加入进来
参考