1. 程式人生 > >cassandra叢集搭建實戰

cassandra叢集搭建實戰

node110.202.20.191 (seed1)

node210.202.20.192

node310.202.20.193

node410.202.20.194

node510.202.20.195

node610.202.20.196

node710.202.20.197

node810.202.20.198 (seed2)

以上伺服器基於現在的雲平臺(32核,96G記憶體),OS:centos6.6

yum -y installjdk-8u51-linux-x64.rpm

rm /usr/bin/java

ln -s /usr/java/jdk1.8.0_51/bin/java/usr/bin/java

在/etc/sysctl.conf中新增以下三行:

vm.zone_reclaim_mode=0

vm.max_map_count = 262144

vm.swappiness = 1

執行sysctl –p讓配置生效

在/etc/security/limits.conf 中新增以下四行:

*       soft    nofile 65536

*       hard    nofile 65536

*       soft    nproc  65536

*       hard    nproc  65536

在/etc/hosts加入以下資訊:

10.202.20.191 ras1.novalocal

10.202.20.192 ras2.novalocal

10.202.20.193 ras3.novalocal

10.202.20.194 ras4.novalocal

10.202.20.195 ras5.novalocal

10.202.20.196 ras6.novalocal

10.202.20.197 ras7.novalocal

10.202.20.198 ras8.novalocal

useradd cassandra

在/home/cassandra/.bash_profile中新增

export JAVA_HOME=/usr/java/jdk1.8.0_51

修改path

PATH=$PATH:$HOME/bin:/opt/cassandra/bin

mkdir /data1

mkdir /data2

mount /dev/vdb1 /data1

mount /dev/vdc1 /data2

chmod 777 /data1

chmod 777 /data2

http://cassandra.apache.org/download/下載對應的版本

tar xvf apache-cassandra-2.1.12-bin.tar.gz -C /opt

mv /opt/apache-cassandra-2.1.12 /opt/cassandra

chown -R cassandra.cassandra /opt/cassandra

su – cassandra

準備幾個目錄,其中commitlog使用者存放交易日誌,建議使用單獨的盤存放,dataNfile用於存放資料檔案,建議使用SSD,如果是硬碟,建議用raid0,saved_casches用於存放查詢快取,可以與資料檔案放在同一個盤上

mkdir /data1/commitlog

mkdir /data1/data1file

mkdir /data2/data2file

mkdir /data2/saved_caches

配置引數檔案,在配置前,做個備份

cp cassandra.yaml cassandra.yaml.bak

修改引數檔案

叢集名稱:

cluster_name: 'FVP-RAS Cluster'

資料檔案:

如果存放位置多個地方,寫多行

data_file_directories:

 - /data1/data1file

 - /data2/data2file

交易日誌:

commitlog_directory: /data1/commitlog

查詢快取:

saved_caches_directory: /data2/saved_caches

種子伺服器IP:

多個以逗號分開

- seeds: "10.202.20.191,10.202.20.198"

監聽地址:

為空,會使用主機名對應的IP地址

listen_address:

為空,會使用主機名對應的IP地址

rpc通訊地址:

為空,會使用主機名對應的IP地址

配置遠端JMX訪問

修改cassandra-env.sh

LOCAL_JMX=no

以下操作需要root許可權

mkdir -p /etc/cassandra

cp/usr/java/jdk1.8.0_51/jre/lib/management/jmxremote.password.template   /etc/cassandra/jmxremote.password

chown cassandra.cassandra /etc/cassandra/jmxremote.password

chmod 400 /etc/cassandra/jmxremote.password

echo "cassandra cassandrapassword">>/etc/cassandra/jmxremote.password

sed -i '/controlRole/icassandra readwrite'/usr/java/jdk1.8.0_51/jre/lib/management/jmxremote.access

配置使用者與許可權

修改cassandra.yaml中的以下兩行

authenticator: PasswordAuthenticator

authorizer: CassandraAuthorizer

在cassandra啟動後,在第一個seed節點執行以下命令:

echo "ALTER KEYSPACE system_auth WITHREPLICATION={'class':'org.apache.cassandra.locator.SimpleStrategy','replication_factor':'8'};"|cqlsh 10.202.20.191  -ucassandra -pcassandra

注:上面8為整個叢集節點數,因為許可權認證表需要全叢集同步

echo "create user admin with password '123456'superuser;"|cqlsh 10.202.20.191 -ucassandra -pcassandra

echo "drop user cassandra;"|cqlsh 10.202.20.191  -uadmin -p123456

2. 操作

2.1     啟動

/opt/cassandra/bin/cassandra 預設是在後臺執行,如果想在前臺執行,請使bin/cassandra –f ,另外在啟動時,請先啟動一個seed的伺服器例項,再啟動其它節點的例項

啟動後,可以通地/opt/cassandra/logs/ system.log來檢視相關資訊,動態檢視命令如下:

tail -f /opt/cassandra/logs/system.log

cqlsh 10.202.20.191 -uadmin -p123456

可在cqlsh命令提示符下輸入help或?獲得幫助,輸入exit或quit退出cqlsh,命令預設以“;”結束。

檢視keyspace

DESC keyspaces;

建立keyspace

CREATE KEYSPACE ks_test WITHREPLICATION = { 'class' :'NetworkTopologyStrategy', 'DC1' : 3,'DC2' : 3};

注:這裡3為複製因子,我們這裡統一定義為3,系統認證表空間除外

切換keyspace

USE ks_test;

建立表

CREATE TABLE tt_table1(

  id int PRIMARY KEY,

  c1 text

);

查看錶

DESC TABLES;

插入資料

INSERT INTO tt_table1(id,  c1)

  VALUES (1, 'test1');

INSERT INTO tt_table1(id,  c1)

  VALUES (2, 'test2');

INSERT INTO tt_table1(id,  c1)

  VALUES (3, 'test3');

查詢資料

SELECT * FROM tt_table1;

建立索引後使用WHERE從句查詢

CREATE INDEX ON tt_table1(c1);

SELECT * FROM tt_table1 WHEREc1 = 'test2';

刪除表

DROP TABLE tt_table1;

2.3     監控

2.    

2.1    

2.2    

2.3    

Cassandra發行版附帶的命令列工具,用於監控和常規資料庫操作。一些常用命令如status、cfstats、cfhistograms、netstats、tpstats等。

圖形使用者介面工具,從中央控制檯監控和管理叢集中所有節點,分為企業版與普通版,企業版收費

JMX相容工具用以監控java應用程式,提供Overview、Memory、Thread、Classes、VM summary、Mbeans方面的資訊

兩類cache:partitionkey cache和row cache

partition key cache:Cassandra表partition index的cache

row cache:一個row首次被訪問後整個row(合併自多個對應的SSTable及memtable)被放在row cache中以便於後續對改row的訪問能直接由記憶體獲取資料。 對於很少訪問的archive表當禁用快取。

開啟

CREATE TABLE users (  useridtext PRIMARY KEY, first_name text, last_name text,)

WITH caching ='all';

配置

在cassandra.yaml中,調整下列引數;

key_cache_keys_to_save

key_cache_save_period

key_cache_size_in_mb

row_cache_keys_to_save

row_cache_size_in_mb

row_cache_save_period

row_cache_provider

         工作原理:

第一個read操作直接命中rowcache,從記憶體取出資料。第二個read操作為命中row cache,但命中partition key cache,並由此整合所有相關的SSTable及memtable中的片段為請求的row,返回row並寫進row cache。

優化建議:將很少請求的資料或row很長的資料放在cache較小或不使用cache的表中

Ø  用較多的節點部署各節點負載較輕的叢集

Ø  邏輯上將read稠密的資料分開在離散的表中

可改善write效能。Cassandra在commit logspace threshold超出時將memtables內容刷進磁碟建立SSTable。在cassandra.ymal中配置commit log space threshold來調整memtable吞吐量。配置的值依賴於資料和write負載。下列兩種情況可考慮增加吞吐量:

Ø  write負載包含大量在小資料集上的更新操作

Ø  穩定持續的寫操作

使用nodetool的repair命令,修復與給定的資料範圍相關的replica間的不一致性。在下屬情形執行修復:

Ø  規律的、計劃的叢集維護操作期間(除非沒有執行過delete

Ø  節點恢復後

Ø  在包含較少被訪問的資料的節點上

Ø  在down掉的節點更新資料

執行節點修復的方針:

Ø  常規修復操作執行次數由gc_grace值硬性規定。需在該時間內在每個節點至少執行一次修復操作。

Ø  同時在多於一個的節點執行常規修復時需謹慎,最好在低峰期規律執行修復。

Ø  在很少delete或overwrite資料的系統中,可增加gc_grace的值。

修復操作消耗磁碟I/O,可通過下述途徑減輕:

Ø  使用nodetool的compactionthrottling選項。

Ø  使用nodetool snapshot之後從snapshot執行修復。

修復操作會導致overstreaming(問題源於Cassandra內部Merkletrees資料結構)。比如只有一個損壞的partition但卻需傳送很多的stream,且若節點中存在的partition越多問題越嚴重。這會引起磁碟空間浪費和不必要的compaction。可使用subrange 修復來減輕overstreaming。subrange repair只修復屬於節點的部分資料。

2.7     新增/移除節點或資料中心

2.  

2.1  

2.2  

2.3  

2.4  

2.5  

2.6  

2.7  

以使用vnodes的節點為例:

Ø  在新節點安裝Cassandra,關閉cassandra,清除資料。

Ø  在cassandra.yaml和cassandra-topology.properties中配置如下屬性:

cluster_name

listern_address/broadcast_address

endpoint_snitch

num_tokens

seed_provider

Ø  逐個啟動新節點中的cassandra,不同節點的初始化之間保持兩分鐘的間隔。可用nodetool stats監控啟動和資料流處理待所有新節點執行起來後逐個在每個之前已存在的節點執行nodetoolcleanup來移除不再屬於這些節點的key。在下一個節點執行nodetool cleanup前必須等上一個節點中的nodetool cleanup結束。另外cleanup操作可考慮在低峰期進行。

以使用vnodes的節點構成的叢集為例

Ø  確保keyspace使用NetworkTopologyStrategy複製策略

Ø  對於每個新節點在cassandra.yaml中設定如下屬性

auto_bootstrap:false.

Ø  設定其他與所屬叢集匹配的屬性(參見上一部分:在既存叢集中新增節點)

Ø  根據設定的snitch型別在各新節點配置對應的指明網路拓撲的配置檔案(無需重啟)

Ø  確保使用的客戶端不會自動探測新的節點。

Ø  若使用QUORUM一致性級別,需檢查LOCAL_QUORUM或EACH_QUORUM一致性級別是否滿足多資料中心的要求

Ø  逐個在每個節點開啟cassandra。注意初始化時間間隔。

以使用vnodes的節點構成的叢集為例

Ø  用nodetool status命令確認環中死掉的節點,從輸出中記錄該節點的HOSTID。

Ø  新增並啟動新的替代節點

Ø  使用nodetool removenode命令根據記錄的死亡節點的HOSTID從叢集中移除死掉的節點。

Ø  確認沒有client正在向資料中心內的任何節點寫資料

Ø  在資料中心內的各節點中執行nodetoolrepair以確保資料從該中心得到正確的傳播。更改所有的keyspace屬性確保不再引用即將移除的資料中心。

Ø  在資料中心內的各節點分別執行nodetooldecommission

Cassandra通過為磁碟中的資料檔案(SSTable檔案)建立快照來備份資料。可為單個表、單個keyspace、所有keyspace建立快照。可用並行SSH工具為整個叢集建立快照。建立時不保證所有replica一致,但在恢復快照時Cassandra利用內建的一致性機制保持一致性。建立了系統範圍的快照後可開啟增量備份只備份自上次快照以來變化了的資料(每當一個SSTable被flush後,一個對應的硬連結被拷貝至與/snapshot同級的/backups子目錄),快照通過硬連結建立。否則會因將檔案拷貝至不同的位置而增加磁碟I/O。

在每個節點執行nodetoolsnapshot命令為節點建立快照。也可通過並行SSH工具(如pssh)執行nodetool snapshot建立全域性的快照。

nodetool -hlocalhost -p  snapshot demdb

執行命令後首先會將記憶體中的資料刷進磁碟,之後為每個keyspace的SSTable檔案建立硬連結。快照的預設位置為/var/lib/cassandra/data/<keyspace_name>/<table_name>/snapshots。其中/var/lib/cassandra/data部分依據資料目錄設定而不同。要保證空間充足,建立後可考慮移至其他位置。

建立新的快照並不會自動刪除舊的快照,需在建立新快照前通過nodetool clearsnapshot命令移除舊的快照。

nodetool -hlocalhost -p  clearsnapshot

同樣可通過並行SSH工具(如pssh)執行nodetoolclearsnapshot一次刪除所有節點的快照。

預設不開啟,可通過在各節點的cassandra.yaml配置檔案中設定incremental_backups為true來開啟增量備份。開啟後會為每個新的被刷入的SSTable建立一個硬連結並拷貝至資料目錄的/backups子目錄。Cassandra不會自動刪除增量備份檔案,建立新的快照前需手工移除舊的增量備份檔案。

需所有的快照檔案,若使用了增量備份還需快照建立之後所有的增量備份檔案。通常,在從快照恢復資料前需先truncate表。(若備份發生在delete前而恢復發生在delete後且沒truncate表時,則不能得到最原始的資料,因為直到compaction操作發生前被標記為tombstone的資料與原始資料處於不同的SSTable中,所以恢復包含原始資料的SSTable不會移除被標記被tombstone的資料,這些資料仍然顯示為將被刪除)。

可以用如下方式從快照恢復資料

使用sstableloader工具:

http://www.datastax.com/documentation/cassandra/0/webhelp/cassandra/tools/toolsBulkloader_t.html

先拷貝snapshot目錄中的快照檔案至相應資料目錄。之後通過JConsole呼叫column family MBean 中的JMX方法loadNewSSTables()或者使用nodetool refresh命令而不呼叫上述方法。

使用重啟節點方式:

Ø  若恢復單節點則先關閉該節點,若恢復整個叢集則需先關閉所有節點

Ø  清除/var/lib/cassandra/commitlog中的所有檔案

Ø  刪除<data_directory_location>/<keyspace_name>/<table_name>中所有*.db檔案

Ø  拷貝最新<data_directory_location>/<keyspace_name>/<table_name>/snapshots/<snapshot_name>的快照檔案至<data_directory_location>/<keyspace_name>/<table_name>/snapshots/<snapshot_name>

Ø  若使用了增量備份則還需拷貝<data_directory_location>/<keyspace_name>/<table_name>/backups中的內容至<data_directory_location>/<keyspace_name>/<table_name>

Ø  重啟節點

Ø  執行nodetool repair

cassandra的刪除操作,實際上並不是真的刪除,它是執行的插入操作,插入的資料叫做tombstone(墓碑),記錄了被刪除記錄的資訊和刪除時間。根據條件查詢的時候,如果它會把滿足條件的記錄查詢出來,包括tombstone。然後過濾掉刪除的記錄,再把結果返回,這樣的場景下,導至頻繁刪除的表的膨漲非常歷害,帶來效能問題

通過nodetoolrepair操作來解決。

基本語法:

nodetool -h hostrepair [keyspace] [table names]

使用-pr選項,表示只修復range落在該節點的master資料

nodetool -h host-pr repair [keyspace] [table names]

資料量足夠大的時候,這個過程還是很慢,你可能焦急的不知道這個過程什麼時候結束。你可以通過token段的方式,

nodetool -h host-st xxx -et xxxx repair [keyspace] [table names]

可以加一個-par選項,多執行緒併發repair。

nodetool -h host-pr -par repair [keyspace] [table names]

nodetool -h host-st xxx -et xxxx -par repair [keyspace] [table names]

可以加一個-inc選項,增量repair

nodetool -h host-pr -inc repair [keyspace] [table names]

nodetool -h host-st xxx -et xxxx -inc repair [keyspace] [table names]

注意-inc和-par是不能一起使用的。

為了防止資料重現,我們定義每3天一次進行增量repairnodetool repair -pr -par -inc),對於停機超過4天伺服器,需要清除此節點所有資料,重建此節點,預設的GC時間為10天(gc_grace_seconds = 864000),我們定義不修改此引數