redis学习简记

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 #重写会创建一个当前 AOF 文件的体积优化版本
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 服务器的配置参数
redis> CONFIG GET s* #获取以s开头的配置参数的值
CONFIG SET #修改配置参数,或者改变 Redis 的持久化 (Persistence) 方式。动态调整,无需重启,ONFIG SET 的值只能通过数字值显式地设定。
CONFIG RESETSTAT #重置INFO 命令中的某些统计数据,包括:
• 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 #重新构建并生成出一个新的 redis.conf 文件 原子性重写

DBSIZE #返回当前数据库的 key 的数量。

DEBUG OBJECT #调试命令,当 key 存在时,返回有关信息。当 key 不存在时,返回一个错误

FLUSHALL #清空整个 Redis 服务器的数据 所有(删除所有数据库的所有 key )
FLUSHDB #清空当前数据库中的所有 key。此命令从不失败
INFO #Redis 服务器的各种信息和统计数值
LASTSAVE #返回最近一次 Redis 成功将数据保存到磁盘上的时间,以 UNIX 时间戳格式表示。
MONITOR #实时打印出 Redis 服务器接收到的命令,调试用。
PSYNC #用于复制功能 (replication) 的内部命令。
SAVE #将当前 Redis 实例的所有数据快照 (snapshot) 以 RDB 文件的形式保存到硬盘。
SHUTDOWN
SLAVEOF #用于在 Redis 运行时动态地修改复制 (replication) 功能的行为
•SLAVEOF NO ONE 对一个从属服务器执行命令 将使得这个从属服务器关闭复制功能,并从从属服务器
转变回主服务器,原来同步数据不会丢失
•以将当前服务器转变为指定服务器的从属服务器 (slave server)。
如果当前服务器已经是某个主服务器 (master server) 的从属服务器,那么执行 SLAVEOF host port 将使当
前服务器停止对旧主服务器的同步,丢弃旧数据集,转而开始对新主服务器进行同步。

SLOWLOG #用于复制功能 (replication) 的内部命令
Slow log 是 Redis 用来记录查询执行时间的日志系统 [Replication](https://redis.io/topics/replication)
SYNC # 个包含两个字符串的列表:第一个字符串是当前时间 (以 UNIX 时间戳格式表示),而第二个字
符串是当前这一秒钟已经逝去的微秒数。

connection

1
2
3
4
5
6
7
8
AUTH 
CONFIG SET requirepass password #可以使用密
码来保护 Redis 服务器
ECHO message
PING
QUIT
SELECT #切换到指定的数据库,数据库索引号 index 用数字值指定,以 0 作为起始索引值。默认使用0号数据库

部分常用命令

1)获取sentinel的状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
(1info

查看sentinelzhuangtai

(2sentinel masters

获取sentinel中监控的所有master的节点

(3sentinel master

获取master-name节点redis的状态信息

(4sentinel 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
#  telnet 192.168.0.15 6379 
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
# slave redis 绑定的IP地址
bind 192.168.0.12
# 监听的端口,使用默认的 2679
port 6379
# 以后台进程运行
daemonize yes
# 日志输出位置,便查看实验结果
logfile "/logfile/var/log/redis/redis.log"
# 作为 master redis 的 slave redis
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
# 绑定的IP地址
bind 192.168.0.15
# 监听的端口
port 26379
# 监控的 master redis 信息,

sentinel monitor mymaster 192.168.0.15 6379 2
# 判断 master redis 主观下线的时长(subjectively down,简称 SDOWN ),单位为毫秒,如果master在多少秒内无反应哨兵会开始进行master-slave间的切换,使用“选举”机制
sentinel down-after-milliseconds mymaster 30000
#如果在该时间(ms)内未能完成failover操作,则认为该failover失败
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
2
# 绑定的IP地址
bind 192.168.0.$

配置完成,启动

1
$ redis-sentinel redis-sentinel.conf

#### 常用代码

1
2
3
4
5
6
7
8
9
# 强制杀死redis,模仿宕机
ps aux |grep redis |awk '{print $2}'|xargs kill -9
# 优化模拟宕机 【根据Dual-X-raY提示-_-】
redis> DEBUG SEGFAULT
# 重启,指定conf
/home/work/xxx/bin/redis-server /home/work/xxx/etc/redis.conf
# 压测,具体参数可以参考benchmark
$ ./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服务器的实力信息,这是因为停止的实例有可能会在将来恢复,哨兵会让其重新加入进来
参考

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!