默认 DC/OS Apache Cassandra 安装为试行服务提供合理的默认设置,但可能不足以支持生产使用。根据部署的上下文,您可能需要不同的配置。

使用自定义配置安装

以下是如何自定义安装 Apache Cassandra 实例的一些例子。

在每个例子中,您将使用自定义配置创建一个新的 Apache Cassandra 实例,如下所示:

$ dcos package install cassandra --options=sample-cassandra.json

建议: 将自定义配置存储在源控件中。

安装多个实例

默认情况下,Apache Cassandra 服务安装名称为 cassandra 的服务。您可以使用如下自定义服务配置来指定不同的名称:

{
  "service": {
    "name": "cassandra-other"
  }
}

当上述 JSON 配置通过 --options 自变量被传递到 package install cassandra 命令时,新服务将使用 JSON 配置中指定的名称:

$ dcos package install cassandra --options=cassandra-other.json

可以通过自定义每个实例的名称将多个 Apache Cassandra 实例安装到 DC/OS 群集中。例如,您可能有一个名为 cassandra-staging 和另一个名为 cassandra-prod的 Apache Cassandra 实例,每个都具有各自的自定义配置。

为实例指定自定义名称后,可以使用 dcos cassandra CLI 命令或直接通过 HTTP 接触实例,如下所述 以下

注意: 初次安装后,服务名称 不能更改。更改服务名称需要根据新名称安装服务的新实例,然后根据需要复制任何数据到新实例。

安装到文件夹中

在 DC/OS 1.10 及更高版本中,可以通过指定斜线分隔的服务名称将服务安装到文件夹中。例如:

{
  "service": {
    "name": "/foldered/path/to/cassandra"
  }
}

以上示例将在路径 foldered => path => to => cassandra 中安装服务。然后可以使用 dcos cassandra CLI 命令或直接通过 HTTP 接触服务,如下所述 以下

注意:初次安装后,服务文件夹位置 不能更改。更改服务位置需要针对新位置安装服务的新实例,然后根据需要复制任何数据到新实例。

寻址已命名实例

使用自定义名称或在文件夹下安装服务之后,可以使用 --name 自变量从所有 dcos cassandra CLI 命令访问该服务。默认情况下,--name 值默认为包名称,或 cassandra

例如,如果您有一个名为 cassandra-dev的实例,以下命令将针对它调用 pod list 命令:

$ dcos cassandra --name=cassandra-dev pod list

相同的查询将通过 HTTP 执行,如下所示:

$ curl -H "Authorization:token=$auth_token" <dcos_url>/service/cassandra-dev/v1/pod

同样,如果您在文件夹中有一个类似 /foldered/path/to/cassandra的实例,以下命令将针对它调用 pod list 命令:

$ dcos cassandra --name=/foldered/path/to/cassandra pod list

类似地,可以直接通过 HTTP 查询,如下所示:

$ curl -H "Authorization:token=$auth_token" <dcos_url>/service/foldered/path/to/cassandra-dev/v1/pod

您可以添加 -v (详细)自变量到任何 dcos cassandra 命令以查看正在进行的潜在 HTTP 查询。这是查看 CLI 在何处获取信息的有用工具。在实践中,dcos cassandra 命令是由 DC/OS Apache Cassandra 服务本身提供的 HTTP 接口的瘦包装器。

与 DC/OS 访问控制集成

在 Enterprise DC/OS 中,可以使用 DC/OS 访问控制来限制对服务的访问。要让非超级用户完全访问服务,向其授予以下权限列表:

dcos:adminrouter:service:marathon full
dcos:service:marathon:marathon:<service-name> full
dcos:adminrouter:ops:mesos full
dcos:adminrouter:ops:slave full

其中 <service-name> 是您的完整服务名称,包括文件夹(如果安装在文件夹中)。

创建自定义配置文件

创建将用于安装 Apache Cassandra 的自定义配置文件,并另存为 config.json。指定服务帐户 (<service_account_id>) and a secret path (cassandra/<secret-name>) .

{
  "service": {
    "service_account": "<service_account_id>",
    "service_account_secret": "cassandra/<secret-name>"
  }
}

服务设置

布局约束

布局约束允许您自定义 DC/OS 群集中部署服务的位置。布局约束使用 Marathon 运营商 语法。例如,[["hostname", "UNIQUE"]] 确保每个代理最多部署一个 Pod。

通用任务是指定要对其进行部署的白名单系统列表。为此,请使用以下语法用于布局约束:

[["hostname", "LIKE", "10.0.0.159|10.0.1.202|10.0.3.3"]]

注意: 请务必在这种情境中包括超额容量,以便如果白名单系统中的一个系统性能下降,还有足够的容量修复您的服务。

更新布局约束

群集更改,因此布局约束也随之变化。但是,已经运行的服务 Pod 将不会受到布局约束变化的影响。这是因为更改布局约束可能会使得当前运行的 pod 的当前布局失效,而且 Pod 不会自动被重新布置,因为这样做是破坏性的操作。我们建议使用以下程序更新 Pod 的布局约束:

  • 更新服务中的布局约束定义。
  • 对每个受影响的 Pod,一次执行一个 pod replace。这将(破坏性地)移动 Pod 使其符合新的布局约束。

需要: DC/OS 1.11 Enterprise 或更高版本。

通过引用 @zone 键,布局约束可以应用于 DC/OS 区。例如,可以通过包括此约束在最少三个不同区中扩散 Pod:

[["@zone", "GROUP_BY", "3"]]

注意: 安装时不带有区约束的服务无法更新为有约束的服务,而安装时带有区约束的服务可能无法删除此约束。

虚拟网络

DC/OS Apache Cassandra 支持在 DC/OS 的 虚拟网络 上进行部署(包括 dcos 覆盖网络),允许每个容器(任务)拥有自己的 IP 地址,而不使用代理机器上的端口资源。这可以通过在安装过程中传递以下配置来指定:

{
  "service": {
    "virtual_network_enabled": true
  }
}

注意: 服务在虚拟网络上部署后,就无法将其更新以使用主机网络。

区域

服务参数 region 可用于在一个替换区域中部署服务。默认情况下,服务部署在“本地”区域,这是运行 DC/OS 管理节点的区域。要在特定原因下安装服务,在其选项中包含:

{
  "service": {
    "region": "<region>"
  }
}

注意:服务不能在区域之间移动。

Cassandra 节点设置

调整以下设置以自定义分配给每个节点的资源量。DC/OS Apache Cassandra 的 系统要求 在调整这些值时必须考虑。降低系统要求下的这些值,可能导致使用该服务时出现不良性能和/或故障。

以下每个设置均可在 节点 配置部分进行自定义。

节点计数

节点 配置部分自定义 Node Count 设置(默认 3)。有关最低节点计数要求,请参阅 Apache Cassandra 文档。

  • 在 DC/OS CLI options.json 中:count:整数(默认: 3
  • DC/OS Web 界面NODESinteger

CPU

您可以自定义分配给每个节点的 CPU 数量。1.0 的值等同于计算机上的一个完整专用 CPU 核心,尽管所有核心均可通过时间分片提供。通过编辑 节点 配置部分的 cpus 值来更改此值。值设置过低会导致任务受限。

请注意,每个 Cassandra 节点都会为 sidecar 服务(例如,备份和 nodetool)使用额外的 1.0 CPU。为每个 Cassandra 节点配置 3 个 CPU 时,实际使用率将为 4 个 CPU,在配置 Cassandra 时应考虑到这些,以最大化在代理上的资源利用率。

  • 在 DC/OS CLI options.json 中:cpus:数字(默认:0.5
  • DC/OS Web 界面CASSANDRA_CPUSnumber

内存

您可以自定义分配给每个节点的 RAM 量。通过编辑 节点 配置部分的 mem 值(以 MB 为单位)来更改此值。此值设置过低将导致内存不足错误。heap.size 设置值还必须小于此值,以防止内存不足错误,这种错误在 Java 虚拟机尝试给 Cassandra 流程分配额外的可用内存时会出现。

  • 在 DC/OS CLI options.json 中:mem:整数(默认: 10240
  • DC/OS Web 界面CASSANDRA_MEMORY_MBinteger

JMX 端口

您可以自定义 Apache Cassandra 针对 JMX 请求(例如,由 nodetool 发出的请求)进行侦听的端口。

  • 在 DC/OS CLI options.json 中:jmx_port:整数(默认: 7199
  • DC/OS Web 界面TASKCFG_ALL_JMX_PORTinteger

存储端口

您可以自定义 Apache Cassandra 针对节点间通信进行侦听的端口。

  • 在 DC/OS CLI options.json 中:storage_port:整数(默认: 7000
  • DC/OS Web 界面TASKCFG_ALL_CASSANDRA_STORAGE_PORTinteger

SSL 存储端口

您可以自定义 Apache Cassandra 针对 SSL 节点间通信进行侦听的端口。

  • 在 DC/OS CLI options.json 中:ssl_storage_port:整数(默认: 7001
  • DC/OS Web 界面TASKCFG_ALL_CASSANDRA_SSL_STORAGE_PORTinteger

本地传输端口

您可以自定义 Apache Cassandra 针对 CQL 查询进行侦听的端口。

  • 在 DC/OS CLI options.json 中:native_transport_port:整数(默认: 9042
  • DC/OS Web 界面TASKCFG_ALL_CASSANDRA_NATIVE_TRANSPORT_PORTinteger

RPC 端口

您可以自定义 Apache Cassandra 针对 Thrift RPC 请求进行侦听的端口。

  • 在 DC/OS CLI options.json 中:rpc_port:整数(默认: 9160
  • DC/OS Web 界面TASKCFG_ALL_CASSANDRA_RPC_PORTinteger

磁盘

卷类型

该服务支持两种卷类型:

  • ROOT 卷是根卷上的隔离目录,与主机系统的其余部分共享 IO /心轴。
  • MOUNT 卷是独立卷上的专用设备或分区,具有专用 IO/心轴。

使用 MOUNT 卷,需要 每个 DC/OS 代理系统上的附加配置,所以服务当前使用默认的 ROOT 卷。为确保生产环境中可靠和稳定的性能,您应配置将在您的集群中运行服务的计算机上的 MOUNT 卷,然后将以下内容配置为 MOUNT 卷:

配置磁盘类型:

  • 在 DC/OS CLI options.json 中:disk_type:字符串(默认:ROOT
  • DC/OS Web 界面CASSANDRA_DISK_TYPEstring

磁盘调度器

建议 您预配置您的存储主机,以在生产环境中使用截止时间 IO 调度器。

机架感知放置

当指定使用@zone键的布局约束时,将自动启用 Cassandra 的基于“机架”的故障域支持。例如,您可以通过指定约束[["@zone", "GROUP_BY", "3"]],使 Cassandra 节点至少跨越三个不同的区域/机架。当使用布局约束指定 @zone 时,Cassandra 节点将自动通过 rack(匹配区域名称)进行配置。如果没有布局约束参考 @zone 被配置,那么所有节点都将通过 rack1 的默认机架进行配置。

Apache Cassandra 配置

Apache Cassandra 的配置可通过服务架构的 cassandra 部分进行。有关可用配置的完整列表,请参阅服务架构。

多数据中心部署

要跨数据中心复制数据, Apache Cassandra 则需要使用每个远程集群中种子节点的地址配置每个集群。以下是启用多数据中心 Apache Cassandra 部署的情况,其在单个 DC / OS 集群内运行:

启动两个 Cassandra 集群

  1. 使用默认配置启动第一个集群:
dcos package install cassandra
  1. 为第二个集群创建 options.json 文件,该集群指定不同的服务名称和数据中心名称:
{
  "service": {
    "name": "cassandra2",
    "data_center": "dc2"
  }
}
  1. 使用这些自定义选项启动第二个集群:
dcos package install cassandra --options=<options.json>

获取种子节点的 IP 地址

注意: 如果您的 Cassandra 群集不在同一个网络上,您必须设置代理层来路由流量。

  1. 为第一个集群获取种子节点地址的列表:
dcos cassandra --name=cassandra endpoints node

或者,您可以从调度器 HTTP API 中获取此信息:

DCOS_AUTH_TOKEN=$(dcos config show core.dcos_acs_token)
DCOS_URL=$(dcos config show core.dcos_url)
curl -H "authorization:token=$DCOS_AUTH_TOKEN" $DCOS_URL/service/cassandra/v1/endpoints/node

您的输出类似于:

{
  "address": [
    "10.0.1.236:9042",
    "10.0.0.119:9042"
  ],
  "dns": [
    "node-0-server.cassandra.autoip.dcos.thisdcos.directory:9042",
    "node-1-server.cassandra.autoip.dcos.thisdcos.directory:9042"
  ],
  "vip": "node.cassandra.l4lb.thisdcos.directory:9042"
}

注意 address 字段中的 IP。

  1. 对第二个 Cassandra 集群运行相同命令,并注意 address 字段中的 IP:
dcos cassandra --name=cassandra2 endpoints node

为两个集群更新配置

  1. 使用第一个集群 (cassandra) 的 IP 地址创建 options2.json 文件:
{
  "service": {
    "remote_seeds": "10.0.1.236:9042,10.0.0.119:9042"
  }
}
  1. 更新第二个集群的配置:
dcos cassandra --name=cassandra2 update start --options=options2.json

对第一个集群执行相同操作,在 service.remote_seeds 字段中创建包含第二个集群 (cassandra2) 种子节点的 IP 地址的 options.json。然后,更新第一个集群的配置:dcos cassandra --name=cassandra update start --options=options.json

两个调度器都将在接收到配置更新后重新启动,并且每个集群将与其他集群的种子节点通信,以建立多数据中心拓扑。对您添加的每个新集群重复执行此过程。

您可以监控第一个集群的更新进度:

dcos cassandra --name=cassandra update status

或者对第二个集群:

dcos cassandra --name=cassandra2 update status

您的输出类似于:

deploy (IN_PROGRESS)
└─ node-deploy (IN_PROGRESS)
   ├─ node-0:[server] (COMPLETE)
   ├─ node-1:[server] (COMPLETE)
   └─ node-2:[server] (PREPARED)

测试您的多数据中心配置

确保使用 Cassandra 客户端测试您的部署。