官方地址:https://hub.docker.com/_/cassandra
目前最新版本是3.11.6
下载镜像
docker pull cassandra
Cassandra采用去中心化的集群架构,没有master节点的概念;但是会有seed节点在新节点连入时通知当前集群。
下面的Docker Compose模板将为你创建一个包含3个节点的Cassandra集群,其中第一个容器“cassandra-1”为seed节点。
新建目录/opt/cassandra,结构如下:
./ ├── cassandra.yaml └── docker-compose.yamlcassandra.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这样做的目的是为了,可以使用用户名和密码,进行远程连接。默认的策略,好像只能本地连接。
说明:
cassandra.yaml 挂载到容器中,开启用户远程登录。
/data/cassandra-cluster 是本地目录,用来做持久化的。
CASSANDRA_BROADCAST_ADDRESS 此变量用于控制向其他节点播发哪个IP地址。
CASSANDRA_SEEDS 这个变量是用逗号分隔的IP地址列表,gossip 用来引导加入集群的新节点。
在上面的docker-compose.yaml中,映射了2个端口。我一般只使用9042端口,用来做远程连接!
修改参数
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.
创建持久化目录
mkdir -p /data/cassandra-cluster/cassandra-{1,2,3}
现在,我们可以轻松利用 docker-compose 命令来启动Cassandra集群了
docker-compose up -d启动之后,需要等待1分钟左右。
这个时候,如果使用docker logs命令查看日志,会发现它会有一些报错,请不必理会!
因为我把数据目录映射了出来,默认是空的。所以第一次启动时,会报错。不过没有关系,docker会自动重新启动几次。
在第3次时,就会启动成功了。
输出:
... 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查询语言shell,并解释如何使用其命令。
默认情况下,Cassandra提供一个提示Cassandra查询语言shell(cqlsh),允许用户与它通信。使用此shell,您可以执行Cassandra查询语言(CQL)。
使用cqlsh,你可以
定义模式,插入数据,执行查询。
列出来的相当于关系型数据的的系统数据库名
cassandra@cqlsh> describe keyspaces; system_traces system_schema system_auth system system_distributed
解释:
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');
在删除语句时必须加条件,否则会出现: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