分布式存儲(chǔ)系統(tǒng)的一些理解與實(shí)踐_第1頁
分布式存儲(chǔ)系統(tǒng)的一些理解與實(shí)踐_第2頁
分布式存儲(chǔ)系統(tǒng)的一些理解與實(shí)踐_第3頁
分布式存儲(chǔ)系統(tǒng)的一些理解與實(shí)踐_第4頁
分布式存儲(chǔ)系統(tǒng)的一些理解與實(shí)踐_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、分布式存儲(chǔ)系統(tǒng)的一些理解和實(shí)踐張建偉一、 分布式存儲(chǔ)系統(tǒng)介紹1. 簡(jiǎn)介互聯(lián)網(wǎng)數(shù)據(jù)規(guī)模越來越大,并發(fā)請(qǐng)求越來越高,傳統(tǒng)的關(guān)系數(shù)據(jù)庫,在很多使用場(chǎng)景下并不能很好的滿足需求。分布式存儲(chǔ)系統(tǒng)應(yīng)運(yùn)而生。它有良好的擴(kuò)展性,弱化關(guān)系數(shù)據(jù)模型,甚至弱化一致性要求,以得到高并發(fā)和高性能。按功能分類,主要有以下幾種:² 分布式文件系統(tǒng)hdfs ceph glusterfs tfs ² 分布式對(duì)象存儲(chǔ)s3(dynamo) ceph bcs(mola)² 分布式表格存儲(chǔ)hbase cassandra oceanbase² 塊存儲(chǔ)ceph ebs(amazon)分布式存儲(chǔ)系統(tǒng),包

2、括分布式系統(tǒng)和單機(jī)存儲(chǔ)兩部分;不同的系統(tǒng),雖在功能支持、實(shí)現(xiàn)機(jī)制、實(shí)現(xiàn)語言等方面是有差異的,但其設(shè)計(jì)時(shí),關(guān)注的關(guān)鍵問題是基本相同的。單機(jī)存儲(chǔ)的主流實(shí)現(xiàn)方式,有hash引擎、B+樹引擎和LSM樹(Log Structured Merge Tree)三種,不展開介紹。本文第二章節(jié),主要結(jié)合hbase、cassandra和ceph,講下分布式系統(tǒng)設(shè)計(jì)部分,需要關(guān)注的關(guān)鍵問題。2. 適用場(chǎng)景各分布式存儲(chǔ)系統(tǒng)功能定位不盡相同,但其適用和不適用的場(chǎng)景,在一定程度上是相同的,如下。1) 適用大數(shù)據(jù)量(大于100T,乃至幾十PB)key/value或者半結(jié)構(gòu)化數(shù)據(jù)高吞吐高性能高擴(kuò)展2) 不適用Sql查詢復(fù)雜查

3、詢,如聯(lián)表查詢復(fù)雜事務(wù)二、 分布式存儲(chǔ)系統(tǒng)設(shè)計(jì)要點(diǎn)1. 數(shù)據(jù)分布分布式存儲(chǔ),可以由成千甚至上萬臺(tái)機(jī)器組成,以實(shí)現(xiàn)海量數(shù)據(jù)存儲(chǔ)和高并發(fā)。那它最先要解決的就是數(shù)據(jù)分布問題,即哪些數(shù)據(jù)存儲(chǔ)在哪些機(jī)器(節(jié)點(diǎn))上。常用的有hash類算法和用meta表映射兩種方式。一般完全分布式的設(shè)計(jì)(無master節(jié)點(diǎn)),會(huì)用hash類算法;而集中式的設(shè)計(jì)(有master節(jié)點(diǎn))用meta表映射的方式。兩者各有優(yōu)缺點(diǎn),后面講到具體問題時(shí)再做比較。1) 一致性hash將存儲(chǔ)節(jié)點(diǎn)和操作的key(key唯一標(biāo)識(shí)存儲(chǔ)的object,有時(shí)也叫object name)都hash到02的32次方區(qū)間。映射到如下環(huán)中的某個(gè)位置。沿操作k

4、ey的位置順時(shí)針找到的第一個(gè)節(jié)點(diǎn)即為此key的primary存儲(chǔ)節(jié)點(diǎn)。如下圖所示:圖1 一致性hashCassandra借鑒了dynamo的實(shí)現(xiàn),用了一致性hash的方式。節(jié)點(diǎn)的hash值(也叫token),可以手動(dòng)分配或者自動(dòng)生成。Key的hash值即md5(key)。每個(gè)表可以在建表時(shí)指定副本數(shù),當(dāng)副本數(shù)為3時(shí),找primary存儲(chǔ)節(jié)點(diǎn)后,順時(shí)針方向的下2個(gè)存儲(chǔ)節(jié)點(diǎn)即為replica存儲(chǔ)節(jié)點(diǎn)。Hash類算法,優(yōu)點(diǎn)是無需master節(jié)點(diǎn),一個(gè)缺點(diǎn)是,不支持key的順序掃描。2) Crush算法也是一種類hash算法,隨著ceph誕生,也是ceph的一大亮點(diǎn)。Crush算法比較復(fù)雜,這里簡(jiǎn)化介

5、紹下。Ceph的每個(gè)Object最終都會(huì)映射到一組OSD中,由這組OSD保存這個(gè)Object,映射流程如下:Object PG OSD set· OSD先理解為機(jī)器節(jié)點(diǎn)吧· PG即Placement Groups,可以理解為存儲(chǔ)在同一組OSD上的object的集合Object先映射到PG(Placement Group),再由PG映射到OSD set。每個(gè)表空間有固定數(shù)量的pg,在建表時(shí)指定。每個(gè)Object通過計(jì)算hash值并對(duì)pg數(shù)量取模得到它所對(duì)應(yīng)的PG。PG再映射到一組OSD(OSD的個(gè)數(shù)由表的副本數(shù)決定,也是建表時(shí)指定),第一個(gè)OSD是Primary,剩下的都是R

6、eplicas。PG OSD set 的映射由幾個(gè)因素決定:· CRUSH hash算法:一種偽隨機(jī)算法。· OSD MAP:包含當(dāng)前所有OSD的狀態(tài)、OSD的機(jī)器機(jī)架信息等。· CRUSH Rules:數(shù)據(jù)映射的策略。這些策略可以靈活的設(shè)置object存放的區(qū)域。比如可以指定table1中所有objects放置在機(jī)架1上,所有objects的第1個(gè)副本放置在機(jī)架1上的服務(wù)器A上,第2個(gè)副本分布在機(jī)架1上的服務(wù)器B上。 table2中所有的object分布在機(jī)架2、3、4上,所有Object的第1個(gè)副本分布在機(jī)架2的服務(wù)器上,第2個(gè)副本分布在機(jī)架3的服器上,第3個(gè)

7、副本分布在機(jī)架4的服務(wù)器上。具體實(shí)現(xiàn)不再展開。圖2 ceph crush算法偽代碼如下所示:locator = object_nameobj_hash = hash(locator)pg = obj_hash % num_pgosds_for_pg = crush(pg) # returns a list of osdsprimary = osds_for_pg0replicas = osds_for_pg1:Crush相比一致性hash更加靈活。3) 按range查表由master節(jié)點(diǎn)記錄和管理每個(gè)表range的粒度,以及每個(gè)range的數(shù)據(jù)存儲(chǔ)在哪些節(jié)點(diǎn)上。range是根據(jù)key的字節(jié)序確

8、定。Client在執(zhí)行key存取操作是,先到master,根據(jù)其所在range,查詢其存儲(chǔ)在哪些節(jié)點(diǎn);再直接跟存儲(chǔ)節(jié)點(diǎn)交互,實(shí)現(xiàn)存取。Hbase是用這種方式實(shí)現(xiàn),支持key的順序掃描。如下圖所示,region即一段range的數(shù)據(jù)(存儲(chǔ)在mater server上),region sever即實(shí)際存儲(chǔ)節(jié)點(diǎn)。圖3 hbase region映射2. 數(shù)據(jù)可靠性數(shù)據(jù)可靠性,即數(shù)據(jù)不丟失,是存儲(chǔ)系統(tǒng)的第一職責(zé)。圖4 數(shù)據(jù)中心分布式一般采用普通服務(wù)器,要假設(shè)服務(wù)器和硬盤都是不可靠的。如何保證在有硬件損壞時(shí)數(shù)據(jù)不丟失,是任何分布式存儲(chǔ)系統(tǒng)都必須考慮的。已有做法有以下幾種。1) 多副本即數(shù)據(jù)保存N+1份(一

9、般是3份),每一份都存儲(chǔ)在不同的節(jié)點(diǎn)上。在數(shù)據(jù)損壞N份時(shí),仍能修復(fù)數(shù)據(jù)。缺點(diǎn)是,需N倍的冗余存儲(chǔ)空間。² hbase、cassandra、ceph都很好的支持。2) 糾刪碼即將一條數(shù)據(jù)切分成n等份,通過對(duì)這n份數(shù)據(jù)編碼,得到m份相等大小的校驗(yàn)數(shù)據(jù)塊兒。這n+m份數(shù)據(jù),各自存儲(chǔ)在不同的節(jié)點(diǎn)上,拿到n+m中的任意n份數(shù)據(jù),均可計(jì)算得到原始的數(shù)據(jù)。一般n取10,m取3。優(yōu)點(diǎn)是,只需m/n倍的冗余空間,缺點(diǎn)是讀寫效率較低,且耗費(fèi)cpu。圖5 糾刪碼² Hbase:hdfs層為hbase提供支持。² Cassandra:社區(qū)版本不支持,社區(qū)還無添加此功能的路線圖,之前社區(qū)有

10、討論過此功能,后來不了了之。應(yīng)該是主要考慮到糾刪碼方式對(duì)現(xiàn)有系統(tǒng)的存儲(chǔ)結(jié)構(gòu)、一致性語義都有較大影響,且性能較低。² Ceph:支持。但在功能上有些缺失,比如不支持partial read,適合讀遠(yuǎn)多于寫的場(chǎng)景,應(yīng)用較少。3) 跨級(jí)群自動(dòng)備份一般為了更高的可靠性,數(shù)據(jù)會(huì)通過準(zhǔn)實(shí)時(shí)備份機(jī)制,備份到另外一個(gè)IDC的存儲(chǔ)集群。² Hbase:社區(qū)版本已經(jīng)支持。² cassandra和ceph:都不支持,短期沒有路線圖,長(zhǎng)遠(yuǎn)來講,是需要添加的。4) 接入修復(fù)客戶端寫數(shù)據(jù)到存儲(chǔ)集群,一般先按一定規(guī)則找到一個(gè)接入節(jié)點(diǎn),再由次接入節(jié)點(diǎn)做proxy將數(shù)據(jù)寫到實(shí)際存儲(chǔ)的節(jié)點(diǎn)。假設(shè)需要

11、寫入3副本,如果接入節(jié)點(diǎn)發(fā)現(xiàn),有的副本對(duì)應(yīng)的存儲(chǔ)節(jié)點(diǎn)此時(shí)不可用,或者寫超時(shí),那么會(huì)將寫失敗的節(jié)點(diǎn)及未寫成功的數(shù)據(jù)存儲(chǔ)下來。之后,定時(shí)或者收到通知不可用節(jié)點(diǎn)變?yōu)榭捎脮r(shí),嘗試寫入之前未寫成功的數(shù)據(jù)。² Hbase:hdfs層會(huì)保證寫入足夠的副本,因?yàn)閔dfs的namenode記錄了每個(gè)block的meta數(shù)據(jù)(block存儲(chǔ)在哪些datanode),一個(gè)datanode寫失敗,換一個(gè)寫,直至寫成功??梢钥吹?,記錄meta這種方式很靈活² Cassandra:有hinthandoff機(jī)制,原理如上² Ceph:有pglog機(jī)制,原理如上5) 全局掃描修復(fù)用以修復(fù)磁盤損壞

12、、誤刪文件等原因引起的數(shù)據(jù)丟失。由master節(jié)點(diǎn)發(fā)起全局?jǐn)?shù)據(jù),或者primary節(jié)點(diǎn)發(fā)起自己負(fù)責(zé)的range的數(shù)據(jù),的多個(gè)副本間的數(shù)據(jù)掃描。如果發(fā)現(xiàn)某個(gè)副本缺失,則進(jìn)行修復(fù)。Hbase、cassandra、ceph都有類似機(jī)制,原理類似,機(jī)制不同,這里不一一展開講了。² Hbase:hdfs層的data node在發(fā)現(xiàn)盤損壞后,會(huì)收集剩下的所有block信息,并通知name node對(duì)比修復(fù)² Cassandra:基于Merkle tree的anti-entropy機(jī)制² Ceph:scrub和deep-scrub機(jī)制3. 可用性分布式存儲(chǔ)系統(tǒng),相比傳統(tǒng)關(guān)系數(shù)據(jù)

13、庫,有更好的可用性。在個(gè)別機(jī)器硬件或軟件故障,甚至整個(gè)機(jī)房斷電斷網(wǎng)等極端情況下,仍不影響在線讀寫。對(duì)于個(gè)別機(jī)器硬件或者軟件故障,一般數(shù)據(jù)保存多份副本或者糾刪碼方式就能解決。對(duì)于整個(gè)機(jī)房斷電,只能是多副本的跨idc存儲(chǔ),一般分布式存儲(chǔ)系統(tǒng)都支持這種方式,只是目前實(shí)際應(yīng)用的很少。保證可用性,另外一個(gè)影響因素是,整個(gè)系統(tǒng)是否有單點(diǎn)故障。完全分布式的設(shè)計(jì)是沒有單點(diǎn)的。集中式的設(shè)計(jì),有meta信息,需要meta server的角色,一般也會(huì)將meta server做成集群式,以避免單點(diǎn)問題。下面結(jié)合例子講下。1) 分布式or集中式² Hbase:meta server是集群方式,通過zk的選舉

14、算法選出一個(gè)主節(jié)點(diǎn)來提供服務(wù),主節(jié)點(diǎn)掛掉后,會(huì)重新選一個(gè)。所以hbase的meta server也不算是單點(diǎn)的。但其region server是單點(diǎn)的,即一個(gè)region server掛掉,在master沒有為其負(fù)責(zé)的region進(jìn)行重分配前,這個(gè)region所負(fù)責(zé)的range,是無法提供在線讀寫的。之所以存在此單點(diǎn)問題,猜測(cè)因?yàn)閔base設(shè)計(jì)之初,是為網(wǎng)頁庫這類離線存儲(chǔ)設(shè)計(jì)的,而非在線服務(wù)。另外,region server的這種設(shè)計(jì)能較方便是實(shí)現(xiàn)強(qiáng)一致性和簡(jiǎn)單事務(wù),后面會(huì)提到?,F(xiàn)在貌似已有region server的stand by機(jī)制,即一臺(tái)region server掛掉,另一臺(tái)準(zhǔn)備就緒的

15、能馬上接替并提供服務(wù)。Hbase架構(gòu)如下:圖6 hbase架構(gòu)² cassandra和ceph:是完全分布式的(ceph雖有monitor server,但仍可理解為完全分布式的,這里不展開了),無單點(diǎn)問題。4. 可擴(kuò)展性存儲(chǔ)系統(tǒng)的可擴(kuò)展性,即擴(kuò)容的難易程度??蓴U(kuò)展性是分布式系統(tǒng)相比傳統(tǒng)關(guān)系數(shù)據(jù)庫,最大的優(yōu)勢(shì)。各分布式存儲(chǔ)系統(tǒng)都能很好的支持橫向擴(kuò)展。由于實(shí)現(xiàn)方式的不同,擴(kuò)容的難易程度還是有差異的。一般集中式的系統(tǒng)擴(kuò)容更加容易,完全分布式的系統(tǒng)會(huì)更加麻煩些。下面結(jié)合例子講下。1) 擴(kuò)容² Hbase:比較容易,擴(kuò)容的大致過程為:增加一些region server,由maste

16、r server做一下balance,即重新確定region server與region的對(duì)應(yīng)關(guān)系(每個(gè)region負(fù)責(zé)一定范圍的key,對(duì)應(yīng)于hdfs上的一組文件),完全不需要拖數(shù)據(jù)。而hdfs本身擴(kuò)容也較容易,因?yàn)橛衝ame node存在(相當(dāng)于master server,對(duì)寫入hdfs的每個(gè)塊兒都記錄其存儲(chǔ)節(jié)點(diǎn)),可以將新寫入的文件寫入到新擴(kuò)容的server,這樣不需要拖數(shù)據(jù);如果要考慮寫壓力均衡(即不把寫壓力集中在新加入的機(jī)器上,仍然寫所有機(jī)器),仍需要做數(shù)據(jù)遷移。² Cassandra和ceph:因?yàn)閗ey定位是通過hash類算法,所以拖數(shù)據(jù)不可避免。拖的數(shù)據(jù)量即新加的no

17、de所負(fù)責(zé)的數(shù)據(jù)量。一致性hash和crush算法不同,導(dǎo)致拖數(shù)據(jù)的源節(jié)點(diǎn)不一樣,但總的來說大同小異。5. 數(shù)據(jù)一致性一致性分強(qiáng)一致性和最終一致性,解釋如下:強(qiáng)一致性:寫完一條數(shù)據(jù)key1,馬上讀key1,能讀到最新數(shù)據(jù)。最終一致性:寫完一條數(shù)據(jù)key1,馬上讀key1,可能讀到老數(shù)據(jù),但一段時(shí)間后,能夠讀到新數(shù)據(jù)。最終一致性相比強(qiáng)一致性,有更高的性能。一致性跟primary和replica在讀寫時(shí)的地位相關(guān),不同系統(tǒng)在實(shí)現(xiàn)上會(huì)有不同的取舍,下面具體說明。1) 單主、多主、主從² Hbase:region server是單點(diǎn),可以理解問題單主方式,天然的強(qiáng)一致性。² Cas

18、sandra:最終一致性,通過客戶端一致性級(jí)別的設(shè)置也可實(shí)現(xiàn)強(qiáng)一致性。Cassandra多個(gè)副本節(jié)點(diǎn)的地位相同,可以理解為多主方式,并列提供讀寫,這種方式讀寫性能很高,除了犧牲了強(qiáng)一致性,還有造成寫沖突問題,cassandra通過column級(jí)別的時(shí)間戳解決此問題,但不徹底,時(shí)間戳相同時(shí)就沒有辦法了。² Ceph:的多個(gè)副本間有主從關(guān)系,一主多從,客戶端寫主節(jié)點(diǎn),主節(jié)點(diǎn)負(fù)責(zé)寫從節(jié)點(diǎn)。客戶端只能讀主節(jié)點(diǎn)。以此實(shí)現(xiàn)強(qiáng)一致性。Ceph也支持配置為本地化(就近,不一定是主節(jié)點(diǎn))讀方式,這種方式也犧牲了強(qiáng)一致性。Ceph的塊兒存儲(chǔ)和分布式文件系統(tǒng)功能,要求它必須支持強(qiáng)一致性。6. 性能前面已經(jīng)

19、提到,不同的一致性會(huì)對(duì)性能有影響。另外,還有兩點(diǎn)對(duì)對(duì)性能影響較大:1) 完全分布式or集中式集中式架構(gòu)需要有meta server。讀操作先查meta server,再向data node查詢真正的數(shù)據(jù);寫操作除更新data node也可能要更新meta server。完全分布式讀寫則少了與meta server交互的過程。所以延時(shí)更低。且集中式,在數(shù)據(jù)量巨大或者壓力很大時(shí),meta server有可能成為性能瓶頸,目前有meta server分層、靜態(tài)子樹等解決方案。² Hbase:是集中式的,但客戶端維護(hù)meta server的緩存,一般讀寫時(shí)無需網(wǎng)絡(luò)查詢meta server,

20、所以從hbase這層看,集中式并不影響其性能。但hdfs層讀寫必須要name node參與,所以性能低些。Hbase+hdfs這種分層架構(gòu),有很多好處,但顯然性能會(huì)遜一籌。² Cassandra:是完全分布式的,客戶端可以連接任一臺(tái)node讀寫,這臺(tái)接入node通過一致性hash定位真正負(fù)責(zé)此次讀寫的node,再進(jìn)行讀寫。效率要比hbase高些。² Ceph:是完全分布式的,客戶端通過monitor server得到節(jié)點(diǎn)信息,緩存在本地,再通過crush算法,直接定位到主節(jié)點(diǎn)實(shí)現(xiàn)讀寫。這個(gè)角度看,ceph的效果比cassandra更高些。2) 單機(jī)存儲(chǔ)引擎分布式存儲(chǔ)一般采用

21、LSMT引擎,將隨機(jī)寫轉(zhuǎn)化為順序?qū)憀og和memtable(內(nèi)存)方式,能極大提高寫性能。讀操作,還是通過索引來提高性能。分布式存儲(chǔ)的數(shù)據(jù)模型一般是schema-less的,即不需要預(yù)先定義每行包括哪些列以及每個(gè)列的類型,多行之間允許包括不同的列;一般只有主key索引;不需考慮數(shù)據(jù)完整性約束(比如外鍵約束)、列類型約束、NOT NULL約束等;所以較適合用LSMT引擎實(shí)現(xiàn),關(guān)系數(shù)據(jù)庫則不太適合。Schema-less是分布式存儲(chǔ)一般性能較高的原因之一。圖7 LSMT² Hbase、cassandra、ceph都是wal的方式。順序?qū)懲阩ournal log后,寫實(shí)際數(shù)據(jù)。寫數(shù)據(jù)時(shí),h

22、base和cassandra是寫memtable(源自bigtable吧),更多的減少隨機(jī)寫硬盤。Ceph不是memtable的方式,直接寫文件系統(tǒng),并定時(shí)sync。Memtable的方式對(duì)小value更加友好,但需要引入的compaction,compaction帶來了更多的運(yùn)維工作。Ceph由于其塊兒存儲(chǔ)功能,經(jīng)常會(huì)修改一個(gè)對(duì)象的某一小段,如果用memtable的方式,即使修改一小段,也要重寫整個(gè)對(duì)象,效率比較低。7. 易運(yùn)維性主要是擴(kuò)容、頂替(一臺(tái)機(jī)器損壞,用另外一臺(tái)機(jī)器代替之,可能涉及到遷移數(shù)據(jù))、升級(jí)、盤故障(數(shù)據(jù)修復(fù))等操作的快速性和簡(jiǎn)單性。存儲(chǔ)機(jī)器一般是12*2T盤,現(xiàn)在極端一些有24*4T盤。單機(jī)存儲(chǔ)數(shù)據(jù)量是很大的。擴(kuò)容或者頂替一臺(tái)機(jī)器,一般也要幾個(gè)小時(shí)甚至1天的時(shí)間。在這段時(shí)間內(nèi)存儲(chǔ)系統(tǒng)是處于副本缺失狀態(tài)的,萬一這段時(shí)間好的副本又出問題,后果可能很嚴(yán)重;所以,要盡量避免數(shù)據(jù)遷移或者縮短遷移時(shí)間。1) 擴(kuò)容、頂替、升級(jí)² Hbase:不考慮hdfs的話,其擴(kuò)容、頂替更容易,因?yàn)椴簧婕斑w移數(shù)據(jù)。Hbase因單點(diǎn)問題,升級(jí)必然影響在線服務(wù),這一點(diǎn)是一直在努力優(yōu)化的,例如之前提到的region server standby機(jī)制,hdfs的name node的熱備機(jī)制。² Cassandr

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論