分散式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 |
192.168.220.130(seed) | centos7.6 |
apache-cassandra-3.11.6 |
192.168.220.131(seed) | centos7.6 |
apache-cassandra-3.11.6 |
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>