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 提供可靠的后端数据库支持。

相关推荐
JunLan~32 分钟前
Rocky Linux 系统安装/部署 Docker
linux·docker·容器
sun0077002 小时前
ubuntu dpkg 删除安装包
运维·服务器·ubuntu
海岛日记3 小时前
centos一键卸载docker脚本
linux·docker·centos
小袁搬码4 小时前
Windows中指定路径安装DockerDesktop
windows·docker·容器·docker desktop
吃肉不能购4 小时前
Label-studio-ml-backend 和YOLOV8 YOLO11自动化标注,目标检测,实例分割,图像分类,关键点估计,视频跟踪
运维·yolo·自动化
学Linux的语莫4 小时前
Ansible使用简介和基础使用
linux·运维·服务器·nginx·云计算·ansible
qq_312920115 小时前
docker 部署 kvm 图形化管理工具 WebVirtMgr
运维·docker·容器
踏雪Vernon5 小时前
[OpenHarmony5.0][Docker][环境]OpenHarmony5.0 Docker编译环境镜像下载以及使用方式
linux·docker·容器·harmonyos
学Linux的语莫5 小时前
搭建服务器VPN,Linux客户端连接WireGuard,Windows客户端连接WireGuard
linux·运维·服务器