#作者:stackofumbrella
文章目录
首先nomad组件配置meta、host_volume
# /etc/nomad.d/nomad.hcl
datacenter = "dc1"
data_dir = "/opt/nomad/data"
# 启用 Server 模式
server {
enabled = true
bootstrap_expect = 3
server_join {
retry_join = [
"192.168.123.70",
"192.168.123.71",
"192.168.123.72"
]
}
}
# 启用 Client 模式(允许本机运行任务)
client {
enabled = true
servers = [
"192.168.123.70:4647",
"192.168.123.71:4647",
"192.168.123.72:4647"
]
# Host Volumes ------ 业务需要的持久化目录必须在client上声明
host_volume "ck-data" {
path = "/shaxiang/ck/data"
read_only = false
}
host_volume "ck-config" {
path = "/shaxiang/ck/conf"
read_only = false
}
host_volume "ck-users" {
path = "/shaxiang/ck/user"
read_only = false
}
# node_class = "worker"
# ✅ meta 必须在这里!作为 client 的子配置
meta {
job_constraint = "shard-2"
}
}
# 绑定地址
addresses {
http = "0.0.0.0"
rpc = "0.0.0.0"
serf = "0.0.0.0"
}
ports {
http = 4646
rpc = 4647
serf = 4648
}
consul {
address = "127.0.0.1:8500"
auto_advertise = true
}
启动nomad并查询meta
/etc/systemd/system/nomad.service
[Unit]
Description=Nomad
After=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/nomad agent -config=/etc/nomad.d
Restart=on-failure
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable nomad
systemctl start nomad
systemctl status nomad
查询命令
nomad node status [options] [<node-id>]
不带参数:列出所有节点
带 <node-id>:查看指定节点的详细信息
nomad node status -json [<node-id>] | jq '.Meta.job_constraint'
会输出配置的meta的volume视为正常
nomad node status -verbose [<node-id>] | grep ck #查看你的host_volume是否声明
ck-config false /shaxiang/ck/conf
ck-data false /shaxiang/ck/data
ck-users false /shaxiang/ck/user
clickhouse配置
首先使用run启动ck的容器,ps查看配置文件(config、users),cp到主机。
docker run -d --name some-clickhouse-server --ulimit nofile=262144:262144 clickhouse-server:25.10
配置clickhouse.hcl指定node部署
# 定义一个 Nomad Job,名字为 clickhouse01
job "clickhouse01" {
datacenters = ["dc1"] # 指定 Job 运行的数据中心
type = "service" # Job 类型为 service(长期运行的服务)
priority = 100 # 调度优先级
# 定义 Task Group(任务组),名字同样为 clickhouse01
group "clickhouse01" {
count = 1 # 期望部署的 Task 数量
# ======== Host Volume 定义 ========
# volume 必须在 group 内部、task 之前定义
volume "ck-data" {
type = "host" # 本地宿主机目录
source = "ck-data" # 指定 host_volume 名称(非绝对路径)
read_only = false # 可读写
}
volume "ck-config" {
type = "host"
source = "ck-config" # 对应 client 上声明的 host_volume 名称
read_only = false # 配置文件需要写权限时设为 false
}
volume "ck-users" {
type = "host"
source = "ck-users"
read_only = false
}
# ======== 节点约束 ========
# 仅在 meta.job_constraint = "shard-2" 的节点上运行
constraint {
attribute = "${meta.job_constraint}"
value = "shard-2"
}
# ======== 网络配置 ========
network {
mode = "host" # 使用宿主机网络
port "http" { static = 8123 } # HTTP 服务端口
port "tcp" { static = 9000 } # TCP 服务端口
}
# ======== Task 定义 ========
task "clickhouse" { #定义具体容器名称以及日志文件名称
driver = "docker" # 使用 Docker 驱动
# Docker 配置
config {
image = "registry.cn-hangzhou.aliyuncs.com/ali_cloud_images/clickhouse-server:25.10" # 镜像
ports = ["http", "tcp"] # 端口映射,和 network 部分对应
}
# ======== 挂载 Volume ========
volume_mount {
volume = "ck-data" # 对应上面定义的 volume 名称
destination = "/var/lib/clickhouse" # 容器内部路径
}
volume_mount {
volume = "ck-config"
destination = "/etc/clickhouse-server/config.d" # 配置文件目录
}
volume_mount {
volume = "ck-users"
destination = "/etc/clickhouse-server/users.d" # 用户权限文件目录
}
# ======== 环境变量 ========
env {
CLICKHOUSE_PASSWORD = "ck@123" # ClickHouse 用户密码
}
# ======== 资源限制 ========
resources {
cpu = 2000 # CPU 单位为 MHz(2 核)
memory = 4096 # 内存单位为 MB(4 GB)
}
# ======== 服务注册和健康检查 ========
service {
name = "clickhouse01" # Nomad/Consul 注册服务名称
port = "http" # 对应 network 定义的 http 端口
check { # 健康检查
name = "alive"
type = "http" # HTTP 检查
path = "/ping" # 检查路径
interval = "20s" # 每 20 秒检查一次
timeout = "10s" # 超时 10 秒
}
}
}
}
}
nomad job validate
验证Job文件语法和逻辑
作用
检查 .nomad 文件是否符合 HCL 语法
验证资源请求、网络、卷、约束等配置是否合法
不会连接 Nomad 集群,纯本地校验(安全!)
基本用法
nomad job validate clickhouse.hcl
成功输出示例
Job validation successful.
nomad job run (run之前对应的目录要给到权限)
提交并运行Job
作用
将 Job 提交到 Nomad 集群
触发调度器分配任务到 Client 节点
如果 Job 已存在,则执行 滚动更新(默认策略)
基本用法
nomad job run clickhouse.hcl
nomad job status [<job-name>]
用来查看 Nomad 中指定 Job 的整体状态。
输出信息包括:
Job ID、Name、Type、Datacenter 等基本信息
Task Group 的数量和状态(Queued、Starting、Running、Failed 等)
Placement Failure(如果调度失败,会显示具体原因)
最新 Deployment 状态
用途:快速判断整个 Job 是否正常运行或有调度问题。
nomad alloc status [<Allocation-id>]
用来查看某个具体Allocation的详细状态。
Allocation 是 Job 中实际运行的任务实例,每个 Task Group 的每个副本都会生成一个 allocation。
输出信息包括:
Allocation ID、对应 Job ID、Node ID
Client Status(pending、running、lost 等)
资源分配情况(CPU、Memory)
Task 内部状态(task name、driver、port 映射、volume mount)
Allocation Addresses(实际宿主机 IP + 端口)
nomad job stop -purge [<job-name>]
停止job并清理缓存