Redis_草稿图_2
2024-04-23 20:01:09 2 举报
Redis_草稿图_2是一个关于Redis的数据结构草图,包含了Redis的五种主要数据结构,包括字符串、哈希、列表、集合和排序集合。这张草图提供了一个直观的视图,以便于理解Redis内部数据结构的基本概念和设计思想。
作者其他创作
大纲/内容
复制
7000
7005
传播33字节数据
监视
发送FAIL消息
clusterNode*[16384]
0
1
2
3
...
16383
server4
server3
redisClient
slave_listening_port12345
客户端A
news.it频道
redisServer
slowlog_entry_id8
slowlog
slowlog_log_slower_than0
slowlog_max_len5
c256
通过命令连接发送信息到频道
从服务器Coffset = 10119
复制积压缓冲区
主服务器
伪客户端
是
参数
意义
down_state
返回目标Sentinel对服务器的检查结果,1表示主服务器已下线,0代表主服务器未下线
leader_runid
可以是*符号或者目标Sentinel的局部领头Sentinel的运行ID:*符号代表命令仅仅用于检测主服务器的下线状态,而局部领头Sentinel的运行ID则用于选举领头Sentinel
leader_epoch
目标Sentinel的局部领头Sentinel的配置纪元,用于选举领头Sentienl,仅在leader_runid的值不为*时有效,如果leader_runid的值为*,那么leader_epoch总为0
7002
发送命令SLAVEOF<server2_ip><server2_port>
server1
客户端D
集群
7001
目标节点
开始对槽slot进行重新分片
字节
slots[0]
slots[1]
slots[2047]
索引
4
5
6
7
8
9
10
11
12
13
14
15
16382
值
sentinelRedisInstance
flagsSRI_SLAVE
name\"127.0.0.1:11111\"
否
master1
不是
NULL
服务器
Sentinel
领头Sentinel
client-10086
创建命令连接
c10086
master
setCommand
clusterState
myself
slots
7003
返回PING消息
匹配
ListObject
槽i是否指派给了节点?
源节点是否保存了属于槽slot的键?
pubsubPattern
clientclient-8
pattern\"book.*\"
c2
从服务器Aoffset = 10086
clusterNode *[16384]
16198
16381
\"return 'hello world'\"
偏移量
10087
10088
10089
10090
10091
10092
10093
10094
10095
10096
10097
字节值
'*'
'\'
'$'
'S'
'E'
'T'
Sentinel1
\"return 1+1\"
clientclient-7
pattern\"music.*\"
客户端向源节点发送关于键key的命令
nodes
\"5154...2939\"
\"68ee...f2ff\"
\"9dfb...5c26\"
dict
StringObject\"lst\"
StringObject\"book\"
StringObject\"date\"
握手
继续执行下一个步骤
返回包含节点E和节点F信息的PONG消息
10001
10002
节点
角色
状态
工作
主节点
下线
负责处理槽0至槽5000(因为故障转移已经完成,所以该工作已经失效)
在线
负责处理槽5001至槽10000
负责处理槽10001至槽15000
负责处理槽15001至16383
7004
从节点
负责处理槽0至槽5000
复制节点7004
client-2
接收信息(订阅连接)
lua
watched_keys
\"name\"
\"age\"
\"address\"
clusterNode
flagsREDIS_NODE_MASTER
ip\"127.0.0.1\"
port7000
numslaves2
slaves2
主服务器127.0.0.1:6379
flagsREDIS_NODE_MASTER & REDIS_NODE_PFAIL
节点B
client-5
客户端C
发送写命令
\"world\"
发送命令请求/返回命令回复
从服务器Boffset = 10119
StringObject\"Manning\"
时间
客户端B
T1
WATCH \"name\"
T2
MULTI
T3
SET \"name\" \"vinpink\"
T4
SET \"name\" \"cover\"
T5
EXEC
StringObject\"a\"
StringObject\"b\"
StringObject\"c\"
\"hello\"
节点执行客户端发送的命令
3.返回命令的执行结果3
SENTINEL ....
发送PUBLISH消息
Lua环境
已下线
命令执行器
HashObject
StringObject\"name\"
StringObject\"author\"
StringObject\"publisher\"
client-6
INFO
c3
发送 MEET消息
命令连接
slowlogEntry
id6
time1713670934
duration5
argv
argc2
c512
flagsSRI_MASTER
name\"master1\"
runid\"9a4739e8d2bb8bbc95096b04df58af419ec8033f\"
config_epoch0
addr
down_after_period30000
quorum2
parallel_syncs1
failover_timeout900000
复制中止
主服务器127.0.0.1:6379复制偏移量为200
监视器3
redis-trib
pubsub_channels
\"news.it\"
\"news.sport\"
\"news.business\"
lua_scripts
\"5332031c6b470dc5a0dd9b4bf2030dea6d65de91\"
server2
发送信息(命令连接)
c4
主服务器返回+FULLRESYNC<runid><offset>
SentinelA
从服务器
T0
主从服务器完成同步
执行并传播SET k1 v1
执行主服务器传来的SET k1 v1
执行并传播SET k2 v2
执行主服务器传来的SET k2 v2
T10085
执行并传播SET k10085 v10085
执行主服务器传来的SET k10085 v10085
T10086
执行并传播SET 看10086 v10086
执行主服务器传来的SET k10086 v10086
T10087
主从服务器连接断开
T10088
执行SET k10087 v10087
断线中,尝试重新连接主服务器
T10089
执行SET k10088 v10088
T10090
执行SET k10089 v10089
T10091
主从服务器重新连接
T10092
向主服务器发送SYNC命令
T10093
接收到从服务器发来的SYNC命令,执行BGSAVE命令,创建包含键k1至键k10089的RDB文件,并使用缓冲区记录接下来执行的所有命令
T10094
BGSAVE命令执行完毕,向从服务器发送RDB文件
T10095
接收并载入主服务器发来的RDB文件,获得键k1至键k10089
T10096
因为在BGSAVE命令执行期间,主服务器没有执行任何写命令,所以跳过发送缓冲区包含的写命令这一步
T10097
主从服务器再次完成同步
向客户端返回命令的执行结果
监视器2
1.传送redis.call函数想要执行的Redis命令
id2
time1713670860
duration7
源节点正在迁移槽i?
执行客户端提交的事务
从服务器N
slowlog_entry_id7
cluster-enabled选项的值为yes?
cleint-6
发送命令请求
升级为新的主服务器
REPLCONF listening-port 12345
客户端
migrating_slots_to
flagsSRI_MASTER | SRI_S_DOWN | SRI_O_DOWN
name\"master\"
news.[ie]t模式
id7
time1713789749
duration8
argc3
返回PONG消息
向客户端返回QUEUED
StringObject\"Josiah L Carlson\"
标记为已下线
EVALSCRIPT FLUSHSCRIPT LOAD
2022
5000
5001
5002
6257
10000
定期调用钩子检查脚本是否已超时运行?
将槽slot指派给目标节点
节点7001
masterhost\"127.0.0.1\"
masterport6379
从服务器向主服务器发送PING命令
client-1
clusterNode*[2]
节点D
StringObject\"Redis In Action\"
1.主从服务器设置了不同的密码2.主服务器设置了密码但从服务器没有设置密码3.主服务器没有设置密码但从服务器设置了密码
flagsREDIS_NODE_SLAVE
port7005
\"return hi\"
cleint-1
PUBLISH \"news.et\" \"world\"
PSYNC
传播EVALSHA <sha1> <numkeys> [key ...] [arg ...]
接收者
发送者
将命令放入事务队列
从服务器2
从服务器(主服务器的客户端)127.0.0.1:12345
这是从服务器第一次执行复制?
\"127.0.0.1:26380\"
\"127.0.0.1:26381\"
Sentinel系统
节点A
sentinel2
复制积压缓冲区的构造
命令传播程序
订阅
从服务器A
client-3
键key不存在
slave2
发送命令信息
从服务器127.0.0.1:12345复制偏移量为200
重试
执行复制工作的下一个步骤
\"2f31ba2bb6d6a0f42cc159d2e2dad55440778de3\"
\"a27e7e8a43702b7046d4f6a7ccf5b60cef6b9bd9\"
\"4475bfb5919b5ad16424cb50f74d4724ae833e72\"
SentinelB
节点7003
\"return 2*2\"
slave0
news.et频道
节点7002
falgsREDIS_NODE_MASTER
port7002
port7003
套接字连接
name\"master2\"
runid\"0aab2219518c0bd7b1b885ba9747659e5c5f8d90\"
down_after_period50000
quorum5
parallel_syncs5
failover_timeout450000
sentinelAddr
port12345
multiCmd
cmd
name\"68ee...f2ff\"
configEpoch0
port7001
功能
Sentinel模式下使用情况
数据库和键值对方面的命令,比如SET、DEL、FLSUHDB
不使用
事务命令,比如MULTI和WATCH
脚本命令,比如EVAL
RDB持久化命令,比如SAVE和BGSAVE
AOF持久化命令,比如BGREWRITEAOF
复制命令,比如SLAVEOF
Sentinel内部可以使用,但客户端不可以使用
发布与订阅命令,比如PUBLISH和SUBSCRIBE
SUBSCRIBE、PSUBSCRIBE、UNSUBSCRIBE、PUNSUBSCRIBE四个命令在Sentinel内部和客户端都可以使用,但PUBLISH命令只能在Sentinel内部使用
文件事件处理器(负责发送命令请求、处理命令回复)
Sentinel内部使用,但关联的文件事件处理器和普通Redis服务器不同
时间事件处理器(负责执行serverCron函数)
Sentinel内部使用,时间事件的处理器仍然是serverCron函数,serverCron函数会调用sentinel.c/sentinelTImer函数,后者包含了Sentinel要执行的所有操作
pubsub_patterns
Sentinel3
从服务器接到客户端发来的SLAVEOF命令
4.将命令结果传回给Lua环境
importing_slots_from
从服务器127.0.0.1:12345
发送命令CLUSTER MEET<B_ip> <B_port>
主服务器返回+CONTINUE ?
客户端是否带有ASKING标识?
pubsub
\"news-sport\"
\"news.movie\"
目标节点准备导入槽slot的键值对
c128
设置为server2的从服务器
2.将DBSIZE命令传给执行器执行
节点向客户端返回一个MOVED错误
c1
long long
138855600000
拒绝执行客户端提交的事务
(断线)
主服务器在本机执行完命令EVALSHA <sha1> <numkeys> [key ...] [arg ...]
getCommand
sentinel3
我负责处理槽5001至槽10000
客观下线
sentinelState
masters
client-4
monitors
multiState
commands
count4
SET key value
我负责处理槽0至槽5000
cleint-3
执行这个命令
从服务器B
发送PUBLISH命令
客户端向节点发送关于槽i的命令
执行部分重同步
ASKING
启动服务器
clientclient-9
pattern\"news.*\"
rojb*[2]
StringObject\"GET\"
创建订阅连接
GET \"love\"
\"127.0.0.1:11111\"
\"127.0.0.1:22222\"
\"127.0.0.1:33333\"
slave1
节点7000
run_id\"a5bd47a1e569ed14567eca650de57f9d83301638\"
slave_master_port6379
slave_master_link_statusSENTINEL_MASTER_LINK_STATUS_UP
slave_repl_offset0
slave_priority100
....
sentinelRedisIntance
节点执行命令
从服务器1
发送命令SLAVEOF no one
继续执行脚本
从服务器Aoffset = 10119
节点计算键属于哪个槽
PUBLISH \" news.it\" \"hello\"
cleint-4
sentinel1
主服务器offset = 10086
发送断线时缺失的33字节数据
2.返回最多count个属于槽slot的键
\"728d9ecdcf934ba0f430b2b05f049e13041278ae\"
主服务器返回\"PONG\"?
slots[1]~slots[2047]
run_id\"9a4739e8d2bb8bbc95096b04df58af419ec8033f\"
slaves
节点是否正在导入槽i?
从服务器Coffset = 10086
repl_scriptcache_dict
开启服务器的集群模式成为一个节点
argv[0]
argv[1]
argv[2]
StringObject\"SET\"
StringObject\"number\"
StringObject\"10086\"
有SCRIPT KILL或者SHUTDOWN NOSAVE到达?
1713791641.329412 [0 127.0.0.1:56604] \"KEYS\" \"*\"
\"master1\"
\"master2\"
键key是否存在于源节点的数据库?
PING
flagsSRI_SENTINEL
name\"127.0.0.1:26381\"
是,验证成功
sentinelsRedisInstance
name\"mymaster\"
sentinels
将sha1添加到repl_scriptcache_dict字典
Lua脚本执行DBSIZE命令时的通信步骤
主从服务器设置的密码相同
这个命令是否EXEC、DISCARD、WATCH或MULTI?
转向
robj[3]
StringObject\"Practical Common Lisp\"
从服务器Boffset = 10086
Sentinel2
响应握手
我负责处理槽10001至槽16383
port6379
监视器1
主服务器127.0.0.1:6379复制偏移量为233
header
tail
level5
length
从服务器127.0.0.1:12345复制偏移量为233
SentinelC
robj*[2]
当前节点就是负责处理键所在槽的节点?
flagsREDIS_NODE_MASTER & REDIS_NODE_PFAIL
fail_reports
否,进行身份验证
OK
源节点执行客户端发送的命令
客户端根据MOVED错误提供的信息转向至正确的节点
向客户端返回ASK错误
返回命令回复
3.返回命令的执行结果
ip
被Sentinel判断为主观下线的主服务器的IP地址
port
被Sentinel判断为主观下线的主服务器端口号
current_epoch
Sentinel当前的配置纪元,用于选举领头Sentinel
runid
这个客户端正处于事务状态?
AUTH 10086
开启服务器的单机(stand alone)模式成为一个普通Redis服务器
4.根据MIGRATE命令的指示,将键迁移到目标节点
完成对槽slot的重新分片
\"return 'hi'\"
将EVALSHA命令转换成等价的EVAL命令
clusterNodeFailReport
node
time1390525039000
1385877600000
2.将命令传给执行器执行
Sentinel(master1和master2的客户端)
+CONTINUE
降级为server2的从服务器
port7004
slaveof
通过订阅连接从频道中接收信息
返回执行结果
name\"5154...2939\"
断开并重连服务器
MOVED 6257 127.0.0.1:7001
currentEpoch0
stateREDIS_CLUSTER_FAIL
size0
校验和sha1是否存在于repl_scriptcache_dict字典
time1390525039321
源节点
REPLCONF ACK 200
SET msg \"happy new year!\"
主从服务器都没有设置密码?
redisDb
expires
\"you get the key 'love'\"
3.对于每个返回键向源节点发送一个MIGRATE命令
发送主从服务器断线期间主服务器执行的写命令
执行SCRIPT KILL或者SHUTDOWN
节点向客户端返回MOVED命令
id5
time1713670927
duration10
flagsSRI_MASTER | SRI_S_DOWN
发送包含节点B和节点C信息的PING消息
察觉主服务器已下线
name\"127.0.0.1:26380\"
键key有可能存在目标节点
从服务器C
name\"9dfb...5c26\"
cleint-5
将写命令放入队列
主服务器(从服务器的客户端)127.0.0.1:6379
ASK 16198 127.0.0.1:7003
源节点准备迁移槽slot的键值对
'n'
'e'
'w'
's'
'.'
'i'
't'
'h'
'l'
'o'
进入身份验证阶段
将这些键全部迁移至目标节点
传播EVAL <script> <numkeys> <key ...> <arg ...>
id3
multiCmd[4]
[0]
[1]
[2]
[3]
脚本执行完毕?
Lua脚本执行Redis命令时的通信步骤
向主服务器发送PSYNC <runid> <offset>
1.发送命令CLUSTER GETKEYSINSLOT <slot> <count>
robj*[3]
StringObject\"Peter Seibel\"
1.传送DBSIZE请求
4.将命令结果3传回给Lua环境
复制节点7000
客户端向服务器发送EXEC命令
是,无须进行身份验证
客户端向节点发送数据库键命令
L2
L1
BW
2022.0
读取PING命令的回复超时或者主服务器返回一个错误
向主服务器发送PSYNC ? -1
L5
L4
L3
3347.0
服务器接到来自客户端的命令
1337.0
L32
开始执行脚本
clusterMsgDataPublish
channel_len7
message_len5
bulk_data
客户端的REDIS_DIRTY_CAS标识是否已经打开?
等待再次上线
向主服务器发送PSYNC命令
向从服务器返回+CONTINUE回复,表示执行部分重同步
接收+CONTINUE回复,准备执行部分重同步
向从服务器发送SET k10087 v10087/SET k10088 v10088/SET k10089 v10089三个命令
接收并执行主服务器传来的三个SET命令
cleint-2
0 条评论
下一页
为你推荐
查看更多