9.1 KiB
9.1 KiB
Consul 变量和存储配置指南
本文档介绍如何配置Consul的变量(Variables)和存储(Storage)功能,以增强集群的功能性和可靠性。
概述
Consul提供了两种关键功能来增强集群能力:
- 变量(Variables): 用于存储配置信息、特性开关、应用参数等
- 存储(Storage): 用于持久化数据、快照和备份
变量(Variables)配置
变量命名规范
我们遵循统一的命名规范来管理Consul KV存储中的配置:
config/{environment}/{provider}/{region_or_service}/{key}
各部分说明:
- config: 固定前缀,表示这是一个配置项
- environment: 环境名称,如
dev、staging、prod等 - provider: 云服务提供商,如
oracle、digitalocean、aws、gcp等 - region_or_service: 区域或服务名称,如
kr、us、sgp等 - key: 具体的配置键名,如
token、tenancy_ocid、user_ocid等
示例配置
应用配置
config/dev/app/name
config/dev/app/version
config/dev/app/environment
数据库配置
config/dev/database/host
config/dev/database/port
config/dev/database/name
缓存配置
config/dev/cache/host
config/dev/cache/port
特性开关
config/dev/features/new_ui
config/dev/features/advanced_analytics
如何添加变量
使用curl命令
# 添加单个变量
curl -X PUT http://localhost:8500/v1/kv/config/dev/app/name -d "my-application"
# 添加多个变量
curl -X PUT http://localhost:8500/v1/kv/config/dev/database/host -d "db.example.com"
curl -X PUT http://localhost:8500/v1/kv/config/dev/database/port -d "5432"
使用consul CLI
# 添加单个变量
consul kv put config/dev/app/name my-application
# 添加多个变量
consul kv put config/dev/database/host db.example.com
consul kv put config/dev/database/port 5432
使用自动化脚本
我们提供了自动化脚本来配置Consul变量:
# 运行配置脚本
./deployment/scripts/setup_consul_variables_and_storage.sh
如何使用变量
在Terraform中使用
data "consul_keys" "app_config" {
key {
name = "app_name"
path = "config/dev/app/name"
}
key {
name = "db_host"
path = "config/dev/database/host"
}
}
resource "some_resource" "example" {
name = data.consul_keys.app_config.var.app_name
host = data.consul_keys.app_config.var.db_host
}
在应用程序中使用
大多数Consul客户端库都提供了读取KV存储的方法。例如,在Go中:
import "github.com/hashicorp/consul/api"
// 创建Consul客户端
client, _ := api.NewClient(api.DefaultConfig())
// 读取KV
kv := client.KV()
pair, _, _ := kv.Get("config/dev/app/name", nil)
appName := string(pair.Value)
存储(Storage)配置
持久化存储
Consul需要持久化存储来保存Raft日志和快照数据。在Nomad作业配置中,我们已经指定了数据目录:
config {
command = "consul"
args = [
"agent",
"-server",
"-bootstrap-expect=3",
"-data-dir=/opt/nomad/data/consul", # 数据目录
# 其他参数...
]
}
快照配置
快照是Consul集群状态的时间点备份,用于灾难恢复。
启用快照
在Consul配置文件中添加以下配置:
snapshot {
enabled = true
interval = "24h" # 每24小时创建一次快照
retain = 30 # 保留30个快照
name = "consul-snapshot-{{.Timestamp}}"
}
手动创建快照
# 创建快照
consul snapshot save backup-$(date +%Y%m%d).snap
# 恢复快照
consul snapshot restore backup-20231201.snap
备份配置
定期备份Consul数据是确保数据安全的重要措施。
配置自动备份
backup {
enabled = true
interval = "6h" # 每6小时备份一次
retain = 7 # 保留7个备份
name = "consul-backup-{{.Timestamp}}"
}
备份脚本
#!/bin/bash
# backup_consul.sh
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/backups/consul"
CONSUL_ADDR="http://localhost:8500"
# 创建备份目录
mkdir -p $BACKUP_DIR
# 创建快照
curl -s "${CONSUL_ADDR}/v1/snapshot" > "${BACKUP_DIR}/consul-snapshot-${DATE}.snap"
# 保留最近7天的备份
find $BACKUP_DIR -name "consul-snapshot-*.snap" -mtime +7 -delete
echo "备份完成: ${BACKUP_DIR}/consul-snapshot-${DATE}.snap"
Autopilot配置
Autopilot是Consul的自动管理功能,用于处理服务器故障和自动恢复。
autopilot {
cleanup_dead_servers = true # 自动清理死服务器
last_contact_threshold = "200ms" # 最后联系阈值
max_trailing_logs = 250 # 最大 trailing 日志数
server_stabilization_time = "10s" # 服务器稳定时间
redundancy_zone_tag = "" # 冗余区域标签
disable_upgrade_migration = false # 禁用升级迁移
upgrade_version_tag = "" # 升级版本标签
}
完整配置示例
Consul配置文件 (consul.hcl)
# 基础配置
data_dir = "/opt/consul/data"
raft_dir = "/opt/consul/raft"
# 启用UI
ui_config {
enabled = true
}
# 数据中心配置
datacenter = "dc1"
# 服务器配置
server = true
bootstrap_expect = 3
# 网络配置
client_addr = "0.0.0.0"
bind_addr = "{{ GetInterfaceIP `eth0` }}"
advertise_addr = "{{ GetInterfaceIP `eth0` }}"
# 端口配置
ports {
dns = 8600
http = 8500
https = -1
grpc = 8502
grpc_tls = 8503
serf_lan = 8301
serf_wan = 8302
server = 8300
}
# 集群连接
retry_join = ["100.117.106.136", "100.116.80.94", "100.122.197.112"]
# 服务发现
enable_service_script = true
enable_script_checks = true
enable_local_script_checks = true
# 性能调优
performance {
raft_multiplier = 1
}
# 日志配置
log_level = "INFO"
enable_syslog = false
log_file = "/var/log/consul/consul.log"
# 安全配置
encrypt = "YourEncryptionKeyHere"
# 连接配置
reconnect_timeout = "30s"
reconnect_timeout_wan = "30s"
session_ttl_min = "10s"
# Autopilot配置
autopilot {
cleanup_dead_servers = true
last_contact_threshold = "200ms"
max_trailing_logs = 250
server_stabilization_time = "10s"
redundancy_zone_tag = ""
disable_upgrade_migration = false
upgrade_version_tag = ""
}
# 快照配置
snapshot {
enabled = true
interval = "24h"
retain = 30
name = "consul-snapshot-{{.Timestamp}}"
}
# 备份配置
backup {
enabled = true
interval = "6h"
retain = 7
name = "consul-backup-{{.Timestamp}}"
}
部署步骤
1. 准备配置文件
# 创建配置目录
mkdir -p /root/mgmt/components/consul/configs
# 创建配置文件
cat > /root/mgmt/components/consul/configs/consul.hcl << EOF
# 粘贴上面的完整配置示例
EOF
2. 运行配置脚本
# 运行自动化脚本
./deployment/scripts/setup_consul_variables_and_storage.sh
3. 重启Consul服务
# 停止Consul服务
nomad job stop consul-cluster-simple
# 重新启动Consul服务
nomad job run /root/mgmt/components/consul/jobs/consul-cluster-simple.nomad
4. 验证配置
# 检查Consul状态
curl http://localhost:8500/v1/status/leader
# 检查变量配置
curl -s http://localhost:8500/v1/kv/config/dev/?recurse | jq
# 检查存储配置
curl -s http://localhost:8500/v1/kv/storage/?recurse | jq
最佳实践
- 定期备份: 设置定期备份Consul数据,并测试恢复过程
- 监控存储空间: 监控Consul数据目录的使用情况,避免磁盘空间不足
- 安全配置: 使用ACL和TLS保护Consul集群
- 版本控制: 将Consul配置文件纳入版本控制系统
- 环境隔离: 为不同环境(dev/staging/prod)使用不同的配置路径
- 文档记录: 记录所有配置项的用途和取值范围
故障排除
常见问题
1. 变量无法读取
- 检查Consul服务是否正常运行
- 验证变量路径是否正确
- 确认ACL权限是否足够
2. 存储空间不足
- 检查数据目录大小
- 调整快照和备份保留策略
- 清理旧快照和备份
3. 快照失败
- 检查磁盘空间
- 验证文件权限
- 查看Consul日志获取详细错误信息
调试命令
# 查看Consul成员
consul members
# 查看Raft状态
consul operator raft list-peers
# 查看键值存储
consul kv get --recurse config/dev/
# 查看快照信息
consul snapshot inspect backup.snap
扩展功能
与Vault集成
Consul可以与Vault集成,提供更强大的密钥管理功能:
# 配置Vault作为Consul的加密后端
vault secrets enable consul
# 配置Consul使用Vault进行加密
consul encrypt -vault-token="$VAULT_TOKEN" -vault-addr="$VAULT_ADDR"
与Nomad集成
Consul可以与Nomad集成,提供服务发现和配置管理:
# Nomad配置中的Consul集成
consul {
address = "localhost:8500"
token = "your-consul-token"
ssl = false
}
总结
通过配置Consul的变量和存储功能,可以显著增强集群的功能性和可靠性。变量功能提供了灵活的配置管理,而存储功能确保了数据的安全性和持久性。结合自动化脚本和最佳实践,可以构建一个强大且易于维护的Consul集群。