docker-compose安装并简单配置Cassandra

本文介绍如何在Docker环境中安装Cassandra 4.1版本,并进行简单配置实现远程访问及设置用户名密码等功能。


本文的目标是在docker环境下安装4.1版本的Cassandra,并且简单设置,可以远程访问,设置用户名密码等。

1. docker-compose.yaml

version: "3.8"
services:
  cassandra:
    image: cassandra:4.1
    container_name: cassandra
    ports:
      - 9042:9042
    volumes:
      - $PWD/commitlog:/var/lib/cassandra/commitlog
      - $PWD/hints:/var/lib/cassandra/hints
      - $PWD/data:/var/lib/cassandra/data
      - $PWD/saved_caches:/var/lib/cassandra/saved_caches
      - $PWD/logs:/var/log/cassandra

2.启动容器

使用如下指令启动容器:

docker-compose up -d

注意:如果如果没有在docker-compose.yaml文件所在目录或者文件名不是docker-compose.yaml,需要通过-f指定文件所在位置。即如:

docker-compose -f cassandra-start-up.yaml up -d

启动好之后,可以进入到容器之中:

➜  cassandra docker-compose up -d
Creating network "cassandra_default" with the default driver
Pulling cassandra (cassandra:4.1)...
4.1: Pulling from library/cassandra
eaead16dc43b: Pull complete
46e1869246ce: Pull complete
bbd45db92608: Pull complete
6fcfd0f47989: Pull complete
996685dfbe33: Pull complete
4927828dcc1b: Pull complete
7f67cde8352d: Pull complete
09bb07e15655: Pull complete
b8d7c6610af3: Pull complete
Status: Downloaded newer image for cassandra:4.1
Creating cassandra ... done
➜  cassandra docker ps
CONTAINER ID   IMAGE           COMMAND                  CREATED          STATUS          PORTS                                                       NAMES
cdf4f5b56a88   cassandra:4.1   "docker-entrypoint.s…"   10 minutes ago   Up 10 minutes   7000-7001/tcp, 7199/tcp, 9160/tcp, 0.0.0.0:9042->9042/tcp   cassandra
➜  cassandra docker exec -it cdf4f5b56a88 bash
root@cdf4f5b56a88:/# cqlsh
Connected to Test Cluster at 127.0.0.1:9042
[cqlsh 6.1.0 | Cassandra 4.1-beta1 | CQL spec 3.4.6 | Native protocol v5]
Use HELP for help.
cqlsh> desc keyspaces;

system       system_distributed  system_traces  system_virtual_schema
system_auth  system_schema       system_views

可以看到,我们已经通过cqlsh命令,登录到了当前的Cassandra数据库。
但是这里会有疑惑产生:

  • 登录数据库的指令太过简单了吧?!如果需要登录指定主机地址的数据库,应该怎么设置主机地址?
  • 登录数据库的指令不需要用户名和密码嘛?
  • 需要的话,我的用户名和密码是什么?就目前而言,我并没有做任何设置。
  • 如何设置用户名和密码?

3.简单设置Cassandra

既然有了上面的疑问,那就来一一弄明白:

3.1 cqlsh 是什么?

首先,cqlsh是什么?官网有解释:

cqlsh is a command-line interface for interacting with Cassandra using CQL (the Cassandra Query Language). It is shipped with every Cassandra package, and can be found in the bin/ directory alongside the cassandra executable. cqlsh is implemented with the Python native protocol driver, and connects to the single specified node.

可以知道,cqlsh是个Python的脚本来连接操作Cassandra的。基本用法就是:

cqlsh.py [options] [host [port]]

这里的options包括哪些呢? 官网写的很详细,我就不抄了,看这里 cqlsh: the CQL shell
我就挑几个最关心的看一下:

-u USERNAME --username=USERNAME
Authenticate as user.

-p PASSWORD --password=PASSWORD
Authenticate using password.

-k KEYSPACE --keyspace=KEYSPACE
Authenticate to the given keyspace.

这三个是用来指定用户名和密码以及keySpace的。

–credentials=CREDENTIALS
Specify an alternative credentials file location.

这个是用来指定credentials的。

3.2 为什么没有输入用户名和密码就直接登录了?

这里是由于没有做任何个性化配置,我们使用的相关配置是默认配置文件cassandra.yaml文件里的配置,这个配置文件在容器里的/opt/cassandra/conf目录下。这里的配置内容是

#AllowAllAuthenticator performs no checks - set it to disable authentication.
authenticator: AllowAllAuthenticator

当这里配置为AllowAllAuthenticator的时候,将不做任何的检查。是设置为关闭认证。
要想启用用户名密码登录,就需要将其设置为PasswordAuthenticator:

authenticator: PasswordAuthenticator

不过这个时候会发现,容器中没有vim,也没有vi,那就只能把容器里的文件copy出来,修改完再copy回去了。

docker cp cdf4f5b56a88:/opt/cassandra/conf/cassandra.yaml .

我这是把文件从容器中copy当当前位置,修改完之后再copy回去,source和destination位置互换,即:

docker cp cassandra.yaml cdf4f5b56a88:/opt/cassandra/conf/

替换完成之后,再重新启动容器:

docker restart cdf4f5b56a88

重启完之后再进入容器,再使用cqlsh指令登录,发得到如下错误:

➜  cassandra docker exec -it cdf4f5b56a88 bash
root@cdf4f5b56a88:/# cqlsh
Connection error: ('Unable to connect to any servers', {'127.0.0.1:9042': ConnectionRefusedError(111, "Tried connecting to [('127.0.0.1', 9042)]. Last error: Connection refused")})
root@cdf4f5b56a88:/#

看上面的提示,似乎也看不出来什么错误,只是connection refused。那就想着用用户名和密码尝试一下吧?由于我们没有设置用户名和密码,这个时候就只能使用系统默认设置的用户名和密码都是cassandra的账户进行登录。

root@cdf4f5b56a88:/# cqlsh -u cassandra -p cassandra

Warning: Using a password on the command line interface can be insecure.
Recommendation: use the credentials file to securely provide the password.

Connected to Test Cluster at 127.0.0.1:9042
[cqlsh 6.1.0 | Cassandra 4.1-beta1 | CQL spec 3.4.6 | Native protocol v5]
Use HELP for help.
cassandra@cqlsh>

可以看到这样我们就已经进来了。

3.3 创建新用户

cassnadra划分了三种角色类型:

xxopr: 应用账号,只能进行对表的查询、数据插入、数据删除等DML操作
xxdata: 相当于数据OWNER用户,对表空间内的对象拥有增删改查等DDL操作
cassandra: 超级用户,用于创建表空间的,DBA权限管理

这里先创建一个superuser:

create user root_cassandra with password '123456' superuser;

然后使用这个用户进行登录:

root@cdf4f5b56a88:/# cqlsh -u root_cassandra -p 123456

Warning: Using a password on the command line interface can be insecure.
Recommendation: use the credentials file to securely provide the password.

Connected to Test Cluster at 127.0.0.1:9042
[cqlsh 6.1.0 | Cassandra 4.1-beta1 | CQL spec 3.4.6 | Native protocol v5]
Use HELP for help.
root_cassandra@cqlsh> list users;

 name           | super | datacenters
----------------+-------+-------------
      cassandra |  True |         ALL
 root_cassandra |  True |         ALL

(2 rows)
root_cassandra@cqlsh>

可以看到,这里已经有两个超级用户了,不想保留cassandra这个用户的可以直接drop掉。

drop user cassandra

3.4 简单操作

既然已经到这里了,那就创建一个用户,试试简单操作先:

root_cassandra@cqlsh> create user test_data with password '123456' nosuperuser;
root_cassandra@cqlsh> exit;
root@cdf4f5b56a88:/# cqlsh -u test_data -p 123456

Warning: Using a password on the command line interface can be insecure.
Recommendation: use the credentials file to securely provide the password.

Connected to Test Cluster at 127.0.0.1:9042
[cqlsh 6.1.0 | Cassandra 4.1-beta1 | CQL spec 3.4.6 | Native protocol v5]
Use HELP for help.
test_data@cqlsh> CREATE KEYSPACE IF NOT EXISTS store WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : '1' };
test_data@cqlsh> desc keyspaces;

store   system_auth         system_schema  system_views
system  system_distributed  system_traces  system_virtual_schema

test_data@cqlsh> desc keyspace store

CREATE KEYSPACE store WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'}  AND durable_writes = true;
test_data@cqlsh> CREATE TABLE IF NOT EXISTS store.shopping_cart (
   ... userid text PRIMARY KEY,
   ... item_count int,
   ... last_update_timestamp timestamp
   ... );
test_data@cqlsh> INSERT INTO store.shopping_cart
   ... (userid, item_count, last_update_timestamp)
   ... VALUES ('9876', 2, toTimeStamp(now()));
test_data@cqlsh> INSERT INTO store.shopping_cart
   ... (userid, item_count, last_update_timestamp)
   ... VALUES ('1234', 5, toTimeStamp(now()));

可以看到已经创建了一个keyspace为store的库,创建了一个表shopping_cart,并插入了一些数据。查看一下表结构以及数据:

test_data@cqlsh:store> select * from store.shopping_cart;

 userid | item_count | last_update_timestamp
--------+------------+---------------------------------
   1234 |          5 | 2022-11-05 08:39:47.077000+0000
   9876 |          2 | 2022-11-05 08:39:46.226000+0000

(2 rows)
test_data@cqlsh:store> desc table shopping_cart;

CREATE TABLE store.shopping_cart (
    userid text PRIMARY KEY,
    item_count int,
    last_update_timestamp timestamp
) WITH additional_write_policy = '99p'
    AND bloom_filter_fp_chance = 0.01
    AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'}
    AND cdc = false
    AND comment = ''
    AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'}
    AND compression = {'chunk_length_in_kb': '16', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}
    AND memtable = 'default'
    AND crc_check_chance = 1.0
    AND default_time_to_live = 0
    AND extensions = {}
    AND gc_grace_seconds = 864000
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 0
    AND min_index_interval = 128
    AND read_repair = 'BLOCKING'
    AND speculative_retry = '99p';
test_data@cqlsh:store>

可以看到,数据可以查到,表结构还是有很多默认选项在里面的。这里的默认设置具体是什么意思,我们要怎么设置,先挖坑,填不填再说(我是大坑货)。

version: '3.8' services: cassandra-1: image: rdsource.tp-link.com:8088/cassandra:5.0.5 container_name: cassandra-1 environment: - CASSANDRA_CLUSTER_NAME=TestCluster - CASSANDRA_SEEDS=cassandra-1 - CASSANDRA_BROADCAST_RPC_ADDRESS=cassandra-1 networks: - cassandra-net cassandra-2: image: rdsource.tp-link.com:8088/cassandra:5.0.5 container_name: cassandra-2 environment: - CASSANDRA_CLUSTER_NAME=TestCluster - CASSANDRA_SEEDS=cassandra-1 - CASSANDRA_BROADCAST_ADDRESS=cassandra-2 networks: - cassandra-net cassandra-3: image: rdsource.tp-link.com:8088/cassandra:5.0.5 container_name: cassandra-3 environment: - CASSANDRA_CLUSTER_NAME=TestCluster - CASSANDRA_SEEDS=cassandra-1 - CASSANDRA_BROADCAST_ADDRESS=cassandra-3 networks: - cassandra-net networks: cassandra-net: driver: bridge docker-compose up -d Creating network "docker-cassandra_cassandra-net" with driver "bridge" Creating cassandra-3 ... done Creating cassandra-2 ... done Creating cassandra-1 ... done root@yz-virtual-machine:/mnt/hgfs/share-file/docker-cassandra# docker-compose ps Name Command State Ports ------------------------------------------------------------------------------------------------------- cassandra-1 docker-entrypoint.sh cassa ... Up 7000/tcp, 7001/tcp, 7199/tcp, 9042/tcp, 9160/tcp cassandra-2 docker-entrypoint.sh cassa ... Up 7000/tcp, 7001/tcp, 7199/tcp, 9042/tcp, 9160/tcp cassandra-3 docker-entrypoint.sh cassa ... Up 7000/tcp, 7001/tcp, 7199/tcp, 9042/tcp, 9160/tcp root@yz-virtual-machine:/mnt/hgfs/share-file/docker-cassandra# docker exec -it cassandra-1 bash Error response from daemon: container 6ab6f3886506c244d5d23893b9377d6cd5a18ff5933721b13e6dc7770c61d6c6 is not running root@yz-virtual-machine:/mnt/hgfs/share-file/docker-cassandra# docker-compose ps Name Command State Ports --------------------------------------------------------------- cassandra-1 docker-entrypoint.sh cassa ... Exit 137 cassandra-2 docker-entrypoint.sh cassa ... Exit 137 cassandra-3 docker-entrypoint.sh cassa ... Exit 3 root@yz-virtual-machine:/mnt/hgfs/share-file/docker-cassandra# docker down docker: unknown command: docker down Run 'docker --help' for more information root@yz-virtual-machine:/mnt/hgfs/share-file/docker-cassandra# docker-compose down Removing cassandra-1 ... done Removing cassandra-2 ... done Removing cassandra-3 ... done Removing network docker-cassandra_cassandra-net
最新发布
08-30
<think> 嗯,用户遇到了使用docker-compose启动Cassandra容器容器异常退出(Exit 137和Exit 3)以及执行docker down命令报错的问题。这看起来是个比较典型的Docker资源或配置问题。 用户提供的参考资料里有三个引用:[1]是关于Cassandradocker-compose配置示例,[2]是dockerdocker-compose安装指南,[3]是另一个应用的部署命令。这些引用其实和当前问题关联不大,用户可能是想展示他已经尝试过的方案。 Exit 137错误通常意味着容器被强制终止,最常见的原因是内存不足。Cassandra作为数据库对内存要求比较高,特别是在启动初始化期间。而Exit 3错误可能是权限问题或路径配置错误导致的启动失败。至于docker down报错,大概率是因为容器异常退出后处于不健康状态,导致标准清理流程失败。 需要分步骤解决这些问题: 首先处理内存问题,建议用户检查Docker的内存分配,特别是如果用户在用Mac或Windows的Docker Desktop,默认2GB内存可能不够。Cassandra官方建议至少4GB。然后检查挂载目录的权限,Cassandra容器默认以cassandra用户运行,UID 999需要写权限。 对于docker down报错,其实用户可能想说docker-compose down报错。这类报错往往由于容器状态异常,可以尝试先强制停止容器再删除。如果还是失败,可能需要手动清理残留进程或网络。 用户似乎已经有一定Docker使用经验,但可能对Cassandra的特定需求不太熟悉。在回复时要给出具体可操作的命令示例,比如查看日志的命令docker-compose logs,修改目录权限的命令sudo chown -R 999:999 ./data等。还要提醒用户注意数据持久化目录的配置是否正确,避免误删重要数据。 最后生成的问题要聚焦在Cassandra容器化部署的典型痛点,比如内存调优、持久化配置、权限处理等,这些都是用户后续可能会遇到的延伸问题。 </think> 以下是针对Cassandra容器异常退出(Exit 137/3)及`docker-compose down`报错的完整解决方案: --- ### **一、容器Exit 137/3的根本原因及修复** #### **1. Exit 137 - 内存不足** - **原因**:容器被系统OOM Killer强制终止(常见于低内存环境) - **解决方案**: - **增加内存限制**:在`docker-compose.yaml`中添加资源限制 ```yaml services: cassandra: mem_limit: 4g # 至少分配4GB内存 mem_reservation: 2g ``` - **关闭内存交换**:Cassandra需禁用swap(Linux系统执行): ```bash sudo swapoff -a ``` #### **2. Exit 3 - 存储权限/路径错误** - **原因**:挂载卷权限不足或路径无效 - **解决方案**: - **修正目录权限**: ```bash sudo chown -R 999:999 ./data ./commitlog ./hints # Cassandra默认UID/GID为999 ``` - **检查路径存在性**:确保`$PWD`下的子目录(如data/)已创建: ```bash mkdir -p {data,commitlog,hints,saved_caches,logs} ``` - **验证磁盘空间**: ```bash df -h # 确保挂载点有>10GB空间 ``` --- ### **二、`docker-compose down`报错处理** #### **典型报错场景** ```bash ERROR: for cassandra Container "cassandra" is restarting... ``` #### **强制清理方案**: 1. **强制停止容器**: ```bash docker-compose kill # 强制终止容器进程 ``` 2. **手动删除残留**: ```bash docker-compose rm -f # 强制删除容器 docker network prune -f # 清理孤立网络 ``` 3. **重启Docker服务**(极端情况): ```bash sudo systemctl restart docker ``` --- ### **三、关键配置优化建议** #### **1. 完整`docker-compose.yaml`示例** ```yaml version: "3.8" services: cassandra: image: cassandra:4.1 container_name: cassandra ports: - 9042:9042 volumes: - $PWD/commitlog:/var/lib/cassandra/commitlog - $PWD/hints:/var/lib/cassandra/hints - $PWD/data:/var/lib/cassandra/data - $PWD/saved_caches:/var/lib/cassandra/saved_caches - $PWD/logs:/var/log/cassandra mem_limit: 4g # 关键内存限制 restart: unless-stopped environment: - MAX_HEAP_SIZE=2G # JVM堆大小调整 - HEAP_NEWSIZE=1G ``` #### **2. 启动后诊断命令** ```bash # 查看实时日志: docker-compose logs -f --tail=100 # 检查容器资源占用: docker stats cassandra # 进入容器检查状态: docker exec -it cassandra nodetool status ``` --- ### **四、预防措施** 1. **预初始化目录**: ```bash mkdir -p {data,commitlog,hints,saved_caches,logs} && chmod 775 data ``` 2. **限制发启动**(集群场景): ```yaml deploy: replicas: 1 # 单节点启动成功后再扩展 ``` 3. **启用健康检查**: ```yaml healthcheck: test: cqlsh -e "DESCRIBE KEYSPACES" || exit 1 interval: 30s timeout: 10s ``` > **重要提示**:首次启动时,Cassandra需初始化系统表,磁盘I/O较高,耐心等待1-5分钟再检查状态[^1][^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值