redis、zk、kafka、es分布式、扩缩容 横评(详解在注释里面,图片加载需要时间)
2023-07-05 09:43:34 0 举报
AI智能生成
知识要点和原理解析,详细信息和图片均在黄色图标的注释中,鼠标移动到黄色图标上即会显示,图片加载有时较慢。
作者其他创作
大纲/内容
redis集群
通过<font color="#a23735">分片</font>和<font color="#a23735">主从模式</font>实现分布式
集群的组群过程<br>
CLUSTER MEET 命令
集群分片<br>
哈希槽(slots)的划分<br>
均匀分配<br>
使用 cluster addslots 命令来指定<br>
哈希槽(slots)的映射<br>
取模
指定
<b><font color="#f44336">哈希槽(slots)用来划分数据存储区域,即通过slots定位目标node,真正存储数据的还是redis node</font></b><br>
数据复制
Master 和 Slave模式
主从同步<br>
1、从节点与主节点建立连接时进行全量同步<br>
<font color="#f44336"><b>通过RDB + replication_buffer</b></font>
异常情况<br>
2、主节点与从节点正常运行时的同步<br>
3、主节点与从节点连接断开后又重连时会进行增量同步或全量同步<br>
增量同步<br>
<font color="#f44336"><b>实现方式</b></font>
环形数组repl-backlog-buffer
master-repl-offset
slave-repl-offset
特别注意
repl_backlog_buffer:复制积压缓冲区<br>
默认 1MB
状态维护-心跳检查机制
主观下线
客观下线
注意
数据获取<br>
定位数据所在节点<br>
1、客户端连接任一实例,获取到slots与实例节点的映射关系,并<font color="#f44336"><b>将该映射关系的信息缓存在本地</b></font><br>
2、将需要访问的redis信息的key,经过CRC16计算后,再对16384<font color="#f44336"><b> 取模得到对应的 Slot 索引</b></font><br>
3、通过slot的位置进一步定位到具体所在的实例,再<b><font color="#f44336">将请求发送到对应的实例上</font></b>
Redis Cluster集群扩缩容<br>
扩容<br>
扩容原理
迁移slot和数据<br>
slot迁移的其他说明<br>
缩容<br>
缩容原理<br>
忘记节点<br>
zk
kafka
组件构成<br>
broker<br>
一台 kafka 服务器就是一个 broker<br>
一个kafka集群由多个 broker 组成<br>
一个 broker 可以容纳多个 topic的多个partition<br>
Topic(主题)<br>
在kafka集群中,可以有无数的主题<br>
生产者和消费者消费数据一般以主题为单位。更细粒度可以到分区级别<br>
一个topic 可以划分为多个partition,分布到多个 broker上管理<br>
Partition(分区)<br>
特征
partition 中的每条消息都会被分配一个递增的id(offset),每个 partition 是一个有序的队列,<b><font color="#f44336">kafka 只保证按一个 partition 中的消息的顺序</font></b>,不保证一个 topic 的整体(多个 partition 间)的顺序<br>
每个partition都可以有多个副本<br>
partition的表现形式就是一个一个的文件夹
每一个分区会有一个编号,编号从0开始<br>
Partition的副本数<br>
目的
保障 partition 的高可用<br>
特征
leader replica分布<br>
<font color="#f44336"><b>轮询算法</b></font><br>
<b><font color="#f44336">follower和leader绝对是在不同的机器</font></b>,<b>同一机器对同一个分区也只可能存放一个副本</b>(包括自己)<br>
处于同步状态的副本叫做in-sync-replicas(ISR)<br>
<b><font color="#f44336">follower</font></b>通过<b>拉的方式</b>从<b><font color="#f44336">leader</font></b>同步数据<br>
消费者和生产者都是从<b><font color="#f44336">leader</font></b>读写数据,不与follower交互
好处<br>
对于 kafka 集群<br>
实现topic数据的负载均衡<br>
对于消费者<br>
提高并发度,提高效率
Producer(生产者)<br>
Consumer<br>
Consumer Group<br>
Group Coordinator<br>
cluster、broker、topic、partition、消费者、费者组 关系<br>
分布式核心
通过topic管理消息(broker部分)
一个主题对应多个主分区
一个主分区可以有多个副本
多个分区及副本分布在不同broker上
生产者
通过分区策略将消息发送到目标partition
消费者
配合消费者组及分区策略从不同partition消费消息
重平衡Rebalance<br>
触发与通知<br>
Rebalance 的触发条件<br>
1、当 Consumer Group<b><font color="#f44336"> 组成员数量</font></b>发生变化(主动加入或者主动离组,故障下线等);<br>
2、当订阅<font color="#f44336"><b>主题数量</b></font>发生变化;<br>
3、当订阅主题的<font color="#f44336"><b>分区数</b></font>发生变化;
Rebalance 如何通知其他 consumer 进程?<br>
靠 Consumer 端的心跳线程<br>
heartbeat的实现原理
那这个定期发送如何实现呢?<br>
是通过DelayedQueue来实现的<br>
扩缩容会通过重平衡重新分配
es
构成
Cluster - 集群<br>
两个特性<br>
高可用性<br>
可扩展性<br>
集群健康值<br>
green:所有主要分片和复制分片都可用<br>
yellow:所有主要分片可用,但不是所有复制分片都可用<br>
red:不是所有的主要分片都可用
Node - 节点<br>
节点角色<br>
master 主节点<br>
data 数据节点<br>
一个节点可以既为Master节点,又为Data节点,但是为什么不推荐?
data_content 内容数据节点<br>
...
注意<br>
<b><font color="#ed9745">如果你设置了 node.roles,则节点只会分配你指定的角色。 如果不设置 node.roles,节点将被分配以上所有角</font></b><font color="#f1ac6a"><b>色</b></font>(除了voting_only 和coordinating角色例外)。
节点不等同于服务器,一个服务器上可以部署多个节点。<br>
所有节点都知道集群中的所有其他节点,并且可以将客户端请求转发到适当的节点。<br>
分片<br>
Shard - 分片<br>
Primary Shard(主分片)<br>
ES中的shard用来解决节点的容量上限问题,,通过主分片,可以将数据分布到集群内的所有节点之上。
Replication- 副本<br>
作用
1、服务高可用(容灾)<br>
2、扩展性能<br>
对于一个索引,除非重建索引否则不能调整主分片的数目(主分片数, number_of_shards),但可以随时调整replica数(number_of_replicas)。
Index - 索引<br>
lucene
结构图<br>
术语<br>
Field域<br>
最基本常用属性
分段存储-segment<br>
每个段都是一个独立的可被搜索的数据集,并且段具有不变性,一旦索引的数据被写入硬盘,就不可修改。
为了提升写的性能,Lucene 并没有每新增一条数据就增加一个段,而是采用延迟写的策略,每当有新增的数据时,就将其先写入内存中,然后批量写入磁盘中。
ES Segment Memory<br>
本质上就是segment中加到内存的FST数据,因此segment越多,该内存越大
提交点<br>
segment的数据结构<br>
Inverted Index<br>
Stored Fields<br>
哪些情形下需要显式的指定store属性呢?<br>
Document Values<br>
Cache<br>
Lucene索引<br>
倒排索引<br>
数据结构<br>
posting list的ID范围<br>
索引结构
索引过程<br>
Type - 类型<br>
从6.0.0 版本起已废弃,一个索引中只存放一类数据
Document - 文档<br>
扩缩容
0 条评论
下一页