1. 程式人生 > 其它 >分散式NoSQL資料庫Cassandra叢集搭建

分散式NoSQL資料庫Cassandra叢集搭建

1 Cassandra介紹

1.1 Cassandra介紹

  Cassandra是一套開源分散式NoSQL資料庫系統。它最初由Facebook開發,用於儲存收件箱等簡單格式資料,集GoogleBigTable的資料模型與Amazon Dynamo的完全分散式的架構於一身Facebook於2008將 Cassandra 開源,此後,由於Cassandra良好的可擴充套件性,被Digg、Twitter等知名Web 2.0網站所採納,成為了一種流行的分散式結構化資料儲存方案。
Cassandra是一個混合型的非關係的資料庫,類似於Google的BigTable。其主要功能比Dynamo (分散式的Key-Value儲存系統)更豐富,但支援度卻不如文件儲存MongoDB(介於關係資料庫和非關係資料庫之間的開源產品,是非關係資料庫當中功能最豐富,最像關係資料庫的。支援的資料結構非常鬆散,是類似json的bjson格式,因此可以儲存比較複雜的資料型別)。Cassandra最初由Facebook開發,後轉變成了開源專案。它是一個網路社交雲端計算方面理想的資料庫。以Amazon專有的完全分散式的Dynamo為基礎,結合了Google BigTable基於列族(Column Family)的資料模型。P2P去中心化的儲存。很多方面都可以稱之為Dynamo 2.0。

1.2 Cassandra的特點

彈性可擴充套件性 - Cassandra是高度可擴充套件的; 它允許新增更多的硬體以適應更多的客戶和更多的資料根據要求。
資料儲存靈活 - Cassandra適應所有可能的資料格式,包括:結構化,半結構化和非結構化。它可以根據您的需要動態地適應變化的資料結構。
便捷的資料分發 - Cassandra通過在多個數據中心之間複製資料,可以靈活地在需要時分發資料。
快速寫入 - Cassandra被設計為在廉價的商品硬體上執行。 它執行快速寫入,並可以儲存數百TB的資料,而不犧牲讀取效率。

2 準備環境

  Cassandra選擇了無中心的P2P架構,網路中的所有節點都是對等的,它們構成了一個環,節點之間通過Gossip協議每秒鐘和至多三個節點交換一次資料,這樣每個節點都擁有其它所有節點的資訊,包括位置、狀態等。為了保證資料交換的準確性,所有的節點必須使用同一份叢集列表,這樣的節點又被稱作seed節點。


主機

環境 部署內容
192.168.220.129(master) centos7.6

apache-cassandra-3.11.6
jdk1.8.0_202

192.168.220.130(seed) centos7.6

apache-cassandra-3.11.6
jdk1.8.0_202

192.168.220.131(seed) centos7.6

apache-cassandra-3.11.6
jdk1.8.0_202

3 叢集搭建

安裝包下載地址:http://archive.apache.org/dist/cassandra
wget http://archive.apache.org/dist/cassandra/3.11.6/apache-cassandra-3.11.6-bin.tar.gz

3.1 搭建java環境

[root@test1 ~]# mkdir /usr/java
[root@test1 ~]# tar -zxvf jdk-8u202-linux-x64.tar.gz -C /usr/java >/dev/null 2>&1
[root@test1 ~]# vim /etc/profile.d/java.sh 
export JAVA_HOME=/usr/java/jdk1.8.0_202
export PATH=$PATH:$JAVA_HOME/bin
[root@test1 ~]# source /etc/profile.d/java.sh
驗證:
[root@test1 ~]# java -version
java version "1.8.0_202"
Java(TM) SE Runtime Environment (build 1.8.0_202-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)

3.2 部署Cassandra

新增使用者
[root@test1 ~]# useradd cassandra

建立目錄
[root@test1 ~]# mkdir -pv /data01/cassandra/{commitlog,data,saved_caches}
[root@test1 ~]# mkdir -pv /var/log/cassandra/
目錄授權
chown -R cassandra.cassandra /data01/cassandra/{commitlog,data,saved_caches} 
[root@test1 ~]# chown -R cassandra.cassandra /var/log/cassandra/

編輯檔案
[root@test1 ~]# vim /opt/cassandra/conf/cassandra.yaml
#叢集名稱
cluster_name: 'test'
#資料儲存的目錄,預設為/var/lib/cassandra/data,這裡按照自己的路徑配置,這項可以有多個目錄分行寫
data_file_directories:
- /data01/cassandra/data
#提交日誌存放目錄,預設為/var/lib/cassandra/data。
data_file_directories:
- /data01/cassandra/data
#快取目錄,預設為/var/lib/cassandra/saved_caches。
saved_caches_directory: /data01/cassandra/saved_caches
#seed節點 這裡我使用192.168.220.130和192.168.220.131伺服器作為種子節點,ip中間使用逗號隔開
seeds: “192.168.220.130,192.168.220.131”
#監聽地址 這項配置當前伺服器ip,rpc_address 和 listen_address一樣填寫當前伺服器ip
listen_address:192.168.220.129
rpc_address:192.168.220.129
其他兩臺機器如上配置,注意的是 listen_address, rpc_address 這兩項填寫該臺伺服器地址($ip)

JVM記憶體堆大小和gc日誌檔案路徑修改
預設為4G
[root@test1 ~]# vim /opt/cassandra/conf/jvm.options
#JVM記憶體堆
#-Xms4G
#-Xmx4G
#gc日誌檔案路徑
-Xloggc:/var/log/cassandra/gc.log

cassandra日誌路徑檔案修改
vim /opt/cassandra/conf/logback.xml
<level>INFO</level>
    </filter>
    <file>/var/log/cassandra/system.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
      <fileNamePattern>/var/log/cassandra/system.log.%i.zip</fileNamePattern>

<file>/var/log/cassandra/debug.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
      <fileNamePattern>/var/log/cassandra/debug.log.%i.zip</fileNamePattern>

3.3 叢集啟動

建立啟動檔案
[root@test1 ~]# vim /etc/systemd/system/cassandra.service
[Unit]
Description=Cassandra Server Service
After=network.service

[Service]
Type=simple
Environment=JAVA_HOME=/usr/java/jdk1.8.0_202

PIDFile=/home/cassandra/cassandra.pid
User=cassandra
ExecStart=/opt/cassandra/bin/cassandra -f -p /home/cassandra/cassandra.pid
StandardOutput=journal
StandardError=journal
LimitNOFILE=100000
LimitMEMLOCK=infinity
LimitNPROC=32768
LimitAS=infinity

[Install]
WantedBy=multi-user.target

啟動
[root@test1 ~]# systemctl start cassandra
[root@test1 ~]# systemctl enable cassandra
[root@test1 ~]# ps -ef |grep cassandra

4 Cassandra叢集驗證及簡單使用

4.1 Cassandra叢集驗證

[root@test1 /opt/cassandra/bin]# ./nodetool status
Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address          Load       Tokens       Owns (effective)  Host ID                               Rack
UN  192.168.220.129  263.76 KiB  256          35.3%             c425b8ec-68e7-4be6-8a09-1e5f57e10da0  rack1
UN  192.168.220.130  223.55 KiB  256          31.2%             ca9b052b-fd7d-4e1f-8627-c5946dbfa9ea  rack1
UN  192.168.220.131  358.28 KiB  256          33.5%             51b921a2-f378-46ff-aa21-fe1021aeb1a6  rack1

4.2 Cassandra簡單使用

官方文件:http://cassandra.apache.org/doc/latest/cql/index.html

[root@test1 /opt/cassandra/bin]# ./cqlsh 192.168.220.129
Connected to test at 192.168.220.129:9042.
[cqlsh 5.0.1 | Cassandra 3.11.6 | CQL spec 3.4.4 | Native protocol v4]
Use HELP for help.
cqlsh>
1 查詢全部的keyspace
cqlsh> describe keyspaces;
ks1  system_schema  system_auth  system  system_distributed  system_traces

2 建立一個keyspace:CREATE KEYSPACE IF NOT EXISTS test WITH REPLICATION = {'class': 'SimpleStrategy','replication_factor':1};
   class : 副本配置策略(總共有三種):
    Simple Strategy(RackUnaware Strategy):副本不考慮機架的因素,按照Token放置在連續下幾個節點。假如副本數為3,屬於A節點的資料在B.C兩個節點中也放置副本。
        OldNetwork Topology Strategy(RackAware Strategy):考慮機架的因素,除了基本的資料外,先找一個處於不同資料中心的點放置一個副本,其餘N-2個副本放置在同一資料中心的不同機架中。
        Network Topology Strategy(DatacneterShard Strategy):將M個副本放置到其他的資料中心,將N-M-1的副本放置在同一資料中心的不同機架中。

3 使用某個keyspace:use myCas;

4 查詢全部的table:desc tables;                                    

5 建立一張表:CREATE TABLE user (id int, user_name varchar, PRIMARY KEY (id) );
建立表的時候至少指定一個主鍵

6 向表中插入一條記錄:INSERT INTO user (id,user_name) VALUES (1,'test');
列名必須要顯示指定,如果表中已存在相同主鍵的記錄,那麼該操作會覆蓋表中已存在的記錄

使用參考
https://www.cnblogs.com/youzhibing/p/6549960.html
https://www.cnblogs.com/leiwenbin627/p/11780223.html

4.3 Cassandra設定訪問密碼

修改配置檔案 cassandra.yaml
把 authenticator: AllowAllAuthenticator改為authenticator: PasswordAuthenticator

重啟cassandra
[root@test1 ~]# systemctl restart cassandra

此時之前的登入方式無法再登入進去
[root@test1 /opt/cassandra/bin]# ./cqlsh 192.168.220.129 
Connection error: ('Unable to connect to any servers', {'192.168.220.129': AuthenticationFailed('Remote end requires authentication.',)})

使用預設使用者名稱cassandra和預設密碼cassandra登入
[root@test1 /opt/cassandra/bin]# ./cqlsh 192.168.220.129 -ucassandra -pcassandra
Connected to test at 192.168.220.129:9042.
[cqlsh 5.0.1 | Cassandra 3.11.6 | CQL spec 3.4.4 | Native protocol v4]
Use HELP for help.
cassandra@cqlsh> 

建立使用者
CREATE USER myusername WITH PASSWORD 'mypassword' SUPERUSER ;
cassandra@cqlsh> CREATE USER root WITH PASSWORD 'flz_3qc' SUPERUSER ;

刪除預設帳號
注意:需要用新建立的賬號重新登入,才可以刪除預設賬號
[root@test1 /opt/cassandra/bin]# ./cqlsh 192.168.220.129 -uroot -pflz_3qc
Connected to test at 192.168.220.129:9042.
[cqlsh 5.0.1 | Cassandra 3.11.6 | CQL spec 3.4.4 | Native protocol v4]
Use HELP for help.
root@cqlsh> DROP USER cassandra;
root@cqlsh> 

無密碼登入
vim /root/.cassandra/cqlshrc
[authentication]
username = root
password = flz_3qc
測試
[root@test1 /opt/cassandra/bin]# ./cqlsh 192.168.220.129
Connected to test at 192.168.220.129:9042.
[cqlsh 5.0.1 | Cassandra 3.11.6 | CQL spec 3.4.4 | Native protocol v4]
Use HELP for help.
root@cqlsh>