PaxosStore解读

本文深入探讨PaxosStore,重点关注其内部机制。member_id作为Proposer的区别标志,timestamp以毫秒计确保时间顺序,req_cnt随着写请求递增,这种requestid策略能支撑起每秒25万次的写操作,且只需在单个plog维度保证唯一性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PaxosStore解读

1.   QuorumKV (NWR)
      微信有大量分布式存储(QuorumKV)使用这个算法保证一致性,我们对这个算法做了改进,创造性地把数据副本分离出版本编号和数据存到不同设备,其中N=3(数据只有2份,版本编号有3份),在R=W=2时仍然可以保证强一致性。因为版本编号存放3份,对版本编号使用Quorum方式,通过版本编号协商,只有版本序号达成一致的情况下读写单机数据,从而在保证强一致性的同时实现高读写性能。实际数据只写入一台数据节点,使用流水日志的方式进行同步,并更新版本编号。但是我们的分布式存储(QuorumKV)仍存在数据可靠性比Paxos低的问题,因为数据只写一份副本,依靠异步同步。如果数据节点故障,故障节点上没有同步到另一个节点,数据将无法访问。版本节点故障时,如果Quorum协议没有设置W=3,也可能无法访问正确的数据节点副本。 

2.  PaxosStore (paxos)
2.1  paxosStore介绍
        paxosStore是一个在跨园区数据中心间同步复制,提供灵活的数据模式和访问接口并支持单表亿行,具备快速伸缩能力,低延迟低成本,强一致和高可用的分布式存储系统。
       特点:1) 无租约Paxos工程化,多主多写,高可用;
                   2) 针对业务特性优化,合并整体优化成本15+%;
                   3) 同一容灾、迁移框架下,支持多种插件化存储引擎、亿行大表;
                   4) 快速伸缩能力,基于反馈的自适应迁移系统。
       paxosStore的整体架构:
      
             
     编程模型针对各种外部应用提供多种数据架构。一致性层(consensus layer)执行基于 Paxos 的存储协议。存储层包含了多个根据不同存储模型构建的存储引擎,这些引擎可以满足各种各样的性能要求。PaxosStore 的架构与传统存储设计的不同之处主要在于它能将一致性协议应用提取出来作为一个中间件,为所有潜在的存储引擎提供数据一致性保证。


2.2 一致性层详解
2.2.1  paxos
                             1.4.png
2.2.2  paxos
     paxosLog的结构:

              1.6.png
           相关字段的解释:
            1)Promise No:
            2)  Proposal No:
            3)  Request ID:
            4)  Proposer ID:
            5)  value:

     paxosLog + Data对象:

  1.7.png
    PaxosLog-as-value for key-value storage:
1.8.png
    
    PaxosStore 中读取过程的示例:
1.9.png
2.2.3  基于PaxosLog的强一致性读写协议
1)  强一致性读协议


2) 强一致性写协议
   这里有三个优化点:
   A.  优化写
     FastWrites部分,描述:LogEntry i-1值的归属者可以在写LogEntry i时跳过Paxos算法的Prepare阶段直接进行Accept阶段。基于这段迷一样的文字,我们实现Paxos优化写算法:减少1次写盘、2次协议消息发送、2次协议消息接收;最终实现了写耗时和失败的降低。  
   B.  如何确定谁的提议写成功了?
    Paxos算法只保证LogEntry i确定唯一值,但在多个Proposer的条件下(即A/B机均可发起强一致写),只有确定值的归属者可以返回成功。这里我们复用了etcd中requestid的方案。


     其中member_id用于区分不同的Proposer,timestamp为毫秒级别的时间戳,req_cnt随写请求单调递增。基于requestid方案可以满足单机25w/s的写请求,足够了。requestid只需要在单个plog纬度上保证唯一即可。

   C.    Paxos活锁问题
    Paxos算法本身不保证终止性,当出现写冲突时算法可能永远终结不了,即存在活锁问题;因此在实际工程中我们需要进行一些权衡:限制单次Paxos写触发Prepare的次数和随机避让。我们目前使用了Prepare次数限制策略。

2.3 存储层详解
                      


2.4 容错性和可用性详解

           

3.  总结

     全新的内存云存储,通过精简的PLog as DB、分布式强一致性读写协议等一连串优化,在性能上得到显著提升;结合DirectIO存储系统、PLog全量对齐等,系统首次访问失败率指标下降一个量级。
     PaxosStore是微信内部一次大规模Paxos工程改造实践,创新性地实现了非租约Paxos架构。


     

参考文献:
1.  PaxosStore github地址:https://github.com/Tencent/paxosstore


vue2中el-popover失效,刷新页面后正常显示,el-popover在子组件中,子组件中部分代码:<p v-if="!userName"> <el-popover placement="bottom-start" trigger="hover"> <div class="nav-game"> <ul> <li><el-button class="nav-avatar" type="primary" @click="gotoLogin()">登录</el-button></li> <li><el-link class="nav-avatar" type="primary" @click="gotoRegister()">用户注册</el-link></li> </ul> </div> <el-avatar slot="reference" size="medium" icon='el-icon-user-solid' src="https://i0.hdslb.com/bfs/face/9e684120bdf30f9c7130de8b3f3b004e589f46ef.jpg@96w_96h_1c.webp" ></el-avatar> </el-popover> </p> <p v-else> <el-popover placement="bottom-start" trigger="hover"> <div class="nav-game"> <ul> <li class="nav-a-text"> 用户名:{{ userInfo.name }} </li> <li class="nav-a-text"> id:{{ userInfo.u_id }} </li> <li> <el-menu :default-active="activeIndex" class="el-menu-demo nav-a-item" mode="horizontal" @select="handleSelect"> <el-menu-item index="1" style="border-bottom:none;"> <h3 class="nav-a-num">{{ userInfo.like_num }}</h3> <p class="nav-a-word">点赞</p> </el-menu-item> <el-menu-item index="2"> <h3 class="nav-a-num">{{ userInfo.fans_num }}</h3> <p class="nav-a-word">粉丝</p> </el-menu-item> <el-menu-item index="3"> <h3 class="nav-a-num">{{ userInfo.issue_num }}</h3> <p class="nav-a-word">作品</p> </el-menu-item> </el-menu> </li> <li> <el-menu class="el-menu-vertical-demo" :router="true" style="margin-top: 20px; border-right: none;"> <el-menu-item index="/center"> <i class="el-icon-user" style="color: blue"></i> <span slot="title" class="nav-a-affair">个人中心</span> </el-menu-item> <el-menu-item index="/center"> <i class="el-icon-tickets" style="color: blue"></i> <span slot="title" class="nav-a-affair">稿件中心</span> </el-menu-item> <div style="width: 100%;height: 2px;background-color: gray;"></div> <el-menu-item index="" @click="logout()"> <i class="el-icon-close" style="color: blue"></i> <span slot="title" class="nav-a-affair">退出登入</span> </el-menu-item> </el-menu> </li> </ul> </div> <div slot="reference"> <Avatar :asize="40"></Avatar> </div> </el-popover>
03-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值