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 生产集群的部署架构是什么?每个索引的数据量大概有多
1515
1616- es 生产集群我们部署了 5 台机器,每台机器是 6 核 64G 的,集群总内存是 320G。
1717- 我们 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 。
1919
2020大概就这么说一下就行了。
Original file line number Diff line number Diff line change @@ -47,7 +47,7 @@ slave 不会过期 key,只会等待 master 过期 key。如果 master 过期
4747## 复制的完整流程
4848slave node 启动时,会在自己本地保存 master node 的信息,包括 master node 的` host ` 和` ip ` ,但是复制流程没开始。
4949
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。
5151
5252![ redis-master-slave-replication-detail] ( /images/redis-master-slave-replication-detail.png )
5353
@@ -64,8 +64,8 @@ client-output-buffer-limit slave 256MB 64MB 60
6464
6565### 增量复制
6666- 如果全量复制过程中,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 中获取数据的。
6969
7070### heartbeat
7171主从节点互相都会发送 heartbeat 信息。
@@ -84,6 +84,6 @@ master 每次接收到写命令之后,先在内部写入数据,然后异步
8484
8585redis 的高可用架构,叫做 ` failover ` ** 故障转移** ,也可以叫做主备切换。
8686
87- master node 在故障时,自动检测,并且将某个 slave node 自动切换位 master node的过程 ,叫做主备切换。这个过程,实现了 redis 的主从架构下的高可用。
87+ master node 在故障时,自动检测,并且将某个 slave node 自动切换为 master node 的过程 ,叫做主备切换。这个过程,实现了 redis 的主从架构下的高可用。
8888
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
2020由于 redis 只使用** 单核** ,而 memcached 可以使用** 多核** ,所以平均每一个核上 redis 在存储小数据时比 memcached 性能更高。而在 100k 以上的数据中,memcached 性能要高于 redis。虽然 redis 最近也在存储大数据的性能上进行优化,但是比起 memcached,还是稍有逊色。
2121
2222### redis 的线程模型
23- redis 内部使用文件事件处理器 ` file event handler ` ,这个文件事件处理器是单线程的,所以 redis 才叫做单线程的模型。它采用 IO 多路复用机制同时监听多个 socket,将 socket 产生的事件压入内存队列中 ,事件分派器根据 socket 上的事件来选择对应的事件处理器进行处理 。
23+ redis 内部使用文件事件处理器 ` file event handler ` ,这个文件事件处理器是单线程的,所以 redis 才叫做单线程的模型。它采用 IO 多路复用机制同时监听多个 socket,将产生事件的 socket 压入内存队列中 ,事件分派器根据 socket 上的事件类型来选择对应的事件处理器进行处理 。
2424
2525文件事件处理器的结构包含 4 个部分:
2626- 多个 socket
2727- IO 多路复用程序
2828- 文件事件分派器
2929- 事件处理器(连接应答处理器、命令请求处理器、命令回复处理器)
3030
31- 多个 socket 可能会并发产生不同的操作,每个操作对应不同的文件事件,但是 IO 多路复用程序会监听多个 socket,会将 socket 产生的事件放入队列中排队,事件分派器每次从队列中取出一个事件,把该事件交给对应的事件处理器进行处理 。
31+ 多个 socket 可能会并发产生不同的操作,每个操作对应不同的文件事件,但是 IO 多路复用程序会监听多个 socket,会将产生事件的 socket 放入队列中排队,事件分派器每次从队列中取出一个 socket,根据 socket 的事件类型交给对应的事件处理器进行处理 。
3232
3333来看客户端与 redis 的一次通信过程:
3434
3535![ redis-single-thread-model] ( /images/redis-single-thread-model.png )
3636
37- 首先要明白 ,通信是通过 socket 来完成的,不懂的同学可以先去看一看 socket 网络编程。
37+ 要明白 ,通信是通过 socket 来完成的,不懂的同学可以先去看一看 socket 网络编程。
3838
39- 客户端 socket01 向 redis 进程的 server socket 请求建立连接,此时 server socket 会产生一个 ` AE_READABLE ` 事件,IO 多路复用程序监听到 server socket 产生的事件后,将该事件压入队列中。文件事件分派器从队列中获取该事件,交给 ** 连接应答处理器 ** 。连接应答处理器会创建一个能与客户端通信的 socket01,并将该 socket01 的 ` AE_READABLE ` 事件与命令请求处理器关联 。
39+ 首先, redis 服务端进程初始化的时候,会将 server socket 的 ` AE_READABLE ` 事件与连接应答处理器关联 。
4040
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 ` 事件与命令回复处理器关联。
4244
4345如果此时客户端准备好接收返回结果了,那么 redis 中的 socket01 会产生一个 ` AE_WRITABLE ` 事件,同样压入队列中,事件分派器找到相关联的命令回复处理器,由命令回复处理器对 socket01 输入本次操作的一个结果,比如 ` ok ` ,之后解除 socket01 的 ` AE_WRITABLE ` 事件与命令回复处理器的关联。
4446
You can’t perform that action at this time.
0 commit comments