mgmt/docs/setup/consul_variables_and_storag...

9.1 KiB
Raw Blame History

Consul 变量和存储配置指南

本文档介绍如何配置Consul的变量(Variables)和存储(Storage)功能,以增强集群的功能性和可靠性。

概述

Consul提供了两种关键功能来增强集群能力

  1. 变量(Variables): 用于存储配置信息、特性开关、应用参数等
  2. 存储(Storage): 用于持久化数据、快照和备份

变量(Variables)配置

变量命名规范

我们遵循统一的命名规范来管理Consul KV存储中的配置

config/{environment}/{provider}/{region_or_service}/{key}

各部分说明:

  • config: 固定前缀,表示这是一个配置项
  • environment: 环境名称,如 devstagingprod
  • provider: 云服务提供商,如 oracledigitaloceanawsgcp
  • region_or_service: 区域或服务名称,如 krussgp
  • key: 具体的配置键名,如 tokentenancy_ociduser_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

最佳实践

  1. 定期备份: 设置定期备份Consul数据并测试恢复过程
  2. 监控存储空间: 监控Consul数据目录的使用情况避免磁盘空间不足
  3. 安全配置: 使用ACL和TLS保护Consul集群
  4. 版本控制: 将Consul配置文件纳入版本控制系统
  5. 环境隔离: 为不同环境(dev/staging/prod)使用不同的配置路径
  6. 文档记录: 记录所有配置项的用途和取值范围

故障排除

常见问题

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集群。