用Ansible自动化部署VictoriaMetrics集群的工程实践
在运维领域,重复劳动是最需要被消灭的敌人之一。想象一下这样的场景:你需要为团队部署一个VictoriaMetrics集群,包含3个vmstorage节点、2个vminsert节点和2个vmselect节点。按照传统方式,你需要在7台服务器上重复执行这些操作:
- 下载二进制包
- 解压到指定目录
- 创建数据目录
- 编写systemd服务文件
- 配置启动参数
- 启动服务
- 验证服务状态
更可怕的是,当需要扩展集群规模或更新版本时,整个过程又得重来一遍。这就是为什么我们需要Ansible这样的自动化工具——它能让这些繁琐的操作变成可重复、可版本控制的代码。
1. 环境准备与架构设计
1.1 基础环境要求
在开始编写Playbook之前,我们需要确保以下条件已经满足:
- 控制节点 :安装Ansible 2.9+和Python 3.6+
-
目标节点
:
- 操作系统:CentOS 7+/Ubuntu 18.04+
-
资源要求:
- vmstorage:16GB+内存,SSD存储
- vminsert/vmselect:8GB+内存
-
网络配置
:
- 节点间网络延迟<5ms
- 开放必要的端口(8400-8482)
1.2 集群架构设计
一个典型的VictoriaMetrics集群包含三种角色:
| 组件 | 功能描述 | 扩展性考虑 |
|---|---|---|
| vmstorage | 数据持久化存储 | 数据分片,横向扩展 |
| vminsert | 写入代理,负责数据分片路由 | 无状态,可随意增减 |
| vmselect | 查询协调器,聚合存储节点数据 | 查询负载均衡,可水平扩展 |
推荐的生产环境配置 :
- 至少3个vmstorage节点保证高可用
- vminsert和vmselect节点数量根据写入/查询负载决定
- 每个组件部署在独立的服务器上
2. Ansible Playbook核心结构
2.1 目录结构规划
一个良好的Ansible项目应该具有清晰的目录结构:
victoriametrics-cluster/
├── inventories/
│ ├── production/
│ │ ├── hosts
│ │ └── group_vars/
├── roles/
│ ├── common/
│ ├── vmstorage/
│ ├── vminsert/
│ └── vmselect/
├── site.yml
└── requirements.yml
2.2 主机清单定义
在
inventories/production/hosts
中定义节点分组:
[vmstorage]
storage1 ansible_host=192.168.1.101
storage2 ansible_host=192.168.1.102
storage3 ansible_host=192.168.1.103
[vminsert]
insert1 ansible_host=192.168.1.201
insert2 ansible_host=192.168.1.202
[vmselect]
select1 ansible_host=192.168.1.211
select2 ansible_host=192.168.1.212
2.3 全局变量配置
在
group_vars/all.yml
中定义全局变量:
vm_version: "v1.101.0"
install_dir: "/opt/victoriametrics"
data_dir: "/data/victoriametrics"
tmp_dir: "/tmp/victoriametrics"
timezone: "Asia/Shanghai"
3. 角色实现细节
3.1 vmstorage角色实现
创建
roles/vmstorage/tasks/main.yml
:
- name: 创建必要目录
file:
path: "{{ item }}"
state: directory
owner: root
group: root
mode: '0755'
loop:
- "{{ install_dir }}"
- "{{ data_dir }}"
- "{{ tmp_dir }}"
- name: 下载VictoriaMetrics二进制包
get_url:
url: "https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/{{ vm_version }}/victoria-metrics-linux-amd64-{{ vm_version }}-cluster.tar.gz"
dest: "/tmp/victoria-metrics-cluster.tar.gz"
checksum: "sha256:..."
- name: 解压二进制包
unarchive:
src: "/tmp/victoria-metrics-cluster.tar.gz"
dest: "{{ install_dir }}"
remote_src: yes
extra_opts: "--strip-components=1"
- name: 配置vmstorage服务
template:
src: "templates/vmstorage.service.j2"
dest: "/etc/systemd/system/vmstorage.service"
mode: '0644'
notify: restart vmstorage
对应的服务模板
roles/vmstorage/templates/vmstorage.service.j2
:
[Unit]
Description=VictoriaMetrics Storage Node
After=network.target
[Service]
Type=simple
User=root
Group=root
WorkingDirectory={{ install_dir }}
ExecStart={{ install_dir }}/vmstorage-prod \
-loggerTimezone={{ timezone }} \
-storageDataPath={{ data_dir }} \
-httpListenAddr=:8482 \
-vminsertAddr=:8400 \
-vmselectAddr=:8401 \
-retentionPeriod=90d
Restart=always
[Install]
WantedBy=multi-user.target
3.2 vminsert角色实现
roles/vminsert/tasks/main.yml
关键部分:
- name: 配置vminsert服务
template:
src: "templates/vminsert.service.j2"
dest: "/etc/systemd/system/vminsert.service"
mode: '0644'
notify: restart vminsert
服务模板中需要动态生成storage节点列表:
ExecStart={{ install_dir }}/vminsert-prod \
-httpListenAddr=:8480 \
{% for host in groups['vmstorage'] %}
-storageNode={{ hostvars[host]['ansible_host'] }}:8400{% if not loop.last %},{% endif %}
{% endfor %}
3.3 跨角色依赖处理
在
site.yml
中定义执行顺序:
- hosts: vmstorage
roles:
- common
- vmstorage
- hosts: vminsert
roles:
- common
- vminsert
- hosts: vmselect
roles:
- common
- vmselect
4. 部署验证与维护
4.1 自动化验证
创建专门的验证playbook
verify.yml
:
- name: 验证服务状态
hosts: all
tasks:
- name: 检查服务是否活跃
systemd:
name: "{{ item }}"
state: started
enabled: yes
loop:
- vmstorage
- vminsert
- vmselect
- name: 验证HTTP端点
uri:
url: "http://localhost:{{ item.port }}/metrics"
return_content: yes
status_code: 200
loop:
- { component: "vmstorage", port: 8482 }
- { component: "vminsert", port: 8480 }
- { component: "vmselect", port: 8481 }
when: "'metrics' in content"
4.2 日常维护操作
通过Ansible简化日常维护:
滚动重启storage节点 :
ansible vmstorage -m systemd -a "name=vmstorage state=restarted" --limit "storage[0]"
# 等待数据平衡完成后再继续下一个节点
版本升级流程 :
-
更新
group_vars/all.yml中的vm_version -
执行滚动升级:
ansible-playbook -i inventories/production site.yml --tags "install" --limit "storage[0]" - 验证无误后继续其他节点
4.3 监控指标收集
VictoriaMetrics自身提供了丰富的监控指标,我们可以配置Prometheus收集:
scrape_configs:
- job_name: 'victoriametrics'
static_configs:
- targets:
- 'storage1:8482'
- 'storage2:8482'
- 'storage3:8482'
- 'insert1:8480'
- 'insert2:8480'
- 'select1:8481'
- 'select2:8481'
关键监控指标包括:
-
vm_active_connections -
vm_rows_inserted_total -
vm_request_duration_seconds
5. 高级配置与优化
5.1 性能调优参数
在生产环境中,这些参数可能需要调整:
# vmstorage额外参数
-insert.maxQueueDuration=30s
-search.maxQueryDuration=30s
-storage.cacheSizeMax=5000000000
# vmselect额外参数
-search.maxConcurrentRequests=100
-search.maxQueueDuration=10s
# vminsert额外参数
-rpc.disableCompression=true
5.2 安全加固
网络隔离 :
- 将8400-8401端口限制为仅集群内部访问
- 对外只暴露8480(vminsert)和8481(vmselect)端口
认证配置 :
-httpAuth.username=admin
-httpAuth.password=securepassword
5.3 多集群配置
对于大规模部署,可以考虑多集群架构:
[LB]
|
-------------------------------------
| |
[Cluster A] [Cluster B]
storage[1-3] storage[1-3]
insert[1-2] insert[1-2]
select[1-2] select[1-2]
通过Ansible的
--limit
参数管理不同集群:
ansible-playbook -i inventories/production site.yml --limit "cluster_a"
7650

被折叠的 条评论
为什么被折叠?



