-
Notifications
You must be signed in to change notification settings - Fork 0
/
redis_cluster.brief
105 lines (85 loc) · 3.55 KB
/
redis_cluster.brief
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
本文档摘录redis的集群操作, 以便更深入了解一致性hash以及集群同步等.
集群的节点状态依靠gossip协议维护, gossip协议概念参考wiki:
https://en.wikipedia.org/wiki/Gossip_protocol
基本概念
---------
一个redis集群由多个节点组成, 在刚开始的时候, 每个节点都是独立的, 它们
都处于一个只包含自己的集群中; 我们必须把各个独立的节点连接起来,构建一
个包含多个节点的集群.
启动cluster节点服务器
配置redis.conf文件
释放注释"cluster-enabled yes"
连接各个节点的指令
启动cli
执行指令"cluster meet <ip> <port>"
槽指派(槽索引0~16383)
启动cli
执行指令"cluster addslots <slot>"
服务器端初始化流程
------------------
--main() src/server.c
--loadServerConfig() src/config.c
--loadServerConfigFromString()
--赋值redisServer.cluster_enabled
--...
--initServer()
--clusterInit() src/cluster.c
--clusterLockConfig()
--clusterLoadConfig()
--listenToPort()
--aeCreateFileEvent() 指定监控事件句柄
clusterAcceptHandler(),
建立连接后, 创建连接并
设置数据处理句柄
clusterReadHandler()
--verifyClusterConfigWithData()
--...
clusterCron() src/cluster.c
-----------------
集群模式的异步处理流程, 由serverCron()函数100ms/次调用
--while()
--anetTcpNonBlockBindConnect()
--createClusterLink()
--aeCreateFileEvent() 设置节点通信句柄
clusterReadHandler()
--clusterSendPing()
--每10次循环调用一次
--dictGetRandomKey()
--clusterSendPing()
clusterBeforeSleep()
--------------------
报文处理间隙的集群处理, 如保存集群信息状态等
--main()
--beforeSleep()
--clusterBeforeSleep()
--clusterHandleSlaveFailover()
--clusterUpdateState()
--clusterSaveConfigOrDie()
clusterReadHandler()
--------------------
本函数处理与集群其他节点的通信信息
--read()
--clusterProcessPacket() src/cluster.c
clusterCommand()
----------------
服务器端cluster指令的处理函数 src/cluster.c
-------------------clust meet----------------------
--clusterStartHandshake()
--createClusterNode()
--clusterAddNode() 设置标识
CLUSTER_NODE_HANDSHAKE
|CLUSTER_NODE_MEET
后续由clusterCron()异步
触发协商流程
--addReply()
-------------------clust addslots-------------------
--clusterAddSlot()
--clusterDoBeforeSleep()
--addReply()
集群模式下的命令处理
--------------------
--processCommand() src/server.c
--getNodeByQuery() src/cluster.c
--clusterRedirectClient() 需要重定向的情况
--...
--call() 本节点指令