File tree Expand file tree Collapse file tree 3 files changed +13
-11
lines changed Expand file tree Collapse file tree 3 files changed +13
-11
lines changed Original file line number Diff line number Diff line change @@ -15,6 +15,6 @@ es 生产集群的部署架构是什么?每个索引的数据量大概有多
15
15
16
16
- es 生产集群我们部署了 5 台机器,每台机器是 6 核 64G 的,集群总内存是 320G。
17
17
- 我们 es 集群的日增量数据大概是 2000 万条,每天日增量数据大概是 500MB,每月增量数据大概是 6 亿,15G。目前系统已经运行了几个月,现在 es 集群里数据总量大概是 100G 左右。
18
- - 目前线上有 5 个索引(这个结合你们自己业务来,看看自己有哪些数据可以放 es 的),每个索引的数据量大概是 20G,所以这个数据量之内,我们每个索引分配的是 8 个 shard,比默认的 5 个 shard 多了 3 个shard 。
18
+ - 目前线上有 5 个索引(这个结合你们自己业务来,看看自己有哪些数据可以放 es 的),每个索引的数据量大概是 20G,所以这个数据量之内,我们每个索引分配的是 8 个 shard,比默认的 5 个 shard 多了 3 个 shard 。
19
19
20
20
大概就这么说一下就行了。
Original file line number Diff line number Diff line change @@ -47,7 +47,7 @@ slave 不会过期 key,只会等待 master 过期 key。如果 master 过期
47
47
## 复制的完整流程
48
48
slave node 启动时,会在自己本地保存 master node 的信息,包括 master node 的` host ` 和` ip ` ,但是复制流程没开始。
49
49
50
- slave node 内部有个定时任务,每秒检查是否有新的 master node 要连接和复制,如果发现,就跟 master node 建立 socket 网络连接。然后 slave node 发送 ` ping ` 命令给 master node。如果 master 设置了 requirepass,那么 slave node 必须发送 masterauth 的口令过去进行认证。master node ** 第一次执行全量复制** ,将所有数据发给slave node。而在后续,master node 持续将写命令,异步复制给 slave node。
50
+ slave node 内部有个定时任务,每秒检查是否有新的 master node 要连接和复制,如果发现,就跟 master node 建立 socket 网络连接。然后 slave node 发送 ` ping ` 命令给 master node。如果 master 设置了 requirepass,那么 slave node 必须发送 masterauth 的口令过去进行认证。master node ** 第一次执行全量复制** ,将所有数据发给 slave node。而在后续,master node 持续将写命令,异步复制给 slave node。
51
51
52
52
![ redis-master-slave-replication-detail] ( /images/redis-master-slave-replication-detail.png )
53
53
@@ -64,8 +64,8 @@ client-output-buffer-limit slave 256MB 64MB 60
64
64
65
65
### 增量复制
66
66
- 如果全量复制过程中,master-slave 网络连接断掉,那么 slave 重新连接 master 时,会触发增量复制。
67
- - master 直接从自己的 backlog 中获取部分丢失的数据,发送给 slave node,默认 backlog 就是1MB 。
68
- - msater就是根据 slave 发送的 psync 中的 offset 来从 backlog 中获取数据的。
67
+ - master 直接从自己的 backlog 中获取部分丢失的数据,发送给 slave node,默认 backlog 就是 1MB 。
68
+ - msater 就是根据 slave 发送的 psync 中的 offset 来从 backlog 中获取数据的。
69
69
70
70
### heartbeat
71
71
主从节点互相都会发送 heartbeat 信息。
@@ -84,6 +84,6 @@ master 每次接收到写命令之后,先在内部写入数据,然后异步
84
84
85
85
redis 的高可用架构,叫做 ` failover ` ** 故障转移** ,也可以叫做主备切换。
86
86
87
- master node 在故障时,自动检测,并且将某个 slave node 自动切换位 master node的过程 ,叫做主备切换。这个过程,实现了 redis 的主从架构下的高可用。
87
+ master node 在故障时,自动检测,并且将某个 slave node 自动切换为 master node 的过程 ,叫做主备切换。这个过程,实现了 redis 的主从架构下的高可用。
88
88
89
- 后面会详细说明 redis ** 基于哨兵的高可用性** 。
89
+ 后面会详细说明 redis [ 基于哨兵的高可用性] ( /docs/high-concurrency/redis-sentinel.md ) 。
Original file line number Diff line number Diff line change @@ -20,25 +20,27 @@ redis 相比 memcached 来说,拥有[更多的数据结构](/docs/high-concurr
20
20
由于 redis 只使用** 单核** ,而 memcached 可以使用** 多核** ,所以平均每一个核上 redis 在存储小数据时比 memcached 性能更高。而在 100k 以上的数据中,memcached 性能要高于 redis。虽然 redis 最近也在存储大数据的性能上进行优化,但是比起 memcached,还是稍有逊色。
21
21
22
22
### redis 的线程模型
23
- redis 内部使用文件事件处理器 ` file event handler ` ,这个文件事件处理器是单线程的,所以 redis 才叫做单线程的模型。它采用 IO 多路复用机制同时监听多个 socket,将 socket 产生的事件压入内存队列中 ,事件分派器根据 socket 上的事件来选择对应的事件处理器进行处理 。
23
+ redis 内部使用文件事件处理器 ` file event handler ` ,这个文件事件处理器是单线程的,所以 redis 才叫做单线程的模型。它采用 IO 多路复用机制同时监听多个 socket,将产生事件的 socket 压入内存队列中 ,事件分派器根据 socket 上的事件类型来选择对应的事件处理器进行处理 。
24
24
25
25
文件事件处理器的结构包含 4 个部分:
26
26
- 多个 socket
27
27
- IO 多路复用程序
28
28
- 文件事件分派器
29
29
- 事件处理器(连接应答处理器、命令请求处理器、命令回复处理器)
30
30
31
- 多个 socket 可能会并发产生不同的操作,每个操作对应不同的文件事件,但是 IO 多路复用程序会监听多个 socket,会将 socket 产生的事件放入队列中排队,事件分派器每次从队列中取出一个事件,把该事件交给对应的事件处理器进行处理 。
31
+ 多个 socket 可能会并发产生不同的操作,每个操作对应不同的文件事件,但是 IO 多路复用程序会监听多个 socket,会将产生事件的 socket 放入队列中排队,事件分派器每次从队列中取出一个 socket,根据 socket 的事件类型交给对应的事件处理器进行处理 。
32
32
33
33
来看客户端与 redis 的一次通信过程:
34
34
35
35
![ redis-single-thread-model] ( /images/redis-single-thread-model.png )
36
36
37
- 首先要明白 ,通信是通过 socket 来完成的,不懂的同学可以先去看一看 socket 网络编程。
37
+ 要明白 ,通信是通过 socket 来完成的,不懂的同学可以先去看一看 socket 网络编程。
38
38
39
- 客户端 socket01 向 redis 进程的 server socket 请求建立连接,此时 server socket 会产生一个 ` AE_READABLE ` 事件,IO 多路复用程序监听到 server socket 产生的事件后,将该事件压入队列中。文件事件分派器从队列中获取该事件,交给 ** 连接应答处理器 ** 。连接应答处理器会创建一个能与客户端通信的 socket01,并将该 socket01 的 ` AE_READABLE ` 事件与命令请求处理器关联 。
39
+ 首先, redis 服务端进程初始化的时候,会将 server socket 的 ` AE_READABLE ` 事件与连接应答处理器关联 。
40
40
41
- 假设此时客户端发送了一个 ` set key value ` 请求,此时 redis 中的 socket01 会产生 ` AE_READABLE ` 事件,IO 多路复用程序将事件压入队列,此时事件分派器从队列中获取到该事件,由于前面 socket01 的 ` AE_READABLE ` 事件已经与命令请求处理器关联,因此事件分派器将事件交给命令请求处理器来处理。命令请求处理器读取 socket01 的 ` key value ` 并在自己内存中完成 ` key value ` 的设置。操作完成后,它会将 socket01 的 ` AE_WRITABLE ` 事件与命令回复处理器关联。
41
+ 客户端 socket01 向 redis 进程的 server socket 请求建立连接,此时 server socket 会产生一个 ` AE_READABLE ` 事件,IO 多路复用程序监听到 server socket 产生的事件后,将该 socket 压入队列中。文件事件分派器从队列中获取 socket,交给** 连接应答处理器** 。连接应答处理器会创建一个能与客户端通信的 socket01,并将该 socket01 的 ` AE_READABLE ` 事件与命令请求处理器关联。
42
+
43
+ 假设此时客户端发送了一个 ` set key value ` 请求,此时 redis 中的 socket01 会产生 ` AE_READABLE ` 事件,IO 多路复用程序将 socket01 压入队列,此时事件分派器从队列中获取到 socket01 产生的 ` AE_READABLE ` 事件,由于前面 socket01 的 ` AE_READABLE ` 事件已经与命令请求处理器关联,因此事件分派器将事件交给命令请求处理器来处理。命令请求处理器读取 socket01 的 ` key value ` 并在自己内存中完成 ` key value ` 的设置。操作完成后,它会将 socket01 的 ` AE_WRITABLE ` 事件与命令回复处理器关联。
42
44
43
45
如果此时客户端准备好接收返回结果了,那么 redis 中的 socket01 会产生一个 ` AE_WRITABLE ` 事件,同样压入队列中,事件分派器找到相关联的命令回复处理器,由命令回复处理器对 socket01 输入本次操作的一个结果,比如 ` ok ` ,之后解除 socket01 的 ` AE_WRITABLE ` 事件与命令回复处理器的关联。
44
46
You can’t perform that action at this time.
0 commit comments