阿里云+開源分布式數(shù)據(jù)庫(kù)PolarDB-X源碼解讀_第1頁(yè)
阿里云+開源分布式數(shù)據(jù)庫(kù)PolarDB-X源碼解讀_第2頁(yè)
阿里云+開源分布式數(shù)據(jù)庫(kù)PolarDB-X源碼解讀_第3頁(yè)
阿里云+開源分布式數(shù)據(jù)庫(kù)PolarDB-X源碼解讀_第4頁(yè)
阿里云+開源分布式數(shù)據(jù)庫(kù)PolarDB-X源碼解讀_第5頁(yè)
已閱讀5頁(yè),還剩196頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

封面(此面將由下全覆蓋,此稿中的示意,將在稿PDF版中做更新)(待分享)卷首PolarDB-X是一款面向超高并、海量存、復(fù)景的云原生分布式數(shù)據(jù)系。其采用Shared-nothing與存算分離架構(gòu),支持水平展、分布式事、混合等能力,具企、云原生、高可用、高度兼容MySQL系及生等特點(diǎn)。PolarDB-X最初解決阿里巴巴天貓“雙十一”核心交易系數(shù)據(jù)展性瓶而生,之后伴隨阿里云一路成,是一款多種核心景的、成熟定的數(shù)據(jù)系。2021年10月,在云棲大會(huì)上,阿里云正式外開源了云原生分布式數(shù)據(jù)PolarDB-X,采用全內(nèi)核開源的模式,開源內(nèi)容包含算引擎、存引擎、日志引擎、PolarDB-XOperator等。2022年1月,PolarDB-X正式布2.0.0版本,2021年10月20號(hào)云棲大會(huì)正式開源后的第一次版本更新,更新內(nèi)容包括新增集群容、以及binlog生兼容等特性,兼容maxwell和debezium增量日志,以及新增其他眾多新特性和修復(fù)若干。2022年3月,PolarDB-X正式布2.1.0版本,包含了四大核心特性,全面提升PolarDB-X定性和生兼容性,其中包含基于Paxos的三副本共。2022年5月,PolarDB-X正式布2.1.1版本,重點(diǎn)推出冷數(shù)據(jù)新特性,可以支持表的數(shù)據(jù)按照數(shù)據(jù)特性分存在不同的存介上,比如將冷數(shù)據(jù)存到AliyunOSS象存上。2022年9月,PolarDB-X數(shù)據(jù)高分通分布式數(shù)據(jù)金融準(zhǔn),共行了337個(gè)的工作,涉及:架構(gòu)、運(yùn)、安全、容災(zāi)、性能等。家后,PolarDB-X判定符合的323,整體果表異。2022年10月,PolarDB-X正式布2.2.0版本,是一個(gè)重要的里程碑版本,重點(diǎn)推出符合分布式數(shù)據(jù)金融準(zhǔn)下的企和國(guó)ARM適配,共包括八大核心特性,全面提升PolarDB-X分布式數(shù)據(jù)在金融、通、政等行的普適性。了幫助大家理清快速上手,我布了一系列的文章幫助大家理解PolarDB-X源。本集合了PolarDB-X源解系列文章,希望通本,能大家深入理解PolarDB-X。您首先可以了解PolarDB-X數(shù)據(jù)的基本原理,學(xué)到一個(gè)數(shù)據(jù)是如何的。您也可以把PolarDB-X的原理用到其他系,您學(xué)其他數(shù)據(jù)和分布式系也有幫助。其次,在熟悉了PolarDB-X的代之后,如果有需要,您可以在遵守開源的基上在未來的工作中使用我的代,或者為PolarDB-X獻(xiàn)您的代。目PolarDB-X源解(一):CN代構(gòu) 5PolarDB-X源解(二):CN啟流程 13PolarDB-X源解(三):CDC代構(gòu) 22PolarDB-X源解(四):SQL的一生 37PolarDB-X源解(五):DML之Insert流程 52PolarDB-X源解(六):分布式死 68PolarDB-X源解(七):私有接的一生(CN篇) 74PolarDB-X源解(八):GlobalBinlog的一生 97PolarDB-X源解(九):DDL的一生(上) 107PolarDB-X源解(十):DDL的一生(下) 123PolarDB-X源解(十一):事的一生 133PolarDB-X源解(十二):in常量的與化 151PolarDB-X源解(十三):DML之INSERTIGNORE流程 168PolarDB-X源解(番外):如何一個(gè)Paxos 180PolarDB-X源解(一):CN代構(gòu) 5PolarDB-X源解(一):CN代構(gòu)本文主要介PolarDB-SQL(即PolarDB-XCN算)代構(gòu),首先要回PolarDB-X的架構(gòu),然后從目入手介各個(gè)模的功能,最后列出一些關(guān)接口便于者代。一、整體架構(gòu)PolarDB-X包含4個(gè)核心件構(gòu)成,CN(ComputeNode)算、DN(DataNode)存、GMS(GlobalMetaService)管理元數(shù)據(jù)和提供TSO服,CDC(ChangeDataCapture)生成更日志。其中,CN作服入口,完成三個(gè)任:通MySQL接收用求,返回果。作分布式引擎,兼容MySQL法,提供分布式事、全局索引、MPP等特性。通RPC與DN交互,下寫指令,果。下文將合CN的三個(gè)任,介代、目、模在其中扮演的角色,并出一些關(guān)接口,便于者探索。PolarDB-X源解(一):CN代構(gòu) 6二、代介CN代托管在GitHub上,劃分polardbx-sql和polardbx-glue兩個(gè)。MySQL和分布式引擎包含在polardbx-sql中,由于License原因,與DN交互的RPC相關(guān)代獨(dú)放在polardbx-glue中。代前,首先需要下兩個(gè)的代。推薦首先下polardbx-sql代,然后通gitsubmodule引入polardbx-glue,可以獨(dú)立提交兩個(gè)的更,具體步參考contributing文檔。CN是一個(gè)多模的Java目,模之通接口暴露服,模關(guān)系在pom.xml中,通mvndependency:tree命令可以看全部依。部分接口使用了SPI機(jī)制,部分接口需要在模的src/main/resources/META-INF/polardbx目下看當(dāng)前模中使用的具體。關(guān)于打包,可以參考編譯/初始化文檔。CN的main方法在polardbx-server模下的TddlLauncher中,“Tddl”代表“TaobaoDistributedDataLayer”,生于PolarDB-X0.5代,由于名被關(guān)系依,保留至今。三、目與模polardbx-sql目首中可以看到很多目和文件,加上重名polardbx-rpc后加入工程的polardbx-glue,目根目下包含13個(gè)文件,9個(gè)文件。其中,代目以polardbx開,docke_build.sh用于本地生成docker像,pom.xml是整個(gè)目的工程文件,saveVersion.sh用于打RPM包生成版本號(hào)后。PolarDB-X源解(一):CN代構(gòu) 7根目中,每個(gè)以polardbx開的目,都代表一個(gè)獨(dú)立的模,以下展開介各個(gè)模。模 包polardbx-calcite –polardbx-calciteorg.apache.calcite.plan.heppolardbx-calciteorg.apache.calcite.plan.volcanopolardbx-calciteorg.apache.calcite.sqlpolardbx-calcite org.apache.calcite.rel

介PolarDB-X化器基于ApacheCalcite框架做了深度定制,模用于引入calcite-core的代,定制代在polardbx-optimizer模下RBO框架CBO框架AST(抽象法)點(diǎn)數(shù)據(jù)構(gòu)劃相關(guān)代,包括數(shù)據(jù)構(gòu)、化、型系以及相關(guān)工具等內(nèi)容,主要包含calcite-core的原始代,增加的/物理算子和化放在polardbx-optimizer模下polardbx-calcite org.apache.calcite.rexpolardbx-calcite org.apache.calcite.schemapolardbx-–commonpolardbx-–executorpolardbx-gms –polardbx-gms com.alibaba.polardbx.gms.listenerpolardbx-gms com.alibaba.polardbx.gms.metadbpolardbx-gms com.alibaba.polardbx.gms.privilegepolardbx-gms com.alibaba.polardbx.gms.synccom.alibaba.polardbx.gms.topology/polardbx-gmsha/locality/partition/tablegrouppolardbx-net –polardbx-net polardbx-netcom.alibaba.polardbx.rpc.cdcpolardbx-netcom.alibaba.polardbx.sslpolardbx-–optimizerpolardbx- com.alibaba.polardbx.optimizer.confioptimizer g.metapolardbx- com.alibaba.polardbx.optimizer.confioptimizer g.schema/tablepolardbx- com.alibaba.polardbx.optimizer.core.optimizer datatype

PolarDB-X源解(一):CN代構(gòu) 8表達(dá)式相關(guān)代,主要包含calcite-core的原始代,新增的表達(dá)式相關(guān)代放在polardbx-optimizer模下Catalog相關(guān)接口抽象,具體在polardbx-optimizer模下工具模行器模,所有行器代都在里,比如SQL行代,MPP行器,異步DDL引擎,信息收集,scaleout,全局二索引等,內(nèi)容比多,后文章中展開介元數(shù)據(jù)服模后臺(tái)聽metaDb配置的接口,用于支持CN感知配置化寫schema,table,column,index等元數(shù)據(jù)的接口,informaction_schema中展示的信息大部分通里的接口取。metaDb是PolarDB-X持久化元數(shù)據(jù)的系統(tǒng)庫(kù)授、、白名、寫限信息相關(guān)接口CN點(diǎn)通信相關(guān)接口數(shù)據(jù)拓?fù)湎嚓P(guān)接口,了物理分區(qū)分布(topology),leader/follower(ha),地域(locality),分區(qū)(partition),表(tablegroup)等信息MySQL客端/服器相關(guān)接口包含TCP包理和與客端交互的接口(包括登、文本、PreparedStatement等)CDC件更日志相關(guān)接口SSL相關(guān)理接口化器模包含從/物理劃中收集信息的工具,比如引用了哪些列,算的信息等庫(kù)/表元數(shù)據(jù)相關(guān),了org.apache.calcite.schema中定的元數(shù)據(jù)接口數(shù)據(jù)型相關(guān)代polardbx-com.alibaba.polardbx.optimizer.core.optimizerfunctionpolardbx-com.alibaba.polardbx.optimizer.core.optimizerplannerpolardbx-com.alibaba.polardbx.optimizer.core.optimizerprofilerpolardbx-com.alibaba.polardbx.optimizer.core.optimizerrelpolardbx-com.alibaba.polardbx.optimizer.core.optimizerhintpolardbx-com.alibaba.polardbx.optimizer.core.optimizersequencepolardbx-com.alibaba.polardbx.optimizer.core.optimizerrule/shardingpolardbx-com.alibaba.polardbx.optimizer.core.optimizerviewpolardbx-parser–polardbx-rpc–polardbx-rpccom.alibaba.polardbx.rpcpolardbx-rpccom.alibaba.polardbx.mysql.cjpolardbx-rule–polardbx-server–polardbx-servercom.alibaba.polardbx.cdcpolardbx-servercom.alibaba.polardbx.configpolardbx-servercom.alibaba.polardbx.managerpolardbx-servercom.alibaba.polardbx.matrixpolardbx-servercom.alibaba.polardbx.serverpolardbx-servercom.alibaba.polardbx.server.handlercom.alibaba.polardbx.server.responspolardbx-serverepolardbx-–transaction

PolarDB-X源解(一):CN代構(gòu) 9表達(dá)式算相關(guān)代RBO/CBO化行程中,收集運(yùn)行源消耗信息邏輯/物理算子,DQL/DML/DDL/DAL句化器后,化物理算子構(gòu)成的行劃HINT理相關(guān)代全局唯一ID相關(guān)代分區(qū)裁剪相關(guān)代內(nèi)置的行劃點(diǎn),主要information_schema和SHOW指令涉及的法解析模,基于alibaba/druid內(nèi)置parserDN通信的相關(guān)代rpc交互代rpc數(shù)據(jù)象拆分模服入口,將其他模在一起,main方法在模中CDC核心控制模,包括CDC系表,CDC元數(shù)據(jù)初始化,CDCDDL打等內(nèi)容系配置加相關(guān)代管理指令相關(guān)代,用于理從管理端口入的指令SQL理內(nèi)部入口,串解析,化,行流程包含main方法和求理主流程相關(guān)代碼解析文本和LoadData指令的相關(guān)代碼部分管控指令的行代事管理模,包含分布式事的代碼PolarDB-X源解(一):CN代構(gòu)10polardbx-com.alibaba.polardbx.transaction.as異步任相關(guān)代,包括死、事transactionync超、事日志等polardbx-com.alibaba.polardbx.transaction.lo事日志相關(guān)代transactiongpolardbx-com.alibaba.polardbx.transaction.tsoTSO服相關(guān)代transaction四、如何入手PolarDB-X是一個(gè)復(fù)的系,代、接口、模眾多,代需要一些技巧,推薦先整體后局部的方式。整體了解和所有SQL數(shù)據(jù)一,CN可以劃分、化器和行器三,代可以首先從每的入出入手,了解從用起寫求到收到果的整體流程。下面介各的一些關(guān)接口。協(xié)議層了MySQL協(xié)議,建立接,接收用送的數(shù)據(jù)包,裝成SQL和參數(shù)化器。根據(jù)功能,代可以分接管理,數(shù)據(jù)包解析和解析三部分。接管理和數(shù)據(jù)包解析代在polardbx-net模中,解析代polardbx-server模中。PolarDB-X源解(一):CN代構(gòu) 11接管理的代可以從建立接入手了解,入口在NIOAcceptor#accept。數(shù)據(jù)包解析是將數(shù)據(jù)數(shù)據(jù)象的程,推薦從文本入手了解,入口在AbstractConnection#read。協(xié)議解析是將協(xié)議數(shù)據(jù)對(duì)象分發(fā)到具體執(zhí)行邏輯的過程,入口在FrontendCommandHandler#handle?;鲗?duì)SQL的理包括法解析,校(Validate),生成劃,劃化,物理劃化五個(gè)步,化出物理行劃,入行器。化器使用了ApacheCalcite的RBO/CBO框架,因此化器框架代在polardbx-calcite模中,具體在polardbx-optimizer模中?;魅肟谠赑lanner#plan,以下列出各個(gè)步的關(guān)接口。步接口法解析FastsqlParser#parse校SqlConverter#validate劃生成SqlConverter#toRel劃化Planner#optimizeBySqlWriter物理劃化Planner#optimizeByPlanEnumerator行器執(zhí)行器接收到物理執(zhí)行計(jì)劃后,首先根據(jù)計(jì)劃類型確定執(zhí)行模式,包括cursor/local/mpp三種行模式。不同行模式下每個(gè)算子都的行代可能有差異,因此需要將算子定到行代。行程會(huì)通RPC接口與DN通信,下寫求并果。以下列出關(guān)接口:步接口行器入口PlanExecutor#execute行模式ExecutorHelper#executecursor模式算子定到行代AbstractGroupExecutor#executeInnerPolarDB-X源解(一):CN代構(gòu)12local模式算子定到行代LocalExecutionPlanner#planmpp模式切分行劃PlanFragmenter.Fragmenter#buildRootFragmentcursor模式與DN通信MyJdbcHandlerlocal/mpp模式與DN通信TableScanClient深入了解要深入了解模代,比好的方式是著去看。比如想要了解代,首先思考最的select1的理流程是怎的,合前面的模和接口介,跟蹤后不得到答案,然后思考其他句/型(比如SET和PreparedStatement)理起來有何不同?收到/返回的包大如何理?SSL如何理?等等。另外要注意,然是深入了解,依然推薦在程中分清主次,“目與?!毙≈辛谐龅陌ㄖ攸c(diǎn)關(guān)注,其它包中的內(nèi)容可以先快速。小本文主要介CN(ComputeNode)代,涉及polardbx-sql和polardbx-glue兩個(gè),目的是幫助者快速掌握CN代的整體構(gòu)。從功能上看,CN完成三個(gè)任:理、化、與DN交互,代也因此可以分、化器、行器三部分。文章首先介了代工程的形式,列出相關(guān)文檔。然后展開各個(gè)目模的功能,便于需要深入了解代的者快速定位。最后出代建,并列各個(gè)模中的關(guān)接口,供者使用。PolarDB-X源解(二):CN啟流程 13PolarDB-X源解(二):CN啟流程本文主要解PolarDB-X的CN點(diǎn)(polardbx-sql)的啟程包括參數(shù)加、元信息加等程并啟程中的模做的介。CNServer層的代碼主要包含在polardbx-server模塊中,main函數(shù)位于TddlLauncher。主入口在CobarServer.init()方法中。CN啟分以下幾個(gè)流程:1.CobarServer象的建是例,可以通CobarServer.getInstance()取。參數(shù)加路徑:TddlLauncher.main()->CobarServer.new()->CobarConfig.new()->CobarConfig.initCobarConfig()->ServerLoader.load()CN的參數(shù)均key-value的形式。ServerLoader.load()中,CN主要從以下位置取參數(shù):perties文件,其默位置在classpath的根目中,所以一般使用IDE進(jìn)行開發(fā)時(shí),加載的是polardbx-server\src\main\resources\perties文件Stringconf=System.getProperty("server.conf","classpath:perties");PolarDB-X源解(二):CN啟流程 14Java運(yùn)行參數(shù)中例如java...-DserverPort=8527境量中serverProps.putAll(System.getProperties());serverProps.putAll(System.getenv());以上參數(shù)來源中,perties的先最低,境量中的先最高,當(dāng)包含同名參數(shù),高先的參數(shù)來源會(huì)覆蓋低先的參數(shù)來源。加載的參數(shù),會(huì)保存在SystemConfig中,該類為單例,可以通過CobarServer.getInstance().getConfig().getSystem()取。從MetaDB取元數(shù)據(jù),并初始化例的系件路徑:TddlLauncher.main()->CobarServer.new()->CobarConfig.new()->CobarConfig.initCobarConfig()->ServerLoader.load()->ServerLoader.initPolarDbXComponents()初始化元數(shù)據(jù)的接池MetaDbDataSource.initMetaDbDataSource會(huì)使用SystemConfig中存的MetaDB的地址、端口、用名、密、名等信息,建立與MetaDB的接。MetaDbDataSource.initMetaDbDataSource(this.system.getMetaDbAddr(),this.system.getMetaDbName(),this.system.getMetaDbProp(),this.system.getMetaDbUser(),this.system.getMetaDbPasswd());PolarDB-X源解(二):CN啟流程 15MetaDbDataSource是一個(gè)單例,實(shí)現(xiàn)了JDBC的程序中可以使用MetaDbDataSource.getInstance().getConnection()取與MetaDB的接(了JDBC接口),并使用MetaDB行。系表行建或者升SchemaChangeManager.getInstance().handle();polardbx-gms\src\main\resources\ddl\中保存了系表的表構(gòu),并且使用alter句了每一次版本的更。SchemaChangeManager在初始化,會(huì)當(dāng)前每個(gè)系表的表構(gòu)版本,如果版本老,會(huì)依次使用些句alter句行更新。取例ID信息ServerInstIdManager.getInstance();一個(gè)PolarDB-X集群也稱一個(gè)例,在MetaDB中有一個(gè)唯一的例ID。同,PolarDB-X例有主例與只例兩種模式。當(dāng)存在只例,必然存在一個(gè)主例。步從MetaDB中取例ID,如果當(dāng)前例只例,會(huì)取其主例的例ID。4)MetaDbConfigManager先介下個(gè)西是干的。我存在MetaDB中的配置信息,如果生化,CN需要能感知到個(gè)化。例如,某個(gè)表增加了一個(gè)列。作CN,如何能感知到個(gè)化呢?一個(gè)比的思路是元數(shù)據(jù)做,各幾秒一次。但如果每個(gè)模都去做的事情,會(huì)有個(gè)比大的是MetaDB的力會(huì)很大。PolarDB-X源解(二):CN啟流程 16MetaDbConfigManager此作了封裝,作了一個(gè)一的機(jī)制。但由于每個(gè)模塊元數(shù)據(jù)表的格式千萬化,所以MetaDbConfigManager并不是直接每個(gè)模的元數(shù)據(jù)表,而是config_listener表。表的幾個(gè)關(guān)列是data_id、op_version、gmt_modified。我可以每個(gè)data_id在代中注冊(cè)一個(gè)listener,當(dāng)MetaDbConfigManager到data_id的op_version生化的,會(huì)回個(gè)listener,一般情況下,各模的listener會(huì)按需要再取的元數(shù)據(jù)表。例如,d1.t1表在config_listener中有一行:polardbx.meta.table.d1.t1往t1表中增加了一個(gè)列,我會(huì)修改MetaDB中的columns表,同,我會(huì)修config_listener表中polardbx.meta.table.d1.t1行的op_version,行+1的操作。幾秒后,MetaDbConfigManager會(huì)到行的op_version列生了化,會(huì)回表構(gòu)管理模的listener(:TableMetaListener),listener會(huì)重新加d1.t1表的元數(shù)據(jù)。所以MetaDbConfigManager可以做到每個(gè)CN點(diǎn)只有一個(gè)程MetaDB做就能感知到各個(gè)元數(shù)據(jù)表的化。在啟,CN會(huì)初始化MetaDbConfigManager用于做的程和定任。5)MetaDbInstConfigManager初始化例的配置,里的配置似于MySQL中的SystemVariables,例如SQL的內(nèi)存大小限制之的。段會(huì)從MetaDB的inst_config表中加所有的配置并保存在內(nèi)存中。PolarDB-X源解(二):CN啟流程 17并且會(huì)注冊(cè)的listener,當(dāng)inst_config表生化的候,會(huì)回MetaDbInstConfigManager的listener。6)ConnPoolConfigManager個(gè)是用來存接池(CN與DN之的接池)相關(guān)的配置的(其它用到的配MetaDbInstConfigManager中都有),也是從inst_config中取。7)StorageHaManager個(gè)比重要。目前每一DN(里的指一個(gè)Paxos)內(nèi)的果是存在DN自己的系表中,并不會(huì)寫到MetaDB中。因此CN需要有機(jī)制去從DN的系表中探各點(diǎn)的角色。StorageHaManager會(huì)從storage_info表中取所有的DN點(diǎn)的接信息,并且內(nèi)部會(huì)有的程去角色信息。當(dāng)DN生HA的候,StorageHaManager會(huì)探到個(gè)化,并感知到最新的Leader等角色。初始化系initSystemDbIfNeed初始化information_schema和polardbx等幾個(gè)系。建程池路徑:CobarServer.new()幾個(gè)主要的程池的建:managerExecutor,Manager端口的求killExecutor,用來行kill指令PolarDB-X源解(二):CN啟流程 18serverExecutor,各種SQL都是由個(gè)程池行5.CobarServer.init路徑:TddlLauncher.main()->CobarServer.init()1)(TDataSource)的初始化入口在GmsAppLoader.initDbUserPrivsInfo,里的“App”指的就是一個(gè)。里會(huì)加每個(gè)的用限信息以及最重要的TDataSouce。TDataSource在CN中與一一。它是每個(gè)行SQL的入口。TDatSource的初始化在MatrixConfigHolder.init中,包含了以下內(nèi)容:初始化拓?fù)?,例如個(gè)包含了哪些DN,并初始化與些DN之的接池(TopologyHandler.initPolarDbXTopology)獲取每個(gè)DN的信息,包括版本,特性的支持程度等(StorageInfoManager.init)初始化分片的路由信息(mode='drds',TddlRuleManager.init;mode='auto',PartitionInfoManager.init)初始化表管理器(有哪些表、每個(gè)表有哪些列哪些索引等)(GmsTableMetaManager.init)初始化事管理器(transactionManager.init())建PlanCache(PlanCacheplanCache=newPlanCache(schemaName);)啟DDL任引擎(ddlEngineInit())PolarDB-X源解(二):CN啟流程 19信息管理器的初始化(StatisticManager.init)SPM的初始化(PlanManager.init)GmsClusterLoader.loadPolarDbXCluster加集群信息,例如集群中有哪些CN點(diǎn)等。初始化CclService,個(gè)是用來做SQL限流的。3)warmupCN的SQL函數(shù)目前是反射機(jī)制行加的,里主要作用是加下所有的函數(shù)。網(wǎng)的初始化步束后,服端口便會(huì)打開,CN程就能開始外提供服了。CN在一步會(huì)啟Server端口與Manager端口兩個(gè)端口。Server端口MySQL的3306端口,是提供前端用使用的。Manager端口用于內(nèi)部的管理使用,例如,SHOWPROCEESSLIST指令需要收集所有CN的行情況,就會(huì)使用端口行收集。1)NIOProcessorprocessors=newNIOProcessor[system.getProcessors()];for(inti=0;i<processors.length;i++){processors[i]=newNIOProcessor(i,"Processor"+i,this.serverExecutor);processors[i].startup();}PolarDB-X源解(二):CN啟流程 20CN網(wǎng)理求的入口是NIOProcessor,每個(gè)NIOProcessor有寫兩個(gè)程。里會(huì)來啟NIOProcessor的W與R程。NIOProcessor只網(wǎng)相關(guān)的理,如果接收到的是SQL求,后的SQL的行會(huì)交予ServerExecutor程池行行。2)NIOAcceptorCN網(wǎng)用來理接建立求的是NIOAcceptor,NIOAcceptor的new程中,會(huì)打開端口行聽:publicNIOAcceptor(Stringname,intport,FrontendConnectionFactoryfactory,booleanonline)throwsIOException{super.setName(name);...this.selector=Selector.open();this.serverChannel=ServerSocketChannel.open();this.serverChannel.socket().bind(newInetSocketAddress(port),65535);...}同,NIOAcceptor也是一個(gè)程,會(huì)理接建立的求。當(dāng)接建立后,NIOAcceptor.accept方法會(huì)將連接綁定到一個(gè)NIOProcessor上,由NIOProcessor理接上后的寫求??梢钥闯?,于服端口來,NIOAcceptor只有一個(gè),NIOProcessor的數(shù)目一般和CPU核數(shù)保持一致。3)MPPServer的啟CN作MPP集群中的一個(gè),需要啟端口來行CN之的通信。startMppServer會(huì)行MPP服的啟。PolarDB-X源解(二):CN啟流程 21CDC服的啟CobarServer.tryStartCdcManager會(huì)行CDC的啟。結(jié)語至此,CN就啟完成了。個(gè)程包含了CN中大多數(shù)件,于篇幅原因,沒有完整介每個(gè)件的作用。如果你些件中的哪一個(gè)感趣,迎留言我,我會(huì)在后的文章中,一些關(guān)的件做一步的介。PolarDB-X源解(三):CDC代構(gòu) 22PolarDB-X源解(三):CDC代構(gòu)polardbx-cdc是云原生分布式數(shù)據(jù)系PolarDB-X的一個(gè)核心件,全局增量日志的生成、分和。通polardbx-cdc,PolarDB-X數(shù)據(jù)可以外提供完全兼容MySQLBinlog格式和的增量日志,可與MySQLBinlog下游生工具的無接。本篇將polardbx-cdc的代構(gòu)做一個(gè)系介,并解一下如何快速搭建開境。一、體架構(gòu)如上所示,PolarDB-X包含4個(gè)核心件,CN(ComputeNode)算、DN(DataNode)存、GMS(GlobalMetaService)管理元數(shù)據(jù)和提供TSO服,CDC(ChangeDataCapture)生成更日志。其中,CDC作Binlog日志數(shù)據(jù)的出口,主要3方面的工作:基于TSO,各個(gè)DN的原始物理Binlog行排序和并,構(gòu)建出全局有序的事列。將事列中的數(shù)據(jù),持久化到存介,生成兼容MySQLBinlog格式的Binlog文件。提供兼容MySQLDump的消能力,外提供Replication服。PolarDB-X源解(三):CDC代構(gòu) 23更加形象的來理解,polardbx-cdc是一個(gè)Streaming系,InputSource是各個(gè)DN的原始Binlog,Computing是一系列算和理算法(排序、略、整形、合并等等),TargetSink是屏蔽了分布式數(shù)據(jù)內(nèi)部的全局Binlog文件,并提供了兼容MySQL生的Replication能力。其運(yùn)行狀,如下所示:從技架構(gòu)的角度來看,CDC共包含3個(gè)核心件,分是Daemon、Task和Dumper,如下所示:一個(gè)Node代表一個(gè)運(yùn)行點(diǎn),可以是一臺(tái)物理機(jī)、一臺(tái)ECS或一個(gè)Docker容器,可以部署1到n個(gè)Node,但如果需要HA能力,至少需要部署兩個(gè)。每個(gè)Node上都會(huì)運(yùn)行一個(gè)Daemon程,程行控、管控、度等功能,其定位可以和Hadoop中的NodeManager比。多個(gè)Daemon進(jìn)程中會(huì)有一個(gè)Leader角色,通占的方式來取,一些中心化的控制功能。PolarDB-X源解(三):CDC代構(gòu) 24Dumper從Task拉取理后的binlog數(shù)據(jù),將數(shù)據(jù)持久化到Binlog文件,并外提供兼容MysqlDump的Replication服。每個(gè)Node上都會(huì)運(yùn)行一個(gè)Dumper程,其中有一個(gè)Dumper會(huì)被定Master角色,其余Dumper的角色Slave,Slave會(huì)復(fù)制Master的全局Binlog文件,當(dāng)生故障,Daemon會(huì)完成Master的故障移。Task是CDC的內(nèi)核,事排序、數(shù)據(jù)整形、事合并、DDL理、元數(shù)據(jù)生命周期管理等功能,整個(gè)CDC集群只會(huì)有一個(gè)Task程,度程序會(huì)最低的Node運(yùn)行Task,并盡量保DumperMaster和Task在不同的Node。二、工程構(gòu)polardbx-cdc工程代托管在GitHub上(地址),遵循ApacheLicense2.0。polardbx-cdc是一個(gè)多模的Java目,模之通接口暴露服,模關(guān)系在pom.xml中,通mvndependency:tree命令可以看全部依。PolarDB-X源解(三):CDC代構(gòu) 25如上所示,整個(gè)目共包含15個(gè)目模(除此之外,CDC在polardbx-cdc項(xiàng)目中有部分功能模,具體可參[附3]),下面每個(gè)模展開介。[模]codestye提供了一份內(nèi)置的代格配置文件,主要面向IDEA,如果有趣獻(xiàn)源,可基于style文件行置。[模]docker提供了一系列docker相關(guān)的配置文件,通運(yùn)行目下的build.sh,可以在本地快速構(gòu)建出一份dokcer像。[模]polardbx-cdc-assemble程序構(gòu)建模,提供了構(gòu)建/打包等相關(guān)的配置,在polardbx-cdc工程的根目下行mvncleanpackage-Dmaven.test.skip=true,會(huì)在assemble的target目下生成polardbx-binlog.tar.gz程序包。[模]polardbx-cdc-canalbinlog數(shù)據(jù)解析模,引用了開源Canal的源,并做了很多定制化改造,核心代介如下:包(文件)名稱功能介定了MySQLBinlogEvent的各種數(shù)據(jù)模com.aliyun.polardbx.binlog.canal.binlog型,以及Binlog二制數(shù)據(jù)行Decode的核心Canal的運(yùn)行內(nèi)核模,包含數(shù)據(jù)解析流程com.aliyun.polardbx.binlog.canal.core的管理、ddl的理、限的管理、HA的理等等PolarDB-X源解(三):CDC代構(gòu) 26[模]polardbx-cdc-common公共模,提供了基工具、域模型、數(shù)據(jù)、公共配置等,核心代介如下:包(文件)名稱com.aliyun.polardbx.binlog.domaincom.aliyun.polardbx.binlog.daocom.aliyun.polardbx.binlog.heartbeatcom.aliyun.polardbx.binlog.leadercom.aliyun.polardbx.binlog.rpccom.aliyun.polardbx.binlog.schedulercom.aliyun.polardbx.binlog.taskgeneratorConfig.xml

功能介包含了域模型的定,其中po包下的源代生成工具自生成,了CDC的元數(shù)據(jù)表包含了所有的數(shù)據(jù)定,也是代生成工具自生成包含了TsoHeartbeat件,保binlogstream不斷向前流,也是混合事策略景下生成虛擬TSO的必要條件提供了一個(gè)基于MySQLGET_LOCK函數(shù)的LeaderElector定了Task和Dumper之行數(shù)據(jù)交互的Rpc接口包含了集群度和源分配相關(guān)的功能包含了Task和Dumper件定心跳相關(guān)的功能實(shí)現(xiàn)代生成器配置文件,使用了MyBatisGenerator行自化代生成[模]polardbx-cdc-daemon守程模,提供了HA度、TSO心跳、控信息收集、OpenAPI等功能,核心代介如下:包(文件)名稱 功能介com.aliyun.polardbx.binlog.daemon.cluster包含了集群管控相關(guān)功能,心跳、運(yùn)行com.aliyun.polardbx.binlog.daemon.schedule拓?fù)涠?、HA探活等包含了若干Rest格的接口,警事件com.aliyun.polardbx.binlog.daemon.rest收集、Metrics收集、系參數(shù)置等PolarDB-X源解(三):CDC代構(gòu) 27[模]polardbx-cdc-dumper全局Binlog文件dump模,接收Task模入的binlog數(shù)據(jù)并落,并外提供兼容MySQLdump的數(shù)據(jù)服,核心代介如下:包(文件)名稱 功能介com.aliyun.polardbx.binlog.Dumper主之行數(shù)據(jù)同步,的Client實(shí)現(xiàn)dumper.dump.clientcom.aliyun.polardbx.binlog. 邏輯Binlog文件構(gòu)建模,最核心的兩個(gè)分是LogFileGenerator和LogFileCopier,分Dumperdumper.dump.logfileMaster和DumperSlave的Binlog文件理[模]polardbx-cdc-format數(shù)據(jù)整形模,物理binlog行格式(增加列,減列,物理表化表名稱等),保后的數(shù)據(jù)格式和表Schema始保持一致的狀。[模]polardbx-cdc-meta元數(shù)據(jù)管理模,以基準(zhǔn),PolarDB-X的所有表和物理表行史版本,可以構(gòu)建出定任一點(diǎn)的Schema快照,是DDL理和Binlog整形的基支撐。此外,模了CDC系表的Sql腳本定(src/main/resources/db/migration),CDC使用Flyway行表構(gòu)的管理。[模]polardbx-cdc-monitor控模,一個(gè)內(nèi)置的控,用來管理和控事件。在運(yùn)行,控信息會(huì)通模送到daemon程。[模]polardbx-cdc-protocol數(shù)據(jù)定模,cdc使用gRpc和protobuf來行數(shù)據(jù)的,此模定了數(shù)據(jù)接口和數(shù)據(jù)交格式,核心代介如下:PolarDB-X源解(三):CDC代構(gòu) 28包(文件)名稱功能介tocol包含了Task點(diǎn)和Dumper點(diǎn)的數(shù)據(jù)交格式定com.aliyun.polardbx.rpc.cdc包含了Dumper點(diǎn)和CN點(diǎn)的數(shù)據(jù)交格式定[模]polardbx-cdc-storage數(shù)據(jù)存模,基于rocksdb行了封裝展,當(dāng)內(nèi)存源不足(如大事、bigcolumn等景),用來將內(nèi)存數(shù)據(jù)存到磁[模]polardbx-cdc-task核心任模,可以是CDC的kernel,最核心的如事的排序、整形、合并、DDL的理、元數(shù)據(jù)的生命周期等操作,均在此模完成。核心代介如下:包(文件)名稱功能介包含了一排序功能,每個(gè)DN的原始物理com.aliyun.polardbx.binlog.extractorBinlog行解析,并按照TSO行排序,以數(shù)據(jù)整形、元數(shù)據(jù)史版本、ddl理等功能com.aliyun.polardbx.binlog.merge包含了全局排序功能,接收一排序出的有序列,行多路并,出全局有序的事列包含了事合并功能,從全局有序的事列提取com.aliyun.polardbx.binlog.collect數(shù)據(jù),合并具有相同事id的局部事,得到完整全局事com.aliyun.polardbx.binlog.transmit包含了數(shù)據(jù)功能,排序合并后的數(shù)據(jù)通模送到下游Dumper件包含了一排序功能,每個(gè)DN的原始物理com.aliyun.polardbx.binlog.extractorBinlog行解析,并按照TSO行排序,以數(shù)據(jù)整形、元數(shù)據(jù)史版本、ddl理等功能PolarDB-X源解(三):CDC代構(gòu) 29[模]polardbx-cdc-transfer一個(gè)內(nèi)置的程序,通運(yùn)行程序,可以CDC全局Binlog的正確性行基本的,使用方法后文會(huì)有述。三、表明CDC的系元數(shù)據(jù)表保存在GMS元數(shù)據(jù),下面元數(shù)據(jù)表行介。binlog_system_config系參數(shù)信息表,保存系的參數(shù)配置。binlog_task_config系運(yùn)行拓?fù)渑渲帽?,保存dumper和task的配置信息,如指定在哪個(gè)點(diǎn)行、Rpc端口、運(yùn)行內(nèi)存等。binlog_node_info點(diǎn)信息表,保存了每個(gè)點(diǎn)的源配置和運(yùn)行狀等信息,每個(gè)Node于表中的一條。binlog_dumper_infodumper運(yùn)行狀信息表,每個(gè)Dumper程表中一條。binlog_task_infotask運(yùn)行狀信息表,每個(gè)Task程表中一條。PolarDB-X源解(三):CDC代構(gòu) 30binlog_logic_meta_history表元數(shù)據(jù)信息史表,用于每條DDLSQL及其的表拓?fù)湫畔?。binlog_phy_ddl_history物理表元數(shù)據(jù)信息里是表,用于每條物理DDLSQL。binlog_oss_recordbinlog文件信息表,每個(gè)Binlog文件于表中的一條。binlog_polarx_command命令信息表,CDC和CN之部分交互通表來完成,如觸全量元數(shù)據(jù)的初始化等。binlog_schedule_history度史表,集群每生一次重新度(如:點(diǎn)宕機(jī)觸Rebalance),會(huì)在表中一條史信息。binlog_storage_historyDN點(diǎn)史表,PolarDB-X行水平容或者容,DN數(shù)量會(huì)生更,每次更都會(huì)通“打”的方式通知CDC,CDC會(huì)通表按照所有的更史。Dumper程每次啟會(huì)Binlog文件中的最大tso,送Task程,Task會(huì)通tso從binlog_storage_history表中到當(dāng)前接的DN列表。PolarDB-X源解(三):CDC代構(gòu) 31binlog_env_config_history參數(shù)更史表,CDC中有部分參數(shù)需要和定,表用來些參數(shù)的更史,和binlog_storage_history似,系會(huì)以tso基準(zhǔn),使用段的參數(shù)配置。binlog_schema_historyFlyway行史表。四、開指引下面來介一下,如何基于源搭建開境,方便行二次開或代。JDK最低要求1.8。準(zhǔn)一個(gè)PolarDB-X例(啟CN+DN即可,不要啟CDC件),可通pxd方式部署,或通源安裝。準(zhǔn)polardbx-sql源,并行命令mvninstall-Dmaven.test.skip=true-Denv=release,主要是了得到polardbx-parser包,cdc引用了模。準(zhǔn)polardbx-cdc源,并整perties中的配置,根據(jù)情況整,可能需要整的配置有。polardbx.instance.idmem_sizemetaDb_urlmetaDb_usernamemetaDbPasswdpolarx_urlpolarx_usernamepolarx_passworddnPasswordKeyPolarDB-X源解(三):CDC代構(gòu) 32polardbx-cdc根目下行mvncompile-Dmaven.test.skip=true-Denv=dev,CDC源。啟Daemon程,直接運(yùn)行com.aliyun.polardbx.binlog.daemon.DaemonBootStrap即可。啟Task程,運(yùn)行com.aliyun.polardbx.binlog.TaskBootStrap,并指定入?yún)ⅰ皌askName=Final”。啟Dumper程,運(yùn)行com.aliyun.polardbx.binlog.dumper.DumperBootStrap,并指定入?yún)ⅰ皌askName=Dumper-1”。PolarDB-XServer,行一些Sql,察{HOME}/binlog目下是否會(huì)生Binlog數(shù)據(jù)。createdatabasetransfer_test;CREATETABLE`transfer_test`.`accounts`(`id`int(11)NOTNULL,`balance`int(11)NOTNULL,`gmt_created`datetimenotnull,PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8dbpartitionbyhash(`id`)tbpartitionbyhash(`id`)tbpartitions2;INSERTINTO`transfer_test`.`accounts`(`id`,`balance`,`gmt_created`)VALUES(1,100,now());INSERTINTO`transfer_test`.`accounts`(`id`,`balance`,`gmt_created`)VALUES(2,100,now());INSERTINTO`transfer_test`.`accounts`(`id`,`balance`,`gmt_created`)VALUES(3,100,now());INSERTINTO`transfer_test`.`accounts`(`id`,`balance`,`gmt_created`)VALUES(4,100,now());INSERTINTO`transfer_test`.`accounts`(`id`,`balance`,`gmt_created`)VALUES(5,100,now());INSERTINTO`transfer_test`.`accounts`(`id`,`balance`,`gmt_created`)VALUES(6,100,now());INSERTINTO`transfer_test`.`accounts`(`id`,`balance`,`gmt_created`)VALUES(7,100,now());PolarDB-X源解(三):CDC代構(gòu) 33INSERTINTO`transfer_test`.`accounts`(`id`,`balance`,`gmt_created`)VALUES(8,100,now());INSERTINTO`transfer_test`.`accounts`(`id`,`balance`,`gmt_created`)VALUES(9,100,now());INSERTINTO`transfer_test`.`accounts`(`id`,`balance`,`gmt_created`)VALUES(10,100,now());Docker安裝一個(gè)MySQL,建安裝8.0版本,提供一個(gè)安裝示例如下:dockerrun-itd--namemysql_3309-p3309:3306-eMYSQL_ROOT_PASSWORD=rootmysql登dokcer例:dockerexec-itmysql_3309 bash編輯/etc/mysql/f,a.增加如下配置來關(guān)Gtid(polardbx-cdc全局Binlog不支持Gtid)gtid_mode=OFFenforce_gtid_consistency=OFFb.更改serverid,避免與主重復(fù)server_id=2重啟docker例:dockerrestartmysql_3309MySQL客端登新安裝的MySQL,并行如下命令,察accounts表等信息是否已同步到MySQL。stopslave;resetslave;CHANGEMASTERTOMASTER_HOST='xxx',MASTER_USER='xxx',MASTER_PASSWORD='xxx',MASTER_PORT=xxx,MASTER_LOG_FILE='binlog.000001',MASTER_LOG_POS=4,MASTER_CONNECT_RETRY=100;startslave;PolarDB-X源解(三):CDC代構(gòu) 34可

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論