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