默认 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 界面:
NODES
:integer
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_CPUS
:number
内存
您可以自定义分配给每个节点的 RAM 量。通过编辑 节点 配置部分的 mem 值(以 MB 为单位)来更改此值。此值设置过低将导致内存不足错误。heap.size
设置值还必须小于此值,以防止内存不足错误,这种错误在 Java 虚拟机尝试给 Cassandra 流程分配额外的可用内存时会出现。
- 在 DC/OS CLI options.json 中:
mem
:整数(默认:10240
) - DC/OS Web 界面:
CASSANDRA_MEMORY_MB
:integer
JMX 端口
您可以自定义 Apache Cassandra 针对 JMX 请求(例如,由 nodetool
发出的请求)进行侦听的端口。
- 在 DC/OS CLI options.json 中:
jmx_port
:整数(默认:7199
) - DC/OS Web 界面:
TASKCFG_ALL_JMX_PORT
:integer
存储端口
您可以自定义 Apache Cassandra 针对节点间通信进行侦听的端口。
- 在 DC/OS CLI options.json 中:
storage_port
:整数(默认:7000
) - DC/OS Web 界面:
TASKCFG_ALL_CASSANDRA_STORAGE_PORT
:integer
SSL 存储端口
您可以自定义 Apache Cassandra 针对 SSL 节点间通信进行侦听的端口。
- 在 DC/OS CLI options.json 中:
ssl_storage_port
:整数(默认:7001
) - DC/OS Web 界面:
TASKCFG_ALL_CASSANDRA_SSL_STORAGE_PORT
:integer
本地传输端口
您可以自定义 Apache Cassandra 针对 CQL 查询进行侦听的端口。
- 在 DC/OS CLI options.json 中:
native_transport_port
:整数(默认:9042
) - DC/OS Web 界面:
TASKCFG_ALL_CASSANDRA_NATIVE_TRANSPORT_PORT
:integer
RPC 端口
您可以自定义 Apache Cassandra 针对 Thrift RPC 请求进行侦听的端口。
- 在 DC/OS CLI options.json 中:
rpc_port
:整数(默认:9160
) - DC/OS Web 界面:
TASKCFG_ALL_CASSANDRA_RPC_PORT
:integer
磁盘
卷类型
该服务支持两种卷类型:
ROOT
卷是根卷上的隔离目录,与主机系统的其余部分共享 IO /心轴。MOUNT
卷是独立卷上的专用设备或分区,具有专用 IO/心轴。
使用 MOUNT
卷,需要 每个 DC/OS 代理系统上的附加配置,所以服务当前使用默认的 ROOT
卷。为确保生产环境中可靠和稳定的性能,您应配置将在您的集群中运行服务的计算机上的 MOUNT
卷,然后将以下内容配置为 MOUNT
卷:
配置磁盘类型:
- 在 DC/OS CLI options.json 中:
disk_type
:字符串(默认:ROOT
) - DC/OS Web 界面:
CASSANDRA_DISK_TYPE
:string
磁盘调度器
建议 您预配置您的存储主机,以在生产环境中使用截止时间 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 集群
- 使用默认配置启动第一个集群:
dcos package install cassandra
- 为第二个集群创建
options.json
文件,该集群指定不同的服务名称和数据中心名称:
{
"service": {
"name": "cassandra2",
"data_center": "dc2"
}
}
- 使用这些自定义选项启动第二个集群:
dcos package install cassandra --options=<options.json>
获取种子节点的 IP 地址
- 为第一个集群获取种子节点地址的列表:
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。
- 对第二个 Cassandra 集群运行相同命令,并注意
address
字段中的 IP:
dcos cassandra --name=cassandra2 endpoints node
为两个集群更新配置
- 使用第一个集群 (
cassandra
) 的 IP 地址创建options2.json
文件:
{
"service": {
"remote_seeds": "10.0.1.236:9042,10.0.0.119:9042"
}
}
- 更新第二个集群的配置:
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 客户端测试您的部署。