cassandra從原理到實踐

一、分佈式理論

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

image

讀取請求流程?

image

如果壓縮

image

配置虛擬節點

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

六、Gossip通信協議

鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章