目录
读书笔记:《redis开发与运维》
【1】客户端概述
【1.1】client list:查看当前实例所有连接
127.0.0.1:6379> client list id=7 addr=10.20.50.34:6379 fd=10 name= age=11248616 idle=7 flags=M db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=ping id=262324 addr=127.0.0.1:44134 fd=8 name= age=2959 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=32742 obl=0 oll=0 omem=0 events=r cmd=client 127.0.0.1:6379>
下面是各字段的含义::
id
: 唯一的64位的客户端ID(Redis 2.8.12加入)。addr
: 客户端的地址和端口fd
: 套接字所使用的文件描述符age
: 客户端以秒计算的已连接时长idle
: 客户端以秒计算的最近一次的空闲时长flags
: 客户端 flagdb
: 该客户端正在使用的数据库 IDsub
: 已订阅频道的数量psub
: 已订阅模式的数量multi
: 在事务中被执行的命令数量qbuf
: 输入缓冲区的长度(字节为单位, 0 表示没有分配查询缓冲区)qbuf-free
: 输入缓冲区剩余空间的长度(字节为单位, 0 表示没有剩余空间)obl
: 输出缓冲区的长度(字节为单位, 0 表示没有分配输出缓冲区)oll
: 输出列表包含的对象数量(当输出缓冲区没有剩余空间时,命令回复会以字符串对象的形式被入队到这个队列里)omem
: 输出缓冲区和输出列表占用的内存总量events
: 文件描述符事件cmd
: 最近一次执行的命令
客户端 flag 可以由以下部分组成:
O: 客户端是 MONITOR 模式下的附属节点(slave)
S: 客户端是一般模式下(normal)的附属节点
M: 客户端是主节点(master)
x: 客户端正在执行事务
b: 客户端正在等待阻塞事件
i: 客户端正在等待 VM I/O 操作(已废弃)
d: 一个受监视(watched)的键已被修改, EXEC 命令将失败
c: 在将回复完整地写出之后,关闭链接
u: 客户端未被阻塞(unblocked)
U: 通过Unix套接字连接的客户端
r: 客户端是只读模式的集群节点
A: 尽可能快地关闭连接
N: 未设置任何 flag
【1.2】输入缓冲区问题
qbuf
: 输入缓冲区的长度(字节为单位, 0 表示没有分配查询缓冲区)qbuf-free
: 输入缓冲区剩余空间的长度(字节为单位, 0 表示没有剩余空间)
(1)输入缓冲不能超过1G,超过客户端会被关闭
(2)输入缓冲区不受maxmemory控制,也就是说redis已使用内存+客户端缓存 可能会超过 服务器端定义的 maxmemory。
从而可能引起数据丢失、键值淘汰、omm(内存超出限制)等问题。
【1.3】输出缓冲区问题
obl
: 输出缓冲区的长度(字节为单位, 0 表示没有分配输出缓冲区)oll
: 输出列表包含的对象数量(当输出缓冲区没有剩余空间时,命令回复会以字符串对象的形式被入队到这个队列里)omem
: 输出缓冲区和输出列表占用的内存总量
输出缓冲分为2部分,固态缓冲区(16KB)和动态缓冲区。即(obl)和(oll)
(1)obl:固态缓冲区用于小key和小结果值的返回。使用的是字节数组
(2)oll:动态缓冲区返回比较大的结果集,例如大key字符串、hgetall 等等。使用的是列表
配置规则:默认配置如下
##对客户端输出缓冲进行限制可以强迫那些不从服务器读取数据的客户端断开连接,用来强制关闭传输缓慢的客户端。 #对于normal client,第一个0表示取消hard limit,第二个0和第三个0表示取消soft limit,normal client默认取消限制,因为如果没有寻问,他们是不会接收数据的。 client-output-buffer-limit normal 0 0 0 #对于slave client和MONITER client,如果client-output-buffer一旦超过256mb,又或者超过64mb持续60秒,那么服务器就会立即断开客户端连接。 client-output-buffer-limit slave 256mb 64mb 60 #对于pubsub client,如果client-output-buffer一旦超过32mb,又或者超过8mb持续60秒,那么服务器就会立即断开客户端连接。 client-output-buffer-limit pubsub 32mb 8mb 60
【1.4】监控查看输入输出缓冲区异常
(1)client list :适合查看每个客户端具体情况
127.0.0.1:6379> client list id=7 addr=10.20.50.34:6379 fd=10 name= age=11245672 idle=10 flags=M db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=ping id=262324 addr=127.0.0.1:44134 fd=8 name= age=15 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=32742 obl=0 oll=0 omem=0 events=r cmd=client 127.0.0.1:6379> 127.0.0.1:6379> info clients
(2)info clients :适合快速查看是否有异常瓶颈
127.0.0.1:6379> info clients # Clients connected_clients:2 #当前实例总客户端连接换数量 client_recent_max_input_buffer:2 #表示最大的正在使用的输入缓冲区大小 client_recent_max_output_buffer:0 #表示最大的正在使用的输出缓冲区大小 blocked_clients:0 #正在阻塞的客户端进程数量 127.0.0.1:6379>
【1.5】存活监控
age
: 客户端以秒计算的已连接时长idle
: 客户端以秒计算的最近一次的空闲时长
当idle与age差别很大,那肯定证明这个链接是一个僵尸链接或者无用链接,因为没有任何操作 或者操作非常少。
所以,idle=age(连上后一直没有操作) or idle>600(即最近10分钟都没有任何操作),这都是比较有问题的,或者这个阀值率你可以自己规划。
在配置参数中有个 timeout参数,它规定了 idle 的阀值,如果超过 timeout(redis默认设置为0,也就是没有设置) 设置的 idle 值,那么该连接将会被断开
【2】客户端操作
【2.1】Client setName / Client getName
client setname diy_clientName
client getname exists_clientName
如下面代码,我们把client 的name 改了之后,client list 里面的 name就显示出来了,我们大多数时候通过这个来区分客户端(不设置的话 默认是空)
127.0.0.1:6379> client setname test OK 127.0.0.1:6379> client getname "test" 127.0.0.1:6379> client list id=14 addr=127.0.0.1:55514 fd=8 name=test age=2 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=32742 obl=0 oll=0 omem=0 events=r cmd=client
【2.2】client kill
client kill ip:port
此命令用于杀掉指定的ip地址和端口的客户端
127.0.0.1:6379> client list id=21 addr=127.0.0.1:55528 fd=9 name= age=7 idle=4 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=client id=22 addr=127.0.0.1:55530 fd=8 name= age=0 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=32742 obl=0 oll=0 omem=0 events=r cmd=client 127.0.0.1:6379> client kill 127.0.0.1:55528 OK
【2.3】client pause
client pause timeout(毫秒)
命令用于阻塞客户端 timeout 毫秒数,在此期间客户端连接将被阻塞。
#客户端A 127.0.0.1:6379> client pause 10000 OK #客户端B,几秒之后切换过去执行的 127.0.0.1:6379> ping PONG (6.31s)
实验成功
【2.4】monitor
用于监视 Redis 正在执行的命令。
注意,monitor 会消耗很多资源
#客户端A 127.0.0.1:6379> monitor OK 1594375757.384438 [0 127.0.0.1:55538] "AUTH" "123456" 1594375757.384844 [0 127.0.0.1:55538] "set" "a100" "10" #客户端B 127.0.0.1:6379> set a100 10 OK
【3】客户端配置参数
timeout 30 #默认为0不检测,检测客户端空闲连接阀值,idle超过则断开客户端 maxclients 10000 #客户端最大连接数 tcp-keepalive 60 #默认为0不检测,检测tcp连接火活性周期,防止大量死连接占用资源 tcp-backlog 511 #默认511,tcp三次握手后,会将接收的链接放入队列中,tcp-backlog就是队列大小。受os /proc/sys/net/core/somaxconn 限制,建议该os参数要大于等于tcp-backlog值