ICDE:POLARDB定义云原生数据库
摘要:?4月17日(巴黎時(shí)間)阿里云POLARDB走出國(guó)門(mén),亮相ICDE2018,并同步舉辦阿里云自有的POLARDB技術(shù)專場(chǎng)。在會(huì)上,阿里云進(jìn)行了學(xué)術(shù)成果展示,從而推動(dòng)Cloud Native DataBase成為行業(yè)標(biāo)準(zhǔn)。
4月17日(巴黎時(shí)間)阿里云POLARDB走出國(guó)門(mén),亮相ICDE2018,并同步舉辦阿里云自有的POLARDB技術(shù)專場(chǎng)。在會(huì)上,阿里云進(jìn)行了學(xué)術(shù)成果展示,從而推動(dòng)Cloud Native DataBase成為行業(yè)標(biāo)準(zhǔn)。
以下為阿里云資深技術(shù)專家蔡松露演講實(shí)錄:
現(xiàn)在我給大家介紹一下我們的云原生數(shù)據(jù)庫(kù)-POLARDB。
大家可能要問(wèn)到底什么是“云原生數(shù)據(jù)庫(kù)”,云原生數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)是什么,我們是如何定義的以及為何如此定義?現(xiàn)在,我們先把這些問(wèn)題放一邊,我們稍后回答。
現(xiàn)在我們看一下一個(gè)云原生的數(shù)據(jù)庫(kù)大概是什么樣子,門(mén)檻是什么,特性是什么,首先,云原生數(shù)據(jù)庫(kù)必須有優(yōu)越的性能,有百萬(wàn)級(jí)別的QPS;其次,必須有超大規(guī)模的存儲(chǔ),可達(dá)到100TB的存儲(chǔ)空間;在云上0宕機(jī)能力也是非常重要的;最后一個(gè)也是最重要的,云是一個(gè)生態(tài)系統(tǒng),數(shù)據(jù)庫(kù)必須兼容開(kāi)源生態(tài)。
云原生數(shù)據(jù)庫(kù)就像一輛跑車(chē),一輛跑車(chē)可能有很多特性,比如外觀、速度,但是一個(gè)有這樣外觀和速度的車(chē)不一定是跑車(chē)。所以回到我們的問(wèn)題,云原生數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)是什么,在回答這個(gè)問(wèn)題之前,我們看一下數(shù)據(jù)庫(kù)的發(fā)展歷史。
我從4個(gè)維度來(lái)看一下數(shù)據(jù)庫(kù)的發(fā)展歷史,首先,從數(shù)據(jù)規(guī)模上來(lái)看,我們生活在一個(gè)數(shù)據(jù)大爆炸的時(shí)代;其次,某些數(shù)據(jù)庫(kù)理論發(fā)生了演變,尤其是CAP理論,我們?cè)谒惴ɡ碚撋弦灿兴黄?#xff1b;第三,用戶和應(yīng)用場(chǎng)景也在發(fā)生變化;第四,基礎(chǔ)設(shè)施也在從傳統(tǒng)IDC遷移到云上。
為什么會(huì)有數(shù)據(jù)大爆炸呢?數(shù)據(jù)是如何爆炸的呢?這是我引用的互聯(lián)網(wǎng)女王米克爾的報(bào)告,你可以看到,互聯(lián)網(wǎng)歷史可以整體分為三個(gè)階段,第一階段我們稱之為PC互聯(lián)網(wǎng),數(shù)據(jù)主要由PC產(chǎn)生,第二個(gè)階段可以稱之為移動(dòng)互聯(lián)網(wǎng),數(shù)據(jù)主要由智能手機(jī)產(chǎn)生,第三個(gè)階段是IoT,從現(xiàn)在開(kāi)始,幾乎所有的數(shù)據(jù)由物聯(lián)網(wǎng)設(shè)備產(chǎn)生,可能是你的手表、冰箱、家里的電燈和汽車(chē),可能是任何設(shè)備。
隨著數(shù)據(jù)大爆炸,也帶了很多挑戰(zhàn),大規(guī)模的數(shù)據(jù)意味著用于存儲(chǔ)和分析數(shù)據(jù)的成本也大幅上升,搬運(yùn)和分析數(shù)據(jù)也變得困難,總之,數(shù)據(jù)很難被利用。
最近這些年分布式系統(tǒng)的一些理論也有了重大變化,CAP就是其中之一,CAP理論在2000年引入,在這個(gè)理論中,C代表一致性,A代表可用性,P代表分區(qū)容錯(cuò)性,這個(gè)理論的核心觀點(diǎn)是在P發(fā)生時(shí)C和A不可能同時(shí)被滿足,CAP是一個(gè)偉大的理論,但是對(duì)CAP理論也存在很多誤解,其中一個(gè)誤解就是C和A是互斥的,所以有些系統(tǒng)選擇放棄其中一個(gè)來(lái)滿足另一個(gè),比如很多NoSQL數(shù)據(jù)庫(kù),但是實(shí)際上,C和A的關(guān)系不是0和1的關(guān)系,而是100%和99%的關(guān)系。
現(xiàn)在我們也可以把P問(wèn)題建模成A問(wèn)題,P問(wèn)題主要由網(wǎng)卡、交換機(jī)、錯(cuò)誤的路由配置等故障引起,我們考慮一下這樣一個(gè)例子,一個(gè)節(jié)點(diǎn)因?yàn)榫W(wǎng)卡錯(cuò)誤而被網(wǎng)絡(luò)分區(qū),到這個(gè)節(jié)點(diǎn)的請(qǐng)求會(huì)失敗,如果我們能夠?qū)⑦@個(gè)節(jié)點(diǎn)自動(dòng)剔除,那么請(qǐng)求會(huì)重試并且會(huì)被發(fā)送到一個(gè)健康的節(jié)點(diǎn),事實(shí)上,當(dāng)一個(gè)節(jié)點(diǎn)宕機(jī)的時(shí)候我們也采用同樣的處理方式,所以基本上,P和A問(wèn)題在某些情況下可以看做是一類(lèi)問(wèn)題。
我們?nèi)绾伟咽〉墓?jié)點(diǎn)自動(dòng)剔除并且能夠同時(shí)保障數(shù)據(jù)一致性呢?我們可以用PAXOS算法來(lái)達(dá)到這個(gè)目的,PAXOS能夠保證一致性,而且PAXOS只需要過(guò)半數(shù)的操作成功即可,所以當(dāng)有網(wǎng)絡(luò)分區(qū)、宕機(jī)、慢節(jié)點(diǎn)出現(xiàn)時(shí),我們可以容忍這些問(wèn)題節(jié)點(diǎn)并做到自動(dòng)剔除。如果超過(guò)半數(shù)節(jié)點(diǎn)被分成了若干個(gè)分區(qū),這時(shí)我們選擇一致性犧牲可用性,但是在現(xiàn)實(shí)世界中這種情況極少發(fā)生,所以在大多數(shù)情況下,我們可以通過(guò)將P問(wèn)題建模成A問(wèn)題來(lái)同時(shí)保證完整的C和A。
20年前,只有政府和一些巨頭公司會(huì)選擇數(shù)據(jù)庫(kù),現(xiàn)在從巨頭到小微企業(yè)所有的業(yè)務(wù)都會(huì)跑在數(shù)據(jù)庫(kù)上,而且對(duì)數(shù)據(jù)庫(kù)的需求也在發(fā)生變化。
首先,數(shù)據(jù)庫(kù)必須靈活,有時(shí)我們需要做一個(gè)市場(chǎng)活動(dòng),比如黑色星期五,我們不知道當(dāng)天的真實(shí)流量,有時(shí)會(huì)有突發(fā)的熱點(diǎn)信息,這時(shí)流量會(huì)有一個(gè)飆漲并且是不可預(yù)測(cè)的,我們希望數(shù)據(jù)庫(kù)能夠靈活地進(jìn)行擴(kuò)展;其次,隨著全球化的發(fā)展,貿(mào)易也越來(lái)越透明,很多用戶的業(yè)務(wù)規(guī)模比較小,意味著利潤(rùn)也很少,他們需要更經(jīng)濟(jì)的解決方案;目前的客戶要求也比較嚴(yán)格并且對(duì)延遲很敏感,數(shù)據(jù)庫(kù)延遲越低帶給客戶的損失會(huì)越小;最后,數(shù)據(jù)庫(kù)必須對(duì)每一個(gè)潛在的問(wèn)題做到反應(yīng)迅速,并能從問(wèn)題狀態(tài)中快速恢復(fù)過(guò)來(lái)。
總之,目前對(duì)數(shù)據(jù)庫(kù)的潛在需求是:彈性、低成本、高性能、業(yè)務(wù)永續(xù)。
現(xiàn)在,所有的一切都是時(shí)刻在線的,在云時(shí)代以前,數(shù)據(jù)散落在IDC中,現(xiàn)在數(shù)據(jù)都位于數(shù)據(jù)湖中,數(shù)據(jù)會(huì)在線產(chǎn)生并且同時(shí)被應(yīng)用到訓(xùn)練模型中,所以這些數(shù)據(jù)是在線產(chǎn)生、在線分析并在線應(yīng)用;我們的生活現(xiàn)在也是時(shí)刻在線的,比如衣食住行、工作、社交、娛樂(lè)等都是可以在線解決的,你可以用一部手機(jī)足不出戶就能活下來(lái);現(xiàn)在你的客戶也是時(shí)刻在線的,他們遍布世界各地,無(wú)論白天還是黑夜,一直在線。
在目前的中國(guó),70%的新型企業(yè)都因數(shù)據(jù)挑戰(zhàn)而對(duì)業(yè)務(wù)產(chǎn)生了影響,他們面臨的問(wèn)題主要有:高成本,他們負(fù)擔(dān)不起商業(yè)license和專業(yè)的工程師;他們有很強(qiáng)的發(fā)展的意愿但是數(shù)據(jù)能力不夠強(qiáng);對(duì)他們來(lái)說(shuō)數(shù)據(jù)備份、數(shù)據(jù)挖掘和問(wèn)題排查都是非常困難的事情;他們的數(shù)據(jù)目前像孤島一樣散落分隔在多個(gè)地方,數(shù)據(jù)無(wú)法做到在線并被浪費(fèi),但是數(shù)據(jù)在持續(xù)增長(zhǎng)爆炸,這些數(shù)據(jù)很難被存儲(chǔ)、轉(zhuǎn)移、分析并使用
根據(jù)上述演變趨勢(shì)和接踵而來(lái)的數(shù)據(jù)挑戰(zhàn),我們認(rèn)為一個(gè)云原生的數(shù)據(jù)庫(kù)應(yīng)該符合以下標(biāo)準(zhǔn)。
首先,一個(gè)云原生數(shù)據(jù)庫(kù)不僅是一個(gè)TP數(shù)據(jù)庫(kù),也是一個(gè)AP數(shù)據(jù)庫(kù),TP和AP融合在一起,我們稱之為HTAP,我們從這種架構(gòu)中獲益良多;其次,云原生數(shù)據(jù)庫(kù)必須是serverless的,有了serverless,我們可以大幅削減成本;最后,云原生數(shù)據(jù)庫(kù)必須是智能的,就像一個(gè)顧問(wèn),可以承擔(dān)很多診斷和管理工作,通過(guò)這些工作我們可以提升用戶體驗(yàn)并讓用戶不必再關(guān)心這些枯燥棘手的事情。
接下來(lái)我們?cè)敿?xì)闡述一下。
在HTAP中TP和AP共享一份存儲(chǔ),對(duì)于分析來(lái)說(shuō)不存在任何數(shù)據(jù)延遲,由于不需要數(shù)據(jù)同步,我們也不必把數(shù)據(jù)從主節(jié)點(diǎn)同步到一個(gè)只讀節(jié)點(diǎn),這時(shí)數(shù)據(jù)是實(shí)時(shí)的,對(duì)于時(shí)延要求比較苛刻的應(yīng)用來(lái)說(shuō)非常有益;當(dāng)TP和AP共享一個(gè)存儲(chǔ)之后,至少會(huì)省去1個(gè)副本的成本,對(duì)于計(jì)算層,AP和TP通過(guò)容器來(lái)進(jìn)行隔離,所以AP對(duì)TP沒(méi)有任何影響,而且有了這層隔離之后,TP和AP可以輕松做到分別擴(kuò)展。
有了serverless,產(chǎn)品規(guī)格或版本升級(jí)時(shí)可以做到0成本,計(jì)算節(jié)點(diǎn)會(huì)跑在一個(gè)輕量的容器中,客戶端會(huì)話的生命周期比較短,所以當(dāng)我們進(jìn)行滾動(dòng)升級(jí)時(shí),客戶端幾乎感知不到任何變化;有了serverless可以輕松做到按需使用,按存儲(chǔ)付費(fèi),計(jì)算成本也很低,并且你可以為不同的業(yè)務(wù)模型指定不同的存儲(chǔ)策略,對(duì)于忙的業(yè)務(wù),可以使用更多的內(nèi)存和SSD,對(duì)于閑置的業(yè)務(wù),可以把數(shù)據(jù)放到HDD盤(pán)上,這樣可以大幅縮減成本。
提到智能,智能顧問(wèn)會(huì)分析實(shí)例產(chǎn)生的如CPU/存儲(chǔ)/內(nèi)存使用率和水位線等數(shù)據(jù)給你一個(gè)SQL或索引優(yōu)化建議,在外人看來(lái)智能顧問(wèn)就像是一個(gè)DBA,并把用戶也武裝成一個(gè)專業(yè)的DBA;當(dāng)數(shù)據(jù)鏈路上有問(wèn)題發(fā)生時(shí),由于數(shù)據(jù)鏈路又長(zhǎng)又復(fù)雜,所以我們不清楚問(wèn)題到底出在哪里,當(dāng)我們有一個(gè)監(jiān)控和診斷系統(tǒng)后,我們可以輕松地去診斷整個(gè)鏈路并迅速給出根本原因;智能顧問(wèn)也能負(fù)責(zé)其他如成本控制、安全、審計(jì)等職能。
在上述若干標(biāo)準(zhǔn)和門(mén)檻的指導(dǎo)下,我們打造了一個(gè)全新的云原生數(shù)據(jù)庫(kù)-POLARDB,我會(huì)從架構(gòu)、產(chǎn)品設(shè)計(jì)、未來(lái)工作等幾個(gè)方面全方位闡述一下POLARDB。
這是一個(gè)POLARDB的架構(gòu)大圖,上層是計(jì)算層,下層的存儲(chǔ)層,存儲(chǔ)和計(jì)算分離,他們中間通過(guò)RDMA高速網(wǎng)絡(luò)相連接,所有的邏輯都運(yùn)行在用戶態(tài),繞過(guò)了linux內(nèi)核,在用戶路徑上,我們實(shí)現(xiàn)了0拷貝,我們同時(shí)實(shí)現(xiàn)了一個(gè)RAFT的變種ParellelRaft,它支持亂序提交,比傳統(tǒng)的Raft速度要快很多;我們同時(shí)使用了大量新硬件,既可以提升性能又能降低成本,POLARDB也是面向下一代硬件而設(shè)計(jì)。
對(duì)于計(jì)算節(jié)點(diǎn),只有一個(gè)寫(xiě)入口,R/W節(jié)點(diǎn)負(fù)責(zé)所有類(lèi)型的請(qǐng)求,包括讀和寫(xiě)請(qǐng)求,其他節(jié)點(diǎn)都是只讀節(jié)點(diǎn),只能處理讀請(qǐng)求,對(duì)于存儲(chǔ)節(jié)點(diǎn),我們通過(guò)ParellelRaft算法來(lái)實(shí)現(xiàn)三副本一致性寫(xiě)。我們?yōu)楹我龃鎯?chǔ)計(jì)算分離呢?首先,我們可以為存儲(chǔ)和計(jì)算階段選取不同類(lèi)型的硬件,對(duì)于計(jì)算層,我們主要關(guān)注CPU和內(nèi)存性能,對(duì)于存儲(chǔ)層,我們主要關(guān)注低成本的存儲(chǔ)實(shí)現(xiàn),這樣存儲(chǔ)和計(jì)算節(jié)點(diǎn)都能做到定制化和針對(duì)性優(yōu)化;分離之后計(jì)算節(jié)點(diǎn)是無(wú)狀態(tài)的,變得易于遷移和failover,存儲(chǔ)的復(fù)制和HA也可以得到針對(duì)性的提升;存儲(chǔ)現(xiàn)在可以方便地池化,以塊為單位進(jìn)行管理,所以不再會(huì)有碎片問(wèn)題、不均衡問(wèn)題,并且易于擴(kuò)展;在這種架構(gòu)下,也很容易實(shí)現(xiàn)serverless,當(dāng)你的業(yè)務(wù)比較空閑時(shí)你甚至可以不需要任何計(jì)算節(jié)點(diǎn)。
在POLARDB中,任何邏輯都跑在用戶態(tài),一個(gè)請(qǐng)求從數(shù)據(jù)庫(kù)引擎發(fā)出,然后PFS會(huì)把它映射成一組IO請(qǐng)求,然后PolarSwitch會(huì)把這些請(qǐng)求通過(guò)RDMA發(fā)送到存儲(chǔ)層,然后ParellelRaft leader處理這些請(qǐng)求并通過(guò)SPDK持久化到磁盤(pán)上,同時(shí)再通過(guò)RDMA同步兩份數(shù)據(jù)到兩個(gè)followers,在整個(gè)路徑上沒(méi)有系統(tǒng)調(diào)用,也就沒(méi)有上下文切換,同時(shí)也沒(méi)有多余的數(shù)據(jù)拷貝,沒(méi)有上下文切換加0拷貝使得POLARDB成為一個(gè)極快的數(shù)據(jù)庫(kù)。
這是POALRDB文件系統(tǒng)-PFS的詳細(xì)說(shuō)明,PFS具有POSIX API,對(duì)數(shù)據(jù)庫(kù)引擎侵入性很低,PFS是一個(gè)靜態(tài)庫(kù)并被鏈接到數(shù)據(jù)庫(kù)進(jìn)程中,PFS是一個(gè)分布式文件系統(tǒng),文件系統(tǒng)的元數(shù)據(jù)通過(guò)PAXOS算法進(jìn)行同步,所以PFS允許并行讀寫(xiě),為了訪問(wèn)加速,在數(shù)據(jù)庫(kù)進(jìn)程中有元數(shù)據(jù)的緩存,緩存通過(guò)版本控制來(lái)進(jìn)行失效操作,為了便于大家理解PFS,這是PFS和傳統(tǒng)文件系統(tǒng)的一個(gè)類(lèi)比。
我們使用ParellelRaft來(lái)同步三份數(shù)據(jù),ParellelRaft是Raft的變種之一,Raft不允許亂序提交和日志空洞,這些限制讓Raft性能比較低、吞吐比較小,在ParellelRaft中,我們?cè)试S亂序提交、確認(rèn)、和應(yīng)用,事務(wù)的語(yǔ)義和串行化由數(shù)據(jù)庫(kù)引擎層來(lái)負(fù)責(zé),對(duì)于空洞我們有一整套完整的catch-up機(jī)制,這是一個(gè)非常復(fù)雜的過(guò)程,在VLDB 2018的論文中,我們有詳細(xì)論述,這篇論文剛被接收。
在POLARDB中,我們使用了一些新硬件并最大化利用這些硬件的能力,除了RDMA,我們還在研究open-channel來(lái)最大化SSD的價(jià)值,我們也在通過(guò)3D XPoint技術(shù)在加速存儲(chǔ)層。
這是POLARDB和RDS的對(duì)比壓測(cè)結(jié)果,我們使用sysbench來(lái)進(jìn)行壓測(cè),紫色的柱子代表POLARDB,粉色的代表RDS,通過(guò)這些數(shù)字可以看出,在使用相同資源的情況下,POLARDB的平均讀性能是RDS的6倍,平均寫(xiě)性能是RDS的3倍,所以這個(gè)提升是巨大的。
我們接下來(lái)看一下POLARDB的產(chǎn)品特點(diǎn),性能上,很容易擴(kuò)展到100W QPS,并且延遲小于2ms;存儲(chǔ)最大支持100TB;彈性上,可以很方便做橫向和縱向擴(kuò)展,并且在規(guī)格升級(jí)時(shí)0宕機(jī)無(wú)干擾;對(duì)于兼容性,會(huì)100%兼容MySQL;在可用性上,當(dāng)有錯(cuò)誤發(fā)生時(shí),我們會(huì)選擇一致性犧牲可用性,所以目前我們承諾3個(gè)9的可用性,在數(shù)據(jù)可靠性上,我們承諾5個(gè)9。
在POLARDB中,讀和寫(xiě)被分離到不同的節(jié)點(diǎn)上,只有一個(gè)寫(xiě)節(jié)點(diǎn),寫(xiě)節(jié)點(diǎn)可以處理讀寫(xiě)請(qǐng)求,可以有多個(gè)只讀節(jié)點(diǎn),寫(xiě)QPS最多可達(dá)13W,讀QPS可以很方便地?cái)U(kuò)展到幾百萬(wàn)。
對(duì)于可擴(kuò)展性,所有節(jié)點(diǎn)都可以做縱向擴(kuò)展,只讀節(jié)點(diǎn)可以做橫向擴(kuò)展,實(shí)例的存儲(chǔ)可以做縱向擴(kuò)展,存儲(chǔ)集群可以做橫向擴(kuò)展,當(dāng)讀寫(xiě)節(jié)點(diǎn)和只讀節(jié)點(diǎn)之間做failover時(shí)可以做到0宕機(jī)。
對(duì)于數(shù)據(jù)遷移,你可以通過(guò)加載一個(gè)OSS(類(lèi)似AWS S3)上的備份來(lái)啟動(dòng)你的數(shù)據(jù)庫(kù),也可以通過(guò)將POLARDB當(dāng)成RDS的slave來(lái)從RDS實(shí)時(shí)復(fù)制數(shù)據(jù),也可以利用DTS(data transfer service數(shù)據(jù)傳輸服務(wù))來(lái)從RDS和其他數(shù)據(jù)庫(kù)遷移到POLARDB。
對(duì)于數(shù)據(jù)可靠性,我們可以做到1個(gè)region內(nèi)可用區(qū)內(nèi)多個(gè)可用區(qū)之間的failover,你可以在其他可用區(qū)啟動(dòng)一個(gè)standby實(shí)例并且使用redolog來(lái)進(jìn)行復(fù)制,也可以在多個(gè)region之間failover,我們通常使用binlog進(jìn)行復(fù)制,對(duì)于備份,我們可以秒級(jí)打出一個(gè)snapshot然后傳輸?shù)絆SS上。
下面是POLARDB的一些未來(lái)工作,目前POLARDB還只是個(gè)嬰兒,我們?nèi)匀挥写罅抗ぷ餍枰プ?#xff0c;在引擎層我們將會(huì)支持多寫(xiě),目前POLARDB是一個(gè)共享磁盤(pán)的架構(gòu),未來(lái)會(huì)是一個(gè)共享所有資源的架構(gòu),比如在計(jì)算層我們會(huì)引入一個(gè)集中化Cache的角色來(lái)提升我們的查詢性能,我們也在移植更多的數(shù)據(jù)庫(kù)到POLARDB,比如更多的MySQL版本、PostgreSQL、DocumentDB等。在存儲(chǔ)層,我們會(huì)使用3D XPoint技術(shù)來(lái)提升IO性能,我們也會(huì)通過(guò)open-channel技術(shù)在提升SSD性能,將來(lái)我們也會(huì)將更多引擎層的邏輯進(jìn)行下推,盡量減少更多的IO,讓計(jì)算層更加簡(jiǎn)單。
關(guān)于學(xué)術(shù)我們的基本思想是:學(xué)術(shù)要在工程落地,工程要有學(xué)術(shù)產(chǎn)出,沒(méi)有單純的工程或者學(xué)術(shù)。我們團(tuán)隊(duì)已經(jīng)向Sigmod和VLDB提交了數(shù)篇論文,最近這些論文將會(huì)出版,大家會(huì)看到更多的關(guān)于POLARDB和它的分布式存儲(chǔ)的詳細(xì)的信息,我們也正在歐洲進(jìn)行招聘,我們?cè)诎屠韬偷聡?guó)都設(shè)有辦公室。
原文鏈接
干貨好文,請(qǐng)關(guān)注掃描以下二維碼:
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)
總結(jié)
以上是生活随笔為你收集整理的ICDE:POLARDB定义云原生数据库的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 助力全站WebP ,阿里云云上FPGA
- 下一篇: PyODPS 中使用 Python UD