基於docker創建Cassandra集群


一、概述

簡介

  • Cassandra是一個開源分布式NoSQL數據庫系統。
  • 它最初由Facebook開發,用於儲存收件箱等簡單格式數據,集GoogleBigTable的數據模型與Amazon Dynamo的完全分布式的架構於一身。Facebook於2008將 Cassandra 開源,此后,由於Cassandra良好的可擴展性,被Digg、Twitter等知名Web 2.0網站所采納,成為了一種流行的分布式結構化數據存儲方案。
  • 不過國內並未流行起來,除了最早的淘寶和360在用,加上阿里巴巴后來一直在推崇HBase,就GG了。。。

 

 

特點

  • Cassandra的主要特點就是它不是一個數據庫,而是由一堆數據庫節點共同構成的一個分布式網絡服務,對Cassandra 的一個寫操作,會被復制到其他節點上去,對Cassandra的讀操作,也會被路由到某個節點上面去讀取。對於一個Cassandra集群來說,擴展性能是比較簡單的事情,只管在群集里面添加節點就可以了。
  • 上面的話太官方了,哈哈哈。,簡單來說呢就是說它是一個P2P去中心化的東西,咱門平時傳統用的數據庫都會有Master/Slave,在復雜的場景下對於Master進行擴展是個非常麻煩的事,而Cassandra幫助我們解決了這個麻煩。
  • 它是一個面向列的數據庫,不向傳統結構式數據庫是用表來模擬關系,也就是說你可以隨意擴展你的字段。你可以想象cassandra是一個連續嵌套的Map結構。如下圖所示

 

二、docker搭建

環境說明

操作系統 docker版本 ip地址 配置
centos 7.6 19.03.12 192.168.31.229 4核8g

 

 

 

下載鏡像

官方地址:https://hub.docker.com/_/cassandra

 

 目前最新版本是3.11.6

 

下載鏡像

docker pull cassandra

 

Docker Compose部署

Cassandra采用去中心化的集群架構,沒有master節點的概念;但是會有seed節點在新節點連入時通知當前集群。

下面的Docker Compose模板將為你創建一個包含3個節點的Cassandra集群,其中第一個容器“cassandra-1”為seed節點。

 

新建目錄/opt/cassandra,結構如下:

./
├── cassandra.yaml
└── docker-compose.yaml

cassandra.yaml 

cassandra.yaml 是從cassandra容器里面拷貝出來的。

先運行一個單節點的cassandra

docker run -it cassandra /bin/bash

再開一個新的窗口,拷貝配置文件。

cd /opt/cassandra
docker cp tmp-cassandra:/opt/cassandra/conf/cassandra.yaml .

 

修改cassandra.yaml,將

authenticator: AllowAllAuthenticator

修改為:

authenticator: PasswordAuthenticator

這樣做的目的是為了,可以使用用戶名和密碼,進行遠程連接。默認的策略,好像只能本地連接。

 

docker-compose.yaml

version: '3'
services:
  cassandra-1:
    image: cassandra
    container_name: cassandra-1
    volumes:
      - ./cassandra.yaml:/opt/cassandra/conf/cassandra.yaml
      - /data/cassandra-cluster/cassandra-1/cassandra:/var/lib/cassandra
    environment:
      - CASSANDRA_BROADCAST_ADDRESS=cassandra-1
    ports:
      - "7000:7000"
      - "9042:9042"
    restart: always
  cassandra-2:
    image: cassandra
    container_name: cassandra-2
    volumes:
      - ./cassandra.yaml:/opt/cassandra/conf/cassandra.yaml
      - /data/cassandra-cluster/cassandra-2/cassandra:/var/lib/cassandra
    environment:
      - CASSANDRA_BROADCAST_ADDRESS=cassandra-2
      - CASSANDRA_SEEDS=cassandra-1
    ports:
      - "7001:7000"
      - "9043:9042"
    depends_on:
      - cassandra-1
    restart: always
  cassandra-3:
    image: cassandra
    container_name: cassandra-3
    volumes:
      - ./cassandra.yaml:/opt/cassandra/conf/cassandra.yaml
      - /data/cassandra-cluster/cassandra-3/cassandra:/var/lib/cassandra
    environment:
      - CASSANDRA_BROADCAST_ADDRESS=cassandra-3
      - CASSANDRA_SEEDS=cassandra-1
    ports:
      - "7002:7000"
      - "9044:9042"
    depends_on:
      - cassandra-2
    restart: always

說明:

cassandra.yaml 掛載到容器中,開啟用戶遠程登錄。

/data/cassandra-cluster 是本地目錄,用來做持久化的。

CASSANDRA_BROADCAST_ADDRESS 此變量用於控制向其他節點播發哪個IP地址。

CASSANDRA_SEEDS 這個變量是用逗號分隔的IP地址列表,gossip 用來引導加入集群的新節點。

 

cassandra 常用端口

  • 7199 - JMX(8080 pre Cassandra 0.8.xx)
  • 7000 - 節點間通信(如果啟用了TLS,則不使用)
  • 7001 - TLS節點間通信(使用TLS時使用)
  • 9160 - Thrift客戶端API
  • 9042 - CQL本地傳輸端口

 

 

在上面的docker-compose.yaml中,映射了2個端口。我一般只使用9042端口,用來做遠程連接!

 

調整系統參數

vi /etc/sysctl.conf

修改參數

vm.max_map_count=1048575

刷新參數

sysctl -p

 

如果不做這一步,啟動Cassandra集群時,會有警告信息

WARN  [main] 2020-07-01 05:59:39,699 StartupChecks.java:311 - Maximum number of memory map areas per process (vm.max_map_count) 65530 is too low, recommended value: 1048575, you can change it with sysctl.

 

啟動docker-compose

創建持久化目錄

mkdir -p /data/cassandra-cluster/cassandra-{1,2,3}

 

現在,我們可以輕松利用 docker-compose 命令來啟動Cassandra集群了

docker-compose up -d

啟動之后,需要等待1分鍾左右。

 

這個時候,如果使用docker logs命令查看日志,會發現它會有一些報錯,請不必理會!

因為我把數據目錄映射了出來,默認是空的。所以第一次啟動時,會報錯。不過沒有關系,docker會自動重新啟動幾次。

在第3次時,就會啟動成功了。

 

查看日志

docker logs -f cassandra-1

輸出:

...
INFO  [main] 2020-07-01 06:11:12,670 Server.java:159 - Starting listening for CQL clients on /0.0.0.0:9042 (unencrypted)...
INFO  [main] 2020-07-01 06:11:12,791 CassandraDaemon.java:556 - Not starting RPC server as requested. Use JMX (StorageService->startRPCServer()) or nodetool (enablethrift) to start it
INFO  [OptionalTasks:1] 2020-07-01 06:11:13,588 CassandraRoleManager.java:372 - Created default superuser role 'cassandra'

看到了9042,說明集群已經工作正常了!

 

查看集群狀態

查看容器運行狀態

# docker-compose ps
   Name                  Command               State                            Ports                          
---------------------------------------------------------------------------------------------------------------
cassandra-1   docker-entrypoint.sh cassa ...   Up      0.0.0.0:7000->7000/tcp, 7001/tcp, 7199/tcp,             
                                                       0.0.0.0:9042->9042/tcp, 9160/tcp                        
cassandra-2   docker-entrypoint.sh cassa ...   Up      0.0.0.0:7001->7000/tcp, 7001/tcp, 7199/tcp,             
                                                       0.0.0.0:9043->9042/tcp, 9160/tcp                        
cassandra-3   docker-entrypoint.sh cassa ...   Up      0.0.0.0:7002->7000/tcp, 7001/tcp, 7199/tcp,             
                                                       0.0.0.0:9044->9042/tcp, 9160/tcp     

 

使用Cassandra自帶命令,查看Cassandra集群狀態

# docker exec -ti cassandra-1 cqlsh -u cassandra -pcassandra cassandra-2 -e "DESCRIBE CLUSTER"

Cluster: Test Cluster
Partitioner: Murmur3Partitioner

由於開啟了密碼認證。連接cassandra時,需要用戶名和密碼。這里的-u參數指定用戶名,-p指定密碼。

由此可知,默認的用戶名和密碼都是cassandra

 

三、Cassandra Cqlsh

 這里大概介紹Cassandra查詢語言shell,並解釋如何使用其命令。

默認情況下,Cassandra提供一個提示Cassandra查詢語言shell(cqlsh),允許用戶與它通信。使用此shell,您可以執行Cassandra查詢語言(CQL)。

使用cqlsh,你可以

  • 定義模式,
  • 插入數據,
  • 執行查詢。

 

啟動cqlsh

# docker exec -it cassandra-1 /bin/bash
root@4881bf50f2d5:/# cqlsh -u cassandra -pcassandra
Connected to Test Cluster at 127.0.0.1:9042.
[cqlsh 5.0.1 | Cassandra 3.11.6 | CQL spec 3.4.4 | Native protocol v4]
Use HELP for help.
cassandra@cqlsh> 

 

查詢keyspaces

列出來的相當於關系型數據的的系統數據庫名

cassandra@cqlsh> describe keyspaces;

system_traces  system_schema  system_auth  system  system_distributed

 

創建數據庫

cassandra@cqlsh> CREATE KEYSPACE IF NOT EXISTS mycasdb WITH REPLICATION = {'class': 'SimpleStrategy','replication_factor':3};
cassandra@cqlsh> describe keyspaces;

system_schema  system_auth  mycasdb  system  system_distributed  system_traces

解釋:

Replication Factor : 復制因數。 表示一份數據在一個DC 之中包含幾份。常用奇數~ 比如我們項目組設置的replication_factor=3

Replica placement strategy : 復制策略。 默認的是SimpleStrategy. 如果是單機架、單數據中心的模式,保持使用SimpleStrtegy即可。
 

創建表

在mycasdb數據庫中創建一個表,首先使用use mycasdb;表示要使用此數據庫,然后在使用:

cassandra@cqlsh> use mycasdb;
cassandra@cqlsh:mycasdb> CREATE TABLE user (id int,user_name varchar,PRIMARY KEY (id));

 

查看表

查看數據庫中的表

cassandra@cqlsh:mycasdb> describe tables;

user

 

插入表數據

向user表中插入輸入,使用:

cassandra@cqlsh:mycasdb> INSERT INTO user (id,user_name) VALUES (1,'sxj');
cassandra@cqlsh:mycasdb> INSERT INTO user (id,user_name) VALUES (2,'sxj12');
cassandra@cqlsh:mycasdb> INSERT INTO user (id,user_name) VALUES (3,'sxj123');
cassandra@cqlsh:mycasdb> INSERT INTO user (id,user_name) VALUES (4,'sxj1234');

 

查詢表數據

cassandra@cqlsh:mycasdb> select * from user;

 id | user_name
----+-----------
  1 |       sxj
  2 |     sxj12
  4 |   sxj1234
  3 |    sxj123

(4 rows)

 

刪除語句

cassandra@cqlsh:mycasdb> delete from user where id=2;
cassandra@cqlsh:mycasdb> select * from user;

 id | user_name
----+-----------
  1 |       sxj
  4 |   sxj1234
  3 |    sxj123

(3 rows)

 

在刪除語句時必須加條件,否則會出現:SyntaxException:line 1:16 mismatched input ';' expecting K_WHERE,如下所示:

cassandra@cqlsh:mycasdb> delete from user;
SyntaxException: line 1:16 mismatched input ';' expecting K_WHERE

 

 

本文參考鏈接:

https://yq.aliyun.com/articles/61950

https://blog.csdn.net/toefllitong/article/details/79041155

https://blog.csdn.net/lixinkuan328/article/details/92238083

https://www.w3cschool.cn/cassandra/cassandra_cqlsh.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM