Skip to content

快速参考

  • 由……维护
    Docker 社区

  • 何处获取帮助:
    Docker 社区 Slack、服务器故障、Unix & Linux 或 Stack Overflow

支持的标签及相应的 Dockerfile 链接

快速参考(续)

什么是 Cassandra?

Apache Cassandra 是一个开源分布式数据库管理系统,旨在跨许多商用服务器处理大量数据,提供高可用性且无单点故障。Cassandra 为跨多个数据中心的集群提供强大支持,具有异步无主复制功能,可为所有客户端实现低延迟操作。

wikipedia.org/wiki/Apache_Cassandra

logo

如何使用此图像

启动一个 cassandra 服务器实例

启动一个 Cassandra 实例很简单:

$ docker run --name some-cassandra --network some-network -d cassandra:tag

其中 some-cassandra 是你想要分配给容器的名称, tag 是指定你想要的 Cassandra 版本的标签。有关标签请参见上面的列表。

创建一个集群

使用下面记录的环境变量,有两种集群场景:同一台机器上的实例和不同机器上的实例。对于同一台机器,按照上述描述启动实例。要启动其他实例,只需告诉每个新节点第一个实例在哪里。

$ docker run --name some-cassandra2 -d --network some-network -e CASSANDRA_SEEDS=some-cassandra cassandra:tag

对于独立的机器(即云提供商上的两个虚拟机),你需要告诉 Cassandra 向其他节点通告什么 IP 地址(因为容器的地址在 Docker 桥接之后)。

假设第一台机器的 IP 地址是 10.42.42.42 ,第二台的是 10.43.43.43 ,以暴露的 gossip 端口启动第一台:

$ docker run --name some-cassandra -d -e CASSANDRA_BROADCAST_ADDRESS=10.42.42.42 -p 7000:7000 cassandra:tag

然后在第二台机器上启动一个 Cassandra 容器,将暴露的八卦端口和种子指向第一台机器:

$ docker run --name some-cassandra -d -e CASSANDRA_BROADCAST_ADDRESS=10.43.43.43 -p 7000:7000 -e CASSANDRA_SEEDS=10.42.42.42 cassandra:tag

cqlsh 连接到 Cassandra

以下命令启动另一个 Cassandra 容器实例,并针对原始 Cassandra 容器运行 cqlsh (Cassandra 查询语言外壳),允许您针对数据库实例执行 CQL 语句:

$ docker run -it --network some-network --rm cassandra cqlsh some-cassandra

关于 CQL 的更多信息可以在 Cassandra 文档中找到。

容器外壳访问和查看 Cassandra 日志

docker exec 命令允许你在 Docker 容器内运行命令。以下命令行将在你的 cassandra 容器内给你一个 bash 外壳:

$ docker exec -it some-cassandra bash

Cassandra 服务器日志可通过 Docker 的容器日志获取:

$ docker logs some-cassandra

配置 Cassandra

cassandra 镜像提供配置的最佳方式是提供一个自定义的 /etc/cassandra/cassandra.yaml 文件。有很多方法可以将此文件提供给容器(通过带有 FROM + COPY 的短 Dockerfile 、通过 Docker 配置、通过运行时绑定挂载等),其细节留作读者的练习。

若要使用不同的文件名(例如,避免所有图像提供的配置行为),将 -Dcassandra.config=/path/to/cassandra.yaml 用作图像的参数(如, docker run ... cassandra -Dcassandra.config=/path/to/cassandra.yaml )。

图像支持的环境变量数量很少,这些环境变量会以某种方式修改 /etc/cassandra/cassandra.yaml (但脚本正在修改 YAML,所以自然很脆弱):

  • CASSANDRA_LISTEN_ADDRESS :此变量用于控制要侦听传入连接的 IP 地址。默认值是 auto ,它将在 cassandra.yaml 中把 listen_address 选项设置为容器启动时的 IP 地址。在大多数用例中,此默认值应该可行。

  • CASSANDRA_BROADCAST_ADDRESS :此变量用于控制向其他节点通告哪个 IP 地址。默认值是 CASSANDRA_LISTEN_ADDRESS 的值。它将在 cassandra.yaml 中设置 broadcast_addressbroadcast_rpc_address 选项。

  • CASSANDRA_RPC_ADDRESS :此变量用于控制将 thrift rpc 服务器绑定到哪个地址。如果您未指定地址,则将使用通配符地址( 0.0.0.0 )。它将在 cassandra.yaml 中设置 rpc_address 选项。

  • CASSANDRA_START_RPC :此变量用于控制是否启动 thrift rpc 服务器。它将在 cassandra.yaml 中设置 start_rpc 选项。

  • CASSANDRA_SEEDS :此变量是用于引导加入集群的新节点的 gossip 所使用的以逗号分隔的 IP 地址列表。它将设置 cassandra.yamlseed_provider 选项的 seeds 值。 CASSANDRA_BROADCAST_ADDRESS 将添加传入的种子,以便服务器也能与自身通信。

  • CASSANDRA_CLUSTER_NAME :此变量设置集群的名称,并且对于集群中的所有节点必须相同。它将设置 cassandra.yamlcluster_name 选项。

  • CASSANDRA_NUM_TOKENS :此变量设置此节点的令牌数量。它将设置 cassandra.yamlnum_tokens 选项。

  • CASSANDRA_DC :此变量设置此节点的数据中心名称。它将设置 cassandra-rackdc.propertiesdc 选项。为了让 Cassandra 应用 cassandra-rackdc.properties ,你必须设置 CASSANDRA_ENDPOINT_SNITCH 以使用“GossipingPropertyFileSnitch”,否则此变量将没有效果。

  • CASSANDRA_RACK :此变量设置此节点的机架名称。它将设置 rackcassandra-rackdc.properties 选项。为了让 Cassandra 应用 cassandra-rackdc.properties ,你必须设置 CASSANDRA_ENDPOINT_SNITCH 以使用“GossipingPropertyFileSnitch”,否则此变量将没有效果。

  • CASSANDRA_ENDPOINT_SNITCH :此变量设置此节点将使用的告密者实现。它将设置 cassandra.ymlendpoint_snitch 选项。

注意事项

数据存储在哪里

重要说明:有几种方法可以存储在 Docker 容器中运行的应用程序所使用的数据。我们鼓励 cassandra 镜像的用户熟悉可用的选项,包括:

  • 让 Docker 通过使用其自身内部的卷管理将数据库文件写入主机系统的磁盘来管理数据库数据的存储。这是默认设置,对用户来说简单且相当透明。缺点是对于直接在主机系统上运行(即在容器外部)的工具和应用程序而言,这些文件可能很难定位。
  • 在主机系统(容器外部)上创建一个数据目录,并将其挂载到容器内部可见的目录。这会将数据库文件放置在主机系统上的已知位置,并且使主机系统上的工具和应用程序易于访问这些文件。缺点是用户需要确保该目录存在,并且例如主机系统上的目录权限和其他安全机制已正确设置。

Docker 文档是了解不同存储选项和变体的良好起点,并且有多个博客和论坛帖子在该领域进行讨论并提供建议。我们将在此处仅展示上述后一种选项的基本过程:

  1. 在主机系统的合适卷上创建一个数据目录,例如 /my/own/datadir

  2. 像这样启动你的 cassandra 容器:

    $ docker run --name some-cassandra -v /my/own/datadir:/var/lib/cassandra -d cassandra:tag
    

命令的 -v /my/own/datadir:/var/lib/cassandra 部分将底层主机系统中的 /my/own/datadir 目录挂载为容器内的 /var/lib/cassandra ,默认情况下,Cassandra 将在其中写入其数据文件。

在 Cassandra 初始化完成之前没有连接

如果容器启动时没有初始化数据库,那么将创建一个默认数据库。虽然这是预期行为,但这意味着在初始化完成之前它将不接受传入连接。这可能会在使用自动化工具(例如 docker-compose )时导致问题,这些工具会同时启动多个容器。

许可证

查看此映像中包含的软件的许可证信息。

与所有 Docker 镜像一样,这些镜像可能还包含其他可能受其他许可证约束的软件(例如来自基础发行版的 Bash 等,以及所包含的主要软件的任何直接或间接依赖项)。

一些能够自动检测到的额外许可证信息可能会在 repo-info 存储库的 cassandra/ 目录中找到。

对于任何预构建镜像的使用,镜像用户有责任确保对此镜像的任何使用都符合其中包含的所有软件的任何相关许可证。