版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
NoSQL數(shù)據(jù)庫原理
第7章
Cassandra原理和使用Cassandra的特點ASF(apache軟件基金會)旗下開源軟件,目前由Datastax公司(為主)進(jìn)行維護(hù)環(huán)形對等架構(gòu),沒有主節(jié)點的概念,也沒有主節(jié)點失效的問題借鑒了亞馬遜的Dynamo系統(tǒng),在一致性模型等技術(shù)上有自己的特點,(在一些細(xì)節(jié)上存在差異)。Amazon公司的論文“Dynamo:Amazon'sHighlyAvailableKey-valueStore”,介紹了其研發(fā)的Dynamo分布式數(shù)據(jù)存儲系統(tǒng)的一些關(guān)鍵問題。底層仍是鍵值對結(jié)構(gòu)提供CQL語言,類似于SQL語言,簡單易用第7章Cassandra原理和使用7.1概述Dynamo是一個基于點對點模式的分布式鍵值對存儲系統(tǒng)。節(jié)點對稱。各個節(jié)點的角色、權(quán)重基本相同,簡化整個集群系統(tǒng)的配置和維護(hù)。去中心化。在對稱的基礎(chǔ)上,避免通過主節(jié)點對集群進(jìn)行集中控制。水平擴(kuò)展性。以主機(jī)為單位實現(xiàn)橫向擴(kuò)展,擴(kuò)展方式較簡單,擴(kuò)展對集群整體的影響較小。支持異構(gòu)設(shè)備。支持異構(gòu)設(shè)備指在擴(kuò)展節(jié)點時,可以使用和原節(jié)點配置不同(如性能更高)的主機(jī),即集群中可以存在多種配置的主機(jī)。采用多副本數(shù)據(jù)機(jī)制,但強(qiáng)調(diào)弱一致性和高可用性,即CAP理論中的AP。實際上Dynamo和Cassandra中的一致性和可用性權(quán)重是可以根據(jù)用戶策略調(diào)整的。采用基于鍵值對和列族等概念的數(shù)據(jù)模式。第7章Cassandra原理和使用7.2Cassandra的技術(shù)原理7.2.1AmazonDynamo的主要機(jī)制1.基于一致性哈希算法(或分布式哈希,DHT)的拓?fù)鋭澐钟?~n(例如0-255)的數(shù)字形成一個環(huán),每個數(shù)字是環(huán)上的一個“地址”0~255,即地址空間是256個。Dynamo實際地址空間為2的128次方。節(jié)點的地址,但并不是所有地址都對應(yīng)有實際的節(jié)點。新節(jié)點加入、舊節(jié)點退出不影響其他節(jié)點的地址和分布數(shù)據(jù)(哈希后)也映射到0~n的數(shù)值上。每個節(jié)點負(fù)責(zé)一定的區(qū)域,根據(jù)數(shù)據(jù)映射的數(shù)值,對應(yīng)到相應(yīng)節(jié)點,并由節(jié)點負(fù)責(zé)該數(shù)據(jù)的寫入和存儲、查詢和管理等。虛擬節(jié)點的概念每個節(jié)點根據(jù)能力不同,分為多個虛擬節(jié)點(即占用多個地址)。節(jié)點數(shù)量變多,更容易均勻分布。可以根據(jù)物理節(jié)點的能力不同,分成不同數(shù)量的虛擬節(jié)點。第7章Cassandra原理和使用7.2Cassandra的技術(shù)原理7.2.1AmazonDynamo的主要機(jī)制2.?dāng)?shù)據(jù)多副本每個節(jié)點處理存儲映射到自身負(fù)責(zé)區(qū)域的數(shù)據(jù),還需要將這些數(shù)據(jù)存儲到N-1個后繼節(jié)點中。通過首選列表確定節(jié)點存儲在不同的物理節(jié)點節(jié)點增減時,會影響節(jié)點的存儲范圍,但只會影響相鄰節(jié)點3.?dāng)?shù)據(jù)讀寫Dynamo中的任何節(jié)點都可以接收客戶端對key的任意讀寫操作,并將數(shù)據(jù)最終轉(zhuǎn)發(fā)存儲到協(xié)調(diào)器節(jié)點,讀寫請求則通過HTTP實現(xiàn)第7章Cassandra原理和使用7.2Cassandra的技術(shù)原理7.2.1AmazonDynamo的主要機(jī)制4.?dāng)?shù)據(jù)一致性用戶可以在(讀)寫完部分副本(設(shè)為R或W)而非全部N個副本時,就返回寫入成功出現(xiàn)部分節(jié)點故障時,提高系統(tǒng)可用性R、W、N可由用戶配置R、W為1,可用性最強(qiáng),一致性最差R、W為N,可用性最差,一致性最強(qiáng)在一致性要求高時,推薦R+W>N,而實時性要求高時,則R+W<N在實際應(yīng)用中,經(jīng)常設(shè)置為2、2、3第7章Cassandra原理和使用7.2Cassandra的技術(shù)原理7.2.1AmazonDynamo的主要機(jī)制5.集群成員管理Gossip協(xié)議:在一個有界網(wǎng)絡(luò)中,每個節(jié)點都隨機(jī)地與其他節(jié)點交換信息,經(jīng)過多輪無序的信息交換,最終所有節(jié)點的信息狀態(tài)都會達(dá)成一致。每隔一秒隨機(jī)尋找節(jié)點發(fā)起一次信息交換可能產(chǎn)生邏輯分裂。例如,A、B、C、D四個節(jié)點同時啟動,此時A和B交換信息,C和D交換信息,之后各個節(jié)點都認(rèn)為信息已經(jīng)同步,不再進(jìn)行信息交換,此時集群出現(xiàn)了兩個孤島。引入種子節(jié)點機(jī)制(SeedNode)各個節(jié)點還會定期通過Gossip協(xié)議向其他節(jié)點發(fā)送心跳信息(檢查節(jié)點失效情況)第7章Cassandra原理和使用7.2Cassandra的技術(shù)原理7.2.1AmazonDynamo的主要機(jī)制Cassandra和Dynamo“CassandraisthedaughterofAmazonDynamoDbandGoogleBigtable”Cassandra在分布式結(jié)構(gòu)設(shè)計上充分借鑒了Dynamo,如也采用了DHT環(huán)結(jié)構(gòu)、Gossip協(xié)議、暗示移交等機(jī)制Dynamo的數(shù)據(jù)模型更類似與“文檔型”,Cassandra的數(shù)據(jù)模型類似與HBase的鍵值對和面向列模型第7章Cassandra原理和使用7.2Cassandra的技術(shù)原理7.2.2Cassandra的數(shù)據(jù)模型具有行鍵、(多)列、列族、時間戳等概念,支持多個列行鍵和每個列形成一個“鍵值對”,因此一行數(shù)據(jù)(一個行鍵)可以對應(yīng)多個列如果當(dāng)前列沒存數(shù)據(jù)存儲,則不會預(yù)留存儲空間,這和關(guān)系型數(shù)據(jù)庫有所不同第7章Cassandra原理和使用7.2Cassandra的技術(shù)原理7.2.2Cassandra的數(shù)據(jù)模型具有超極列的概念超極列:包含多個普通列作為子列,但不能再包含超級列超級列族:內(nèi)容包含若干個超級列,不能包含普通列KeySpace:鍵空間在用戶層面可以操作鍵空間和數(shù)據(jù)表對應(yīng)鍵空間和列族等概念第7章Cassandra原理和使用7.2Cassandra的技術(shù)原理7.2.4其他相關(guān)技術(shù)原理Cassandra使用預(yù)寫日志機(jī)制,將單條目的寫入轉(zhuǎn)化為批量寫入,從而提升寫性能底層采用了一次寫入多次讀取,數(shù)據(jù)修改和刪除均采用更新版本(新時間戳)的方式進(jìn)行,即通過在相同行鍵下寫入新版本數(shù)值,或?qū)懭雱h除標(biāo)記實現(xiàn)。支持機(jī)架感知策略即對節(jié)點所處的機(jī)架位置進(jìn)行配置(一個機(jī)架可能共享一個網(wǎng)絡(luò)設(shè)備或一個電源設(shè)備),使得數(shù)據(jù)副本有可能分布在不同機(jī)架上,防止一個機(jī)架出現(xiàn)故障,導(dǎo)致全部數(shù)據(jù)無法訪問理論上Cassandra集群可以跨數(shù)據(jù)中心部署第7章Cassandra原理和使用7.2Cassandra的技術(shù)原理7.3.1單節(jié)點部署CassandraCassandra可以部署在Windows或Linux集群上需要適合的Java運行環(huán)境(推薦Java8版本)和網(wǎng)絡(luò)環(huán)境(IP地址、主機(jī)名、防火墻規(guī)則等)9042(默認(rèn)的CQL本地服務(wù)端口)、9160(默認(rèn)的Cassandra服務(wù)端口)、7000(Cassand集群內(nèi)節(jié)點間通信端口)、7199(CassandraJMX監(jiān)控端口)等端口在Centos上可以采用“yum”命令在線安裝最新穩(wěn)定版本第7章Cassandra原理和使用7.3Cassandra部署與配置7.3.1單節(jié)點部署CassandraCentos上的在線安裝方法編輯/etc/yum.repos.d/cassandra.repo”[cassandra]name=ApacheCassandrabaseurl=/dist/cassandra/redhat/311x/gpgcheck=1repo_gpgcheck=1gpgkey=/dist/cassandra/KEYS執(zhí)行:yum-yinstallCassandra第7章Cassandra原理和使用7.3Cassandra部署與配置也可以在官網(wǎng)直接下載軟件包解壓并進(jìn)行后續(xù)配置,但此時程序的啟動方式和相關(guān)路徑與yum安裝時有所不同7.3.2Cassandra的配置文件前文“Yum”安裝后的/etc/Cassandra/conf目錄,或直接解壓軟件包,得到conf目錄,存放各類配置文件主要配置文件為cassandra.yaml第7章Cassandra原理和使用7.3Cassandra部署與配置cassandra.yaml7.3.2Cassandra的配置文件cassandra.yamlcluster_name:'TestCluster’num_tokens:256partitioner:org.apache.cassandra.dht.Murmur3Partitionerhinted_handoff_enabled:truedata_file_directories:/var/lib/cassandra/datacommitlog_directory:/var/lib/cassandra/commitloghints_directory:/var/lib/cassandra/hintssaved_caches_directory:/var/lib/cassandra/saved_cacheslisten_address:<ip-adress>,表示當(dāng)前節(jié)點的監(jiān)聽地址(本節(jié)點地址)第7章Cassandra原理和使用7.3Cassandra部署與配置7.3.2Cassandra的配置文件cassandra.yamlseed_provider:-class_name:org.apache.cassandra.locator.SimpleSeedProviderparameters:#seedsisactuallyacomma-delimitedlistofaddresses.#Ex:"<ip1>,<ip2>,<ip3>"-seeds:"80"表示配置種子節(jié)點的生成規(guī)則(上述為默認(rèn)規(guī)則)和編輯種子節(jié)點的列表,根據(jù)注釋提示,多個種子列表之間以逗號分割,列表整體用雙括號包括。配置文件cassandra-env.sh包含了對腳本環(huán)境變量的配置,作用類似于前文提到的hadoop-env.sh或hbase-env.sh。第7章Cassandra原理和使用7.3Cassandra部署與配置7.3.3啟動Cassandra在CentOS7上使用yum方式安裝,可以參考如下命令。重新加載系統(tǒng)守護(hù)程序:systemctldaemon-reload啟動Cassandra:systemctlstartCassandra如果需要重新啟動Cassandra:systemctlrestartCassandra如果希望Cassandra隨系統(tǒng)自動啟動,則可運行:systemctlenablecassandra執(zhí)行啟動命令后,可以通過下列命令查看運行效果:nodetoolinfonodetoolstatus第7章Cassandra原理和使用7.3Cassandra部署與配置7.3.3啟動Cassandra第7章Cassandra原理和使用7.3Cassandra部署與配置7.3.4Cassandra集群功能簡介前提確認(rèn)各個節(jié)點之間的網(wǎng)絡(luò)互通。在各個節(jié)點上安裝相同版本的Cassandra軟件。在各個節(jié)點的cassandra.yaml中進(jìn)行如下配置。配置項:cluster_name:各個節(jié)點的集群名稱必須是相同的。-seeds:在各個節(jié)點上配置一系列相同的種子節(jié)點,各個節(jié)點上的種子節(jié)點列表可以是不同的。在已經(jīng)存在的Cassandra集群中加入新節(jié)點,配置過程也是一樣的第7章Cassandra原理和使用7.3Cassandra部署與配置7.4.1cqlsh環(huán)境簡介CQL(CassandraQuerylanguage)CQL的shell環(huán)境:cqlshCassandra提供了“SQL”語言支持,即相應(yīng)的命令行環(huán)境,以適應(yīng)傳統(tǒng)數(shù)據(jù)庫操作者的習(xí)慣但受限于底層數(shù)據(jù)結(jié)構(gòu),無法真正實現(xiàn)對SQL語言的支持,只是“l(fā)ikeSQL”第7章Cassandra原理和使用7.4CQL語言與cqlsh環(huán)境和關(guān)系型數(shù)據(jù)庫相比不支持批量寫入(包括insert、update或delete)。不支持join查詢。不支持事務(wù)、鎖等機(jī)制。不支持groupby、having、max、min、sum、distinct等分組聚合查詢語法。條件查詢時的限制較多。7.4.1cqlsh環(huán)境簡介CQL的shell環(huán)境:cqlsh進(jìn)入shell環(huán)境:cqlsh<ip-address>從cqlshshell環(huán)境中退出:exit在shell環(huán)境中查看CQL所支持的所有功能:Help查看版本信息(cqlsh、Cassandra和CQL等的版本):showversion;描述集群信息(集群的名稱和所使用的環(huán)地址分區(qū)算法):describecluster;查看鍵空間列表(類似于查看數(shù)據(jù)庫列表):desckeyspaces;清空之前屏幕顯示的信息,執(zhí)行:Clear;第7章Cassandra原理和使用7.4CQL語言與cqlsh環(huán)境7.4.1cqlsh環(huán)境簡介第7章Cassandra原理和使用7.4CQL語言與cqlsh環(huán)境常見的CQL命令列表7.4.1cqlsh環(huán)境簡介可以將多條CQL語句保存成文本文件(.cql文件)。.cql文件可以在系統(tǒng)命令行中被執(zhí)行:cqlsh--file'file_name’并在cqlsh環(huán)境中利用SOURCE命令執(zhí)行:SOURCE'file_name'第7章Cassandra原理和使用7.4CQL語言與cqlsh環(huán)境7.4.2鍵空間管理類似于關(guān)系型數(shù)據(jù)庫中“數(shù)據(jù)庫”的概念系統(tǒng)鍵空間system_schema:存儲集群狀態(tài)和配置信息等鍵空間的基本屬性名稱、副本復(fù)制策略和復(fù)制因子創(chuàng)建鍵空間(名稱為ks1)的基本語句CREATEKEYSPACEks1WITHREPLICATION={'class':'SimpleStrategy',':'1’};SimpleStrategy即為為副本復(fù)制策略,即在單數(shù)據(jù)中心情況下的“順時針復(fù)制”策略;復(fù)制因子(replication_factor)設(shè)置為1第7章Cassandra原理和使用7.4CQL語言與cqlsh環(huán)境7.4.2鍵空間管理創(chuàng)建鍵空間(名稱為ks1)的詳細(xì)語句CREATEKEYSPACEks1WITHREPLICATION={'class':'NetworkTopologyStrategy','dc1':3,'dc2':2}ANDDURABLE_WRITES=false;副本復(fù)制策略“NetworkTopologyStrategy”,即可以跨數(shù)據(jù)中心的二級機(jī)架感知策略,此時還需要配置[,'<datacenter>':<integer>,'<datacenter>':<integer>]…分別指示每個數(shù)據(jù)中心的數(shù)據(jù)副本數(shù)量Durable_writes:是否使用預(yù)寫日志,跨數(shù)據(jù)中心時,可以關(guān)閉,降低數(shù)據(jù)傳輸量第7章Cassandra原理和使用7.4CQL語言與cqlsh環(huán)境7.4.2鍵空間管理刪除鍵空間dropkeyspaceks1;查看鍵空間列表describekeyspaces;描述特定的鍵空間信息describekeyspace<keyspacename>;使用/切換鍵空間use<keyspacename>;修改鍵空間屬性(修改復(fù)制因子數(shù)量)ALTERKEYSPACEks1WITHREPLICATION={'class':'SimpleStrategy','replication_factor':'2’};鍵空間必須是已經(jīng)存在的第7章Cassandra原理和使用7.4CQL語言與cqlsh環(huán)境7.4.3數(shù)據(jù)表管理切換鍵空間:useks1;查看ks1鍵空間中的所有表:desctables;或者在系統(tǒng)鍵空間(system_schema)下,執(zhí)行:SELECT*FROMsystem_schema.tablesWHEREkeyspace_name='ks1’;建立一個示例表:CREATETABLEaddress(nametextPRIMARYKEY,phonelist<text>);或:CREATETABLEaddress(nametext,phonelist<text>,PRIMARYKEY(name));name為主鍵(底層為行鍵),類型為字符串(text)Phone為一個字符串的list列表類型第7章Cassandra原理和使用7.4CQL語言與cqlsh環(huán)境7.4.3數(shù)據(jù)表管理使用復(fù)合型主鍵建表:CREATETABLEaddress_2(nametext,Noint,phonelist<text>,PRIMARYKEY(name,No));分區(qū)和分區(qū)鍵(partitionkey):分區(qū)是指對大數(shù)據(jù)表進(jìn)行橫向分割(即HBase中的Region),分區(qū)的依據(jù)則是分區(qū)鍵的散列值,具有相同分區(qū)鍵的數(shù)據(jù)將存儲在同一個數(shù)據(jù)分區(qū)分區(qū)鍵是復(fù)合主鍵(的一部分),分區(qū)鍵也可以指定為復(fù)合列。CREATETABLEaddress_3(firstnametext,lastnametext,Noint,phonelist<text>,PRIMARYKEY((firstname,lastname),No));firstname、lastname和No作為復(fù)合主鍵,且firstname、lastname作為復(fù)合的分區(qū)鍵,No為分簇鍵。第7章Cassandra原理和使用7.4CQL語言與cqlsh環(huán)境7.4.3數(shù)據(jù)表管理復(fù)合主鍵的其他部分為分簇鍵(列)。分簇列是主鍵的一部分,但不作為分區(qū)依據(jù),只作為分區(qū)之內(nèi)(或節(jié)點之內(nèi))的排序依據(jù),分簇列在全局上是無序的。在采用復(fù)合主鍵時,還可以采用下列語句定義分簇列(ClusteringKey):CREATETABLEaddress_4(nametext,Noint,phonelist<text>,PRIMARYKEY(name,No))WITHCLUSTERINGORDERBY(NoDESC);DESC表示在一個分區(qū)內(nèi),按No列降序排列在理論上主鍵、分區(qū)鍵和分簇鍵等都屬于行鍵(key)的一部分。第7章Cassandra原理和使用7.4CQL語言與cqlsh環(huán)境7.4.3數(shù)據(jù)表管理查看表結(jié)構(gòu)(address為表名):desctableaddress;修改表結(jié)構(gòu)添加一列:ALTERTABLEaddressADDageint;修改布隆過濾器誤報率:ALTERTABLEaddresswithbloom_filter_fp_chance=0.01刪除數(shù)據(jù)并重建表(address為表名)TRUNCATEaddress
;
第7章Cassandra原理和使用7.4CQL語言與cqlsh環(huán)境7.4.4CQL的數(shù)據(jù)類型1.原生類型:字符串、整型、浮點型等(1)字符串a(chǎn)scii:ASCII格式字符串text/varchar:UTF8編碼字符串(2)整型tinyint:8位有符號長整型smallint:16位有符號長整型int:32位有符號長整型bigint:64位有符號長整型varint:任意精度整數(shù)整型(3)浮點型decimal:可變精度十進(jìn)制float:32位浮點(IEEE-754二進(jìn)位浮點數(shù)算術(shù)標(biāo)準(zhǔn))double:64位浮點(IEEE-754二進(jìn)位浮點數(shù)算術(shù)標(biāo)準(zhǔn))第7章Cassandra原理和使用7.4CQL語言與cqlsh環(huán)境7.4.4CQL的數(shù)據(jù)類型(4)時間型date:日期(沒有相應(yīng)的時間值)格式為:yyyy-mm-ddtime:毫秒精度的時間(沒有相應(yīng)的日期值)。一般格式為:HH:MM:SS[.fff],.fff為毫秒數(shù),在賦值時為可選值timestamp:時間戳(日期和時間),精度為毫秒。timeuuid:基于時間的UUIDduration:持續(xù)時間,使用ISO8601格式:類似于1y2mo3d1h30m15s100ms形式,Cassandra無法完全保證duration格式數(shù)據(jù)的意義,因而產(chǎn)生排序困難。例如,可能無法得知1mo和29d哪個更大,甚至也無法判斷1d和24h的大小,因此duration不能在表的主鍵中使用。第7章Cassandra原理和使用7.4CQL語言與cqlsh環(huán)境7.4.4CQL的數(shù)據(jù)類型(5)其他類型blob:任意字節(jié)數(shù)組boolean:true或falsecounter:計數(shù)器inet:IP地址,支持IPv4(4字節(jié)長)或IPv6(16字節(jié)長)uuid:長度為128位的UUID,一般采用TYPE4,即基于隨機(jī)數(shù)生成UUID。第7章Cassandra原理和使用7.4CQL語言與cqlsh環(huán)境UUID標(biāo)準(zhǔn)存在多種版本:基于時間的Type1;DCE安全Type2;基于名稱的Type3;隨機(jī)生成的Type4;7.4.4CQL的數(shù)據(jù)類型(1)Map(鍵值對集合)Map中的鍵是唯一的。建立鍵空間語句中的replication參數(shù)就是Map類型。內(nèi)容形式為:map<1:'apple',2:'banana',3:'cherry',……>聲明方式為:tagsmap<text,text>,表示tags是一系列鍵值對的集合,其中鍵和值都是text類型。Map支持根據(jù)鍵更新或刪除元素。(2)Set(唯一值集合)內(nèi)容形式為:set<'apple','banana','cherry',……>聲明方式為:tagsset<text>,表示tags是一個text類型的集合。(3)List(是非唯一值的順序集合)內(nèi)容形式為:list<'apple','banana','cherry','banana','cherry'……>聲明方式為:tagslist<text>,表示tags是一個text類型的列表,指明一個列表中的位置,即可操作執(zhí)行元素。第7章Cassandra原理和使用7.4CQL語言與cqlsh環(huán)境7.4.4CQL的數(shù)據(jù)類型(4)Frozen(集合的序列化)將前述集合型元素進(jìn)行序列化。在沒有進(jìn)行Frozen限定時,集合類型均可以對內(nèi)部的單個元素進(jìn)行操作,但Frozen限定后,就只能對整體進(jìn)行操作。3.用戶自定義類型:CREATETYPEscores(subjecttext,scoreint);用戶可以修改自定義類型(比如增加元素),刪除未被使用的自定義類型4.元組類型元組(tuple)類型可以看作是另一種用戶自定義類型。例如在建表語句中使用如下元組類型:CREATETABLEks1.testtable1(col1text,col2int,col3tuple<text,text>,PRIMARYKEY(col1,col2))其中,col3列被定義為一個元組類型,其中包含兩個元素,類型均為text。和UDT不同,元組不會定義各個元素的名字
。第7章Cassandra原理和使用7.4CQL語言與cqlsh環(huán)境7.5.1基本數(shù)據(jù)查詢SELECT語句:SELECTcolumn_listFROM[keyspace_name.]table_name[WHEREprinmary_key_conditions[ANDclustering_columns_conditions]]|PRIMARYKEYLIMIT基本查詢:SELECT*fromks1.testtable1;PERPARTITIONLIMIT子句:限制返回元素使用oderby和groupby子句來控制返回結(jié)果的順序和分組,但所涉及的列必須為主鍵列和底層的鍵值對結(jié)構(gòu)相對應(yīng)SELECT*fromks1.address_3wherefirstnamein('apple','banana','cherry')ANDlastnamein('apple','banana','cherry')orderbynoDESCPERPARTITIONlimit10;第7章Cassandra原理和使用7.5CQL數(shù)據(jù)查詢7.5.1基本數(shù)據(jù)查詢分頁顯示:PAGING[ON|OFF]顯示效果折疊:expandon;將返回結(jié)果顯示為JSON形式:SELECTjson*fromks1.address_3;聚合查詢Count():計數(shù)。Max()和Min():求最大和最小值。Sum():求和。Avg():求平均值。例如:SELECTCOUNT(*)FROMtesttable1;SELECTsum(col2)FROMtesttable1;第7章Cassandra原理和使用7.5CQL數(shù)據(jù)查詢7.5.2條件查詢利用WHERE子句可以在SELECT、UPDATE或DELETE語句中設(shè)置限定條件,但只針對主鍵。此外對于分區(qū)列、分簇列,其限制條件并不一樣。對于分區(qū)列,可以使用等于(=)、范圍比較(>、<、<=、>=)和存在(IN)三種條件。對分簇列進(jìn)行條件限制,則必須先對該分簇列之前的主鍵列(分區(qū)列或分簇列)使用等于(=)或存在(IN)條件,最后一個分簇列只支持等于(=)和范圍比較(=、>、<、<=、>=),不支持存在(IN)條件。如果不符合上述語句的條件查詢順序,Cassandra可能會報錯,并中止語句運行。如果分區(qū)列有多個,而where條件中只涉及部分分區(qū)列,Cassandra也會報同樣的錯誤??梢酝ㄟ^ALLOWFILTERING子句關(guān)閉一些限制第7章Cassandra原理和使用7.5CQL數(shù)據(jù)查詢7.5.2條件查詢理解分區(qū)鍵和分簇鍵的排序規(guī)則TABLEtest(keyint,col1int,col2int,col3int,col4int,PRIMARYKEY((key),col1,col2,col3,col4));第7章Cassandra原理和使用7.5CQL數(shù)據(jù)查詢key|col1|col2|col3|col4-----+-------+--------+-------+------100|1|1|1|1100|1|1|1|2100|1|1|1|3100|1|1|2|1100|1|1|2|2100|1|1|2|3100|1|2|2|1100|1|2|2|2100|1|2|2|3100|2|1|1|1100|2|1|1|2100|2|1|1|3100|2|1|2|1100|2|1|2|2100|2|1|2|3100|2|2|2|1100|2|2|2|2100|2|2|2|37.5.2條件查詢?yōu)榱吮苊鈼l件查詢時進(jìn)行大范圍掃描而引起的性能瓶頸,Cassandra會要求依次對key、col1、col2和col3使用等于、范圍或存在(IN)條件中的一種,col4則只允許使用等于或范圍條件。例如:SELECT*FROMtestWHEREkey=100ANDcol1IN(1,2)ANDcol2=1ANDcol3=1ANDcol4<=2;第7章Cassandra原理和使用7.5CQL數(shù)據(jù)查詢key|col1|col2|col3|col4-----+-----+---------+-------+-------------100|1|1|1|1100|1|1|1|2100|2|1|1|1100|2|1|1|27.5.2條件查詢where切片查詢:SELECT*FROMtestWHEREkey=100ANDcol1=1ANDcol2=1AND(col3,col4)>=(1,2)AND(col3,col4)<(2,3);該語句同時對col3到col4的范圍進(jìn)行限定,相當(dāng)于在行鍵或行鍵的前n個字節(jié)上進(jìn)行了切片。但下面語句是錯誤的:SELECT*FROMnumbersWHEREkey=100ANDcol_1=1AND(col_2,col_3,col_4)>=(1,1,2)AND(col_3,col_4)<(2,3);因為切片上下限所用的列是不一致的。第7章Cassandra原理和使用7.5CQL數(shù)據(jù)查詢7.5.3索引機(jī)制Cassandra可以對數(shù)據(jù)表建立一個或多個二級索引。這些索引可以使用在普通列、集合列等場景,但不能應(yīng)用在計數(shù)器列。這些列索引信息會維護(hù)在一個隱藏表中。對沒有建立索引的非主鍵列進(jìn)行條件查詢,系統(tǒng)會報錯“執(zhí)行效率無法預(yù)測……”解決方案1:select*fromaddresswhereage=1ALLOWFILTERING;可以屏蔽報錯,但執(zhí)行效率可能確實很低解決方案2:建立索引的語句CREATEINDEXindexofaddressONaddress(age);第7章Cassandra原理和使用7.5CQL數(shù)據(jù)查詢7.5.3索引機(jī)制刪除索引(indexofaddress):dropindexindexofaddress;一般情況下,索引會在后臺自動維護(hù),維護(hù)時不會阻塞讀寫操作。如果需要手動維護(hù)索引,可以在命令行下使用命令:nodetoolrebuild_index<keyspace><table><indexName>手動維護(hù)索引(indexofaddress),可以執(zhí)行:nodetoolrebuild_indexks1adressindexofadress關(guān)于該指令的詳細(xì)參數(shù)可用下面語句查詢:nodetoolhelprebuild_index注意nodetool命令不是在cqlsh環(huán)境中運行的,而是在操作系統(tǒng)的命令行環(huán)境中執(zhí)行。第7章Cassandra原理和使用7.5CQL數(shù)據(jù)查詢7.5.4使用標(biāo)量函數(shù)CAST顯示格式轉(zhuǎn)換:SELECTcast(col2astext)fromks1.testtable;writetime(column_name):返回結(jié)果的寫入時間(毫秒級時間戳)SELECTWRITETIME(col2)fromks1.testtable;注意該語句無法用于任何主鍵列,因為行鍵并沒有單獨的時間戳。TOKEN(column_name):根據(jù)列值計算哈希地址SELECTtoken(col2)fromks1.testtable1;TTL(column_name):顯示該列的生存期,僅針對鍵值對中的值(列),因此對于主鍵列無法使用。uuid():無參數(shù),用來在INSERT和UPDATE語句中生成uuid。第7章Cassandra原理和使用7.5CQL數(shù)據(jù)查詢7.6.1插入、更新和刪除數(shù)據(jù)插入INSERTINTO[keyspace_name.]table_name(column_list)VALUES(column_values)[IFNOTEXISTS][USINGTTLseconds|TIMESTAMPepoch_in_microseconds];text類型變量需要用單引號包括,Tuple類型需要用小括號包括其元素集合,各個元素之間用逗號隔開insertintoks1.testtable1(col1,col2,col3)values('sometext',1,('thekey','thevalue’));如果對相同主鍵的行進(jìn)行重復(fù)插入,則后插入的值會覆蓋之前的值。第7章Cassandra原理和使用7.6CQL數(shù)據(jù)更新7.6.1插入、更新和刪除數(shù)據(jù)更新UPDATE[keyspace_name.]table_name[USINGTTLtime_value|USINGTIMESTAMPtimestamp_value]SETassignment[,assignment,...]WHERErow_specification[IFEXISTS|IFcondition[ANDcondition]];示例如下:updateks1.testtable1setcol3=('newkey','newvalue')wherecol1='sometext'andcol2=1;第7章Cassandra原理和使用7.6CQL數(shù)據(jù)更新7.6.1插入、更新和刪除數(shù)據(jù)更新pdate語句不能更新主鍵,即col1和col2不能被更新,因為主鍵列在底層數(shù)據(jù)結(jié)構(gòu)中作為行鍵存儲,如果更改行鍵,則需要遍歷所有相關(guān)鍵值對,并進(jìn)行更新,這相當(dāng)于進(jìn)行了數(shù)據(jù)查找、數(shù)據(jù)刪除和新行插入,開銷可能很大。update的where條件必須為全部主鍵的限定條件,這是為了能夠直接找到完整的行鍵(限定條件),再更新相應(yīng)的值。如果需要對非主鍵進(jìn)行條件限定,則需要采用IF子句進(jìn)行限定,例如:updateks1.testtable1setcol3=('newkey2','newvalue2')wherecol1='sometext'andcol2=1IFcol3=('newkey','newvalue');第7章Cassandra原理和使用7.6CQL數(shù)據(jù)更新7.6.1插入、更新和刪除數(shù)據(jù)更新下面的例子采用了IFEXISTS條件,即存在符合條件的記錄時,才進(jìn)行更新:updateks1.testtable1setcol3=('newkey2','newvalue2')wherecol1='sometext'andcol2=1IFEXISTS;數(shù)據(jù)刪除DELETE[column_name(term)][,...]FROM[keyspace_name.]table_name[USINGTIMESTAMPtimestamp_value]WHEREPK_column_conditions[IFEXISTS|IFstatic_column_conditions];第7章Cassandra原理和使用7.6CQL數(shù)據(jù)更新7.6.1插入、更新和刪除數(shù)據(jù)刪除基本操作示例如下:deletecol3fromks1.testtable1wherecol1='sometext'andcol2=1;deletefromks1.testtable1wherecol1='othertext'andcol2=10;語句對where條件的要求和update中一致。由于Cassandra數(shù)據(jù)的每一個邏輯行由多個鍵值對構(gòu)成,因此在刪除時,既可以選擇刪除一個邏輯行,也可以選擇只刪除該行中的某幾個鍵值對。此時該行還有其他數(shù)據(jù)存在,被刪除單元會顯示為null。第7章Cassandra原理和使用7.6CQL數(shù)據(jù)更新7.6.1插入、更新和刪除插入JSONinsertintoks1.testtable1json'{"col1":"jsontext2","col2":2000,"col3":["1","2"]}’;不涉及的列會自動賦值為nullINSERT和UPDATE語句中可以加入一些可選條件:USINGTTLseconds規(guī)定了該條目數(shù)據(jù)的存活時間(seconds),到達(dá)時間后,該條目被自動設(shè)置為刪除狀態(tài),該數(shù)據(jù)默認(rèn)為0,即永遠(yuǎn)存活。TIMESTAMP規(guī)定是否采用指定時間戳(epoch_in_microseconds)作為新數(shù)據(jù)的時間戳,如果不指定,則系統(tǒng)自動將寫入時間作為新數(shù)據(jù)的時間戳。第7章Cassandra原理和使用7.6CQL數(shù)據(jù)更新7.6.1插入、更新和刪除批處理是指同時執(zhí)行一系列數(shù)據(jù)更改操作,這樣有助于減少客戶端和服務(wù)器之間的網(wǎng)絡(luò)交互。主要用于INSERT、UPDATE和DELETE等操作。語法如下所示:BEGINBATCH[USINGTIMESTAMPepoch_microseconds]INSERT……[USINGTIMESTAMP[epoch_microseconds]UPDATE……DELETE……APPLYBATCH;[USINGTIMESTAMPepoch_microseconds]是一個可選項,將所有數(shù)據(jù)操作的時間戳設(shè)置為指定內(nèi)容(微秒時間戳,形式如1481124356754405),如果不填寫此項,則被更新數(shù)據(jù)的時間戳為實際寫入時間。第7章Cassandra原理和使用7.6CQL數(shù)據(jù)更新7.6.2讀寫一致性第7章Cassandra原理和使用7.6CQL數(shù)據(jù)更新等級描述一致性可用性ALL必須成功讀寫數(shù)據(jù)的所有副本最高最低EACH_QUORUM在所有數(shù)據(jù)中心,執(zhí)行QUORUM策略(針對寫操作)
QUORUM在多副本中,成功讀寫半數(shù)以上的副本即判定操作成功,例如如果數(shù)據(jù)有三個副本,則讀取其中兩個
LOCAL_QUORUM局限在當(dāng)前(節(jié)點所在的)數(shù)據(jù)中心,執(zhí)行QUORUM策略。避免跨數(shù)據(jù)中心通信
ONE/TWO/THREE有1(或2、3)個節(jié)點(副本)操作成功,則判定操作成功,讀取時表示在多個數(shù)據(jù)副本中,只讀取1(或2、3)個副本ONE時最低(READ)ONE時最高(READ)LOCAL_ONE局限在當(dāng)前(節(jié)點所在的)數(shù)據(jù)中心,執(zhí)行ONE策略。避免跨數(shù)據(jù)中心通信
ANY確保一個副本被寫入成功,或者暗示移交數(shù)據(jù)被成功存儲,僅在寫操作中使用最低(WRITE)最高(WRITE)SERIAL僅在讀取中使用,系統(tǒng)會返回尚未提交的最新數(shù)據(jù)。當(dāng)采用該設(shè)置時,將無法在UPDATE和INSERT語句中使用IFNOTEXISTS或IFEXISTS子句
LOCAL_SERIAL僅在讀取中使用,系統(tǒng)會返回尚未提交的最新數(shù)據(jù),但只返回當(dāng)前數(shù)據(jù)中心的數(shù)據(jù)
7.6.2讀寫一致性當(dāng)設(shè)置一致性等級為ONE時,實際是選擇了CAP理論中的AP,即強(qiáng)調(diào)分布式數(shù)據(jù)的可用性(查詢效率);當(dāng)設(shè)置一致性等級為ALL時,則是選擇了CP,即強(qiáng)調(diào)數(shù)據(jù)的強(qiáng)(讀取)一致性。也就是說,Cassandra將權(quán)衡可用性與一致性的決定權(quán)交給了用戶。查看當(dāng)前一致性設(shè)置,在cqlsh中執(zhí)行:CONSISTENCY;將當(dāng)前環(huán)境的讀寫一致性設(shè)置為所需等級,執(zhí)行:CONSISTENCY[ONE|quorum|ALL|……];之后cqlsh中執(zhí)行的語句都將遵循該設(shè)置。第7章Cassandra原理和使用7.6CQL數(shù)據(jù)更新7.6.2讀寫一致性IF(子句)輕量級事務(wù):在滿足某個條件時執(zhí)行更新語句(INSERT、UPDATE或DELETE),這可以看作是一種輕量級事務(wù),或稱為CompareandSetCAS。insertintoks1.testtable1(col1,col2,col3)values('sometext',1,('anotherkey','anothervalue'))IFNOTEXISTS;where條件可以使用=、<、<=、>、>=、!=和IN等運算符。注意,在INSERT語句中使用IFNOTEXISTS條件時,不能使用USINGTIMESTAMP子句指定時間戳,此時時間戳由系統(tǒng)自動生成,并在CAS過程中應(yīng)用。updateks1.testtable1setcol3=('newkey2','newvalue2')wherecol1='sometext'andcol2=1IFcol3=('newkey','newvalue');注意col3是一個非主鍵列,可以使用IF子句第7章Cassandra原理和使用7.6CQL數(shù)據(jù)更新7.6.2讀寫一致性IF(子句)輕量級事務(wù)(CAS)CAS過程通過擴(kuò)展的PAXOS協(xié)議完成,這是一個4階段的分布式投票和協(xié)調(diào)過程,類似于在一個三階段提交協(xié)議的基礎(chǔ)上增加了讀取當(dāng)前行數(shù)據(jù)的節(jié)點,其更新效率比一般情況下更低。通過設(shè)置串行一致性級別可以調(diào)整CAS的運行策略。執(zhí)行:serialCONSISTENCY;查看當(dāng)前串行一致性設(shè)置。執(zhí)行:serialCONSISTENCY[Serial|LOCAL_serial];在多數(shù)據(jù)中心場景下,serial表示跨數(shù)據(jù)中心協(xié)調(diào),而LOCAL_serial表示在本數(shù)據(jù)中心的相關(guān)節(jié)點間協(xié)調(diào)。第7章Cassandra原理和使用7.6CQL數(shù)據(jù)更新7.6.2讀寫一致性IF(子句)輕量級事務(wù)(CAS)在多數(shù)據(jù)中心場景下,serial表示跨數(shù)據(jù)中心協(xié)調(diào),而LOCAL_serial表示在本數(shù)據(jù)中心的相關(guān)節(jié)點間協(xié)調(diào)。當(dāng)一致性條件(指CONSISTENCY)設(shè)置為serial時,無法使用IF條件IF條件還可以應(yīng)用在建立、修改或刪除鍵空間或數(shù)據(jù)表時:CREATEKEYSPACEIFNOTEXISTSks1WITHreplication={'class':'SimpleStrategy','replication_factor':1};DROPTABLEIFEXISTSks1.testtable;第7章Cassandra原理和使用7.6CQL數(shù)據(jù)更新7.6.3集合列操作集合列包括list、map和set3種類型,類似的還有tuple類型第7章Cassandra原理和使用7.6CQL數(shù)據(jù)更新7.6.3集合列操作集合列包括list、map和set3種類型的列,類似的還有tuple類型列l(wèi)ist、map和set類型的列如果是非frozen限定的(序列化),均無法作為主鍵,而元組(tuple)類型(col5)無此限制。CREATETABLEks1.testtable4(col1int,col2frozen<list<text>>,col3frozen<map<text,text>>,col4frozen<set<text>>,col5tuple<text,text>,PRIMARYKEY(col1,col2,col3,col4));tuple類型的列,沒有被設(shè)置為主鍵時,表結(jié)構(gòu)中會被自動加入frozen限定。第7章Cassandra原理和使用7.6CQL數(shù)據(jù)更新7.6.3集合列操作假設(shè)表ks1.testtable2結(jié)構(gòu)如下:TABLEks1.testtable2(col1intPRIMARYKEY,col2list<text>,col3map<text,text>,col4set<text>,col5frozen<tuple<text,text>>)插入一行值如下:INSERTINTOks1.testtable2(col1,col2,col3,col4,col5)values(1,['apple','apple','banana','cherry','banana'],{'1':'apple','1':'banana','3':'cherry','4':'cherry'},{'apple','banana','cherry','apple'},('apple','banana'))第7章Cassandra原理和使用7.6CQL數(shù)據(jù)更新7.6.3集合列操作格式總結(jié)如下:list類型:插入值時用方括號包括值的集合,元素用逗號分隔,集合中可以存在重復(fù)的值。更新/刪除list類型的列,可以根據(jù)位置更新一個元素(注意第一個位置是0)map類型:插入值時用大括號包括值的集合,元素用逗號分隔,鍵值對用冒號分隔。鍵必須是無重復(fù)的,否則后寫入的鍵值對會覆蓋先寫入的。值可以重復(fù)。Map類型可以根據(jù)鍵來進(jìn)行更新和刪除,鍵應(yīng)該是唯一的set類型:插入值時用大括號包括值的集合,元素用逗號分隔。值必須是唯一的,重復(fù)寫入的值只會寫入一次。更新set類型,可以增加元素,或刪減特定元素的方式進(jìn)行第7章Cassandra原理和使用7.6CQL數(shù)據(jù)更新7.6.3集合列操作格式總結(jié)如下:list類型:插入值時用方括號包括值的集合,元素用逗號分隔,集合中可以存在重復(fù)的值。更新/刪除list類型的列,可以根據(jù)位置更新一個元素(注意第一個位置是0)map類型:插入值時用大括號包括值的集合,元素用逗號分隔,鍵值對用冒號分隔。鍵必須是無重復(fù)的,否則后寫入的鍵值對會覆蓋先寫入的。值可以重復(fù)。Map類型可以根據(jù)鍵來進(jìn)行更新和刪除,鍵應(yīng)該是唯一的set類型:插入值時用大括號包括值的集合,元素用逗號分隔。值必須是唯一的,重復(fù)寫入的值只會寫入一次。更新set類型,可以增加元素,或刪減特定元素的方式進(jìn)行第7章Cassandra原理和使用7.6CQL數(shù)據(jù)更新7.6.3集合列操作元組類型和用戶自定義類型元組類型一般只進(jìn)行整體操作;對于沒有frozen限定的UDT列,可以進(jìn)行單個元素的操作。UDT類型必須整體被刪除,無法只刪除其中一個元素。此外,當(dāng)UDT中含有集合類型時,必須在建表時使用frozen限定,只能對其整體進(jìn)行操作。定義UDT:CREATETYPEt1(item1text,item2int);插入:INSERTINTOks1.testtable5(col1,col2)values(1,{item1:'apple',item2:1});一個UDT整體更新:UPDATEks1.testtable5setcol2={item1:'bigapple',item2:2}WHEREcol1=1;第7章Cassandra原理和使用7.6CQL數(shù)據(jù)更新7.6.4計數(shù)器列的操作計數(shù)器列不能作為主鍵,且計數(shù)器列不能建立索引。計數(shù)器列只能通過update更新(累加)數(shù)據(jù),不能使用insert方法直接為其賦值。表test_counter:CREATETABLEtest_counter(idintPRIMARYKEY,numcounter);更新方法為:UPDATEtest_counterSETnum=num+1WHEREid=1;重復(fù)執(zhí)行上述語句,則在id=1這一行中,num數(shù)值不斷增加。此外,計數(shù)器列采用64位整數(shù)進(jìn)行技數(shù),每次可以添加任意數(shù)值,但添加的內(nèi)容不能是時間戳或uuid等類型
。第7章Cassandra原理和使用7.6CQL數(shù)據(jù)更新7.6.5日期時間列的操作下列日期時間轉(zhuǎn)換函數(shù),可以用在SELECT、UPDATE和INSERT等語句中:now():返回時間性uuid(timeuuid格式)。TODATE(timeuuid)或TODATE(timestamp):轉(zhuǎn)換為日期。Dateof(timeuuid)或TODATE(timestamp):轉(zhuǎn)換為完整日期和時間。該函數(shù)在新版本CQL中不建議使用。TOTIMESTAMP(timeuuid)或TOTIMESTAMP(date):轉(zhuǎn)換為時間戳。toUnixTimestamp(timeuuid)或toUnixTimestamp(date):轉(zhuǎn)換為UNIX時間戳,精度為毫秒級,格式為64位。minTimeUuid/maxTimeUuid:根據(jù)日期或更精確一些的時間計算一個大于或小于該時間的模擬timeuuid(并非基于真實時間)。第7章Cassandra原理和使用7.6CQL數(shù)據(jù)更新7.6.5日期時間列的操作部分顯示效果Timestamp類型:2018-05-0220:01:30.778000+0000timeuuid類型:0b0d2181-4e45-11e8-80fb-c9cbb16b0456bigint類型
存儲的toTimestamp(now():1525291290779system.todate(timeuuid)類型:2018-04-30system.totimestamp(timeuuid):2018-04-3016:00:00.000000+0000第7章Cassandra原理和使用7.6CQL數(shù)據(jù)更新7.6.5日期時間列的操作時間的賦值(timeuuid)SETcol3='8929270f-4c8f-11e8-7f7f-7f7f7f7f7f7f‘
(date)SETcol5='2018-05-01’(time)SETcol6=‘07:00:00’或SETcol6='07:00:00.000’(duration)SETcol6=1h30m15s100ms第7章Cassandra原理和使用7.6CQL數(shù)據(jù)更新7.6.6批量導(dǎo)入/導(dǎo)出數(shù)據(jù)支持表中數(shù)據(jù)導(dǎo)出到CSVCOPYtable_name[(column_list)]TO'file_name'[,'file2_name',...]|STDOUT[WITHoption='value'[AND...]]COPYks1.testtable1(col1,col2)TO'./testtable1.csv'WITHHEADER=TRUE;支持CSV、TSV或其他符號隔開的行列結(jié)構(gòu)文本文件導(dǎo)入到表中COPYtable_name[(column_list)]FROM'file_name'[,'file2_name',...]|STDIN[WITHoption='value'[AND...]]COPYks1.testtable1(col1,col2)FROM'./testtable1.csv'WITHHEADER=TRUE;第7章Cassandra原理和使用7.6CQL數(shù)據(jù)更新7.6.6批量導(dǎo)入/導(dǎo)出數(shù)據(jù)COPYks1.testtable1(col1,col2)FROM'./testtable1.csv'WITHDELIMITER='|'ANDHEADER=TRUE;DELIMITER=‘|’指示分隔符(ASCII字符)HEADER=TRUE;表示導(dǎo)出/導(dǎo)入文件第一行是表頭(列名)第7章Cassandra原理和使用7.6CQL數(shù)據(jù)更新7.7.1通過Python訪問CassandraCassandra提供了Thrift接口,并支持C/C++、C#、PHP、Node.js、Ruby和Python等多種語言。對于Python語言,可以使用cassandra-driver驅(qū)動組件簡化連接過程,該組件屏蔽thrift接口的實現(xiàn)細(xì)節(jié),用戶可以實現(xiàn)對數(shù)據(jù)庫的透明訪問。該驅(qū)動組件由DATASTAX公司開發(fā),并托管到github上,開源免費,可以采用pip方式進(jìn)行安裝:pipinstallcassandra-driver由于Cassandra使用CQL語言操作數(shù)據(jù)庫,因此通過Python3.x進(jìn)行訪問的過程,實際就是建立和數(shù)據(jù)庫的連接之后,發(fā)送CQL語句,并獲取返回結(jié)果的過程。第7章Cassandra原理和使用7.7編程訪問Cassandra
7.7.1通過Python訪問Cassandra(1)建立連接 fromcassa
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 修路掛靠合同范例
- 曲靖稅務(wù)顧問合同范例
- 水泵組采購合同范例
- 激光加工類合同范例
- 潤滑油購油合同范例
- 育苗廠轉(zhuǎn)讓合同范例
- 股東合股協(xié)議合同范例
- 全屋定制合同設(shè)計合同范例
- 移動電源合同范例
- 其他設(shè)備采購合同范例
- 洛陽市2023-2024學(xué)年九年級上學(xué)期期末考試英語試題和答案
- 砂漿行業(yè)銷售技巧分析
- 腸道門診管理課件
- 小學(xué)禁毒教育教學(xué)大綱
- 北京市房山區(qū)2023-2024學(xué)年三年級上學(xué)期期末數(shù)學(xué)試卷
- 2024年中考英語二輪復(fù)習(xí)學(xué)案連詞
- 《中國建筑股份有限公司施工企業(yè)質(zhì)量管理辦法》
- 肛腸科患者的疼痛管理策略與實踐經(jīng)驗
- 風(fēng)電項目投資計劃書
- 山東省醫(yī)療收費目錄
- JGT266-2011 泡沫混凝土標(biāo)準(zhǔn)規(guī)范
評論
0/150
提交評論