文章目錄
- 一、分佈式理論
- 二、cassandra體系結構
- 1、體系結構
- 2、存儲引擎
- 2、cassandra數據的讀寫操作原理
- 三、cassandra配置信息
- 四、cql常用操作
- 1、CREATE KEYSPACE
- 2、CREATE ROLE
- 3、grant
- 4、REVOKE
- 5、DROP ROLE
- 6、alter keyspace
- 7、alter role
- 8、alter table
- 9、alter type
- 10、list
- 11、truncate
- 五、nodetool常用操作
- nodetool status
- nodetool snapshot
- nodetool flush
- nodetool repair
- nodetool cleanup
- nodetool gossipinfo
- nodetool removenode
- nodetool netstats
- nodetool reloadseeds
- nodetool drain
- nodetool tablestats eo_cs.eo_name
- nodetool compactionstats
- nodetool enablebackup
- nodetool gcstats
- nodetool ring
- nodetool statushandoff
- 六、Gossip通信協議
一、分佈式理論
CAP定理
來源:https://zh.wikipedia.org/wiki/CAP定理
在理論計算機科學中,CAP定理(CAP theorem),又被稱作布魯爾定理(Brewer’s theorem),它指出對於一個分佈式計算系統來說,不可能同時滿足以下三點:
-
一致性(Consistency):等同於所有節點訪問同一份最新的數據副本。
-
可用性(Availability):每次請求都能獲取到非錯的響應——但是不保證獲取的數據爲最新數據。
-
分區容錯性(Partitiontolerance):以實際效果而言,分區相當於對通信的時限要求。系統如果不能在時限內達成數據一致性,就意味着發生了分區的情況,必須就當前操作在C和A之間做出選擇[3]。
根據定理,分佈式系統只能滿足三項中的兩項而不可能滿足全部三項[4]。理解CAP理論的最簡單方式是想象兩個節點分處分區兩側。允許至少一個節點更新狀態會導致數據不一致,即喪失了C性質。如果爲了保證數據一致性,將分區一側的節點設置爲不可用,那麼又喪失了A性質。除非兩個節點可以互相通信,才能既保證C又保證A,這又會導致喪失P性質。
BASE理論
-
基本可用(Basically Available):基本可用是指分佈式系統在出現故障的時候,允許損失部分可用性,即保證核心可用。在開發高併發系統時有三把利器用來保護系統:緩存、降級和限流。例如:電商大促時,爲了應對訪問量激增,部分用戶可能會被引導到降級頁面,服務層也可能只提供降級服務。這就是損失部分可用性的體現。
-
軟狀態( Soft State):軟狀態是指允許系統存在中間狀態,而該中間狀態不會影響系統整體可用性。分佈式存儲中一般一份數據至少會有三個副本,允許不同節點間副本同步的延時就是軟狀態的體現。mysql replication的異步複製也是一種體現。
-
最終一致性( Eventual Consistency):最終一致性是指系統中的所有數據副本經過一定時間後,最終能夠達到一致的狀態。弱一致性和強一致性相反,最終一致性是弱一致性的一種特殊情況。
數據模型
1.BigTable
2.Dynamo
二、cassandra體系結構
1、體系結構
關鍵組成部分:
- node:
- cluster
- Datacenter
- replication
- commit log
- SSTable
- tombstone /'tuːmstəʊn/
- CQL Table
- Gossip
- Partitioner 集羣中的節點之間均勻分配數據以實現負載平衡。
- replication factor
2、存儲引擎
cassandra是log-structured engine,數據存儲時,存儲引擎將插入和更新的數據分組存儲在內存中,並按照間隔順序將數據以附加模式寫入磁盤。一旦寫入磁盤,則數據就不可變,也不會被覆蓋。log-structured engine 可以避免覆蓋並使用順序I/O來更新數據,因此非常適合廉價的消費類SSD。
https://docs.datastax.com/en/ddac/doc/datastax_enterprise/dbArch/archPartitioners.html
2、cassandra數據的讀寫操作原理
https://docs.datastax.com/en/ddac/doc/datastax_enterprise/dbInternals/dbIntIntro.html
數據是如何寫的?
- 1、Logging data in the commit log
- 2、Writing data to the memtable
- 3、Flushing data from the memtable
- 4、Storing data on disk in SSTables
讀取請求流程?
如果壓縮
配置虛擬節點
https://docs.datastax.com/en/dse/5.1/dse-admin/datastax_enterprise/config/configVnodeTOC.html
啓用vnodes
在cassandra.yaml文件中:
1、取消註釋num_tokens並設置所需的令牌數。
2、(推薦)要使用分配算法,請取消註釋allocate_tokens_for_local_replication_factor ,並將其設置爲數據中心中鍵空間的目標複製因子。如果複製發生變化,則在複製因子(RF)設置之間切換。
3、註釋掉initial_token或保留未設置狀態。
要將現有羣集升級到vnode,請參閱在現有生產羣集上啓用虛擬節點。
禁用vnodes
在cassandra.yaml文件中:
1、註釋掉num_tokens和 allocate_tokens_for_local_replication_factor。
2、取消註釋initial_token並將其設置爲1 或多節點集羣的生成標記的值。
三、cassandra配置信息
1、jvm優化
調整java虛擬機jvm可以提高性能優化或減少高內存消耗。默認使用垃圾優先回收器(G1)。
java垃圾回收器的設置,在jvm.options文件中:
- 1、註釋掉GI Settings行,表示開啓GI
- 2、註釋掉 CMS Settings行,表示開啓CMS
對於使用G1的節點,DataStax建議儘可能大的MAX_HEAP_SIZE,最高64 GB。
參考:https://docs.datastax.com/en/ddac/doc/datastax_enterprise/operations/opsTuneJVM.html
2、cassandra.yaml
常用參數的配置:
- listen_address:默認值是localhost,數據庫綁定ip或主機名,用於將此節點鏈接到其他節點。注意:禁止listen_address設置爲0.0.0.0,不能同時設置listen_address或listen_interface。
- commitlog_directory:存儲提交日誌的目錄。
- seed_provider:指定集羣的seeds
- data_file_directories:存儲表叔的目錄位置。
- saved_caches_directory:存儲表鍵和行高速緩存的目錄位置
- incremental_backups:默認值false,備份上次拍攝快照以來更新的數據。
性能屬性:
- commitlog_sync:默認值periodic,用於以毫秒爲單位確認寫入。
- commitlog_sync_period_in_ms:默認值10000,配合commitlog_sync的periodic。控制提交日誌與磁盤同步的頻率。
- commitlog_segment_size_in_mb:默認值:32,單位MB,表示單個commitlog文件大小。用於將所有數據刷新到SSTable後,可以對提交日誌段進行存檔、刪除、回收。
- memtable_flush_writers:刷新寫入程序的線程數,這些線程被磁盤I/O阻塞,每個線程在被阻塞時內存中保存一個memtable。SSD時增加此參數值,默認值2,最大值8。
- memtable_heap_space_in_mb:默認值堆大小的1/4,爲memtbles分配堆內存量。
- memtable_offheap_space_in_mb:默認值堆大小的1/4,爲memtbles分配堆外內存量。memtable_offheap_space_in_mb和memtable_heap_in_mb的值來自動memtable flush的閾值。
- trickle_fsync:默認值true。設置爲true時,會導致操作系統以設置的間隔trickle_fsync_interval_in_kb刷新髒頁緩衝區。啓動該參數可防止突發髒頁緩衝區刷新影響讀取延遲。建議在ssd開啓,HDD關閉。
使用端口
-
trickle_fsync_interval_in_kb:默認值:1024.以千字節爲單位的大小fsync。
-
storage_port:默認值7000.節點間通信的端口。
-
native_transport_port:默認值:9042.cql傳輸監聽客戶端的端口。
-
rpc_port:默認值:9160.用於客戶端的Thrift端口
-
ssl_storage_port:默認值:7001。用於加密通信的SSL端口。除非在encryption_options中啓用,否則不使用。
-
native_transport_port_ssl:默認值:9142。如果啓用了客戶端加密並且禁用了native_transport_port_ssl,則native_transport_port(默認值:9042)將加密所有流量。要同時使用未加密和加密的流量,請啓用native_transport_port_ssl。
-
auto_snapshot:默認值 true。設置爲true時,當數據庫庫在截斷keyspace或刪除表之前獲取數據快照。建議設置爲true,防止數據丟失。
-
key_cache_save_period:默認值14400.(4小時)keys存在緩存中的時間(以秒爲單位),緩存保存在saved_caches_directory。保存在緩存中減少了冷啓動時的I/O影響,提高啓動速度。
-
slow_query_log_timeout_in_ms:默認值:500,節點記錄慢日誌。選擇超過此值的查詢會生成聚合日誌消息以識別慢速查詢。禁用設置0.
-
internode_authenticator:默認值:AllowAllAuthorizer,禁用授權,cassandra不需要認證。值爲CassandraAuthorizer,表示存儲system_auth.permissions表中的權限,當system_auth系統keyspace複製因子爲1,則無法訪問集羣,因此當設置CassandrAuthorizer時,修改system_auth的複製因子。多數據中心,確保複製設置爲NetworkTopologyStrategy。
設置vnode:
- num_tokens:爲虛擬節點令牌體系結構設置此屬性。確定要分配給此虛擬節點(vnode)的令牌範圍數。使用1到128之間的數字,其中 1禁用vnodes。當令牌號在數據中心中的節點之間變化時,vnode邏輯分配相對於數據中心中的其他節點的比例數量的範圍。通常,如果所有節點具有相同的硬件能力,則每個節點應具有相同的 num_tokens值。
- allocate_tokens_for_local_replication_factor:將vnode添加到現有羣集或在新數據中心中設置節點時,請設置爲數據中心中鍵空間的目標複製因子(RF)。觸發推薦 的RF和 算法分配num_tokens對於這個節點。分配算法嘗試以優化指定RF的數據中心節點上的複製負載的方式選擇令牌。分配給每個節點的負載接近於vnode的數量。
如果allocate_tokens_for_local_replication_factor 也被註釋掉,則啓用隨機算法 。
- vnodes配置
啓用vnodes
在cassandra.yaml文件中:
1、取消註釋num_tokens並設置所需的令牌數。
2、(推薦)要使用分配算法,請取消註釋allocate_tokens_for_local_replication_factor ,
並將其設置爲數據中心中鍵空間的目標複製因子。如果複製發生變化,
則在複製因子(RF)設置之間切換。
3、註釋掉initial_token或保留未設置狀態。
禁用vnodes
在cassandra.yaml文件中:
1、註釋掉num_tokens和 allocate_tokens_for_local_replication_factor。
2、取消註釋initial_token並將其設置爲1 或多節點集羣的生成標記的值。
https://docs.datastax.com/en/ddac/doc/datastax_enterprise/config/configCassandra_yaml.html
四、cql常用操作
1、CREATE KEYSPACE
CREATE KEYSPACE eo_cs WITH replication = {'class': 'NetworkTopologyStrategy', 'datacenter1': '3'} AND durable_writes = true;
2、CREATE ROLE
語法:
CREATE ROLE [IF NOT EXISTS] role_name [WITH SUPERUSER = true | false | LOGIN = true | false | PASSWORD = ‘password’ | OPTIONS = option_map]
create ROLE eocs WITH SUPERUSER = false and password = ‘eocs’ and login=true;
3、grant
語法:
GRANT privilege ON resource_name TO role_name
GRANT all PERMISSIONS ON KEYSPACE eo_cs TO eocs;
GRANT select ON KEYSPACE eo_cs TO eocs;
privilege選項:all permissions、alter、authorize、create、describe、execute、modify、select
4、REVOKE
REVOKE AUTHORIZE on KEYSPACE eo_cs from eocs;
5、DROP ROLE
語法:
drop role [if exists] role_name;
6、alter keyspace
語法:
ALTER KEYSPACE keyspace_name
WITH REPLICATION = {‘class’ : ‘SimpleStrategy’, ‘replication_factor’ : N
| ‘class’ : ‘NetworkTopologyStrategy’, ‘dc1_name’ : N [, …]}
[AND DURABLE_WRITES = true|false] ;
CREATE KEYSPACE eo_im WITH replication = {'class': 'NetworkTopologyStrategy', 'datacenter1': '3'} AND durable_writes = true;
- DURABLE_WRITES:(可選)(不推薦),通過禁用持久寫入(DURABLE_WRITES = false)來寫入鍵空間時繞過提交日誌。默認值是true。
小心:使用SimpleStrategy複製時,不要禁用持久寫入。
7、alter role
語法: alter role role_name [with [password = ‘yourpassword’] [login = true|false] [superuser = true|false] [options = map_literal]]
- password:更改密碼
- superuser:爲其他啓動或禁用超級用戶狀態,不能是當前登錄的角色。將超級用戶設置爲false,撤銷創建新角色的權限,但不會撤銷已存在的authorize,alterhe drop權限。
- login:啓動或禁用當前角色以外的登錄權限
8、alter table
語法:
ALTER TABLE [keyspace_name.] table_name
[ALTER column_name TYPE cql_type]
[ADD (column_definition_list)]
[DROP column_list | COMPACT STORAGE ]
[RENAME column_name TO column_name]
[WITH table_properties];
9、alter type
語法:
ALTER TYPE field_name
[ALTER field_name TYPE new_cql_datatype
| ADD (field_name cql_datatype[,…])
| RENAME field_name TO new_field_name[AND …]]
10、list
list 選項:
[ALL | ALTER | AUTHORIZE | CREATE | DESCRIBE | DROP | EXECUTE | MODIFY | ROLES | SELECT | USERS]
cassandra@cqlsh> list select;
role | username | resource | permission
-----------+-----------+--------------------+------------
cassandra | cassandra | <keyspace eeotest> | SELECT
cassandra | cassandra | <keyspace eo_cs> | SELECT
cassandra | cassandra | <keyspace eo_im> | SELECT
eo_im | eo_im | <keyspace eo_im> | SELECT
eocs | eocs | <keyspace eo_cs> | SELECT
11、truncate
立即且不可逆地從指定表中刪除所有數據,並從該表派生的任何物化視圖中刪除所有數據。
語法:
TRUNCATE [TABLE] [keyspace_name.table_name]
在truncate表時需要以下操作:
- 1、如有必要,可使用cqlsh 一致性命令設置的一致性水平ALL。
- 2、使用nodetool status或其他工具確保所有節點都已啓動並接收連接。
- 3、使用TRUNCATE或TRUNCATE TABLE,後跟表名。
例如:
TRUNCATE eo_im.test;或者
TRUNCATE TABLE eo_im.test;
注意: TRUNCATE向所有節點發送JMX命令,告訴他們刪除保存指定表中數據的SSTable。如果這些節點中的任何節點已關閉或未響應,則該命令將失敗並輸出如下消息:
truncate cycling.user_activity;
Unable to complete request: one or more nodes were unavailable.
五、nodetool常用操作
nodetool status
查看集羣狀態
nodetool
參數:
short | long | description |
---|---|---|
-h | –host | hostname or ip address |
-p | –port | 端口號 |
-pwf | –password-file | 密碼文件路徑 |
-pw | –password | 密碼 |
-u | –username | 用戶名 |
– | 將選項與可能被誤認爲選項參數區分開 |
示例:
root@bj-ali-std1-data_slave-03:/# nodetool status
Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns Host ID Rack
UN 172.23.245.103 4.34 GiB 256 ? 49165d85-3681-4307-abd5-2b5a641a5702 rack1
UN 172.23.245.105 10.73 GiB 256 ? 899e0381-c3c7-4111-9439-7b8302be9fac rack1
UN 172.23.245.104 8.42 GiB 256 ? de72d74a-516a-4d9e-b46f-c27a2b6e6f81 rack1
說明:
status 節點運行狀態:
U:up的縮寫
D:down的縮寫
state 集羣狀態:
N:normal(正常)的縮寫
L:leaving(離開)的縮寫
J:joining(加入)的縮寫
M:moving(移動)的縮寫
Owns:
每個數據中心節點擁有的數據百分比乘以複製因子。例如,節點可以擁有33%的環,但如果複製因子爲3,則顯示100%。
注意:如果羣集使用具有不同複製策略或複製因子的鍵空間,請在運行nodetool status時指定鍵空間以獲取有意義的本機信息。
nodetool snapshot
1、查看快照列表:
root@cassandra-2:~# nodetool listsnapshots
2、清除快照:
root@cassandra-2:~# nodetool clearsnapshot
Requested clearing snapshot(s) for [all keyspaces]
root@cassandra-2:~# nodetool listsnapshots
Snapshot Details:
There are no snapshots
3、創建快照:
語法:nodetool -h localhost -p 7199 snapshot
root@cassandra-2:~# nodetool snapshot xn_dolphin_1
Requested creating snapshot(s) for [xn_dolphin_1] with snapshot name [1539103181091] and options {skipFlush=false}
Snapshot directory: 1539103181091
root@cassandra-2:~# nodetool listsnapshots
Snapshot Details:
Snapshot name Keyspace name Column family name True size Size on disk
1539103181091 xn_dolphin_1 dolphin_conversation_message 0 bytes 1.18 KiB
1539103181091 xn_dolphin_1 dolphin_conversation_member 0 bytes 1.02 KiB
1539103181091 xn_dolphin_1 dolphin_conversation_list 0 bytes 946 bytes
1539103181091 xn_dolphin_1 zoogate_blacklist 0 bytes 1.01 KiB
1539103181091 xn_dolphin_1 dolphin_conversation 0 bytes 1.1 KiB
1539103181091 xn_dolphin_1 dolphin_wchat_openid 0 bytes 895 bytes
1539103181091 xn_dolphin_1 dolphin_leaving_msg 0 bytes 1.27 KiB
1539103181091 xn_dolphin_1 dolphin_conversation_visitorinfo 0 bytes 1.2 KiB
1539103181091 xn_dolphin_1 dolphin_member_inout 0 bytes 1.05 KiB
1539103181091 xn_dolphin_1 zoogate_login_info 0 bytes 1.02 KiB
1539103181091 xn_dolphin_1 dolphin_conversation_result 5.1 MiB 5.1 MiB
1539103181091 xn_dolphin_1 dolphin_conversation_statistics 0 bytes 1 KiB
Total TrueDiskSpaceUsed: 5.1 MiB
4、恢復數據
nodetool flush
從memtable中刷新一個或多個表。
語法:
nodetool < options > flush - < keyspace >(< table > …)
選項
短 | 長 | 描述 |
---|---|---|
-h | –host | 主機名或IP地址 |
-p | –port | 端口號。 |
-pwf | –password-file | 密碼文件路徑。 |
-pw | –password 密碼。 | |
-u | –username | |
keyspace | 鍵空間的名稱。 | |
table | 一個或多個表名,用空格分隔。 | |
– | 將選項與可能被誤認爲選項的參數分開。 |
描述:
指定一個鍵空間,後跟一個或多個要從memtable刷新到磁盤上的SSTables的表。
nodetool repair
修復數據的一致性
在增加副本因子時,使用repair把保證數據副本個數滿足需求。
nodetool cleanup
在減少副本因子時,使用cleanup 來清除多餘的副本數據。
nodetool gossipinfo
集羣的gossip信息
nodetool removenode
刪除某個節點
nodetool removenode HostID//刪除一個節點 例:./nodetool removenode ec1411fc-4ac9-473d-8374-f2fc293e6472
nodetool removenode status //查看刪除狀態
nodetool removenode force //如果用status發現總在等待一個節點, 行一次force停掉
nodetool removenode host_id
nodetool netstats
獲取有關主機的網絡信息。
nodetool reloadseeds
重新加載種子節點列表。
nodetool drain
將節點所有memtables數據刷新到SSTables硬盤。此操作會中斷來自其他節點的監聽,需要重啓該節點。如果只是要講memtables刷新到磁盤上,建議使用nodetool flush。一般在Cassandra版本升級的時候才使用這個命令。
nodetool tablestats eo_cs.eo_name
查看錶的一些信息,包括讀的次數,寫的次數,sstable的數量,memtable信息,壓縮信息,bloomfilter信息。
和nodetool cfstats一樣
nodetool compactionstats
統計正在壓縮的任務
nodetool enablebackup
啓動增量備份
對應nodetool disablebackup
nodetool gcstats
打印垃圾收集(GC)統計信息。
nodetool ring
Provides node status and information about the ring.
[root@tidb1 ~]# nodetool ring
Datacenter: datacenter1
==========
Address Rack Status State Load Owns Token
9217867712051363644
10.0.0.61 rack1 Up Normal 321.02 KiB ? -9218584694210041843
10.0.0.62 rack1 Up Normal 330.48 KiB ? -9217256112395284002
10.0.0.62 rack1 Up Normal 330.48 KiB ? -9210889157837833843
10.0.0.62 rack1 Up Normal 330.48 KiB ? -9171000296116146048
10.0.0.62 rack1 Up Normal 330.48 KiB ? -9152550881329104468
10.0.0.62 rack1 Up Normal 330.48 KiB ? -9105469006225184150
10.0.0.63 rack1 Up Normal 310.56 KiB ? -9101761092802475775
10.0.0.61 rack1 Up Normal 321.02 KiB ? -9038091519118775922
10.0.0.62 rack1 Up Normal 330.48 KiB ? -9030971017156121076
10.0.0.61 rack1 Up Normal 321.02 KiB ? -9026658576359436277
10.0.0.61 rack1 Up Normal 321.02 KiB ? -8988926568650120334
nodetool statushandoff
Provides the status of hinted handoff.
[root@tidb1 ~]# nodetool statushandoff
Hinted handoff is running