网站开发是叫系统吗怎么做返利网之类的网站

news/2025/9/29 12:08:38/文章来源:
网站开发是叫系统吗,怎么做返利网之类的网站,h5做的分销网站,个人网页设计作品开题报告简介#xff1a;传统MySQL基于binlog复制的主备架构有它的局限性#xff0c;包括存储空间有限#xff0c;备份恢复慢#xff0c;主备复制延迟等问题#xff0c;为了解决用户对于云上RDS(X-Engine)大容量存储#xff0c;以及弹性伸缩的诉求#xff0c;PolarDB推出了历史库…简介传统MySQL基于binlog复制的主备架构有它的局限性包括存储空间有限备份恢复慢主备复制延迟等问题为了解决用户对于云上RDS(X-Engine)大容量存储以及弹性伸缩的诉求PolarDB推出了历史库(基于X-Engine引擎的一写多读)产品支持物理复制提供一写多读的能力目前已经在阿里云官网售卖。本文主要阐述如何基于LSM-tree结构的存储引擎实现数据库的一写多读能力。 作者 | 雁闲 来源 | 阿里技术公众号 一 前言 PolarDB是阿里巴巴自研的新一代云原生关系型数据库在存储计算分离架构下利用了软硬件结合的优势为用户提供具备极致弹性、海量存储、高性能、低成本的数据库服务。X-Engine是阿里巴巴自研的新一代存储引擎作为AliSQL的核心引擎之一已广泛用于阿里巴巴集团核心业务包括交易历史库钉钉历史库图片空间等。X-Engine基于LSM-tree架构其核心特征是数据以追加写方式写入高压缩低成本适用于写多读少有低成本诉求的业务场景。传统MySQL基于binlog复制的主备架构有它的局限性包括存储空间有限备份恢复慢主备复制延迟等问题为了解决用户对于云上RDS(X-Engine)大容量存储以及弹性伸缩的诉求PolarDB推出了历史库(基于X-Engine引擎的一写多读)产品支持物理复制提供一写多读的能力目前已经在阿里云官网售卖。本文主要阐述如何基于LSM-tree结构的存储引擎实现数据库的一写多读能力。 二 LSM-tree数据库引擎 LSM-Tree全称是Log Structured Merge Tree是一种分层有序面向磁盘设计的数据结构其核心思想是利用磁盘批量的顺序写要比随机写性能高的特点将所有更新操作都转化为追加写方式提升写入吞吐。LSM-tree类的存储引擎最早源于Google三驾马车之一的BigTable的存储引擎以及它的开源实现LevelDB。LSM-tree存储引擎有几个特点首先增量数据像日志一样通过追加方式写入顺序落盘其次数据按照key来进行有序组织这样在内存和磁盘中会形成一颗颗小的“有序树”最后各个“有序树”可以进行归并将内存中的增量数据迁移到磁盘上磁盘上的多个“有序树”可以进行归并优化树的形状整个LSM-tree是一个有序的索引组织结构。 在云原生数据库时代一写多读技术已被广泛应用于生产环境中主要云产商都有其标杆产品典型代表包括亚马逊的Aurora阿里云的PolarDB以及微软云的Socrates。它的核心思想是计算存储分离将有状态的数据和日志下推到分布式存储计算节点无状态多个计算节点共享一份数据数据库可以低成本快速扩展读性能。Aurora是这个领域的开山鼻祖实现了业内第一个一写多读的数据库计算节点Scale up存储节点Scale out并将日志模块下推到存储层计算节点之间计算与存储节点之间传输redo日志计算节点基于Quorum协议写多副本保证可靠性存储层提供多版本页服务。PolarDB与Aurora类似也采用了存储计算分离架构与Aurora相比PolarDB它自己的特色存储基座是一个通用的分布式文件系统大量采用OS-bypass和zero-copy技术存储的多副本一致性由ParallelRaft协议保证。PolarDB计算节点与存储节点同时传输数据页和redo日志计算节点与计算节点之间只传递位点信息。与Aurora的“日志即数据库”理念一样Socrates的节点之间只传输redo日志也实现了多版本页服务它的特点是将数据库存储层的持久性与可用性分开抽象出一套日志服务。整个数据库分为3层一层计算服务一层page server服务和一层日志服务这样设计的好处是可以分层进行优化提供更灵活和细粒度的控制。 虽然AuroraPolarDB和Socrates在设计上各有特点但它们都共同践行了存储计算分离思想数据库层面提供一写多读的能力。深入到存储引擎这一层来说这几个产品都是基于Btree的存储引擎如果基于LSM-tree存储引擎来做呢LSM-tree有它自己的特点追加顺序写数据分层存储磁盘上数据块只读更有利于压缩。X-Engine引擎云上产品RDS(X-Engine)已经充分发挥了LSM-tree高压缩低成本特点同样的数据量存储空间只占到RDS(InnoDB)的1/3甚至更少RDS(X-Engine)传统的主备架构依然面临着主备复制延迟大备份恢复慢等问题。基于LSM-tree引擎实现一写多读不仅计算资源和存储资源解耦多个节点共享一份数据还能进一步压缩存储成本。 基于LSM-tree引擎实现一写多读面临着与Btree引擎不一样的技术挑战首先是存储引擎日志不一样LSM-tree引擎是双日志流需要解决双日志流的物理复制问题其次是数据组织方式不一样LSM-tree引擎采用分层存储追加写入新数据需要解决多个计算节点一致性物理快照以及Compation问题。最后作为数据库引擎还需要解决一写多读模式下DDL的物理复制问题。同时为了产品化充分发挥Btree引擎和LSM-tree引擎的各自优势还面临着新的挑战即如何在一个数据库产品中同时实现两个存储引擎(InnoDB,X-Engine)的一写多读。 三 LSM-tree引擎一写多读的关键技术 1 PolarDB整体架构 PolarDB支持X-Engine引擎后X-Engine引擎与InnoDB引擎仍然独立存在。两个引擎各自接收写入请求数据和日志均存储在底层的分布式存储上其中idb文件表示的是InnoDB的数据文件sst文件表示的是X-Engine的数据文件。这里最主要的点在于InnoDB与XEngine共享一份redo日志X-Engine写入时将wal日志嵌入到InnoDB的redo中Replica节点和Standby节点在解析redo日志后分发给InnoDB引擎和XEngine引擎分别回放进行同步。 PolarDB(X-Engine)架构图 X-Engine引擎架构 X-Engine引擎采用LSM-tree结构数据以追加写的方式写入内存并周期性物化到磁盘上内存中数据以memtable形式存在包括一个活跃的active memtable和多个静态的immutable。磁盘上数据分层存储总共包括3层L0L1和L2每一层数据按块有序组织。X-Engine最小空间分配单位是一个extent默认是2M每个extent包含若干个block默认是16k。数据记录紧凑存储在block中由于追加写特点磁盘上的数据块都是只读的因此X-Engine引擎可以默认对block进行压缩另外block中的记录还会进行前缀编码综合这些使得X-Engine的存储空间相对于InnoDB引擎只有1/3部分场景(比如图片空间)甚至能压缩到1/7。有利就有弊追加写带来了写入优势对于历史版本数据需要通过Compaction任务来进行回收。有关X-Engine的核心技术可以参考发表在Sigmod19的论文《X-Engine: An Optimized Storage Engine for Large-scale E-commerce Transaction Processing》 X-Engine整体架构 2 物理复制架构 物理复制的核心是通过引擎自身的日志来完成复制避免写额外的日志带来的成本和性能损失。MySQL原生的复制架构是通过binlog日志进行复制写事务需要同时写引擎日志和binlog日志这带来的问题是一方面单个事务在关键写路径上需要写两份日志写性能受制于二阶段提交和binlog的串行写入另一方面binlog复制是逻辑复制复制延迟问题也使得复制架构的高可用以及只读库的读服务能力大打折扣尤其是在做DDL操作时这个延迟会进一步放大。 在InnoDB中有redo和undo两种日志undo日志可以理解为一种特殊的“data”所以实际上InnoDB的所有操作都能通过redo日志来保证持久性。因此在进行复制时只需要在主从节点复制redo日志即可。X-Engine引擎包含两种日志一种是wal日志(WriteAheadLog)用于记录前台的事务的操作另一种是Slog(StorageLog)用于记录LSM-tree形状变化的操作主要指Compaction/Flush等。wal日志保证了前台事务的原子性和持久性Slog则保证了X-Engine内部LSM-tree形状变化的原子性和持久性这两个日志缺一不可都需要复制同步。 共享存储下的物理复制 Primary-Replica物理复制架构 LSM-tree引擎一写多读的能力是对PolarDB进行功能增强体现在架构层面就是充分利用已有的复制链路包括Primary-Replica传递日志信息链路和Replica-Primary传递协同控制信息链路。InnoDB事务由若干个mtr(Mini-Transaction)组成写入redo日志的最小单位是mtr。我们在Innodb的redo日志新增一种日志类型用于表示X-Engine日志将X-Engine的事务内容作为一个mtr事务写入到redo日志中这样Innodb的redo和X-Engine的wal日志能共享一条复制链路。由于Primary和Replica共享一份日志和数据Dump_thread只需要传递位点信息由Replica根据位点信息去读redo日志。Replica解析日志根据日志类型来分发日志给不同的回放引擎这种架构使得所有复制框架与之前的复制保持一致只需要新增解析、分发X-Engine日志逻辑新增X-Engine的回放引擎充分与InnoDB引擎解耦。 由于LSM-tree追加写特点内存memtable中数据会周期性的Flush到磁盘为了保证Primary和Replica读到一致性物理视图Primary和Replica需要同步SwitchMemtable需要新增一条SwitchMemtable控制日志来协调。redo日志持久化后Primary通过日志方式将位点信息主动推送给Replica以便Replica及时回放最新的日志减少同步延迟。对于Slog日志既可以采用类似于redo的日志方式来主动“push”方式来同步位点也可以采用Replica主动“pull”的方式来同步。SLog是后台日志相对于前台事务回放实时性要求不高不必要将redo位点和SLog位点都放在一条复制链路增加复杂性所以采用了Replica的“pull”的方式来同步SLog。 灾备集群间的物理复制 Primary-Standby物理复制架构 与共享集群复制不同灾备集群有独立一份存储Primary—Standby需要传递完整的redo日志。Stanby与Replica区别在于日志来源不同Replica从共享存储上获取日志Standy从复制链路获取日志其它解析和回放路径是一样的。是否将Slog日志作为redo日志一部分传递给Standby是一个问题Slog日志由Flush/Compaction动作产生记录的是LSM-tree形状的物理变化。如果也通过redo日志链路同步给Standby会带来一些复杂性一方面是X-Engine内部写日志的方式需要改动需要新增新增文件操作相关的物理日志来确保主从物理结构一致故障恢复的逻辑也需要适配另一方面Slog作为后台任务的操作日志意味着复制链路上的所有角色都需要同构如果放弃同构那么Standy节点可能会触发Flush/Compaction任务写日志这与物理复制中只允许Primary写日志是相违背的。实际上Slog同步写入到redo log中不是必须的因为Slog是后台日志这个动作不及时回放并不影响数据视图的正确性因此复制链路上只包含redo日志(X-Engine wal日志和InnoDB redo日志)Standby自己控制Flush/Compaction产生Slog日志这样Standby也不必与Primary节点物理同构整个架构与现有体系相匹配同时也更加灵活。 3 并行物理复制加速 X-Engine的事务包括两个阶段第一个阶段是读写阶段这个阶段事务操作数据会缓存在事务上下文中第二阶段是提交阶段将操作数据写入到redo日志持久化随后写到memtable中供读操作访问。对于Standby/Replica节点而言回放过程与Primary节点类似从redo中解析到事务日志然后将事务回放到memtable中。事务之间不存在冲突通过Sequence版本号来确定可见性。并行回放的粒度是事务需要处理的一个关键问题就是可见性问题。事务串行回放时Sequence版本号都是连续递增的事务可见性不存在问题。在并行回放场景下我们仍然需要保序通过引入“滑动窗口”机制只有连续一段没有空洞的Sequence才能推进全局的Sequence版本号这个全局Sequence用于读操作获取快照。 并行复制框架 一写多读架构下为了保证同一数据库实例的Primary、Replica、Standby三个角色的内存镜像完全一致新增了一种SwitchMemtableLog该Log Record在RW的switch_memtable过程中产生因此RO、Standby不再主动触发switch_memtable操作而是通过从RW上同步SwitchMemtableLog进行switch_memtable。SwitchMemtable操作是一个全局的屏障点以防止当前可写memtable在插入过程中switch从而导致数据错乱。另外对于2PC事务并发控制也需要做适配。一个2PC事务除了数据本身的日志还包括BeginPrepare、EndPrepare、Commit、Rollback四类日志写入过程中保证BeginPrepare和EndPrepare写入到一个WriteBatch中并顺序落盘因此可以保证同一个事务的Prepare日志都会被解析到一个ReplayTask中。在并行回放过程中由于无法保证Commit或Rollback日志一定后于Prepare日志被回放因此如果Commit、Rollback日志先于Prepare日志被回放那么在全局的recovered_transaction_map中插入一个key对xid的空事务对应的事务状态为Commit或Rollback随后Prepare日志完成回放时如果发现recovered_transaction_map中已经存在对应的事务那么可以根据事务的状态来决定直接提交事务还是丢弃事务。 对于BTree的物理复制LSM-tree的物理复制并不是真正的“物理”复制。因为BTree传递的redo的内容是数据页面的修改而LSM-tree传递的redo内容是KeyValue值。这带来的结果是Btree物理复制可以基于数据页粒度做并发回放而LSM-tree的物理复制是基于事务粒度的并发回放。Btree并发回放有它自身的复杂性比如需要解决系统页回放与普通数据页回放先后顺序问题并且还需要解决同一个mtr中多个数据页并发回放可能导致的物理视图不一致问题。LSM-tree需要解决多个节点在同样位置SwitchMemtable以及2PC事务回放等问题。 4 MVCC(多版本并发控制) 物理复制技术解决了数据同步的问题为存储计算分离打下了基础。为了实现弹性动态升降配增删只读节点的能力需要只读节点具备一致性读的能力另外RW节点和RO节点共享一份数据历史版本回收也是必需要考虑的问题。 一致性读 X-Engine提供快照读的能力通过多版本机制来实现读写不互斥效果。从上述的X-Engine架构图可以看到X-Engine的数据实际上包括了内存和磁盘两部分不同于InnoDB引擎内存中page是磁盘上page的缓存X-Engine中内存数据与磁盘数据完全异构一份“快照”需要对应的是内存磁盘数据。X-Engine采用追加写方式新数据进来会产生新的memtable后台任务做flush/compaction任务也会产生新的extent。那么如何获取一致性视图呢X-Engine内部实际上是通过MetaSnapshotSnapshot来管理首先每个MetaSnapshot对应一组memtable和L0L1, L2的extents这样在物理上确定了数据范围然后通过Snapshot来处理行级版本的可见性这里的Snapshot实际上就是一个事务提交序列号Sequence。不同于InnoDB事务编号采用开始序需要通过活跃事务视图来判断记录的可见性X-Engine事务采用提交序每条记录有一个唯一递增序列号Sequence判断行级版本的可见性只需要比较Sequence即可。在一写多读的模式下Replica节点与Primary节点共享一份磁盘数据而磁盘数据是有内存中数据定期dump出来的因此需要保证Primary和Replica节点有相同的切memtable位点从而保证数据视图的一致性。 一写多读下的Compaction 在一写多读场景下Replica可以通过类似于Primary的快照机制来实现快照读需要处理的问题是历史版本回收问题。历史版本的回收依赖于Compaction任务来完成这里的回收包括两部分一部分MetaSnapshot的回收主要确认哪些memtable和extents可以被物理回收掉另一部分是行级多版本回收这里主要是确认哪些历史版本行可以被回收掉。对于MetaSnapshot的回收Primary会收集所有Replica节点上的最小不再使用的MetaSnapshot版本号X-Engine引擎的每个索引都是一个LSM-tree因此汇报MetaSnaphot版本号是索引粒度的。Primary收集完MetaSnapshot版本号计算最小可以回收的MetaSnapshot进行资源回收操作回收操作以Slog日志的方式同步给Replica节点。Replica节点在回放日志进行资源回收时需要将内存和磁盘资源分开内存资源在各个节点是独立的磁盘资源是共享的因此Replica节点的内存资源可以独立释放而磁盘资源则统一由Primary节点来释放。对于行级多版本的回收同样需要由Primary节点收集所有Replica节点最小序列号Sequence由Primary节点通过Compaction任务来消除。这块汇报链路复用PolarDB的ACK链路只是新增了X-Engine的汇报信息。 5 DDL的物理复制如何实现 物理复制相对于逻辑复制一个关键优势在于DDL对于DDL而言逻辑复制可以简单理解为复制SQL语句DDL在从库上会重新再执行一遍。逻辑复制对于比较重的DDL操作比如Alter table影响非常大一个Alter变更操作在主库执行需要半小时那么复制到从库也需要再执行半小时那么主从延迟最大可能就会是1个小时这个延迟对只读库提供读服务产生严重影响。 Server层复制 DDL操作同时涉及到Server层和引擎层包括字典缓存以及数据。最基础的DDL操作比如 Create/Drop操作在一写多读架构下要考虑数据与数据字典数据与字典缓存一致性等问题。一写多读的基础是物理复制物理复制日志只在引擎层流动不涉及到Server层因此需要新增日志来解决DDL操作导致的不一致问题。我们新增了meta信息变更的日志并作为redo日志的一部分同步给从节点这个meta信息变更日志主要包括两部分内容一个是字典同步主要是同步MDL锁确保Primary/Replica节点字典一致另一个是字典缓存同步Replica上的内存是独立的Server层缓存的字典信息也需要更新因此要新增日志来处理比如Drop Table/Drop db/Upate function/Upate precedure等操作。另外还需要同步失效Replica的QueryCache避免使用错误的查询缓存。 引擎层复制 X-Engine引擎与InnoDB引擎一样是索引组织表在X-Engine内部每个索引都是一个LSM-tree结构内部称为Subtable所有写入都是在Subtable中进行Subtable的生命周期与DDL操作紧密相关。用户发起建表动作会产生Subtable这个是物理LSM-tree结构的载体然后才能有后续的DML操作同样的用户发起删表动作后所有这个Subtable的DML操作都应该执行完毕。Create/Drop Table操作涉及到索引结构的产生和消亡会同时产生redo控制日志和SLog日志在回放时需要解决redo控制日志和SLog日志回放的时序问题。这里我们将对应Subtable的redo日志的LSN位点持久化到SLog中作为一个同步位点Replica回放时两个回放链路做协调即可redo日志记录的是前台操作Slog记录的是后台操作因此两个链路做协同时需要尽量避免redo复制链路等待Slog复制链路。比如对于Create操作回放Slog时需要等待对应的redo日志的LSN位点回放完毕才推进对于DROP操作回放SLog也需要协同等待避免回放前台事务找不到Subtable。 OnlineDDL复制技术 对于Alter Table操作X-Engine实现了一套OnlineDDL机制详细实现原理可以参考内核月报。在一写多读架构下X-Engine引擎在处理这类Alter操作时采用了物理复制实际上对于Replica而言由于是同一份数据并不需要重新生成物理extent只需要同步元信息即可。对于Standby节点需要通过物理extent复制来重新构建索引。DDL复制时实际上包含了基线和增量部分。DDL复制充分利用了X-Engine的分层存储以及LSM-tree结构追加写特点在获取快照后利用快照直接构建L2作为基线数据这部分数据以extent块复制形式通过redo通道传递给Standby而增量数据则与普通的DML事务一样所以整个操作都是通过物理复制进行大大提高了复制效率。这里需要限制的仅仅是在Alter操作过程中禁止做到L2的compaction即可。整个OnlineDDL过程与InnoDB的OnlineDDL流程类似也是包括3个阶段prepare阶段build阶段和commit阶段其中prepare阶段需要获取快照commit阶段元数据生效需要通过MDL锁来确保字典一致。与基于Btree的OnlineDDL复制相比基线部分Btree索引复制的是物理页而LSM-tree复制的是物理extent增量部分Btree索引是通过记增量日志回放增量日志到数据页写redo日志进行同步LSM-tree则是通过DML前台操作写redo的方式同步。 OnlineDDL复制 6 双引擎技术 Checkpoint位点推进 通过wal-in-redo技术我们将X-Engine的wal日志嵌入到了InnoDB的redo中首先要处理的一个问题就是redo日志的回收问题。日志回收首先涉及到一个位点问题融合进redo日志后X-Engine内部将RecoveryPoint定义为lsn, Sequencelsn表示redo日志的位点Sequence为对应的X-Engine的事务的版本号。Redo日志回收与Checkpoint(检查点)强相关确保Checkpoint位点及时推进是需要考虑的问题否则redo日志的堆积一方面影响磁盘空间另一方面也影响恢复速度。这里有一个基本的原则是Checkpointmin(innodb-ckpt-lsn, xengine-ckpt-lsn)xengine-ckpt-lsn就是来源于X-Engine的RecoveryPoint确保任何引擎有内存数据没有落盘时对应的redo日志不能被清理。为了避免X-Engine的checkpoint推进影响整体位点推进内部会确保xengine-ckpt-lsn与全局的redo-lsn保持一定的阀值超过阀值则会强制将memtable落盘推进检查点。 数据字典与DDL X-Engine作为一个数据库引擎有自己独立的字典InnoDB也有自己的字典两份字典在一个系统里面肯定会存在问题。为了解决问题这里有两种思路一是X-Engine仍然保留自己的数据字典在做DDL时通过2PC事务来保证一致性这带来的问题是需要有协调者。一般情况下MySQL的协调者是binlog日志在binlog关闭时是tclog日志。显然从功能和性能角度我们都不会强依赖binlog日志。我们采用了另外一种思路X-Engine不再用自身引擎存储元数据所有元数据均通过InnoDB引擎持久化X-Engine元数据实际上是InnoDB字典的一份缓存那么在做DDL变更时元数据部分实际上只涉及InnoDB引擎通过事务能保证DDL的原子性。 通过元数据归一化我们解决了元数据的原子性问题但X-Engine数据和InnoDB元数据如何保证一致也是个问题。比如一个DDL操作alter table xxx engine xengine这个DDL是将innodb表转为xengine表由于表结构变更是Innodb字典修改数据是在修改X-Engine是一个跨引擎事务跨引擎事务需要通过协调者保证一致性。为了避免引入binlog作为协调者依赖tclog作为协调者没有经过大规模生产环境验证我们选择了另外一种处理方式具体来说在涉及跨引擎事务时优先提交X-Engine事务然后再提交InnoDB事务。对于DDL来说就是“先数据后元数据”元数据提交了才真正表示这个DDL完成。如果中途失败则结合“延迟删除”的机制来保证垃圾数据能被最终清理掉通过一个后台任务来周期性的对比X-Engine数据与InnoDB的字典以InnoDB字典为准结合X-Engine内存元信息确认这部分数据是否有用。 CrashRecovery X-Engine与InnoDB引擎一样是MySQL的一个插件X-Enigne作为一个可选的插件启动顺序在Innodb之后。每个引擎在恢复阶段都需要通过redo日志来将数据库恢复到宕机前状态。在双引擎形态下所有redo都在InnoDB中那意味着无论是InnoDB引擎还是X-Engine引擎在读取日志恢复时都需要扫描整个redo日志相当于整个恢复阶段扫描了两遍redo这可能使得整个宕机恢复过程非常长降低了系统的可用性。为了解决这个问题我们将X-Engine的恢复阶段细分并且调整引擎的启动顺序在InnoDB启动前先完成X-Engine的初始化以及Slog等恢复过程处于恢复redo的状态。在InnoDB启动时根据类型将日志分发X-Engine引擎整个流程与正常同步redo日志的过程一致。当redo日志分发完毕相当于InnoDB引擎和X-Engine引擎自身的宕机恢复过程已经完成然后走正常XA-Recovery和Post-Recovery阶段即可这个流程与之前保持一致。 HA PolarDB支持双引擎后整个升降级流程中都会嵌套有X-Engine引擎的逻辑比如在Standby升级为RW前需要确保X-Engine的回放流水线完成并将未决的事务保存起来以便后续通过XA_Recovery继续推进。RW降级为Standby的时候需要等待X-Engine写流水线回放同时如果还残留有未决事务需要在切换过程中将这部分未决事务遍历出来存入Recovered_transactions_集合供后续并发回放使用。 四 LSM-tree VS Btree 上节我们详细描述了基于LSM-tree架构的存储引擎实现一写多读所需要的关键技术并结合PolarDB双引擎介绍了一些工程实现。现在我们跳出来看看基于Btree和基于LSM-tree两种数据组织结构在实现技术上的对比。首先要回到一个基本点Btree是原地更新而LSM-tree是追加写这带来的区别就是Btree的数据视图在内存和外存一个缓存映射关系而LSM-tree是一个叠加的关系。因而需要面对的技术问题也不同Btree需要刷脏需要有double-write(在PolarFS支持16k原子写后消除了这个限制)LSM-tree需要Compaction来回收历史版本。在一写多读的模式下面临的问题也不一样比如Btree引擎复制是单redo日志流LSM-tree引擎是双日志流Btree在处理并行回放时可以做到更细粒度的页级并发但是需要处理SMO(SplitMergeOperation)问题避免读节点读到“过去页”或是“未来页”。而LSM-tree是事务级别的并发为了保证RW和RO节点“内存磁盘”的一致性视图需要RW和RO在相同的位点做Switch Memtable。下表以InnoDB引擎和X-Engine引擎为例列出了一些关键的区别点。 五 LSM-tree引擎业内发展状况 目前业内LSM-tree类型引擎比较热的是Rocksdb它的主要应用场景是作为一个KeyValue引擎使用。Facebook将Rocksdb引擎引入到了他们的MySQL8.0分支类似于X-Engine之于AliSQL主要服务于他们的用户数据库UDB业务存储用户数据和消息数据采用的仍然是基于binlog的主备复制结构目前没有看到有做存储计算分离以及一写多读的事情。另外github上有一个rocksdb-cloud项目将rocksdb作为底座架在AWS等云服务上提供NoSQL接口服务相当于做了存储计算分离但并不支持物理复制和一写多读。在数据库领域阿里巴巴的Oceanbase和谷歌的Spanner的底层存储引擎都是基于LSM-tree结构这显示了LSM-tree作为数据库引擎的可行性这两个数据库都是基于Share-Nothing的架构。基于Share-Storage的数据库到目前为止还没有成熟的产品PolarDB(X-Engine)是业内第一个基于LSM-tree结构的实现的一写多读方案对于后来者有很好的借鉴意义LSM-tree这种结构天然将内存和磁盘存储分离我们充分利用了磁盘存储只读的特点通过压缩将其成本优势发挥出来结合一写多读的能力将成本优势发挥到极致。 六 性能测试 基于X-Engine引擎实现一写多读能力后我们采用基准测试工具sysbench对性能做了摸底主要对比了RDS(X-Engine)PolarDB(X-Engine)以及PolarDB(InnoDB)的性能。 1 测试环境 测试的client和数据库server均从阿里云官网购买。client采用ecs规格是ecs.c7.8xlarge(32core,64G)测试sysbench版本是sysbench-1.0.20测试的数据库server包括RDS(X-Engine)PolarDB(X-Engine)PolarDB(InnoDB)均采用8core32G规格配置文件采用线上默认的配置。测试场景覆盖了全内存态和IO-bound的几种典型的workload。测试表数目是250张表全内存态单表行数为25000行IO-bound的表行数为300万行。 2 测试结果 RDS VS PolarDB 上面左图是小表全内存场景右图是大表io-bound场景。PolarDB(X-Engine)相比RDS(X-Engine)主要是写入路径发生了变化最核心的区别是RDS主备架构依赖binlog做复制而PolarDB形态只需要redo日志即可。PolarDB形态的写相关workload的性能相比RDS形态无论在全内存态还是IO-bound场景都有很大的性能提升。 Btree VS LSM-tree 上图是小表全内存场景下图是大表io-bound场景。PolarDB形态下X-Engine引擎相对于InnoDB引擎还有差距这个差距主要来源于range查询另外更新场景导致的多版本也会导致更新时需要做range查询这些因素导致了读写相关的workloadInnoDB引擎比X-Engine表现更优秀。同时我们可以看到在IO-bound场景X-Engine引擎写入更有优势。 七 未来展望 PolarDB(X-Engine)解决方案很好解决了用户的归档存储问题但目前来看还不够彻底。第一技术上虽然PolarDB支持了双引擎但我们还没有充分将两个引擎结合起来。一个可行的思路是在线归档一体化用户的在线数据采用默认的引擎InnoDB通过设定一定的规则PolarDB内部自动将部分历史数据进行归档并转换为X-Engine引擎存储整个过程对用户透明。第二目前的存储都落在PolarDB的高性能存储PolarStore上为了进一步降低成本X-Engine引擎可以将部分冷数据存储在OSS上这个对于分层存储是非常友好和自然的。实际上基于LSM-tree的存储引擎有很强的可塑性我们目前的工作只是充分发挥了存储优势未来还可以对内存中数据结构进行进一步探索比如做内存数据库等都是可以探索的方向。 原文链接 本文为阿里云原创内容未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/921804.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PSM敏捷认证自考学习指南

PSM敏捷认证自考学习指南来分享我自考psm认证课程心得吧,希望可以帮到你。 第一,关于复习 (Scrum指南) 必读材料,读5遍以上,别问为什么,题目基本都是围绕这个的。 第二,关于考试 考试题型有,选择题,单选,多…

(基于江协科技)51单片机入门:3.静态数码管 - 实践

(基于江协科技)51单片机入门:3.静态数码管 - 实践2025-09-29 12:02 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; displ…

US$7 12Pin Welding Line for CG Pro 9S12 Programmer

12Pin Welding Line for CG Pro 9S12 ProgrammerIf your CG Pro 9S12 is with new design, please choose New Design--SK238-B6If your CG Pro 9S12 is with old design, please choose Old Design--SK238-6We will a…

江阴市住房与建设局网站wordpress菜单设计

我们可以利用OpenCV的直方图,backproject直方图和meanshift算法来跟踪物体。下面通过简单的例子来说明如何实现跟踪算法,我们有两幅狒狒的图片,如下图所示:我们首先在左图中框选狒狒的脸,计算出框选区域的色度(HSV空间…

seo网站推广优化就找微源优化网站租用一年服务器费用多少

getAttribute获得class属性时,IE6,IE7的传參是className,IE7和现代游览器都是class全部游览器DOMElement均有的className属性,其在IE各版本号下的均表现良好返回属性class值的字符串此外html5中DOMElement有个classList属性,它返回一个类型为DOMTokenList的对象,它当中有非常多…

商城网站做推广有什么好处做网站书面报告申请

介绍高光谱图像的基本知识,便通过MATLAB对高光谱图像进行基本的处理。 文章目录前言一、高光谱图像二、MATLAB高光谱图像处理1.加载.MAT文件数据2.图像的显示3.图像维度变换总结前言 高光谱图像是一个立方体结构,维度为M x N x B,M为水平方向…

2025内网聊天工具排行 4款好用的内网聊天软件推荐

本文盘点2025年主流内网聊天工具,聚焦企业微信私有化、有度即时通、飞秋、FastMsg四款局域网通讯软件的私有化部署、安全性、适用场景及扩展能力,为企业选型提供高安全通讯与高效协作的解决方案。一、企业微信私有化…

【正则表达式】正则表达式零基础入门:从“抄”到“写”,附性能测试实战案例 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

dumpgds

setMultiCpuUsage -localCpu 16 set VER_NAME [exec /bin/date +%m%d_%H%M] update_names -net -nocase set design_name [dbGet top.name] remove_assigns deleteEmptyModule update_names -nocasesaveNetlist -i…

网站网页制作企彩票销售网站开发

文章目录 前言主要功能基本用法 前言 docker-compose 是一个用于定义和运行多容器 Docker 应用的工具。它使用一个 YAML 文件(通常命名为 docker-compose.yml)来配置应用的服务、网络和卷等属性。通过 docker-compose,你可以利用一个单一的命…

独立开发在线客服系统手记:实现对 PostgreSQL 的支持,以及与 MySQL 的对比

我会先对比一下 PostgreSQL 和 MySQL 的差异,然后带你看看在 C# 中如何快速接入 PostgreSQL。我在业余时间开发了一款自己的独立产品:升讯威在线客服与营销系统。陆陆续续开发了几年,从一开始的偶有用户尝试,到如今…

pre_cts_opt

#################################################################################### set design_name [dbGet top.name] set pre_stage pre_place set post_stage pre_c…

自己如何建设刷赞网站小程序与app有什么区别

WinCC OPC服务器和OPC客户机之时的数据交换通过DCOM进行。安装WinCC后,WinCC OPC服务器的DCOM要设置正确。如下情况设置必须改变:? 如果登记到OPC客户机或服务器计算机的用户没有管理员员限? 如果用不同于OPC客户机的帐号登记OPC服务器。注意下列说明描…

ccopt

################################################################################# ##### common setting set design_name [dbGet top.name] set pre_stage pre_cts_opt set post_stag…

方言普通话识别大模型,支撑中英+202种方言识别

方言普通话识别大模型,支撑中英+202种方言识别pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &…

春季高考网站建设做设计用哪个素材网站

问题场景: 使用若依Vue前端分离版-基于SpringBoot的权限管理系统进行实战。 问题描述与解决 拉取若依项目后,根据官方开发文档(项目readme文档)进行依赖下载安装后,启动失败。 出现以下几个问题: 运行n…

神华两学一做网站重庆做网站seo优化选哪家好

1 /*2 题目大意:3 就是一幢大厦中有0~99的楼层, 然后有1~5个电梯!每个电梯有一定的上升或下降速度和楼层的停止的位置!4 问从第0层楼到第k层最少经过多长时间到达!5 6 思路&#x…

北京专业的网站ui设计公司怎么制作图片加文字

ElementUI 布局——行与列的灵活运用 一 . 使用 Layout 组件1.1 注册路由1.2 使用 Layout 组件 二 . 行属性2.1 栅格的间隔2.2 自定义元素标签 三 . 列属性3.1 列的偏移3.2 列的移动 在现代网页设计中&#xff0c;布局是构建用户界面的基石。Element UI 框架通过其强大的 <e…

图怪兽logo设计官网seo技术培训东莞

ArcGIS Pro SDK (十四)地图探索 6 图形与工具 文章目录 ArcGIS Pro SDK (十四)地图探索 6 图形与工具1 图形叠加1.1 图形叠加1.2 图形叠加与 CIMPicture图形1.3 添加带有文本的叠加图形2 工具2.1 更改草图工具的符号2.2 创建用于地图中单击的点的返回坐标的工具2.3 创建用于…

init.tcl

setMessageLimit 1000 set DESIGN IF_ASIC_TOPset init_lef_file " \/home/xxx.tlef \/home/xxx.lef \/home/xxx.lef \/home/xxx.lef \/home/xxx.lef \/home/xxx.lef \/home/xxx.lef \" #/home/xxx.lef…