mysql、redis、zk、kafka、es的数据原子性、一致性保证、顺序性横评
2023-07-05 09:35:22 0 举报
AI智能生成
知识要点和原理解析,详细信息和图片均在黄色图标的注释中,鼠标移动到黄色图标上即会显示,图片加载有时较慢。
作者其他创作
大纲/内容
mysql
四大特性(ACID)
原子性(Atomicity)
依靠undo log保证
一致性(Consistency)
依靠其他三大特性保证
隔离性(Isolation)
依靠MVCC保证
持久性(Durability)
由内存(buffer pool、LogBuffer)+redo log保证
redis
单线程保证
zk
zookeeper中保证数据一致性用的是ZAB协议
顺序一致性
原子性
系统视图唯一性
持久性
及时性
zk一致性保证的是
写请求是线性一致性的,读不是
任何给定的client操作的执行顺序是由client来决定的,其称之为FIFO Client Order
工作方式
FIFO client order会应用于单个client的所有请求
zk没有保证跨客户端的强一致性
顺序一致性
问题
ZooKeeper 集群的写入是由 Leader 结点协调的,真实场景下写入会有一定的并发量,那 Zab 协议的两阶段提交是如何保证事务严格按顺序生效的
Leader 是如何判断当前 ZXID 之前是否还有未提交提案的
leader顺序性
follower顺序性
leader下发提案到follower时
对比新提案的 ZXID 与自身最新 ZXID 是否相差“1”,来保证事务顺序生效
leader下发commit时
通过对比commit request的zxid和pendingTxns的zxid
步骤
总之:Follower通过队列和zxid等顺序标识保证请求的顺序处理,一言不合就会退出或者重新同步Leader。
client回调顺序性
按序出队
比较xzid
zookeeper如何保证半数提交后剩下的节点上最新的数据
剩下的节点,会进行版本比对,发现版本不一致的话,会更新节点的数据(退出重新同步)
kafka
事务
Kafka为什么要引入事务
1、跨会话的幂等性写入
2、跨会话的事务恢复
3、跨多个 Topic-Partition 的幂等性写入
幂等性不能跨多个分区运作,而事务可以弥补这个缺陷。
前面3个是针对producer的,Consumer 端难以保证事务性
事务性保证
拒绝僵尸实例(Zombie fencing)
Kafka中的事务特性主要用于以下两种场景
1、生产者发送多条消息可以封装在一个事务中,形成一个原子操作
2、read-process-write模式:将消息消费和生产封装在一个事务中,形成一个原子操作
使用示例源码
事务性要解决的问题
在写多个 Topic-Partition 时,执行的一批写入操作,有可能出现部分 Topic-Partition 写入成功,部分写入失败(比如达到重试次数),这相当于出现了中间的状态,这并不是我们期望的结果;
Producer 应用中间挂之后再恢复,无法做到 Exactly-Once 语义保证(幂等性无法保证重启后精准一次性);
事务性实现的关键
1、事务原子性:2PC
2、TransactionCoordinator高可用
3、Producer 在 Fail 恢复后操作
4、如何标识一个事务操作的状态
事务性的整体流程
1. Finding a TransactionCoordinator
2. Getting a PID
3. Starting a Transaction
4. Consume-Porcess-Produce Loop
5.Committing or Aborting a Transaction
思考
如果多个 Producer 使用同一个 txn.id 会出现什么情况?
Consumer 端如何消费事务数据?
Consumer 的消费策略
read_committed
read_uncommitted
Last Stable Offset(LSO)
Server 处理 read_committed 类型的 Fetch 请求?
这种机制有没有什么问题呢?
Consumer 如何过滤 abort 的事务数据
方案
Consume过滤abort
1、如果这个数据是 control msg(也即是 marker 数据)
2、如果这个数据是正常的数据
3、检查abortedProducerIds队列
Consumer 消费数据时,其顺序如何保证
如果 txn.id 长期不使用,server 端怎么处理?
消息有序性
全局有序
如何保证:需要1个Topic只能对应1个Partition
consumer也要使用单线程或者保证消费顺序的线程模型
局部有序
不增加partition数量的情况下想提高消费速度
消息重试对顺序消息的影响
max.in.flight.requests.per.connection
不设置该参数,失败记录捕获后自行处理
es
Elasticsearch的写入流程特性
可靠性
一致性
原子性
实时性
隔离性
一致性(Consistency)
三种设置来判断是否允许写操作
One
All
Quorum(k-wu-wo/reng,法定人数)
0 条评论
下一页