Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
cai-4
advanced-java
提交
99eb26e7
A
advanced-java
项目概览
cai-4
/
advanced-java
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
A
advanced-java
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
99eb26e7
编写于
3月 15, 2019
作者:
Y
yanglbme
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
docs(high-concurrency): update es and redis desc
* Fix typos * Update docs description
上级
a774169b
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
13 addition
and
11 deletion
+13
-11
docs/high-concurrency/es-production-cluster.md
docs/high-concurrency/es-production-cluster.md
+1
-1
docs/high-concurrency/redis-master-slave.md
docs/high-concurrency/redis-master-slave.md
+5
-5
docs/high-concurrency/redis-single-thread-model.md
docs/high-concurrency/redis-single-thread-model.md
+7
-5
未找到文件。
docs/high-concurrency/es-production-cluster.md
浏览文件 @
99eb26e7
...
...
@@ -15,6 +15,6 @@ es 生产集群的部署架构是什么?每个索引的数据量大概有多
-
es 生产集群我们部署了 5 台机器,每台机器是 6 核 64G 的,集群总内存是 320G。
-
我们 es 集群的日增量数据大概是 2000 万条,每天日增量数据大概是 500MB,每月增量数据大概是 6 亿,15G。目前系统已经运行了几个月,现在 es 集群里数据总量大概是 100G 左右。
-
目前线上有 5 个索引(这个结合你们自己业务来,看看自己有哪些数据可以放 es 的),每个索引的数据量大概是 20G,所以这个数据量之内,我们每个索引分配的是 8 个 shard,比默认的 5 个 shard 多了 3 个shard。
-
目前线上有 5 个索引(这个结合你们自己业务来,看看自己有哪些数据可以放 es 的),每个索引的数据量大概是 20G,所以这个数据量之内,我们每个索引分配的是 8 个 shard,比默认的 5 个 shard 多了 3 个
shard。
大概就这么说一下就行了。
\ No newline at end of file
docs/high-concurrency/redis-master-slave.md
浏览文件 @
99eb26e7
...
...
@@ -47,7 +47,7 @@ slave 不会过期 key,只会等待 master 过期 key。如果 master 过期
## 复制的完整流程
slave node 启动时,会在自己本地保存 master node 的信息,包括 master node 的
`host`
和
`ip`
,但是复制流程没开始。
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。
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。
![
redis-master-slave-replication-detail
](
/images/redis-master-slave-replication-detail.png
)
...
...
@@ -64,8 +64,8 @@ client-output-buffer-limit slave 256MB 64MB 60
### 增量复制
-
如果全量复制过程中,master-slave 网络连接断掉,那么 slave 重新连接 master 时,会触发增量复制。
-
master 直接从自己的 backlog 中获取部分丢失的数据,发送给 slave node,默认 backlog 就是1MB。
-
msater就是根据 slave 发送的 psync 中的 offset 来从 backlog 中获取数据的。
-
master 直接从自己的 backlog 中获取部分丢失的数据,发送给 slave node,默认 backlog 就是
1MB。
-
msater
就是根据 slave 发送的 psync 中的 offset 来从 backlog 中获取数据的。
### heartbeat
主从节点互相都会发送 heartbeat 信息。
...
...
@@ -84,6 +84,6 @@ master 每次接收到写命令之后,先在内部写入数据,然后异步
redis 的高可用架构,叫做
`failover`
**故障转移**
,也可以叫做主备切换。
master node 在故障时,自动检测,并且将某个 slave node 自动切换
位 master node
的过程,叫做主备切换。这个过程,实现了 redis 的主从架构下的高可用。
master node 在故障时,自动检测,并且将某个 slave node 自动切换
为 master node
的过程,叫做主备切换。这个过程,实现了 redis 的主从架构下的高可用。
后面会详细说明 redis
**基于哨兵的高可用性**
。
\ No newline at end of file
后面会详细说明 redis
[
基于哨兵的高可用性
](
/docs/high-concurrency/redis-sentinel.md
)
。
\ No newline at end of file
docs/high-concurrency/redis-single-thread-model.md
浏览文件 @
99eb26e7
...
...
@@ -20,7 +20,7 @@ redis 相比 memcached 来说,拥有[更多的数据结构](/docs/high-concurr
由于 redis 只使用
**单核**
,而 memcached 可以使用
**多核**
,所以平均每一个核上 redis 在存储小数据时比 memcached 性能更高。而在 100k 以上的数据中,memcached 性能要高于 redis。虽然 redis 最近也在存储大数据的性能上进行优化,但是比起 memcached,还是稍有逊色。
### redis 的线程模型
redis 内部使用文件事件处理器
`file event handler`
,这个文件事件处理器是单线程的,所以 redis 才叫做单线程的模型。它采用 IO 多路复用机制同时监听多个 socket,将
socket 产生的事件压入内存队列中,事件分派器根据 socket 上的事件
来选择对应的事件处理器进行处理。
redis 内部使用文件事件处理器
`file event handler`
,这个文件事件处理器是单线程的,所以 redis 才叫做单线程的模型。它采用 IO 多路复用机制同时监听多个 socket,将
产生事件的 socket 压入内存队列中,事件分派器根据 socket 上的事件类型
来选择对应的事件处理器进行处理。
文件事件处理器的结构包含 4 个部分:
-
多个 socket
...
...
@@ -28,17 +28,19 @@ redis 内部使用文件事件处理器 `file event handler`,这个文件事
-
文件事件分派器
-
事件处理器(连接应答处理器、命令请求处理器、命令回复处理器)
多个 socket 可能会并发产生不同的操作,每个操作对应不同的文件事件,但是 IO 多路复用程序会监听多个 socket,会将
socket 产生的事件放入队列中排队,事件分派器每次从队列中取出一个事件,把该事件
交给对应的事件处理器进行处理。
多个 socket 可能会并发产生不同的操作,每个操作对应不同的文件事件,但是 IO 多路复用程序会监听多个 socket,会将
产生事件的 socket 放入队列中排队,事件分派器每次从队列中取出一个 socket,根据 socket 的事件类型
交给对应的事件处理器进行处理。
来看客户端与 redis 的一次通信过程:
![
redis-single-thread-model
](
/images/redis-single-thread-model.png
)
首先
要明白,通信是通过 socket 来完成的,不懂的同学可以先去看一看 socket 网络编程。
要明白,通信是通过 socket 来完成的,不懂的同学可以先去看一看 socket 网络编程。
客户端 socket01 向 redis 进程的 server socket 请求建立连接,此时 server socket 会产生一个
`AE_READABLE`
事件,IO 多路复用程序监听到 server socket 产生的事件后,将该事件压入队列中。文件事件分派器从队列中获取该事件,交给
**连接应答处理器**
。连接应答处理器会创建一个能与客户端通信的 socket01,并将该 socket01 的
`AE_READABLE`
事件与命令请求
处理器关联。
首先,redis 服务端进程初始化的时候,会将 server socket 的
`AE_READABLE`
事件与连接应答
处理器关联。
假设此时客户端发送了一个
`set key value`
请求,此时 redis 中的 socket01 会产生
`AE_READABLE`
事件,IO 多路复用程序将事件压入队列,此时事件分派器从队列中获取到该事件,由于前面 socket01 的
`AE_READABLE`
事件已经与命令请求处理器关联,因此事件分派器将事件交给命令请求处理器来处理。命令请求处理器读取 socket01 的
`key value`
并在自己内存中完成
`key value`
的设置。操作完成后,它会将 socket01 的
`AE_WRITABLE`
事件与命令回复处理器关联。
客户端 socket01 向 redis 进程的 server socket 请求建立连接,此时 server socket 会产生一个
`AE_READABLE`
事件,IO 多路复用程序监听到 server socket 产生的事件后,将该 socket 压入队列中。文件事件分派器从队列中获取 socket,交给
**连接应答处理器**
。连接应答处理器会创建一个能与客户端通信的 socket01,并将该 socket01 的
`AE_READABLE`
事件与命令请求处理器关联。
假设此时客户端发送了一个
`set key value`
请求,此时 redis 中的 socket01 会产生
`AE_READABLE`
事件,IO 多路复用程序将 socket01 压入队列,此时事件分派器从队列中获取到 socket01 产生的
`AE_READABLE`
事件,由于前面 socket01 的
`AE_READABLE`
事件已经与命令请求处理器关联,因此事件分派器将事件交给命令请求处理器来处理。命令请求处理器读取 socket01 的
`key value`
并在自己内存中完成
`key value`
的设置。操作完成后,它会将 socket01 的
`AE_WRITABLE`
事件与命令回复处理器关联。
如果此时客户端准备好接收返回结果了,那么 redis 中的 socket01 会产生一个
`AE_WRITABLE`
事件,同样压入队列中,事件分派器找到相关联的命令回复处理器,由命令回复处理器对 socket01 输入本次操作的一个结果,比如
`ok`
,之后解除 socket01 的
`AE_WRITABLE`
事件与命令回复处理器的关联。
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录