高可用分佈式非關係型數據庫-Cassandra

1 理論基礎html

1.1 簡介java

Apache Cassandra是一套開源分佈式NoSQL數據庫系統。它最初由Facebook開發,用於儲存收件箱等簡單格式數據,集Google BigTable的數據模型與Amazon Dynamo的徹底分佈式架構於一身。Facebook於2008將Cassandra開源,此後,因爲Cassandra良好的可擴展性和性能,被Apple Comcast Instagram Spotify eBay Rackspace Netflix等知名網站所採用,成爲了一種流行的分佈式結構化數據存儲方案。node

在數據庫排行榜「DB-Engines Ranking」中,Cassandra排在第七位,是非關係型數據庫中排名第二高的(僅次於MongoDB)。python

- 可彈性擴展性,容許根據需求增長節點知足更多的客戶端請求linux

- 業務高可用性,架構具備容災設計避免單點故障形成業務中斷數據庫

- 線性規模性能,吞吐量隨着節點數量的增長而呈線性增加
apache

- 靈活數據存儲,可知足全部數據格式,包括結構化,半結構化和非結構化且可動態調整數據結構vim

- 輕鬆數據分發,經過在多個數據中心複製數據,提供靈活的分佈數據數組

1.2 系統架構緩存

1.2.1 架構目標

- 分擔多個節點之間的大數據負載

- 避免單點故障

1.2.2 架構特色

- 羣集中的角色都相同,每一個節點相互獨立但同時與其餘節點互連

- 羣集中的每一個節點均可以接受讀取和寫入請求,而無需理會數據在羣集中的實際位置

- 當單點故障發生時,客戶端能夠從羣集中的其餘非故障節點中提取或寫入數據

1.3.3 數據複製

wKioL1kvabqwZiegAAAzdE59xUk921.jpg

- Cassandra羣集使用Gossip協議在節點間相互通信和檢測羣集中的故障節點

- 羣集中一或多個節點充當數據供給,若有過時節點Cassandra將最新數據返回給客戶端並修復過時節點

1.3.4 關鍵部件介紹

- Node,指構成羣集的成員服務器

- Data Center,羣集中相關可用節點的集合

- Cluster,羣集包含一個或多個數據中心

- Commit Lot,寫入操做以前的記錄日誌,羣集依賴日誌作崩潰恢復。

- MemTable,駐留在內存中的數據結構,Commit Log後數據將寫入到MemTable

- SSTable,當達到設定閾值,數據將從MemTable批量刷新到磁盤中存爲SSTable

- Bloom filter,

 -- 二進制向量數據結構,它具備很好的空間和時間效率,

 -- 被用來檢測一個元素是否是集合中的一個成員。

 -- 若是檢測結果爲是,該元素不必定在集合中;

 -- 但若是檢測結果爲否,該元素必定不在集合中。

1.3.5 數據寫入流程

- 先記錄日誌(CommitLog)後寫入數據

- 數據先寫入到Column Family對應的Memtable中

- Memtable達到必定量時再批量刷新磁盤中存爲SSTable

注:至關於緩存寫回機制,它將隨機IO轉成順序IO(下降存儲壓力)

1.4 數據模型

1.4.1 Colume

wKioL1kujBTwMXyrAAAbXv0spso648.png

列是Cassandra中最小的數據單元,由如下元素組成:

- Name,惟一名稱,用於引用列

- Value,列的內容,能夠是不一樣的類型,如AsciiType,LongType,TimeUUIDType,UTF8Type等。

- TimeStamp,時間戳記,用於肯定有效內容的系統時間戳

範例以下:

Name Value TimeStamp
"age" "18" 1270694041669000
"height" "172cm" 1270694041669000

注:一行爲一個Colume

1.4.2 Super Column

wKiom1kvWHHT_U3uAABIN1sRAGs042.png

超級列至關於Column的數組或集合,由Super Column name和一個或多個的Column構成。

Super Column Name Columns
StudentA
Name Value TimeStamp
"age" "20" 1270694041669000
"height" "172cm" 1270694041669000

1.4.3 Column Family

列族是一個NoSQL的對象(至關於關係型數據庫的表),它包含描述對象屬性的相關Column或Super Column。

列族分類:

- 普通列族,以列來描述族的屬性

- 超級列族,以超級列來描述族的屬性

Column Family Key Columns
StudentA
Name Value TimeStamp
"age" "20" 1270694041669000
"height" "172cm" 1270694041669000

1.4.4 KeySpace

鍵空間是Cassandra中數據的最外層容器,其基本屬性有,

- Replication factor,集羣中將接收相同數據副本的計算技術

- Replica placement strategy,定義環中的複製策略

 -- simple strategy,簡單策略

 -- old network topology strategy,舊網絡拓撲策略

 -- network topology strategy,網絡拓撲策略

- Column families,列族(包含一個或多個列族)

1.4.5 總數據模型圖

wKiom1kuUyGR-FZ3AAAt9iquY4g970.gif

2 實踐部分

2.1 環境信息

HostName = cassandra0[1-2].cmdschool.org

ipAddress = 10.168.0.5[1-2]

OS = CentOS 7.3 x86_64

2.2 JDK安裝

2.2.1 下載JDK包

In cassandra0[1-2]:

cd ~
wget http://download.oracle.com/otn/java/jdk/8u121-b13/e9e7ea248e2c4826b92b3f075a80e441/jdk-8u121-linux-x64.tar.gz?AuthParam=1495873209_eea482e2b59774918c970cf5dc383fdb

注:如需其餘版本請參閱,http://www.oracle.com/technetwork/java/javase/archive-139210.html

2.2.2 建立java目錄

In cassandra0[1-2]:

mkdir /usr/java

2.2.3 解壓

In cassandra0[1-2]:

tar xf jdk-8u121-linux-x64.tar.gz
mv jdk1.8.0_121/ /usr/java/

2.2.4 配置環境變量

In cassandra0[1-2]:

vim /etc/profile.d/java.sh

加入以下內容:

export JAVA_HOME=/usr/java/jdk1.8.0_121
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

2.2.5 配置生效

In cassandra0[1-2]:

source /etc/profile

2.2.6 環境變量測試

In cassandra0[1-2]:

java -version

2.3 安裝Cassandra

2.3.1 先決條件檢查

In cassandra0[1-2]:

1)JAVA檢查

 java -version

顯示以下:

java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)

2)python檢查:

python --version

顯示以下:

Python 2.7.5

2.3.2 下載安裝包

In cassandra0[1-2]:

cd ~
wget https://mirrors.tuna.tsinghua.edu.cn/apache/cassandra/3.10/apache-cassandra-3.10-bin.tar.gz

2.3.3 解壓安裝包

In cassandra0[1-2]:

tar -xf apache-cassandra-3.10-bin.tar.gz

2.3.4 部署到程序目錄

In cassandra0[1-2]:

mkdir /usr/cassandra
mv apache-cassandra-3.10 /usr/cassandra/

2.3.5 配置運行用戶

In cassandra0[1-2]:

useradd -s /sbin/nologin -b /var/lib cassandra
chown -R cassandra:cassandra /usr/cassandra/apache-cassandra-3.10
chmod -R 770 /usr/cassandra/apache-cassandra-3.10

確認用戶數據目錄存在:

ls -ld /var/lib/cassandra/

顯示以下:

drwx------. 6 cassandra cassandra 136 Jun  1 09:42 /var/lib/cassandra/

2.3.6 配置環境變量

In cassandra0[1-2]:

1)環境變量配置

vim /etc/profile.d/cassandra.sh

加入以下配置:

export CASSANDRA_HOME=/usr/cassandra/apache-cassandra-3.10
export CASSANDRA_PATH=${CASSANDRA_HOME}/bin
export PATH=${CASSANDRA_PATH}:$PATH

2)使環境變量生效

source /etc/profile

3)測試環境變量

cassandra -v

顯示以下:

3.10

2.3.7 配置Cassandra的環境變量

In cassandra0[1-2]:

1)環境變量配置

cp -a /usr/cassandra/apache-cassandra-3.10/bin/cassandra.in.sh /usr/cassandra/apache-cassandra-3.10/bin/cassandra.in.sh.default
vim /usr/cassandra/apache-cassandra-3.10/bin/cassandra.in.sh

啓用並修改以下配置:

# JAVA_HOME can optionally be set here
JAVA_HOME=/usr/java/jdk1.8.0_121

注:提示「Cassandra 3.0 and later require Java 8u40 or later.」時須要配置

2.4 配置Cassandra羣集

2.4.1 環境變量配置

cp -a /usr/cassandra/apache-cassandra-3.10/conf/cassandra.yaml /usr/cassandra/apache-cassandra-3.10/conf/cassandra.yaml.default
vim /usr/cassandra/apache-cassandra-3.10/conf/cassandra.yaml

修改以下配置:

In cassandra01:

cluster_name: 'Cassandra Cluster'
seed_provider:
- seeds: "10.168.0.51,10.168.0.52"
listen_address:  10.168.0.51
rpc_address: 10.168.0.51
start_rpc: true

data_file_directories:
    - /var/lib/cassandra/data
commitlog_directory: /var/lib/cassandra/commitlog
saved_caches_directory: /var/lib/cassandra/saved_caches

In cassandra02:

cluster_name: 'Cassandra Cluster'
seed_provider:
- seeds: "10.168.0.51,10.168.0.52"
listen_address:  10.168.0.52
rpc_address: 10.168.0.52
start_rpc: true

data_file_directories:
    - /var/lib/cassandra/data
commitlog_directory: /var/lib/cassandra/commitlog
saved_caches_directory: /var/lib/cassandra/saved_caches

注:seeds的配置容許只寫其餘節點的IP,不寫本機IP。

2.4.2 配置cassandra-env環境腳本

cp -a /usr/cassandra/apache-cassandra-3.10/conf/cassandra-env.sh /usr/cassandra/apache-cassandra-3.10/conf/cassandra-env.sh.default
vim /usr/cassandra/apache-cassandra-3.10/conf/cassandra-env.sh

修改配置以下:

In cassandra0[1-2]:

MAX_HEAP_SIZE="1G"
HEAP_NEWSIZE="256M"

2.5 防火牆配置

In cassandra0[1-2]:

firewall-cmd --permanent --add-port 7000/tcp
firewall-cmd --permanent --add-port 9042/tcp
firewall-cmd --reload
firewall-cmd --list-all

2.6 服務的控制

2.6.1 測試服務啓動

In cassandra0[1-2]:

sudo -u cassandra /usr/cassandra/apache-cassandra-3.10/bin/cassandra -f

看到以下信息則服務正常啓動:

INFO  [Thread-2] 2017-06-01 10:51:47,640 ThriftServer.java:133 - Listening for thrift clients...

注:按下[Ctrl+C]可結束進程

2.6.2 確認服務正常啓動

In cassandra0[1-2]:

pgrep -u cassandra -f cassandra

顯示PID以下:

2596

2.6.3 檢查羣集的狀態

In cassandra0[1-2]:

nodetool status

信息顯示以下:

Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address      Load       Tokens       Owns (effective)  Host ID                               Rack
UN  10.168.0.51  213.63 KiB  256          100.0%            6faefd3b-e2cf-4477-a1c1-922d4f10b7a5  rack1
UN  10.168.0.52  103.69 KiB  256          100.0%            3cc4fdd7-53a0-4a67-be7f-fbe1cd8d0571  rack1

2.6.4 測試鏈接

In cassandra02:

cqlsh -ucassandra -pcassandra 10.168.0.51
cqlsh -ucassandra -pcassandra 10.168.0.52

2.6.5 結束進程

In cassandra0[1-2]:

pkill -f cassandra

2.6.6 配置服務控制腳本

In cassandra0[1-2]:

vim /etc/init.d/cassandrad

輸入以下內容:

#!/bin/bash
# chkconfig: 2345 55 25

user="cassandra"

status() {
        if [ ! `pgrep -u $user -f cassandra | wc -l` -eq 0 ]; then
                echo "statusChecking for service cassandra running"
                exit 0
        else
                echo "statusChecking for service cassandra not running"
                exit 1
        fi
}

start() {
        if [ `pgrep -u $user -f cassandra | wc -l` -eq 0 ]; then
                sudo -u $user /usr/cassandra/apache-cassandra-3.10/bin/cassandra > /dev/null
                for ((i=60; i>=0; i--)) do
                        sleep 1s
                        if [ ! `pgrep -u $user -f cassandra | wc -l` -eq 0 ]; then
                                echo "start service cassandra finish"
                                break & exit 0
                        fi
                        if [ $i -eq 0 ]; then
                                echo "start service cassandra failed"
                                exit 1
                        fi
                done
        fi
}

stop() {
        if [ ! `pgrep -u $user -f cassandra | wc -l` -eq 0 ]; then
                pgrep -u $user -f cassandra | xargs kill -9
                for((i=60; i>=0; i--)) do
                        sleep 1s
                        if [ `pgrep -u $user -f cassandra | wc -l` -eq 0 ]; then
                                echo "stop service cassandra finish"
                                break & exit 0
                        fi
                        if [ $i -eq 0 ]; then
                                echo "stop service cassandra failed"
                                exit 1
                        fi
                done
        fi
}

case "$1" in
        start)
                start
        ;;
        stop)
                stop
        ;;
        restart)
                stop
                start
        ;;
        status)
                status
        ;;
        *)
                echo "Usage: $0 {start|stop|restart|status}"
                exit 1
esac

2.6.7 配服務自動啓動和啓動服務

In cassandra0[1-2]:

chkconfig cassandrad on
/etc/init.d/cassandrad start

=====================================

參閱文檔:

https://cassandra.apache.org/doc/latest/getting_started/installing.html

https://www.ibm.com/developerworks/cn/opensource/os-cn-cassandra/

https://wenku.baidu.com/view/255b50105f0e7cd184253654.html?re=view

https://wenku.baidu.com/view/7612fb8805087632311212ee.html

http://blog.csdn.net/sharon_1987/article/details/50826131


https://en.wikipedia.org/wiki/Column_(data_store)

https://en.wikipedia.org/wiki/Super_column

https://en.wikipedia.org/wiki/Column_family


https://www.tutorialspoint.com/cassandra/cassandra_architecture.htm

http://www.360doc.com/content/16/0624/06/6902273_570291132.shtml


下載連接:

https://cassandra.apache.org/download/

相關文章
相關標籤/搜索