别再手动敲命令了!用Ansible一键部署VictoriaMetrics集群(附完整Playbook)

用Ansible自动化部署VictoriaMetrics集群的工程实践

在运维领域,重复劳动是最需要被消灭的敌人之一。想象一下这样的场景:你需要为团队部署一个VictoriaMetrics集群,包含3个vmstorage节点、2个vminsert节点和2个vmselect节点。按照传统方式,你需要在7台服务器上重复执行这些操作:

  1. 下载二进制包
  2. 解压到指定目录
  3. 创建数据目录
  4. 编写systemd服务文件
  5. 配置启动参数
  6. 启动服务
  7. 验证服务状态

更可怕的是,当需要扩展集群规模或更新版本时,整个过程又得重来一遍。这就是为什么我们需要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]"
# 等待数据平衡完成后再继续下一个节点

版本升级流程

  1. 更新 group_vars/all.yml 中的 vm_version
  2. 执行滚动升级:
    ansible-playbook -i inventories/production site.yml --tags "install" --limit "storage[0]"
    
  3. 验证无误后继续其他节点

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"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值