本文档风哥主要介绍DM数据库DevOps,包括DevOps概述、CI/CD概述、DevOps工具、版本控制、自动化部署、监控告警、持续集成、持续部署、日志管理、实际案例和最佳实践等内容,风哥教程参考DM官方文档DM8运维指南、DM8自动化部署指南,适合DevOps工程师在学习和生产环境中使用。
Part01-基础概念与理论知识
1.1 DevOps概述
DevOps是一种重视软件开发人员(Dev)和IT运维技术人员(Ops)之间沟通合作的文化、运动或惯例。
# DevOps的定义
DevOps是一种重视软件开发人员(Dev)和IT运维技术人员(Ops)之间沟通合作的文化、运动或惯例。
# DevOps的核心原则
1. 自动化
– 自动化构建
– 自动化测试
– 自动化部署
2. 持续交付
– 快速交付
– 频繁交付
– 可靠交付
3. 协作
– 开发与运维协作
– 跨团队协作
– 知识共享
4. 监控
– 实时监控
– 性能监控
– 日志监控
# DevOps的价值
– 提高效率:提高开发和运维效率
– 降低成本:降低开发和运维成本
– 提高质量:提高软件质量
– 加快交付:加快软件交付速度
DevOps是一种重视软件开发人员(Dev)和IT运维技术人员(Ops)之间沟通合作的文化、运动或惯例。
# DevOps的核心原则
1. 自动化
– 自动化构建
– 自动化测试
– 自动化部署
2. 持续交付
– 快速交付
– 频繁交付
– 可靠交付
3. 协作
– 开发与运维协作
– 跨团队协作
– 知识共享
4. 监控
– 实时监控
– 性能监控
– 日志监控
# DevOps的价值
– 提高效率:提高开发和运维效率
– 降低成本:降低开发和运维成本
– 提高质量:提高软件质量
– 加快交付:加快软件交付速度
1.2 CI/CD概述
CI/CD是持续集成和持续部署的缩写,是DevOps的重要组成部分。
# CI/CD的定义
CI/CD是持续集成和持续部署的缩写,是DevOps的重要组成部分。
# 持续集成(CI)
1. 定义
– 频繁集成代码
– 自动化构建
– 自动化测试
2. 流程
– 提交代码
– 自动构建
– 自动测试
– 反馈结果
3. 价值
– 早期发现问题
– 减少集成风险
– 提高代码质量
# 持续部署(CD)
1. 定义
– 自动化部署
– 频繁部署
– 快速回滚
2. 流程
– 通过测试 风哥提示:
– 自动部署
– 验证部署
– 监控运行
3. 价值
– 快速交付
– 降低部署风险
– 提高部署效率
# CI/CD的价值
– 加速交付:加快软件交付速度
– 提高质量:提高软件质量
– 降低风险:降低部署风险
– 提高效率:提高开发和运维效率
CI/CD是持续集成和持续部署的缩写,是DevOps的重要组成部分。
# 持续集成(CI)
1. 定义
– 频繁集成代码
– 自动化构建
– 自动化测试
2. 流程
– 提交代码
– 自动构建
– 自动测试
– 反馈结果
3. 价值
– 早期发现问题
– 减少集成风险
– 提高代码质量
# 持续部署(CD)
1. 定义
– 自动化部署
– 频繁部署
– 快速回滚
2. 流程
– 通过测试 风哥提示:
– 自动部署
– 验证部署
– 监控运行
3. 价值
– 快速交付
– 降低部署风险
– 提高部署效率
# CI/CD的价值
– 加速交付:加快软件交付速度
– 提高质量:提高软件质量
– 降低风险:降低部署风险
– 提高效率:提高开发和运维效率
1.3 DevOps工具
DevOps工具是实施DevOps的重要工具,包括版本控制、CI/CD、监控等工具。
# DevOps工具分类
1. 版本控制工具
– Git:分布式版本控制系统
– SVN:集中式版本控制系统
– Mercurial:分布式版本控制系统
2. CI/CD工具
– Jenkins:开源CI/CD工具
– GitLab CI:GitLab内置CI/CD
– Travis CI:云端CI/CD工具
3. 容器化工具
– Docker:容器化平台
– Kubernetes:容器编排平台
– Docker Compose:多容器应用编排
4. 监控工具 学习交流加群风哥微信: itpux-com
– Prometheus:监控系统
– Grafana:可视化工具
– ELK Stack:日志分析平台
5. 配置管理工具
– Ansible:自动化配置管理
– Puppet:配置管理工具
– Chef:配置管理工具
# DM数据库在DevOps中的应用
– 版本控制:管理数据库脚本
– CI/CD:自动化数据库部署
– 监控:监控数据库性能
– 日志:收集和分析数据库日志
1. 版本控制工具
– Git:分布式版本控制系统
– SVN:集中式版本控制系统
– Mercurial:分布式版本控制系统
2. CI/CD工具
– Jenkins:开源CI/CD工具
– GitLab CI:GitLab内置CI/CD
– Travis CI:云端CI/CD工具
3. 容器化工具
– Docker:容器化平台
– Kubernetes:容器编排平台
– Docker Compose:多容器应用编排
4. 监控工具 学习交流加群风哥微信: itpux-com
– Prometheus:监控系统
– Grafana:可视化工具
– ELK Stack:日志分析平台
5. 配置管理工具
– Ansible:自动化配置管理
– Puppet:配置管理工具
– Chef:配置管理工具
# DM数据库在DevOps中的应用
– 版本控制:管理数据库脚本
– CI/CD:自动化数据库部署
– 监控:监控数据库性能
– 日志:收集和分析数据库日志
风哥提示:DevOps是现代软件开发的重要实践,掌握DevOps的方法和工具,是提高软件开发效率和质量的关键。根据业务需求和团队特点,选择合适的DevOps工具链,是保证项目成功的重要手段。
Part02-生产环境规划与建议
2.1 版本控制
2.1.1 Git版本控制
# 1. Git基础操作
– 初始化仓库
$ git init
– 添加文件
$ git add .
– 提交更改
$ git commit -m “Initial commit”
– 查看状态
$ git status
# 2. Git分支管理
– 创建分支
$ git branch feature/user-management
– 切换分支
$ git checkout feature/user-management
– 合并分支
$ git checkout main
$ git merge feature/user-management
– 删除分支
$ git branch -d feature/user-management
# 3. Git远程仓库 学习交流加群风哥QQ113257174
– 添加远程仓库
$ git remote add origin https://github.com/fgedu/dm-scripts.git
– 推送到远程仓库
$ git push -u origin main
– 从远程仓库拉取
$ git pull origin main
# 4. 实际示例
– 创建数据库脚本仓库
$ mkdir dm-scripts
$ cd dm-scripts
$ git init
$ git add .
$ git commit -m “Initial commit”
– 创建数据库脚本
$ vi create_tables.sql
CREATE TABLE fgedu_user (
user_id INT PRIMARY KEY,
user_name VARCHAR(50),
user_email VARCHAR(100),
user_status INT
);
– 提交脚本
$ git add create_tables.sql
$ git commit -m “Add create_tables.sql”
– 推送到远程仓库
$ git remote add origin https://github.com/fgedu/dm-scripts.git
$ git push -u origin main
– 初始化仓库
$ git init
– 添加文件
$ git add .
– 提交更改
$ git commit -m “Initial commit”
– 查看状态
$ git status
# 2. Git分支管理
– 创建分支
$ git branch feature/user-management
– 切换分支
$ git checkout feature/user-management
– 合并分支
$ git checkout main
$ git merge feature/user-management
– 删除分支
$ git branch -d feature/user-management
# 3. Git远程仓库 学习交流加群风哥QQ113257174
– 添加远程仓库
$ git remote add origin https://github.com/fgedu/dm-scripts.git
– 推送到远程仓库
$ git push -u origin main
– 从远程仓库拉取
$ git pull origin main
# 4. 实际示例
– 创建数据库脚本仓库
$ mkdir dm-scripts
$ cd dm-scripts
$ git init
$ git add .
$ git commit -m “Initial commit”
– 创建数据库脚本
$ vi create_tables.sql
CREATE TABLE fgedu_user (
user_id INT PRIMARY KEY,
user_name VARCHAR(50),
user_email VARCHAR(100),
user_status INT
);
– 提交脚本
$ git add create_tables.sql
$ git commit -m “Add create_tables.sql”
– 推送到远程仓库
$ git remote add origin https://github.com/fgedu/dm-scripts.git
$ git push -u origin main
2.1.2 数据库脚本版本控制
# 1. 数据库脚本组织
– 目录结构
dm-scripts/
├── sql/
│ ├── ddl/
│ │ ├── create_tables.sql
│ │ └── alter_tables.sql
│ ├── dml/
│ │ ├── insert_data.sql
│ │ └── update_data.sql 更多视频教程www.fgedu.net.cn
│ └── dql/
│ └── query_data.sql
├── scripts/
│ ├── deploy.sh
│ └── rollback.sh
└── README.md
# 2. 数据库脚本命名
– DDL脚本
– create_table_name.sql:创建表
– alter_table_name.sql:修改表
– drop_table_name.sql:删除表
– DML脚本
– insert_table_name.sql:插入数据
– update_table_name.sql:更新数据
– delete_table_name.sql:删除数据
# 3. 数据库脚本版本管理
– 使用Git标签
$ git tag v1.0.0
$ git push origin v1.0.0
– 查看标签
$ git tag
– 切换到标签
$ git checkout v1.0.0
# 4. 实际示例
– 创建数据库脚本
$ vi sql/ddl/create_fgedu_user.sql
CREATE TABLE fgedu_user (
user_id INT PRIMARY KEY,
user_name VARCHAR(50),
user_email VARCHAR(100),
user_status INT
);
$ vi sql/ddl/create_fgedu_order.sql
CREATE TABLE fgedu_order (
order_id INT PRIMARY KEY,
user_id INT,
product_id INT,
amount DECIMAL(10,2),
order_date DATE
); 更多学习教程公众号风哥教程itpux_com
– 提交脚本
$ git add sql/ddl/
$ git commit -m “Add DDL scripts for fgedu_user and fgedu_order”
– 打标签
$ git tag v1.0.0
$ git push origin main –tags
– 目录结构
dm-scripts/
├── sql/
│ ├── ddl/
│ │ ├── create_tables.sql
│ │ └── alter_tables.sql
│ ├── dml/
│ │ ├── insert_data.sql
│ │ └── update_data.sql 更多视频教程www.fgedu.net.cn
│ └── dql/
│ └── query_data.sql
├── scripts/
│ ├── deploy.sh
│ └── rollback.sh
└── README.md
# 2. 数据库脚本命名
– DDL脚本
– create_table_name.sql:创建表
– alter_table_name.sql:修改表
– drop_table_name.sql:删除表
– DML脚本
– insert_table_name.sql:插入数据
– update_table_name.sql:更新数据
– delete_table_name.sql:删除数据
# 3. 数据库脚本版本管理
– 使用Git标签
$ git tag v1.0.0
$ git push origin v1.0.0
– 查看标签
$ git tag
– 切换到标签
$ git checkout v1.0.0
# 4. 实际示例
– 创建数据库脚本
$ vi sql/ddl/create_fgedu_user.sql
CREATE TABLE fgedu_user (
user_id INT PRIMARY KEY,
user_name VARCHAR(50),
user_email VARCHAR(100),
user_status INT
);
$ vi sql/ddl/create_fgedu_order.sql
CREATE TABLE fgedu_order (
order_id INT PRIMARY KEY,
user_id INT,
product_id INT,
amount DECIMAL(10,2),
order_date DATE
); 更多学习教程公众号风哥教程itpux_com
– 提交脚本
$ git add sql/ddl/
$ git commit -m “Add DDL scripts for fgedu_user and fgedu_order”
– 打标签
$ git tag v1.0.0
$ git push origin main –tags
2.2 自动化部署
2.2.1 Ansible自动化部署
# 1. 安装Ansible
– 安装Ansible
$ yum install -y ansible
– 验证安装
$ ansible –version
# 输出结果
# ansible 2.9.27
# config file = /etc/ansible/ansible.cfg
# configured module search path = [‘/root/.ansible/plugins/modules’, ‘/usr/share/ansible/plugins/modules’]
# ansible python module location = /usr/lib/python3.6/site-packages/ansible
# executable location = /usr/bin/ansible
# python version = 3.6.8 (default, Aug 18 2020, 08:33:21) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
# 2. 配置Ansible
– 编辑主机清单
$ vi /etc/ansible/hosts
[dm_servers]
dm1 ansible_host=192.168.1.10 ansible_user=root
dm2 ansible_host=192.168.1.11 ansible_user=root
[dm_servers:vars]
ansible_ssh_private_key_file=/root/.ssh/id_rsa from DB视频:www.itpux.com
# 3. 编写Playbook
$ vi deploy_dm.yml
—
– name: Deploy DM Database
hosts: dm_servers
become: yes
tasks:
– name: Copy DM installation package
copy:
src: /dm/dm8_setup.iso
dest: /tmp/dm8_setup.iso
– name: Mount DM installation package
mount:
src: /tmp/dm8_setup.iso
path: /mnt/dm
fstype: iso9660
opts: loop
state: mounted
– name: Install DM Database
shell: /mnt/dm/DMInstall.bin -i silent -f /tmp/dm_install.xml
args:
chdir: /mnt/dm
– name: Start DM Database
shell: /dm/bin/dmserver /dm/data/dm.ini start
# 4. 执行Playbook
– 执行部署
$ ansible-playbook -i /etc/ansible/hosts deploy_dm.yml
# 输出结果
# PLAY [Deploy DM Database] ********************************************************
# TASK [Gathering Facts] *********************************************************
# ok: [dm1]
# ok: [dm2]
# TASK [Copy DM installation package] **********************************************
# changed: [dm1]
# changed: [dm2]
# TASK [Mount DM installation package] ********************************************
# changed: [dm1]
# changed: [dm2]
# TASK [Install DM Database] *****************************************************
# changed: [dm1]
# changed: [dm2]
# TASK [Start DM Database] *******************************************************
# changed: [dm1]
# changed: [dm2]
# PLAY RECAP *********************************************************************
# dm1: ok=5 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
# dm2: ok=5 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
– 安装Ansible
$ yum install -y ansible
– 验证安装
$ ansible –version
# 输出结果
# ansible 2.9.27
# config file = /etc/ansible/ansible.cfg
# configured module search path = [‘/root/.ansible/plugins/modules’, ‘/usr/share/ansible/plugins/modules’]
# ansible python module location = /usr/lib/python3.6/site-packages/ansible
# executable location = /usr/bin/ansible
# python version = 3.6.8 (default, Aug 18 2020, 08:33:21) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
# 2. 配置Ansible
– 编辑主机清单
$ vi /etc/ansible/hosts
[dm_servers]
dm1 ansible_host=192.168.1.10 ansible_user=root
dm2 ansible_host=192.168.1.11 ansible_user=root
[dm_servers:vars]
ansible_ssh_private_key_file=/root/.ssh/id_rsa from DB视频:www.itpux.com
# 3. 编写Playbook
$ vi deploy_dm.yml
—
– name: Deploy DM Database
hosts: dm_servers
become: yes
tasks:
– name: Copy DM installation package
copy:
src: /dm/dm8_setup.iso
dest: /tmp/dm8_setup.iso
– name: Mount DM installation package
mount:
src: /tmp/dm8_setup.iso
path: /mnt/dm
fstype: iso9660
opts: loop
state: mounted
– name: Install DM Database
shell: /mnt/dm/DMInstall.bin -i silent -f /tmp/dm_install.xml
args:
chdir: /mnt/dm
– name: Start DM Database
shell: /dm/bin/dmserver /dm/data/dm.ini start
# 4. 执行Playbook
– 执行部署
$ ansible-playbook -i /etc/ansible/hosts deploy_dm.yml
# 输出结果
# PLAY [Deploy DM Database] ********************************************************
# TASK [Gathering Facts] *********************************************************
# ok: [dm1]
# ok: [dm2]
# TASK [Copy DM installation package] **********************************************
# changed: [dm1]
# changed: [dm2]
# TASK [Mount DM installation package] ********************************************
# changed: [dm1]
# changed: [dm2]
# TASK [Install DM Database] *****************************************************
# changed: [dm1]
# changed: [dm2]
# TASK [Start DM Database] *******************************************************
# changed: [dm1]
# changed: [dm2]
# PLAY RECAP *********************************************************************
# dm1: ok=5 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
# dm2: ok=5 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
2.2.2 Docker自动化部署
# 1. 创建Dockerfile
$ vi Dockerfile
FROM centos:7
# 安装依赖
RUN yum install -y wget
# 下载DM数据库
RUN wget -O /tmp/dm8_setup.iso http://download.fgedu.com/dm8_setup.iso
# 挂载ISO
RUN mkdir -p /mnt/dm && \
mount -o loop /tmp/dm8_setup.iso /mnt/dm
# 安装DM数据库
RUN /mnt/dm/DMInstall.bin -i silent -f /tmp/dm_install.xml
# 暴露端口
EXPOSE 5236
# 启动DM数据库
CMD [“/dm/bin/dmserver”, “/dm/data/dm.ini”]
# 2. 构建Docker镜像
– 构建镜像
$ docker build -t fgedu/dm8:latest .
# 查看镜像
$ docker images
# 输出结果
# REPOSITORY TAG IMAGE ID CREATED SIZE
# fgedu/dm8 latest abc123def456 10 seconds ago 2.5GB
# 3. 运行Docker容器
– 运行容器
$ docker run -d \
–name dm8 \
-p 5236:5236 \
-v /data/dm:/dm/data \
fgedu/dm8:latest
# 查看容器
$ docker ps
# 输出结果
# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 1234567890ab fgedu/dm8:latest “/dm/bin/dmserve…” 10 seconds ago Up 9 seconds 0.0.0.0:5236->5236/tcp dm8
# 4. 实际示例
– 使用Docker Compose部署
$ vi docker-compose.yml
version: ‘3’
services:
dm8:
image: fgedu/dm8:latest
container_name: dm8
ports:
– “5236:5236”
volumes:
– /data/dm:/dm/data
environment:
– DM_USER=fgedu_user
– DM_PASSWORD=fgedu_password
restart: always
– 启动服务
$ docker-compose up -d
– 查看服务
$ docker-compose ps
# 输出结果
# NAME COMMAND SERVICE STATUS PORTS
# dm8 “/dm/bin/dmserve…” dm8 running 0.0.0.0:5236->5236/tcp
$ vi Dockerfile
FROM centos:7
# 安装依赖
RUN yum install -y wget
# 下载DM数据库
RUN wget -O /tmp/dm8_setup.iso http://download.fgedu.com/dm8_setup.iso
# 挂载ISO
RUN mkdir -p /mnt/dm && \
mount -o loop /tmp/dm8_setup.iso /mnt/dm
# 安装DM数据库
RUN /mnt/dm/DMInstall.bin -i silent -f /tmp/dm_install.xml
# 暴露端口
EXPOSE 5236
# 启动DM数据库
CMD [“/dm/bin/dmserver”, “/dm/data/dm.ini”]
# 2. 构建Docker镜像
– 构建镜像
$ docker build -t fgedu/dm8:latest .
# 查看镜像
$ docker images
# 输出结果
# REPOSITORY TAG IMAGE ID CREATED SIZE
# fgedu/dm8 latest abc123def456 10 seconds ago 2.5GB
# 3. 运行Docker容器
– 运行容器
$ docker run -d \
–name dm8 \
-p 5236:5236 \
-v /data/dm:/dm/data \
fgedu/dm8:latest
# 查看容器
$ docker ps
# 输出结果
# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 1234567890ab fgedu/dm8:latest “/dm/bin/dmserve…” 10 seconds ago Up 9 seconds 0.0.0.0:5236->5236/tcp dm8
# 4. 实际示例
– 使用Docker Compose部署
$ vi docker-compose.yml
version: ‘3’
services:
dm8:
image: fgedu/dm8:latest
container_name: dm8
ports:
– “5236:5236”
volumes:
– /data/dm:/dm/data
environment:
– DM_USER=fgedu_user
– DM_PASSWORD=fgedu_password
restart: always
– 启动服务
$ docker-compose up -d
– 查看服务
$ docker-compose ps
# 输出结果
# NAME COMMAND SERVICE STATUS PORTS
# dm8 “/dm/bin/dmserve…” dm8 running 0.0.0.0:5236->5236/tcp
2.3 监控告警
2.3.1 Prometheus监控
# 1. 安装Prometheus
– 下载Prometheus
$ wget https://github.com/prometheus/prometheus/releases/download/v2.45.0/prometheus-2.45.0.linux-amd64.tar.gz
– 解压Prometheus
$ tar -zxvf prometheus-2.45.0.linux-amd64.tar.gz
$ mv prometheus-2.45.0.linux-amd64 /opt/prometheus
# 2. 配置Prometheus
– 编辑配置文件
$ vi /opt/prometheus/prometheus.yml
global:
scrape_interval: 15s
scrape_configs:
– job_name: ‘dm_database’
static_configs:
– targets: [‘fgedu.localhost:9153’]
# 3. 启动Prometheus
– 启动Prometheus
$ /opt/prometheus/prometheus –config.file=/opt/prometheus/prometheus.yml &
– 验证Prometheus
$ curl http://fgedu.localhost:9090/-/healthy
# 输出结果
# Prometheus is Healthy.
# 4. 配置DM数据库Exporter
– 下载DM Exporter
$ wget https://github.com/fgedu/dm_exporter/releases/download/v1.0.0/dm_exporter-1.0.0.linux-amd64.tar.gz
– 解压DM Exporter
$ tar -zxvf dm_exporter-1.0.0.linux-amd64.tar.gz
$ mv dm_exporter-1.0.0.linux-amd64 /dm_exporter
– 配置DM Exporter
$ vi /dm_exporter/config.yml
dm:
host: fgedu.localhost
port: 5236
user: fgedu_user
password: fgedu_password
– 启动DM Exporter
$ /dm_exporter/dm_exporter –config.file=/dm_exporter/config.yml &
# 5. 实际示例
– 查询DM数据库指标
$ curl http://fgedu.localhost:9153/metrics | grep dm_database_connections
# 输出结果
# dm_database_connections{database=”fgedu”} 100
– 下载Prometheus
$ wget https://github.com/prometheus/prometheus/releases/download/v2.45.0/prometheus-2.45.0.linux-amd64.tar.gz
– 解压Prometheus
$ tar -zxvf prometheus-2.45.0.linux-amd64.tar.gz
$ mv prometheus-2.45.0.linux-amd64 /opt/prometheus
# 2. 配置Prometheus
– 编辑配置文件
$ vi /opt/prometheus/prometheus.yml
global:
scrape_interval: 15s
scrape_configs:
– job_name: ‘dm_database’
static_configs:
– targets: [‘fgedu.localhost:9153’]
# 3. 启动Prometheus
– 启动Prometheus
$ /opt/prometheus/prometheus –config.file=/opt/prometheus/prometheus.yml &
– 验证Prometheus
$ curl http://fgedu.localhost:9090/-/healthy
# 输出结果
# Prometheus is Healthy.
# 4. 配置DM数据库Exporter
– 下载DM Exporter
$ wget https://github.com/fgedu/dm_exporter/releases/download/v1.0.0/dm_exporter-1.0.0.linux-amd64.tar.gz
– 解压DM Exporter
$ tar -zxvf dm_exporter-1.0.0.linux-amd64.tar.gz
$ mv dm_exporter-1.0.0.linux-amd64 /dm_exporter
– 配置DM Exporter
$ vi /dm_exporter/config.yml
dm:
host: fgedu.localhost
port: 5236
user: fgedu_user
password: fgedu_password
– 启动DM Exporter
$ /dm_exporter/dm_exporter –config.file=/dm_exporter/config.yml &
# 5. 实际示例
– 查询DM数据库指标
$ curl http://fgedu.localhost:9153/metrics | grep dm_database_connections
# 输出结果
# dm_database_connections{database=”fgedu”} 100
2.3.2 Grafana可视化
# 1. 安装Grafana
– 下载Grafana
$ wget https://dl.grafana.com/oss/release/grafana-10.2.2-1.x86_64.rpm
– 安装Grafana
$ rpm -ivh grafana-10.2.2-1.x86_64.rpm
# 2. 启动Grafana
– 启动Grafana
$ systemctl start grafana-server
$ systemctl enable grafana-server
– 验证Grafana
$ curl http://fgedu.localhost:3000/api/health
# 输出结果
# {“commit”:”abc123″,”database”:”ok”,”version”:”10.2.2″}
# 3. 配置Grafana
– 登录Grafana
URL: http://fgedu.localhost:3000
Username: admin
Password: admin
– 添加Prometheus数据源
Configuration -> Data Sources -> Add data source
Name: Prometheus
URL: http://fgedu.localhost:9090
Save & Test
# 4. 创建仪表盘
– 创建新仪表盘
Dashboards -> New Dashboard -> Add new panel
– 添加查询
Query: dm_database_connections{database=”fgedu”}
– 配置可视化
Visualization: Time series
Legend: Connections
– 保存仪表盘
Save -> DM Database Dashboard
# 5. 实际示例
– 查看仪表盘
URL: http://fgedu.localhost:3000/d/abc123/dm-database-dashboard
– 仪表盘显示
– 连接数:100
– 查询数:1000
– 事务数:500
– 下载Grafana
$ wget https://dl.grafana.com/oss/release/grafana-10.2.2-1.x86_64.rpm
– 安装Grafana
$ rpm -ivh grafana-10.2.2-1.x86_64.rpm
# 2. 启动Grafana
– 启动Grafana
$ systemctl start grafana-server
$ systemctl enable grafana-server
– 验证Grafana
$ curl http://fgedu.localhost:3000/api/health
# 输出结果
# {“commit”:”abc123″,”database”:”ok”,”version”:”10.2.2″}
# 3. 配置Grafana
– 登录Grafana
URL: http://fgedu.localhost:3000
Username: admin
Password: admin
– 添加Prometheus数据源
Configuration -> Data Sources -> Add data source
Name: Prometheus
URL: http://fgedu.localhost:9090
Save & Test
# 4. 创建仪表盘
– 创建新仪表盘
Dashboards -> New Dashboard -> Add new panel
– 添加查询
Query: dm_database_connections{database=”fgedu”}
– 配置可视化
Visualization: Time series
Legend: Connections
– 保存仪表盘
Save -> DM Database Dashboard
# 5. 实际示例
– 查看仪表盘
URL: http://fgedu.localhost:3000/d/abc123/dm-database-dashboard
– 仪表盘显示
– 连接数:100
– 查询数:1000
– 事务数:500
生产环境建议:根据业务需求和团队特点,选择合适的DevOps工具链。在版本控制中,要建立规范的分支策略和提交规范。在自动化部署中,要保证部署的可靠性和可回滚性。在监控告警中,要建立完善的监控指标和告警规则。
Part03-生产环境项目实施方案
3.1 持续集成
3.1.1 Jenkins持续集成
# 1. 安装Jenkins
– 下载Jenkins
$ wget https://pkg.jenkins.io/redhat-stable/jenkins-2.414.1-1.1.noarch.rpm
– 安装Jenkins
$ rpm -ivh jenkins-2.414.1-1.1.noarch.rpm
– 启动Jenkins
$ systemctl start jenkins
$ systemctl enable jenkins
# 2. 配置Jenkins
– 访问Jenkins
URL: http://fgedu.localhost:8080
– 解锁Jenkins
$ cat /var/lib/jenkins/secrets/initialAdminPassword
# abc123def456
– 安装插件
Git Plugin
Pipeline Plugin
SSH Plugin
# 3. 创建Jenkins任务
– 创建新任务
New Item -> DM Database CI
– 配置源码管理
Git Repository: https://github.com/fgedu/dm-scripts.git
Branch: */main
– 配置构建触发器
Poll SCM: H/5 * * * *
– 配置构建步骤
Execute Shell:
#!/bin/bash
# 执行数据库脚本
/dm/bin/disql SYSDBA/SYSDBA@fgedu.localhost:5236 @sql/ddl/create_tables.sql
# 4. 实际示例
– 执行构建
Build Now
– 查看构建日志
Console Output
# 输出结果
# Started by user admin
# Building in workspace /var/lib/jenkins/workspace/DM Database CI
# > git rev-parse –is-inside-work-tree
# timeout=10
# Fetching changes from the remote Git repository
# > git config remote.origin.url https://github.com/fgedu/dm-scripts.git
# timeout=10
# Checking out Revision abc123def456 (refs/remotes/origin/main)
# > git config core.sparsecheckout
# timeout=10
# > git checkout -f abc123def456
# Commit message: “Add create_tables.sql”
# [DM Database CI]
$ bash -xe /tmp/jenkins123456.sh
# + /dm/bin/disql SYSDBA/SYSDBA@fgedu.localhost:5236 @sql/ddl/create_tables.sql
# Server[LOCALHOST:5236]:mode is normal, state is open
# login used time: 0.123(ms)
# execute time: 0.456(ms)
# Finished: SUCCESS
– 下载Jenkins
$ wget https://pkg.jenkins.io/redhat-stable/jenkins-2.414.1-1.1.noarch.rpm
– 安装Jenkins
$ rpm -ivh jenkins-2.414.1-1.1.noarch.rpm
– 启动Jenkins
$ systemctl start jenkins
$ systemctl enable jenkins
# 2. 配置Jenkins
– 访问Jenkins
URL: http://fgedu.localhost:8080
– 解锁Jenkins
$ cat /var/lib/jenkins/secrets/initialAdminPassword
# abc123def456
– 安装插件
Git Plugin
Pipeline Plugin
SSH Plugin
# 3. 创建Jenkins任务
– 创建新任务
New Item -> DM Database CI
– 配置源码管理
Git Repository: https://github.com/fgedu/dm-scripts.git
Branch: */main
– 配置构建触发器
Poll SCM: H/5 * * * *
– 配置构建步骤
Execute Shell:
#!/bin/bash
# 执行数据库脚本
/dm/bin/disql SYSDBA/SYSDBA@fgedu.localhost:5236 @sql/ddl/create_tables.sql
# 4. 实际示例
– 执行构建
Build Now
– 查看构建日志
Console Output
# 输出结果
# Started by user admin
# Building in workspace /var/lib/jenkins/workspace/DM Database CI
# > git rev-parse –is-inside-work-tree
# timeout=10
# Fetching changes from the remote Git repository
# > git config remote.origin.url https://github.com/fgedu/dm-scripts.git
# timeout=10
# Checking out Revision abc123def456 (refs/remotes/origin/main)
# > git config core.sparsecheckout
# timeout=10
# > git checkout -f abc123def456
# Commit message: “Add create_tables.sql”
# [DM Database CI]
$ bash -xe /tmp/jenkins123456.sh
# + /dm/bin/disql SYSDBA/SYSDBA@fgedu.localhost:5236 @sql/ddl/create_tables.sql
# Server[LOCALHOST:5236]:mode is normal, state is open
# login used time: 0.123(ms)
# execute time: 0.456(ms)
# Finished: SUCCESS
3.1.2 GitLab CI持续集成
# 1. 配置GitLab CI
– 创建.gitlab-ci.yml文件
$ vi .gitlab-ci.yml
stages:
– test
– deploy
test:
stage: test
script:
– echo “Running tests”
– /dm/bin/disql SYSDBA/SYSDBA@fgedu.localhost:5236 @sql/test/test_data.sql
deploy:
stage: deploy
script:
– echo “Deploying to production”
– /dm/bin/disql SYSDBA/SYSDBA@fgedu.localhost:5236 @sql/ddl/create_tables.sql
only:
– main
# 2. 提交到GitLab
– 添加文件
$ git add .gitlab-ci.yml
– 提交更改
$ git commit -m “Add GitLab CI configuration”
– 推送到GitLab
$ git push origin main
# 3. 查看CI/CD流水线
– 访问GitLab
URL: https://gitlab.com/fgedu/dm-scripts/-/pipelines
– 查看流水线状态
Pipeline #123
test: passed
deploy: passed
# 4. 实际示例
– 查看CI日志
– test job日志
# Running tests
# Server[LOCALHOST:5236]:mode is normal, state is open
# login used time: 0.123(ms)
# execute time: 0.456(ms)
– deploy job日志
# Deploying to production
# Server[LOCALHOST:5236]:mode is normal, state is open
# login used time: 0.234(ms)
# execute time: 0.567(ms)
– 创建.gitlab-ci.yml文件
$ vi .gitlab-ci.yml
stages:
– test
– deploy
test:
stage: test
script:
– echo “Running tests”
– /dm/bin/disql SYSDBA/SYSDBA@fgedu.localhost:5236 @sql/test/test_data.sql
deploy:
stage: deploy
script:
– echo “Deploying to production”
– /dm/bin/disql SYSDBA/SYSDBA@fgedu.localhost:5236 @sql/ddl/create_tables.sql
only:
– main
# 2. 提交到GitLab
– 添加文件
$ git add .gitlab-ci.yml
– 提交更改
$ git commit -m “Add GitLab CI configuration”
– 推送到GitLab
$ git push origin main
# 3. 查看CI/CD流水线
– 访问GitLab
URL: https://gitlab.com/fgedu/dm-scripts/-/pipelines
– 查看流水线状态
Pipeline #123
test: passed
deploy: passed
# 4. 实际示例
– 查看CI日志
– test job日志
# Running tests
# Server[LOCALHOST:5236]:mode is normal, state is open
# login used time: 0.123(ms)
# execute time: 0.456(ms)
– deploy job日志
# Deploying to production
# Server[LOCALHOST:5236]:mode is normal, state is open
# login used time: 0.234(ms)
# execute time: 0.567(ms)
3.2 持续部署
3.2.1 蓝绿部署
# 1. 蓝绿部署架构
– 蓝环境(Blue)
– 当前生产环境
– 处理用户请求
– 稳定运行
– 绿环境(Green)
– 新版本环境
– 准备上线
– 测试验证
# 2. 蓝绿部署流程
– 部署到绿环境
$ ansible-playbook -i /etc/ansible/hosts deploy_dm_green.yml
– 验证绿环境
$ /dm/bin/disql SYSDBA/SYSDBA@fgedu.localhost:5237 @sql/test/test_data.sql
– 切换流量到绿环境
$ ansible-playbook -i /etc/ansible/hosts switch_to_green.yml
– 监控绿环境
$ curl http://fgedu.localhost:9153/metrics | grep dm_database_connections
# 3. 回滚到蓝环境
– 切换流量到蓝环境
$ ansible-playbook -i /etc/ansible/hosts switch_to_blue.yml
– 监控蓝环境
$ curl http://fgedu.localhost:9153/metrics | grep dm_database_connections
# 4. 实际示例
– 部署到绿环境
$ ansible-playbook -i /etc/ansible/hosts deploy_dm_green.yml
# 输出结果
# PLAY [Deploy DM Database to Green] *********************************************
# TASK [Gathering Facts] *********************************************************
# ok: [dm1]
# TASK [Deploy DM Database] *****************************************************
# changed: [dm1]
# PLAY RECAP *********************************************************************
# dm1: ok=2 changed=1 unreachable=0 failed=0
– 验证绿环境
$ /dm/bin/disql SYSDBA/SYSDBA@fgedu.localhost:5237 @sql/test/test_data.sql
# 输出结果
# Server[LOCALHOST:5237]:mode is normal, state is open
# login used time: 0.123(ms)
# execute time: 0.456(ms)
– 切换流量到绿环境
$ ansible-playbook -i /etc/ansible/hosts switch_to_green.yml
# 输出结果
# PLAY [Switch to Green Environment] **********************************************
# TASK [Gathering Facts] *********************************************************
# ok: [dm1]
# TASK [Switch Traffic] ***********************************************************
# changed: [dm1]
# PLAY RECAP *********************************************************************
# dm1: ok=2 changed=1 unreachable=0 failed=0
– 蓝环境(Blue)
– 当前生产环境
– 处理用户请求
– 稳定运行
– 绿环境(Green)
– 新版本环境
– 准备上线
– 测试验证
# 2. 蓝绿部署流程
– 部署到绿环境
$ ansible-playbook -i /etc/ansible/hosts deploy_dm_green.yml
– 验证绿环境
$ /dm/bin/disql SYSDBA/SYSDBA@fgedu.localhost:5237 @sql/test/test_data.sql
– 切换流量到绿环境
$ ansible-playbook -i /etc/ansible/hosts switch_to_green.yml
– 监控绿环境
$ curl http://fgedu.localhost:9153/metrics | grep dm_database_connections
# 3. 回滚到蓝环境
– 切换流量到蓝环境
$ ansible-playbook -i /etc/ansible/hosts switch_to_blue.yml
– 监控蓝环境
$ curl http://fgedu.localhost:9153/metrics | grep dm_database_connections
# 4. 实际示例
– 部署到绿环境
$ ansible-playbook -i /etc/ansible/hosts deploy_dm_green.yml
# 输出结果
# PLAY [Deploy DM Database to Green] *********************************************
# TASK [Gathering Facts] *********************************************************
# ok: [dm1]
# TASK [Deploy DM Database] *****************************************************
# changed: [dm1]
# PLAY RECAP *********************************************************************
# dm1: ok=2 changed=1 unreachable=0 failed=0
– 验证绿环境
$ /dm/bin/disql SYSDBA/SYSDBA@fgedu.localhost:5237 @sql/test/test_data.sql
# 输出结果
# Server[LOCALHOST:5237]:mode is normal, state is open
# login used time: 0.123(ms)
# execute time: 0.456(ms)
– 切换流量到绿环境
$ ansible-playbook -i /etc/ansible/hosts switch_to_green.yml
# 输出结果
# PLAY [Switch to Green Environment] **********************************************
# TASK [Gathering Facts] *********************************************************
# ok: [dm1]
# TASK [Switch Traffic] ***********************************************************
# changed: [dm1]
# PLAY RECAP *********************************************************************
# dm1: ok=2 changed=1 unreachable=0 failed=0
3.2.2 金丝雀部署
# 1. 金丝雀部署架构
– 生产环境
– 处理大部分用户请求
– 稳定运行
– 金丝雀环境
– 处理少量用户请求
– 新版本验证
# 2. 金丝雀部署流程
– 部署金丝雀版本
$ ansible-playbook -i /etc/ansible/hosts deploy_dm_canary.yml
– 配置流量分配
– 90%流量到生产环境
– 10%流量到金丝雀环境
– 监控金丝雀环境
$ curl http://fgedu.localhost:9153/metrics | grep dm_database_connections
– 逐步增加金丝雀流量
– 50%流量到生产环境
– 50%流量到金丝雀环境
– 全量切换到金丝雀环境
$ ansible-playbook -i /etc/ansible/hosts switch_to_canary.yml
# 3. 回滚到生产环境
– 切换流量到生产环境
$ ansible-playbook -i /etc/ansible/hosts switch_to_production.yml
– 监控生产环境
$ curl http://fgedu.localhost:9153/metrics | grep dm_database_connections
# 4. 实际示例
– 部署金丝雀版本
$ ansible-playbook -i /etc/ansible/hosts deploy_dm_canary.yml
# 输出结果
# PLAY [Deploy DM Database Canary] ***********************************************
# TASK [Gathering Facts] *********************************************************
# ok: [dm1]
# TASK [Deploy DM Database] *****************************************************
# changed: [dm1]
# PLAY RECAP *********************************************************************
# dm1: ok=2 changed=1 unreachable=0 failed=0
– 配置流量分配
$ vi /etc/nginx/nginx.conf
upstream dm_backend {
server 192.168.1.10:5236 weight=9;
server 192.168.1.11:5236 weight=1;
}
– 重启Nginx
$ systemctl restart nginx
– 监控金丝雀环境
$ curl http://fgedu.localhost:9153/metrics | grep dm_database_connections
# 输出结果
# dm_database_connections{database=”fgedu”,instance=”production”} 90
# dm_database_connections{database=”fgedu”,instance=”canary”} 10
– 生产环境
– 处理大部分用户请求
– 稳定运行
– 金丝雀环境
– 处理少量用户请求
– 新版本验证
# 2. 金丝雀部署流程
– 部署金丝雀版本
$ ansible-playbook -i /etc/ansible/hosts deploy_dm_canary.yml
– 配置流量分配
– 90%流量到生产环境
– 10%流量到金丝雀环境
– 监控金丝雀环境
$ curl http://fgedu.localhost:9153/metrics | grep dm_database_connections
– 逐步增加金丝雀流量
– 50%流量到生产环境
– 50%流量到金丝雀环境
– 全量切换到金丝雀环境
$ ansible-playbook -i /etc/ansible/hosts switch_to_canary.yml
# 3. 回滚到生产环境
– 切换流量到生产环境
$ ansible-playbook -i /etc/ansible/hosts switch_to_production.yml
– 监控生产环境
$ curl http://fgedu.localhost:9153/metrics | grep dm_database_connections
# 4. 实际示例
– 部署金丝雀版本
$ ansible-playbook -i /etc/ansible/hosts deploy_dm_canary.yml
# 输出结果
# PLAY [Deploy DM Database Canary] ***********************************************
# TASK [Gathering Facts] *********************************************************
# ok: [dm1]
# TASK [Deploy DM Database] *****************************************************
# changed: [dm1]
# PLAY RECAP *********************************************************************
# dm1: ok=2 changed=1 unreachable=0 failed=0
– 配置流量分配
$ vi /etc/nginx/nginx.conf
upstream dm_backend {
server 192.168.1.10:5236 weight=9;
server 192.168.1.11:5236 weight=1;
}
– 重启Nginx
$ systemctl restart nginx
– 监控金丝雀环境
$ curl http://fgedu.localhost:9153/metrics | grep dm_database_connections
# 输出结果
# dm_database_connections{database=”fgedu”,instance=”production”} 90
# dm_database_connections{database=”fgedu”,instance=”canary”} 10
3.3 日志管理
3.3.1 ELK Stack日志管理
# 1. 安装Elasticsearch
– 下载Elasticsearch
$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.10.4-linux-x86_64.tar.gz
– 解压Elasticsearch
$ tar -zxvf elasticsearch-8.10.4-linux-x86_64.tar.gz
$ mv elasticsearch-8.10.4 /opt/elasticsearch
– 配置Elasticsearch
$ vi /opt/elasticsearch/config/elasticsearch.yml
cluster.name: fgedu-cluster
node.name: node-1
network.host: 0.0.0.0
http.port: 9200
– 启动Elasticsearch
$ /opt/elasticsearch/bin/elasticsearch -d
# 2. 安装Logstash
– 下载Logstash
$ wget https://artifacts.elastic.co/downloads/logstash/logstash-8.10.4-linux-x86_64.tar.gz
– 解压Logstash
$ tar -zxvf logstash-8.10.4-linux-x86_64.tar.gz
$ mv logstash-8.10.4 /opt/logstash
– 配置Logstash
$ vi /opt/logstash/config/logstash.conf
input {
file {
path => “/dm/log/*.log”
start_position => “beginning”
}
}
filter {
grok {
match => { “message” => “%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{GREEDYDATA:msg}” }
}
}
output {
elasticsearch {
hosts => [“fgedu.localhost:9200”]
index => “dm-logs-%{+YYYY.MM.dd}”
}
}
– 启动Logstash
$ /opt/logstash/bin/logstash -f /opt/logstash/config/logstash.conf &
# 3. 安装Kibana
– 下载Kibana
$ wget https://artifacts.elastic.co/downloads/kibana/kibana-8.10.4-linux-x86_64.tar.gz
– 解压Kibana
$ tar -zxvf kibana-8.10.4-linux-x86_64.tar.gz
$ mv kibana-8.10.4 /opt/kibana
– 配置Kibana
$ vi /opt/kibana/config/kibana.yml
server.host: “0.0.0.0”
server.port: 5601
elasticsearch.hosts: [“http://fgedu.localhost:9200”]
– 启动Kibana
$ /opt/kibana/bin/kibana &
# 4. 实际示例
– 访问Kibana
URL: http://fgedu.localhost:5601
– 创建索引模式
Management -> Stack Management -> Index Patterns
Index pattern: dm-logs-*
Time field: @timestamp
– 查看日志
Discover -> dm-logs-*
– 查询日志
message: “ERROR”
– 下载Elasticsearch
$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.10.4-linux-x86_64.tar.gz
– 解压Elasticsearch
$ tar -zxvf elasticsearch-8.10.4-linux-x86_64.tar.gz
$ mv elasticsearch-8.10.4 /opt/elasticsearch
– 配置Elasticsearch
$ vi /opt/elasticsearch/config/elasticsearch.yml
cluster.name: fgedu-cluster
node.name: node-1
network.host: 0.0.0.0
http.port: 9200
– 启动Elasticsearch
$ /opt/elasticsearch/bin/elasticsearch -d
# 2. 安装Logstash
– 下载Logstash
$ wget https://artifacts.elastic.co/downloads/logstash/logstash-8.10.4-linux-x86_64.tar.gz
– 解压Logstash
$ tar -zxvf logstash-8.10.4-linux-x86_64.tar.gz
$ mv logstash-8.10.4 /opt/logstash
– 配置Logstash
$ vi /opt/logstash/config/logstash.conf
input {
file {
path => “/dm/log/*.log”
start_position => “beginning”
}
}
filter {
grok {
match => { “message” => “%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{GREEDYDATA:msg}” }
}
}
output {
elasticsearch {
hosts => [“fgedu.localhost:9200”]
index => “dm-logs-%{+YYYY.MM.dd}”
}
}
– 启动Logstash
$ /opt/logstash/bin/logstash -f /opt/logstash/config/logstash.conf &
# 3. 安装Kibana
– 下载Kibana
$ wget https://artifacts.elastic.co/downloads/kibana/kibana-8.10.4-linux-x86_64.tar.gz
– 解压Kibana
$ tar -zxvf kibana-8.10.4-linux-x86_64.tar.gz
$ mv kibana-8.10.4 /opt/kibana
– 配置Kibana
$ vi /opt/kibana/config/kibana.yml
server.host: “0.0.0.0”
server.port: 5601
elasticsearch.hosts: [“http://fgedu.localhost:9200”]
– 启动Kibana
$ /opt/kibana/bin/kibana &
# 4. 实际示例
– 访问Kibana
URL: http://fgedu.localhost:5601
– 创建索引模式
Management -> Stack Management -> Index Patterns
Index pattern: dm-logs-*
Time field: @timestamp
– 查看日志
Discover -> dm-logs-*
– 查询日志
message: “ERROR”
3.3.2 日志分析
# 1. 日志查询
– 查询错误日志
message: “ERROR”
– 查询特定时间范围的日志
@timestamp: [2024-01-10T00:00:00 TO 2024-01-10T23:59:59]
– 查询特定级别的日志
level: “ERROR” OR level: “WARNING”
# 2. 日志统计
– 统计错误数量
message: “ERROR” | count
– 统计错误分布
message: “ERROR” | terms msg.keyword
– 统计错误趋势
message: “ERROR” | date_histogram @timestamp
# 3. 日志告警
– 创建告警规则
Alerting -> Rules -> Create rule
Rule type: Query rule
Index: dm-logs-*
Query: message: “ERROR”
Aggregation: Count
Threshold: > 10
– 配置告警通知
Actions -> Add action
Action type: Email
To: admin@fgedu.com
Subject: DM Database Error Alert
Message: DM Database error detected
# 4. 实际示例
– 查询错误日志
message: “ERROR” AND @timestamp: [2024-01-10T00:00:00 TO 2024-01-10T23:59:59]
# 输出结果
# @timestamp level msg
# 2024-01-10 10:00:00 ERROR Connection failed
# 2024-01-10 10:01:00 ERROR Query timeout
– 统计错误数量
message: “ERROR” | count
# 输出结果
# 100
– 查询错误日志
message: “ERROR”
– 查询特定时间范围的日志
@timestamp: [2024-01-10T00:00:00 TO 2024-01-10T23:59:59]
– 查询特定级别的日志
level: “ERROR” OR level: “WARNING”
# 2. 日志统计
– 统计错误数量
message: “ERROR” | count
– 统计错误分布
message: “ERROR” | terms msg.keyword
– 统计错误趋势
message: “ERROR” | date_histogram @timestamp
# 3. 日志告警
– 创建告警规则
Alerting -> Rules -> Create rule
Rule type: Query rule
Index: dm-logs-*
Query: message: “ERROR”
Aggregation: Count
Threshold: > 10
– 配置告警通知
Actions -> Add action
Action type: Email
To: admin@fgedu.com
Subject: DM Database Error Alert
Message: DM Database error detected
# 4. 实际示例
– 查询错误日志
message: “ERROR” AND @timestamp: [2024-01-10T00:00:00 TO 2024-01-10T23:59:59]
# 输出结果
# @timestamp level msg
# 2024-01-10 10:00:00 ERROR Connection failed
# 2024-01-10 10:01:00 ERROR Query timeout
– 统计错误数量
message: “ERROR” | count
# 输出结果
# 100
风哥提示:DevOps是一个持续的过程,需要根据业务需求和团队特点,不断调整和优化。建立完善的监控体系,是保障系统稳定运行的关键。
Part04-生产案例与实战讲解
4.1 自动化部署案例
4.1.1 案例描述
某企业需要自动化部署DM数据库,提高部署效率,降低部署风险。
4.1.2 实施步骤
# 1. 需求分析
– 业务需求
– 自动化部署DM数据库
– 提高部署效率
– 降低部署风险
– 技术需求
– 使用Ansible自动化部署
– 支持多环境部署
– 支持回滚
# 2. 方案设计
– 部署架构
– 开发环境:单节点部署
– 测试环境:单节点部署
– 生产环境:集群部署
– 部署流程
– 准备部署包
– 执行部署脚本
– 验证部署结果
– 回滚(如果需要)
# 3. 实施步骤
– 编写Ansible Playbook
$ vi deploy_dm.yml
—
– name: Deploy DM Database
hosts: dm_servers
become: yes
tasks:
– name: Copy DM installation package
copy:
src: /dm/dm8_setup.iso
dest: /tmp/dm8_setup.iso
– name: Mount DM installation package
mount:
src: /tmp/dm8_setup.iso
path: /mnt/dm
fstype: iso9660
opts: loop
state: mounted
– name: Install DM Database
shell: /mnt/dm/DMInstall.bin -i silent -f /tmp/dm_install.xml
args:
chdir: /mnt/dm
– name: Start DM Database
shell: /dm/bin/dmserver /dm/data/dm.ini start
– name: Verify DM Database
shell: /dm/bin/disql SYSDBA/SYSDBA@fgedu.localhost:5236 “SELECT 1”
– 编写回滚Playbook
$ vi rollback_dm.yml
—
– name: Rollback DM Database
hosts: dm_servers
become: yes
tasks:
– name: Stop DM Database
shell: /dm/bin/dmserver /dm/data/dm.ini stop
– name: Restore DM Database
shell: /dm/bin/dmrestore /backup/dm_backup.bak
– name: Start DM Database
shell: /dm/bin/dmserver /dm/data/dm.ini start
– 执行部署
$ ansible-playbook -i /etc/ansible/hosts deploy_dm.yml
# 输出结果
# PLAY [Deploy DM Database] ********************************************************
# TASK [Gathering Facts] *********************************************************
# ok: [dm1]
# ok: [dm2]
# TASK [Copy DM installation package] **********************************************
# changed: [dm1]
# changed: [dm2]
# TASK [Mount DM installation package] ********************************************
# changed: [dm1]
# changed: [dm2]
# TASK [Install DM Database] *****************************************************
# changed: [dm1]
# changed: [dm2]
# TASK [Start DM Database] *******************************************************
# changed: [dm1]
# changed: [dm2]
# TASK [Verify DM Database] ******************************************************
# ok: [dm1]
# ok: [dm2]
# PLAY RECAP *********************************************************************
# dm1: ok=6 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
# dm2: ok=6 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
# 4. 验证结果
– 连接数据库
$ /dm/bin/disql SYSDBA/SYSDBA@fgedu.localhost:5236
– 查询数据库版本
SQL> SELECT * FROM V$VERSION;
# 输出结果
# BANNER
# ———————————————————————-
# DM Database Server 8.1.2.192
# 5. 实施结果
– 自动化部署成功
– 部署效率提高
– 部署风险降低
– 业务需求
– 自动化部署DM数据库
– 提高部署效率
– 降低部署风险
– 技术需求
– 使用Ansible自动化部署
– 支持多环境部署
– 支持回滚
# 2. 方案设计
– 部署架构
– 开发环境:单节点部署
– 测试环境:单节点部署
– 生产环境:集群部署
– 部署流程
– 准备部署包
– 执行部署脚本
– 验证部署结果
– 回滚(如果需要)
# 3. 实施步骤
– 编写Ansible Playbook
$ vi deploy_dm.yml
—
– name: Deploy DM Database
hosts: dm_servers
become: yes
tasks:
– name: Copy DM installation package
copy:
src: /dm/dm8_setup.iso
dest: /tmp/dm8_setup.iso
– name: Mount DM installation package
mount:
src: /tmp/dm8_setup.iso
path: /mnt/dm
fstype: iso9660
opts: loop
state: mounted
– name: Install DM Database
shell: /mnt/dm/DMInstall.bin -i silent -f /tmp/dm_install.xml
args:
chdir: /mnt/dm
– name: Start DM Database
shell: /dm/bin/dmserver /dm/data/dm.ini start
– name: Verify DM Database
shell: /dm/bin/disql SYSDBA/SYSDBA@fgedu.localhost:5236 “SELECT 1”
– 编写回滚Playbook
$ vi rollback_dm.yml
—
– name: Rollback DM Database
hosts: dm_servers
become: yes
tasks:
– name: Stop DM Database
shell: /dm/bin/dmserver /dm/data/dm.ini stop
– name: Restore DM Database
shell: /dm/bin/dmrestore /backup/dm_backup.bak
– name: Start DM Database
shell: /dm/bin/dmserver /dm/data/dm.ini start
– 执行部署
$ ansible-playbook -i /etc/ansible/hosts deploy_dm.yml
# 输出结果
# PLAY [Deploy DM Database] ********************************************************
# TASK [Gathering Facts] *********************************************************
# ok: [dm1]
# ok: [dm2]
# TASK [Copy DM installation package] **********************************************
# changed: [dm1]
# changed: [dm2]
# TASK [Mount DM installation package] ********************************************
# changed: [dm1]
# changed: [dm2]
# TASK [Install DM Database] *****************************************************
# changed: [dm1]
# changed: [dm2]
# TASK [Start DM Database] *******************************************************
# changed: [dm1]
# changed: [dm2]
# TASK [Verify DM Database] ******************************************************
# ok: [dm1]
# ok: [dm2]
# PLAY RECAP *********************************************************************
# dm1: ok=6 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
# dm2: ok=6 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
# 4. 验证结果
– 连接数据库
$ /dm/bin/disql SYSDBA/SYSDBA@fgedu.localhost:5236
– 查询数据库版本
SQL> SELECT * FROM V$VERSION;
# 输出结果
# BANNER
# ———————————————————————-
# DM Database Server 8.1.2.192
# 5. 实施结果
– 自动化部署成功
– 部署效率提高
– 部署风险降低
4.2 持续集成案例
4.2.1 案例描述
某企业需要建立持续集成流程,自动化测试和部署数据库脚本。
4.2.2 实施步骤
# 1. 需求分析
– 业务需求
– 自动化测试数据库脚本
– 自动化部署数据库脚本
– 快速反馈测试结果
– 技术需求
– 使用Jenkins持续集成
– 集成Git版本控制
– 自动化测试和部署
# 2. 方案设计
– CI流程
– 提交代码
– 触发构建
– 执行测试
– 部署到测试环境
– 反馈结果
– 测试策略
– 单元测试:测试单个SQL语句
– 集成测试:测试多个SQL语句
– 端到端测试:测试完整流程
# 3. 实施步骤
– 配置Jenkins
– 创建新任务
New Item -> DM Database CI
– 配置源码管理
Git Repository: https://github.com/fgedu/dm-scripts.git
Branch: */main
– 配置构建触发器
Poll SCM: H/5 * * * *
– 配置构建步骤
Execute Shell:
#!/bin/bash
# 执行单元测试
/dm/bin/disql SYSDBA/SYSDBA@fgedu.localhost:5236 @sql/test/unit_test.sql
# 执行集成测试
/dm/bin/disql SYSDBA/SYSDBA@fgedu.localhost:5236 @sql/test/integration_test.sql
# 部署到测试环境
/dm/bin/disql SYSDBA/SYSDBA@test.fgedu.com:5236 @sql/ddl/create_tables.sql
– 配置构建后操作
Email Notification:
Recipients: dev@fgedu.com
Subject: DM Database CI Build #
${BUILD_NUMBER} – ${BUILD_STATUS}
Content: Build URL: ${BUILD_URL}
– 执行构建
Build Now
– 查看构建日志
Console Output
# 输出结果
# Started by user admin
# Building in workspace /var/lib/jenkins/workspace/DM Database CI
# > git rev-parse –is-inside-work-tree
# timeout=10
# Fetching changes from the remote Git repository
# > git config remote.origin.url https://github.com/fgedu/dm-scripts.git
# timeout=10
# Checking out Revision abc123def456 (refs/remotes/origin/main)
# Commit message: “Add create_tables.sql”
# [DM Database CI]
$ bash -xe /tmp/jenkins123456.sh
# + /dm/bin/disql SYSDBA/SYSDBA@fgedu.localhost:5236 @sql/test/unit_test.sql
# Server[LOCALHOST:5236]:mode is normal, state is open
# login used time: 0.123(ms)
# execute time: 0.456(ms)
# + /dm/bin/disql SYSDBA/SYSDBA@fgedu.localhost:5236 @sql/test/integration_test.sql
# Server[LOCALHOST:5236]:mode is normal, state is open
# login used time: 0.234(ms)
# execute time: 0.567(ms)
# + /dm/bin/disql SYSDBA/SYSDBA@test.fgedu.com:5236 @sql/ddl/create_tables.sql
# Server[test.fgedu.com:5236]:mode is normal, state is open
# login used time: 0.345(ms)
# execute time: 0.678(ms)
# Email was triggered for: Success
# Sending email to: dev@fgedu.com
# Finished: SUCCESS
# 4. 验证结果
– 查看测试环境
$ /dm/bin/disql SYSDBA/SYSDBA@test.fgedu.com:5236
– 查询表结构
SQL> DESC fgedu_user;
# 输出结果
# Name Type Nullable
# ——— ———— ——–
# USER_ID INT NO
# USER_NAME VARCHAR(50) NO
# USER_EMAIL VARCHAR(100) NO
# USER_STATUS INT YES
# 5. 实施结果
– 持续集成成功
– 自动化测试正常
– 自动化部署正常
– 业务需求
– 自动化测试数据库脚本
– 自动化部署数据库脚本
– 快速反馈测试结果
– 技术需求
– 使用Jenkins持续集成
– 集成Git版本控制
– 自动化测试和部署
# 2. 方案设计
– CI流程
– 提交代码
– 触发构建
– 执行测试
– 部署到测试环境
– 反馈结果
– 测试策略
– 单元测试:测试单个SQL语句
– 集成测试:测试多个SQL语句
– 端到端测试:测试完整流程
# 3. 实施步骤
– 配置Jenkins
– 创建新任务
New Item -> DM Database CI
– 配置源码管理
Git Repository: https://github.com/fgedu/dm-scripts.git
Branch: */main
– 配置构建触发器
Poll SCM: H/5 * * * *
– 配置构建步骤
Execute Shell:
#!/bin/bash
# 执行单元测试
/dm/bin/disql SYSDBA/SYSDBA@fgedu.localhost:5236 @sql/test/unit_test.sql
# 执行集成测试
/dm/bin/disql SYSDBA/SYSDBA@fgedu.localhost:5236 @sql/test/integration_test.sql
# 部署到测试环境
/dm/bin/disql SYSDBA/SYSDBA@test.fgedu.com:5236 @sql/ddl/create_tables.sql
– 配置构建后操作
Email Notification:
Recipients: dev@fgedu.com
Subject: DM Database CI Build #
${BUILD_NUMBER} – ${BUILD_STATUS}
Content: Build URL: ${BUILD_URL}
– 执行构建
Build Now
– 查看构建日志
Console Output
# 输出结果
# Started by user admin
# Building in workspace /var/lib/jenkins/workspace/DM Database CI
# > git rev-parse –is-inside-work-tree
# timeout=10
# Fetching changes from the remote Git repository
# > git config remote.origin.url https://github.com/fgedu/dm-scripts.git
# timeout=10
# Checking out Revision abc123def456 (refs/remotes/origin/main)
# Commit message: “Add create_tables.sql”
# [DM Database CI]
$ bash -xe /tmp/jenkins123456.sh
# + /dm/bin/disql SYSDBA/SYSDBA@fgedu.localhost:5236 @sql/test/unit_test.sql
# Server[LOCALHOST:5236]:mode is normal, state is open
# login used time: 0.123(ms)
# execute time: 0.456(ms)
# + /dm/bin/disql SYSDBA/SYSDBA@fgedu.localhost:5236 @sql/test/integration_test.sql
# Server[LOCALHOST:5236]:mode is normal, state is open
# login used time: 0.234(ms)
# execute time: 0.567(ms)
# + /dm/bin/disql SYSDBA/SYSDBA@test.fgedu.com:5236 @sql/ddl/create_tables.sql
# Server[test.fgedu.com:5236]:mode is normal, state is open
# login used time: 0.345(ms)
# execute time: 0.678(ms)
# Email was triggered for: Success
# Sending email to: dev@fgedu.com
# Finished: SUCCESS
# 4. 验证结果
– 查看测试环境
$ /dm/bin/disql SYSDBA/SYSDBA@test.fgedu.com:5236
– 查询表结构
SQL> DESC fgedu_user;
# 输出结果
# Name Type Nullable
# ——— ———— ——–
# USER_ID INT NO
# USER_NAME VARCHAR(50) NO
# USER_EMAIL VARCHAR(100) NO
# USER_STATUS INT YES
# 5. 实施结果
– 持续集成成功
– 自动化测试正常
– 自动化部署正常
4.3 监控告警案例
4.3.1 案例描述
某企业需要建立监控告警体系,实时监控DM数据库运行状态,及时发现和解决问题。
4.3.2 实施步骤
# 1. 需求分析
– 业务需求
– 实时监控DM数据库
– 及时发现和解决问题
– 提高系统可用性
– 技术需求
– 使用Prometheus监控
– 使用Grafana可视化
– 配置告警规则
# 2. 方案设计
– 监控指标
– 连接数:监控数据库连接数
– 查询数:监控数据库查询数
– 事务数:监控数据库事务数
– 性能指标:监控数据库性能
– 告警规则
– 连接数告警:连接数超过阈值
– 查询数告警:查询数超过阈值
– 性能告警:性能指标异常
# 3. 实施步骤
– 配置Prometheus
– 编辑配置文件
$ vi /opt/prometheus/prometheus.yml
global:
scrape_interval: 15s
scrape_configs:
– job_name: ‘dm_database’
static_configs:
– targets: [‘fgedu.localhost:9153’]
– 配置告警规则
$ vi /opt/prometheus/alerts.yml
groups:
– name: dm_database_alerts
rules:
– alert: HighConnections
expr: dm_database_connections > 100
for: 5m
labels:
severity: warning
annotations:
summary: “High number of connections”
description: “DM database has {{ $value }} connections”
– alert: HighQueryCount
expr: rate(dm_database_queries[5m]) > 100
for: 5m
labels:
severity: warning
annotations:
summary: “High query count”
description: “DM database has {{ $value }} queries per second”
– 启动Prometheus
$ /opt/prometheus/prometheus –config.file=/opt/prometheus/prometheus.yml –config.file=/opt/prometheus/alerts.yml &
– 配置Grafana
– 添加Prometheus数据源
Configuration -> Data Sources -> Add data source
Name: Prometheus
URL: http://fgedu.localhost:9090
Save & Test
– 创建仪表盘
Dashboards -> New Dashboard -> Add new panel
– 添加连接数面板
Query: dm_database_connections{database=”fgedu”}
Visualization: Time series
Legend: Connections
– 添加查询数面板
Query: rate(dm_database_queries{database=”fgedu”}[5m])
Visualization: Time series
Legend: Queries/s
– 配置告警通知
Alerting -> Notification channels -> Add channel
Type: Email
Address: admin@fgedu.com
– 配置告警规则
Alerting -> Alert rules -> New rule
Name: High Connections
Query: dm_database_connections{database=”fgedu”} > 100
Condition: Query
Threshold: 100
Time: 5m
Notification: Email channel
# 4. 验证结果
– 查看Prometheus
URL: http://fgedu.localhost:9090
– 查看Grafana
URL: http://fgedu.localhost:3000
– 查看仪表盘
Dashboard -> DM Database Dashboard
– 模拟告警
– 增加连接数
$ for i in {1..150}; do /dm/bin/disql SYSDBA/SYSDBA@fgedu.localhost:5236 “SELECT 1” & done
– 查看告警
Alerting -> Alerts
# 输出结果
# Alert: High Connections
# State: Firing
# Value: 150
# Duration: 5m
# 5. 实施结果
– 监控告警成功
– 实时监控正常
– 告警通知正常
– 业务需求
– 实时监控DM数据库
– 及时发现和解决问题
– 提高系统可用性
– 技术需求
– 使用Prometheus监控
– 使用Grafana可视化
– 配置告警规则
# 2. 方案设计
– 监控指标
– 连接数:监控数据库连接数
– 查询数:监控数据库查询数
– 事务数:监控数据库事务数
– 性能指标:监控数据库性能
– 告警规则
– 连接数告警:连接数超过阈值
– 查询数告警:查询数超过阈值
– 性能告警:性能指标异常
# 3. 实施步骤
– 配置Prometheus
– 编辑配置文件
$ vi /opt/prometheus/prometheus.yml
global:
scrape_interval: 15s
scrape_configs:
– job_name: ‘dm_database’
static_configs:
– targets: [‘fgedu.localhost:9153’]
– 配置告警规则
$ vi /opt/prometheus/alerts.yml
groups:
– name: dm_database_alerts
rules:
– alert: HighConnections
expr: dm_database_connections > 100
for: 5m
labels:
severity: warning
annotations:
summary: “High number of connections”
description: “DM database has {{ $value }} connections”
– alert: HighQueryCount
expr: rate(dm_database_queries[5m]) > 100
for: 5m
labels:
severity: warning
annotations:
summary: “High query count”
description: “DM database has {{ $value }} queries per second”
– 启动Prometheus
$ /opt/prometheus/prometheus –config.file=/opt/prometheus/prometheus.yml –config.file=/opt/prometheus/alerts.yml &
– 配置Grafana
– 添加Prometheus数据源
Configuration -> Data Sources -> Add data source
Name: Prometheus
URL: http://fgedu.localhost:9090
Save & Test
– 创建仪表盘
Dashboards -> New Dashboard -> Add new panel
– 添加连接数面板
Query: dm_database_connections{database=”fgedu”}
Visualization: Time series
Legend: Connections
– 添加查询数面板
Query: rate(dm_database_queries{database=”fgedu”}[5m])
Visualization: Time series
Legend: Queries/s
– 配置告警通知
Alerting -> Notification channels -> Add channel
Type: Email
Address: admin@fgedu.com
– 配置告警规则
Alerting -> Alert rules -> New rule
Name: High Connections
Query: dm_database_connections{database=”fgedu”} > 100
Condition: Query
Threshold: 100
Time: 5m
Notification: Email channel
# 4. 验证结果
– 查看Prometheus
URL: http://fgedu.localhost:9090
– 查看Grafana
URL: http://fgedu.localhost:3000
– 查看仪表盘
Dashboard -> DM Database Dashboard
– 模拟告警
– 增加连接数
$ for i in {1..150}; do /dm/bin/disql SYSDBA/SYSDBA@fgedu.localhost:5236 “SELECT 1” & done
– 查看告警
Alerting -> Alerts
# 输出结果
# Alert: High Connections
# State: Firing
# Value: 150
# Duration: 5m
# 5. 实施结果
– 监控告警成功
– 实时监控正常
– 告警通知正常
生产环境建议:在DevOps项目完成后,要进行充分的测试,确保系统的可靠性和稳定性。建立完善的监控体系,及时发现和解决问题。定期进行系统维护,保持系统稳定运行。
Part05-风哥经验总结与分享
5.1 DevOps最佳实践
DM数据库DevOps最佳实践:
- 文化先行:建立DevOps文化,促进开发和运维协作
- 自动化优先:尽可能自动化所有重复性工作
- 持续改进:持续改进流程和工具
- 版本控制:所有代码和配置都纳入版本控制
- 测试驱动:建立完善的测试体系
- 监控告警:建立完善的监控告警体系
- 文档完善:完善文档,便于知识共享
- 团队协作:加强团队协作,提高效率
- 经验积累:积累经验,提高能力
- 最佳实践:遵循最佳实践,避免常见错误
5.2 常见问题与解决方案
# 1. 自动化部署问题
– 症状:自动化部署失败
– 原因:脚本错误、环境差异、权限问题
– 解决方案:检查脚本、统一环境、配置权限
# 2. 持续集成问题
– 症状:构建失败、测试失败
– 原因:代码错误、测试用例错误、环境问题
– 解决方案:修复代码、修复测试用例、检查环境
# 3. 监控告警问题
– 症状:监控不准确、告警不及时
– 原因:监控配置错误、告警规则不合理
– 解决方案:检查监控配置、优化告警规则
# 4. 日志管理问题
– 症状:日志丢失、日志分析困难
– 原因:日志配置错误、日志格式不规范
– 解决方案:检查日志配置、规范日志格式
# 5. 团队协作问题
– 症状:协作不畅、效率低下
– 原因:沟通不足、责任不清
– 解决方案:加强沟通、明确责任
– 症状:自动化部署失败
– 原因:脚本错误、环境差异、权限问题
– 解决方案:检查脚本、统一环境、配置权限
# 2. 持续集成问题
– 症状:构建失败、测试失败
– 原因:代码错误、测试用例错误、环境问题
– 解决方案:修复代码、修复测试用例、检查环境
# 3. 监控告警问题
– 症状:监控不准确、告警不及时
– 原因:监控配置错误、告警规则不合理
– 解决方案:检查监控配置、优化告警规则
# 4. 日志管理问题
– 症状:日志丢失、日志分析困难
– 原因:日志配置错误、日志格式不规范
– 解决方案:检查日志配置、规范日志格式
# 5. 团队协作问题
– 症状:协作不畅、效率低下
– 原因:沟通不足、责任不清
– 解决方案:加强沟通、明确责任
5.3 DevOps检查清单
DM数据库DevOps检查清单:
- 版本控制检查:代码和配置是否纳入版本控制
- 自动化部署检查:自动化部署是否完成,是否可回滚
- 持续集成检查:持续集成流程是否建立,测试是否完善
- 持续部署检查:持续部署流程是否建立,部署策略是否合理
- 监控告警检查:监控指标是否完善,告警规则是否合理
- 日志管理检查:日志收集是否正常,日志分析是否完善
- 文档记录检查:文档是否完善,知识是否共享
- 团队协作检查:团队协作是否顺畅,责任分工是否明确
- 持续改进检查:改进计划是否制定,改进措施是否落实
- 最佳实践检查:是否遵循最佳实践,是否避免常见错误
持续改进:DevOps是一个持续的过程,需要根据业务需求和团队特点,不断调整和优化。建立完善的监控体系,是保障系统稳定运行的关键。定期进行系统维护,保持系统稳定运行。
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
