一、概述

简介

  • 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

基于docker创建Cassandra集群的更多相关文章

  1. 基于Docker的redis集群搭建

    Redis集群官方介绍:http://www.redis.cn/topics/cluster-tutorial.html 基于Docker搭建Redis集群 环境:6个节点,三主三从 制作Redis镜 ...

  2. 基于docker安装pxc集群

    基于docker安装pxc集群 一.PXC 集群的安装 PXC集群比较特殊,需要安装在 linux 或 Docker 之上.这里使用 Docker进行安装! Docker的镜像仓库中包含了 PXC数据 ...

  3. 庐山真面目之十二微服务架构基于Docker搭建Consul集群、Ocelot网关集群和IdentityServer版本实现

    庐山真面目之十二微服务架构基于Docker搭建Consul集群.Ocelot网关集群和IdentityServer版本实现 一.简介      在第七篇文章<庐山真面目之七微服务架构Consul ...

  4. 基于Docker部署ETCD集群

    基于Docker部署ETCD集群 关于ETCD要不要使用TLS? 首先TLS的目的是为了鉴权为了防止别人任意的连接上你的etcd集群.其实意思就是说如果你要放到公网上的ETCD集群,并开放端口,我建议 ...

  5. 基于docker搭建elasticsearch集群

    es集群的搭建 - 基于单机搭建elasticsearch集群见官网 https://www.elastic.co/guide/en/elasticsearch/reference/current/d ...

  6. quay.io/coreos/etcd 基于Docker镜像的集群搭建

    etcd是一个高可用的键值存储系统,主要用于共享配置和服务发现.etcd是由CoreOS开发并维护的,灵感来自于 ZooKeeper 和 Doozer,它使用Go语言编写,并通过Raft一致性算法处理 ...

  7. docker创建ceph集群

    背景 Ceph官方现在提供两类镜像来创建集群,一种是常规的,每一种Ceph组件是单独的一个镜像,如ceph/daemon.ceph/radosgw.ceph/mon.ceph/osd等:另外一种是最新 ...

  8. 基于Docker的Consul集群实现服务发现

    服务发现 其实简单说,服务发现就是解耦服务与IP地址之间的硬绑定关系,以典型的集群为例,对于集群来说,是有多个节点的,这些节点对应多个IP(或者同一个IP的不同端口号),集群中不同节点责任是不一样的. ...

  9. docker创建Redis集群

    开始工作: yum install wegt ##安装下载工具 yum install net-tools ##安装网络工具 yum install tree ##安装tree命令(方便查看集群配置文 ...

随机推荐

  1. Azure Functions(一)什么是 ServerLess

    一,引言 自去年4月份分享过3篇关于 Azure Functions 的文章之后,就一直没有再将 Azure Functions 相关的内容了.今天再次开始将 Azure Functions 相关的课 ...

  2. httprunner(6)配置信息config

    前言 每个测试用例都应该有config部分,可以配置用例级别.比如name.base_url.variables.verify.export等等 案例演示 from httprunner import ...

  3. c++中几种swap

    在c与c++中,有多种办法可以通过函数交换传入的两数的值,但有容易有一些问题产生,因而本文将几种交换方式及容易出错的点进行了分类. 1.传引用这是c++中最常见方式如下: int swap1 (int ...

  4. priority_queue()大根堆和小根堆(二叉堆)

    #include<iostream> #include <queue> using namespace std; int main() { //对于基础类型 默认是大顶堆 pr ...

  5. 【poj 2407】Relatives(数论--欧拉函数 模版题)

    题意就是求10^9以内的正整数的欧拉函数(Φ(n)表示<=n的与n互质的正整数个数). 解法:用欧拉筛和欧拉函数的一些性质:    1.若p是质数,Φ(p)=p-1:    2.欧拉函数是积性函 ...

  6. How many integers can you find HDU - 1796 容斥原理

    题意: 给你一个数n,找出来区间[1,n]内有多少书和n不互质 题解: 容斥原理 这一道题就让我真正了解容斥原理的实体部分 "容斥原理+枚举状态,碰到奇数加上(n-1)/lcm(a,b,c. ...

  7. word2vector论文笔记

    背景 很多当前的NLP系统和技术都把单词像ont-hot一样当做原子性的一个概念去对待,单纯就是一个索引,无法表示词之间的相似性.原因就是往往一个简单的.鲁棒的.可观测的模型在海量数据集上的学习效果要 ...

  8. linux无需root挂载iso镜像文件

    引言 起初,我在针对deepin制作一款appimage安装工具,想要其实现的功能就是自动获取图标,只需要输入软件名称和分类即可,当然以后也会寻找方案省去手动输入的麻烦. 后来我发现一个有趣的问题 o ...

  9. centos7+腾讯云服务器搭建wordpress

    title: centos7+腾讯云服务器搭建wordpress date: 2020-03-04 categories: web tags: [wordpress] 分两部分:1.搭建LEMP环境 ...

  10. Fullscreen API All In One

    Fullscreen API All In One 全屏显示 https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API https ...