cassandra指定配置文件的docker启动方法

在使用 Docker 部署 Cassandra 时,您可能需要自定义 Cassandra 的配置文件(如 cassandra.yaml)以满足特定需求,例如配置集群名称、种子节点、数据中心等。以下是如何在 Docker 容器运行时指定和使用自定义配置文件的详细步骤和说明:

步骤概述

  1. 安装 Docker(已完成)
  2. 创建 Docker 网络(已完成)
  3. 准备数据存储目录(已完成)
  4. 拉取 Cassandra 镜像(已完成)
  5. 准备自定义配置文件
  6. 运行 Cassandra 容器并挂载配置文件
  7. 配置多节点集群(如果需要)

步骤 5: 准备自定义配置文件

要自定义 Cassandra 的配置,您需要准备一个或多个配置文件,并将它们挂载到容器内的相应目录。以下是具体步骤:

5.1 创建配置文件目录

在宿主机上创建一个目录用于存放 Cassandra 的配置文件。例如:

bash 复制代码
mkdir -p /root/cassandra/conf
5.2 获取默认配置文件

您需要获取 Cassandra 镜像中的默认配置文件,以便进行修改。可以通过以下命令启动一个临时容器并复制配置文件:

bash 复制代码
docker run --rm cassandra cat /etc/cassandra/cassandra.yaml > /root/cassandra/conf/cassandra.yaml
5.3 编辑配置文件

使用您喜欢的文本编辑器(如 vimnano)编辑 /root/cassandra/conf/cassandra.yaml 文件,根据您的需求进行修改。以下是一些常见的配置项及其说明:

yaml 复制代码
cluster_name: "YourClusterName"  # 集群名称,所有节点必须一致

num_tokens: 256  # 每个节点的令牌数,决定数据分片的数量

seed_provider:
  - class_name: org.apache.cassandra.locator.SimpleSeedProvider
    parameters:
      - seeds: "192.168.1.101,192.168.1.102"  # 种子节点的 IP 地址列表

listen_address: "192.168.1.101"  # 当前节点的 IP 地址

rpc_address: "0.0.0.0"  # RPC 服务的监听地址

endpoint_snitch: GossipingPropertyFileSnitch  # 用于数据中心和机架感知的 Snitch

# 数据目录和提交日志目录(如果需要自定义)
data_file_directories:
  - /var/lib/cassandra/data
commitlog_directory: /var/lib/cassandra/commitlog

注意事项:

  • 种子节点(Seed Nodes):seed_provider 中列出集群中一部分种子节点的 IP 地址。通常不需要列出所有节点,只需至少两个种子节点以确保集群的稳定性。
  • 集群名称(cluster_name): 确保所有节点的 cluster_name 一致。
  • 监听地址(listen_address)和 RPC 地址(rpc_address): 配置为每个节点的实际 IP 地址。对于多节点集群,每个节点的 listen_address 应该是唯一的。
  • Snitch 配置: 根据您的网络拓扑选择合适的 endpoint_snitchGossipingPropertyFileSnitch 是常用且灵活的选择,适用于大多数场景。
5.4 配置其他文件(可选)

如果需要自定义其他配置文件,如 cassandra-rackdc.properties,您可以按照类似的步骤复制并修改这些文件,然后挂载到容器中相应的位置。

步骤 6: 运行 Cassandra 容器并挂载配置文件

使用 docker run 命令启动 Cassandra 容器,并将自定义的配置文件挂载到容器内。以下是修改后的运行命令示例:

bash 复制代码
docker run -d \
  --name zd-cassandra \
  --restart always \
  -p 9042:9042 \
  --network cassandra \
  -v /root/cassandra:/var/lib/cassandra \
  -v /root/cassandra/conf/cassandra.yaml:/etc/cassandra/cassandra.yaml \
  -e CASSANDRA_USER=cassandra \
  -e CASSANDRA_PASSWORD=cassandra \
  cassandra

命令说明:

  • -v /root/cassandra/conf/cassandra.yaml:/etc/cassandra/cassandra.yaml:将宿主机的自定义 cassandra.yaml 文件挂载到容器内的 /etc/cassandra/cassandra.yaml,覆盖默认配置。
  • 其他参数保持不变,用于配置网络、端口映射、数据存储和环境变量等。

多个配置文件挂载示例:

如果您还自定义了其他配置文件(如 cassandra-rackdc.properties),可以按如下方式挂载:

bash 复制代码
docker run -d \
  --name zd-cassandra \
  --restart always \
  -p 9042:9042 \
  --network cassandra \
  -v /root/cassandra:/var/lib/cassandra \
  -v /root/cassandra/conf/cassandra.yaml:/etc/cassandra/cassandra.yaml \
  -v /root/cassandra/conf/cassandra-rackdc.properties:/etc/cassandra/cassandra-rackdc.properties \
  -e CASSANDRA_USER=cassandra \
  -e CASSANDRA_PASSWORD=cassandra \
  cassandra

步骤 7: 配置多节点集群(如果需要)

如果您计划在多个服务器上部署 Cassandra 节点,确保每个节点都按照以下步骤配置:

  1. 准备每个节点的配置文件:

    • 为每个节点创建独立的配置文件目录(如 /root/cassandra_node1/conf/root/cassandra_node2/conf)。
    • 修改每个节点的 cassandra.yaml,确保 listen_addressrpc_address 设置为各自节点的 IP 地址。
    • seed_provider 中包含集群中至少一个种子节点的 IP 地址。
  2. 启动每个节点的 Cassandra 容器:

    bash 复制代码
    docker run -d \
      --name zd-cassandra-node1 \
      --restart always \
      -p 9042:9042 \
      --network cassandra \
      -v /root/cassandra_node1:/var/lib/cassandra \
      -v /root/cassandra_node1/conf/cassandra.yaml:/etc/cassandra/cassandra.yaml \
      -e CASSANDRA_USER=cassandra \
      -e CASSANDRA_PASSWORD=cassandra \
      cassandra
    
    docker run -d \
      --name zd-cassandra-node2 \
      --restart always \
      -p 9043:9042 \  # 注意端口映射避免冲突
      --network cassandra \
      -v /root/cassandra_node2:/var/lib/cassandra \
      -v /root/cassandra_node2/conf/cassandra.yaml:/etc/cassandra/cassandra.yaml \
      -e CASSANDRA_USER=cassandra \
      -e CASSANDRA_PASSWORD=cassandra \
      cassandra

    注意:

    • 每个节点的容器应使用不同的主机端口(如 90429043)映射到容器内的 9042 端口,以避免端口冲突。
    • 确保每个节点的 cassandra.yaml 文件正确配置了各自的 IP 地址和种子节点列表。

总结

通过上述步骤,您可以在 Docker 容器中部署和配置多个 Cassandra 节点,确保它们能够作为一个集群协同工作。关键点如下:

  • 自定义配置文件: 创建和编辑自定义的 cassandra.yaml 文件,并通过 Docker 卷挂载到容器内,覆盖默认配置。
  • 种子节点配置:cassandra.yaml 中指定种子节点的 IP 地址,确保新节点能够通过种子节点加入集群。
  • 独立端口映射: 如果在同一台服务器上运行多个 Cassandra 容器,确保它们的主机端口映射不同,避免端口冲突。
  • 数据持久化: 使用 Docker 卷挂载宿主机的目录到容器内,确保数据在容器重启或删除后依然持久化。

示例:自定义 cassandra.yaml

以下是一个自定义的 cassandra.yaml 示例,用于多节点集群:

yaml 复制代码
cluster_name: "Thingsboard Cluster"

num_tokens: 256

seed_provider:
  - class_name: org.apache.cassandra.locator.SimpleSeedProvider
    parameters:
      - seeds: "192.168.1.101,192.168.1.102"

listen_address: "192.168.1.103"  # 当前节点的 IP 地址

rpc_address: "0.0.0.0"

endpoint_snitch: GossipingPropertyFileSnitch

data_file_directories:
  - /var/lib/cassandra/data
commitlog_directory: /var/lib/cassandra/commitlog
saved_caches_directory: /var/lib/cassandra/saved_caches

# 其他自定义配置项...

在这个示例中:

  • cluster_name: 设置为 "Thingsboard Cluster",确保所有节点一致。
  • seeds: 列出种子节点的 IP 地址,例如 "192.168.1.101,192.168.1.102"
  • listen_address: 当前节点的 IP 地址,例如 "192.168.1.103"
  • rpc_address: 设置为 "0.0.0.0",允许外部访问 RPC 服务。

常见问题

  1. 配置文件修改后容器未生效:

    • 确保配置文件路径正确,并且挂载的配置文件覆盖了容器内的默认文件。

    • 重启容器以应用新的配置:

      bash 复制代码
      docker restart zd-cassandra
  2. 节点无法加入集群:

    • 检查网络连接,确保所有节点能够相互访问。
    • 确保种子节点配置正确,并且种子节点正在运行。
    • 检查 Cassandra 日志(通常位于 /var/log/cassandra/ 或容器内的 /var/lib/cassandra/log)以获取错误信息。
  3. 端口冲突:

    • 在同一台服务器上运行多个 Cassandra 容器时,确保主机端口(如 90429043)不重复。
    • 使用不同的宿主机端口映射到容器内的 9042 端口。

通过正确配置和部署,您可以在 Docker 环境中高效地运行一个多节点的 Cassandra 集群,为 ThingsBoard 提供可靠的后端数据库支持。

相关推荐
翻滚吧键盘1 小时前
记录一个连不上docker中的mysql的问题
mysql·docker·容器
计算机毕设定制辅导-无忧学长2 小时前
Nginx 性能优化技巧与实践(二)
运维·nginx·性能优化
元气满满的热码式2 小时前
K8S中数据存储之配置存储
云原生·容器·kubernetes
龙胖不下锅2 小时前
k8s服务StatefulSet部署模板
云原生·容器·kubernetes
忘忧人生2 小时前
docker 部署 java 项目详解
java·docker·容器
律二萌萌哒3 小时前
K8S极简教程(4小时快速学会)
云原生·容器·kubernetes
烛.照1034 小时前
Nginx部署的前端项目刷新404问题
运维·前端·nginx
华纳云IDC服务商6 小时前
超融合服务器怎么优化数据管理?
运维·服务器
会飞的土拨鼠呀6 小时前
Prometheus监控minio对象存储
运维·prometheus
hy____1236 小时前
动态内存管理
linux·运维·算法