Cassandra是一款分布式的結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)方案(NoSql數(shù)據(jù)庫),存儲(chǔ)結(jié)構(gòu)比Key-Value數(shù)據(jù)庫(像redis)更豐富,但是比Document數(shù)據(jù)庫(如MongoDB)支持度有限;適合做數(shù)據(jù)分析或數(shù)據(jù)倉庫這類需要迅速查找且數(shù)據(jù)量大的應(yīng)用.
Cassandra 集群特性比較豐富,考慮場(chǎng)景也比較多,如果想用好集群,集群本很多概念都要能夠了解,下面對(duì)相關(guān)概念進(jìn)行簡(jiǎn)介;
創(chuàng)新互聯(lián)建站-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比浦北網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式浦北網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋浦北地區(qū)。費(fèi)用合理售后完善,十余年實(shí)體公司更值得信賴。
keyspace -> table –> column,對(duì)應(yīng)關(guān)系型數(shù)據(jù)庫 database -> table -> column
cluster_name:集群名,同一集群的多個(gè)節(jié)點(diǎn),集群名要一致;
seeds: 種子節(jié)點(diǎn),集群中的全部機(jī)器的ip,以逗號(hào)隔開;
storage_port: Cassandra服務(wù)器與服務(wù)器之間連接的端口號(hào),一般不需要修改,但要保證此端口上沒有防火墻;
listen_address: Cassandra集群中服務(wù)器與服務(wù)器之間相互通信的地址。如果留空,將默認(rèn)使用服務(wù)器的機(jī)器名;
native_transport_port: 默認(rèn)的CQL本地服務(wù)端口,本地的cql客戶端與服務(wù)器交互的端口;
7000作為集群通信端口(如果開啟了SSL就是7001端口)。
9042端口用于native協(xié)議的客戶端連接。
7199端口用于JMX,
9160端口用于廢棄的Thrift接口
data_file_directories: 數(shù)據(jù)文件存放的目錄,一個(gè)或多個(gè)
commitlog_directory: 提交信息的日志文件存放的目錄
saved_caches_directory: 緩存存放的目錄
有多個(gè)Rack組成的邏輯集合。比如同一棟樓里互相連接的機(jī)器
一個(gè)邏輯集合,有多個(gè)彼此臨近node的組成。比如一個(gè)機(jī)架上的所有物理機(jī)器。
Gossip是一種p2p協(xié)議,用于failure detection,跟蹤其他節(jié)點(diǎn)的狀態(tài),每秒運(yùn)行一次。
運(yùn)用Phi Accrual Failure Detection實(shí)現(xiàn)failure detection
計(jì)算出一個(gè)結(jié)果level of suspicion,表示節(jié)點(diǎn)失敗的可能性。
具有靈活性,同時(shí)也避免了傳統(tǒng)heartbeat的不可靠。應(yīng)為可能只是短暫的網(wǎng)絡(luò)擁塞,尤其是在公有云上。
snitch定義了集群中每個(gè)節(jié)點(diǎn)相對(duì)其他節(jié)點(diǎn)的鄰近度, 以此來確定從哪個(gè)節(jié)點(diǎn)讀取和寫入。
一般采用手動(dòng)定義的模式,在cassandra.yaml配置為endpoint_snitch: GossipingPropertyFileSnitch
同時(shí)在cassandra-rackdc.properties配置當(dāng)前節(jié)點(diǎn)的dc和rack,比如
Cassandra表示由集群管理的數(shù)據(jù)作為一個(gè)環(huán)。環(huán)中的每個(gè)節(jié)點(diǎn)被分配一個(gè)或多個(gè)由token描述的數(shù)據(jù)范圍,確定在環(huán)中的位置。token是用于標(biāo)識(shí)每個(gè)分區(qū)的64位整數(shù)ID,范圍是-2^63 -- 2^63-1
通過hash算法計(jì)算partition key的hash值,以此確定存放在哪個(gè)節(jié)點(diǎn)
virtual node的概念簡(jiǎn)稱vnode,原先的token范圍被縮減為多個(gè)更小的token范圍。每個(gè)節(jié)點(diǎn)包含多個(gè)token范圍。默認(rèn)每個(gè)節(jié)點(diǎn)產(chǎn)生256個(gè)token范圍(通過num_tokens調(diào)節(jié)),也就是256個(gè)vnode。在2.0以后默認(rèn)開啟。在性能差的節(jié)點(diǎn)上,可以適當(dāng)減少num_tokens的值。
partitioners決定數(shù)據(jù)存放在哪個(gè)vnode上。它是一個(gè)hash函數(shù),計(jì)算每行的partition key的hash值。
代碼在org.apache.cassandra.dht包里,目前主要用Murmur3Partitioner、DHT即為distributed hash table。
第一份復(fù)制存在對(duì)應(yīng)的vnode中。其他復(fù)制的存放位置由replica strategy(或叫replica placement strategy)決定
主要有兩種策略:
SimpleStrategy
將副本放置在環(huán)上的連續(xù)節(jié)點(diǎn)處,從分區(qū)器指示的節(jié)點(diǎn)開始。
NetworkTopologyStrategy
允許為每個(gè)數(shù)據(jù)中心指定不同的復(fù)制因子。在數(shù)據(jù)中心內(nèi),它將副本分配給不同的rack,以最大限度地提高可用性
根據(jù)CAP理論,一致性,可用性和分區(qū)容忍性不可兼得,cassandra通過設(shè)置讀寫時(shí)最少響應(yīng)節(jié)點(diǎn)的數(shù)量,實(shí)現(xiàn)了可調(diào)的一致性。
可選的一致性級(jí)別:ANY, ONE, TWO,THREE, QUORUM, ALL,其中QUORUM,ALL是強(qiáng)一致性。強(qiáng)一致性公式:R+W>N R:讀復(fù)制數(shù), W:寫復(fù)制數(shù),N:復(fù)制因子
可以連接任一節(jié)點(diǎn)來執(zhí)行讀寫操作,被連接的節(jié)點(diǎn)叫做Coordinator Nodes,需要處理讀寫一致性。比如:寫到多個(gè)節(jié)點(diǎn),從多個(gè)節(jié)點(diǎn)讀取
當(dāng)執(zhí)行一個(gè)寫操作時(shí),數(shù)據(jù)被直接寫到commit log文件,并將設(shè)置commit log中的dirty flag為1。然后將數(shù)據(jù)寫到內(nèi)存memtable,每個(gè)memtable對(duì)應(yīng)一個(gè)表,當(dāng)memtable的大小達(dá)到一個(gè)限值后會(huì)被寫入磁盤SSTable,然后將commit log中的dirty flag設(shè)為0
有三種cache:
key cache
緩存partiton keys到row index entries的映射,存在jvm heap
row cache
緩存常用的row,存在off heap
counter cache
提升counter性能
一種寫入高可用特性,當(dāng)寫入請(qǐng)求發(fā)給coordinator是,replica節(jié)點(diǎn)可能因?yàn)榉N種原因不可用(網(wǎng)絡(luò)、硬件等),此時(shí)coordinator會(huì)臨時(shí)保存寫請(qǐng)求,等到replica節(jié)點(diǎn)重新上線時(shí)再寫入。默認(rèn)保留兩個(gè)小時(shí)
SStables文件是不可修改的。刪除數(shù)據(jù)被當(dāng)做一個(gè)update,會(huì)被更新為tombstone。在compact運(yùn)行之前,它可以抑制原來的值。
設(shè)置中:Garbage Collection Grace Seconds(GCGraceSeconds),默認(rèn)864,000,10天。
會(huì)清理超過這個(gè)時(shí)間的tombstones。當(dāng)節(jié)點(diǎn)不可用時(shí)間超過這個(gè)這個(gè)時(shí)間,會(huì)被替換
是個(gè)快速的、非確定性算法,用于確定測(cè)試元素是否在集合中。以此降低不必要的磁盤讀取。可能得到一個(gè)false-positive結(jié)果。通過將數(shù)據(jù)集映射到bit array上,一種特殊的緩存。
SSTables是不可變的,通過compaction。重新生成一個(gè)新的SSTable文件(此文件中不包含不需要的數(shù)據(jù),比如被刪除的數(shù)據(jù))
三種策略:
SizeTieredCompactionStrategy (STCS)
默認(rèn)的策略,寫密集型
LeveledCompactionStrategy (LCS)
讀密集型
DateTieredCompactionStrategy (DTCS)
用于基于時(shí)間或日期的數(shù)據(jù)
assandra使用Anti-Entropy協(xié)議,這是一種用于修復(fù)復(fù)制集數(shù)據(jù)的gossip協(xié)議
有兩種情況
read repair
讀取時(shí)發(fā)現(xiàn)有不是最新的數(shù)據(jù)。此時(shí)開始修復(fù)
Anti-Entropy repair
通過nodetool手動(dòng)運(yùn)行修復(fù)
Merkle Trees來源于Ralph Merkle,也叫做hash tree,是一種二叉樹。每個(gè)父節(jié)點(diǎn)是它直接子節(jié)點(diǎn)的hash值,用于減少網(wǎng)絡(luò)I/O。
cassandra采用分階段事件驅(qū)動(dòng)架構(gòu),SEDA: An Architecture for Well-Conditioned, Scalable Internet Services
一個(gè)stage由事件隊(duì)列、事件處理器和線程池組成
controller決定stage的調(diào)度和線程申請(qǐng)。主要代碼在org.apache.cassandra.concurrent.StageManager
以下操作都是作為stage來執(zhí)行的
Read (local reads)
Mutation (local writes)
Gossip
Request/response (interactions with other nodes)
Anti-entropy (nodetool repair)
Read repair
Migration (making schema changes)
Hinted handoff
system_traces
system_schema
keyspaces
tables
columns
存儲(chǔ)kespace,table,column的定義
- materialized_views
存儲(chǔ)可用的view
- functions
用戶定義函數(shù)
- types
用戶自定義類型
- triggers
每個(gè)表的觸發(fā)配置
- aggregates
聚合定義
system_auth
system
local
peers
存儲(chǔ)節(jié)點(diǎn)信息
available_ranges
range_xfers
存儲(chǔ)token范圍
materialized_ views_builds_in_progres
built_materialized_views
跟蹤view的構(gòu)建
paxos
存儲(chǔ)paxos狀態(tài)
batchlog
存儲(chǔ) atomic batch操作的狀態(tài)
size_estimates
存儲(chǔ)每個(gè)表的分區(qū)的估計(jì)數(shù)量,用于hadoop集成
https://www.2cto.com/database/201802/717564.html
https://blog.csdn.net/zhuwinmin/article/details/76066642
https://segmentfault.com/a/1190000015610357