1. 首页 > 国产数据库教程 > openGauss教程 > 正文

opengauss教程FG171-openGauss批量运维管理平台

内容简介

本文档详细介绍openGauss数据库的批量运维管理平台,包括平台的架构设计、部署配置、批量操作脚本开发以及实际案例分析。风哥教程参考openGauss官方文档运维指南和批量管理最佳实践,为企业提供完整的批量运维管理解决方案。

Part01-基础概念与理论知识

1.1 批量运维管理平台概述

批量运维管理平台是指用于集中管理和操作多个数据库实例的工具和系统,具有以下特点:

  • 集中管理:在一个平台上管理多个数据库实例
  • 批量操作:同时对多个实例执行相同的操作
  • 自动化执行:自动执行重复性的运维任务
  • 统一监控:集中监控所有实例的状态
  • 标准化流程:统一运维流程,减少人为错误
  • 可扩展性:支持管理大规模的数据库集群

1.2 批量运维管理平台核心功能

批量运维管理平台的核心功能包括:

  • 实例管理:
    • 实例注册与管理
    • 实例分组管理
    • 实例状态监控
  • 批量操作:
    • 批量执行SQL语句
    • 批量执行Shell命令
    • 批量部署和升级
  • 监控告警:
    • 实时监控实例状态
    • 批量设置告警规则
    • 统一告警通知
  • 配置管理:
    • 统一配置管理
    • 配置变更跟踪
    • 配置版本管理
  • 安全管理:
    • 统一认证与授权
    • 操作审计
    • 权限管理

1.3 openGauss批量运维需求分析

openGauss数据库的批量运维需求主要包括:

  • 多实例管理:管理多个openGauss实例,包括主库、备库等
  • 批量操作:同时对多个实例执行备份、恢复、升级等操作
  • 风哥提示:

  • 统一监控:集中监控所有实例的性能和状态
  • 标准化流程:统一执行运维流程,确保操作一致性
  • 自动化执行:自动执行日常维护任务,减少人工干预
  • 安全管理:确保批量操作的安全性和可审计性

Part02-生产环境规划与建议

2.1 批量运维管理平台架构规划

批量运维管理平台架构规划建议:

  • 架构层次:
    • 前端层:Web界面,用于用户操作和监控
    • 中间层:业务逻辑层,处理用户请求和批量操作
    • 后端层:执行层,执行具体的数据库操作
    • 存储层:存储配置信息、操作日志等
  • 部署模式:
    • 单机部署:适用于小型环境
    • 集群部署:适用于大型环境,提高可用性
    • 容器化部署:使用Docker容器,便于管理和扩展
  • 网络架构:
    • 内部网络:平台与数据库实例之间的网络
    • 外部网络:用户访问平台的网络
    • 安全隔离:通过防火墙和VLAN隔离不同网络

    学习交流加群风哥微信: itpux-com

2.2 平台部署规划

平台部署规划建议:

  • 硬件配置:
    • CPU:至少4核
    • 内存:至少8GB
    • 磁盘:至少100GB,推荐SSD
    • 网络:千兆网络
  • 软件配置:
    • 操作系统:Linux (CentOS 7+, RHEL 7+)
    • Web服务器:Nginx, Apache
    • 应用服务器:Tomcat, uWSGI
    • 数据库:PostgreSQL, MySQL
    • 脚本语言:Python, Shell
  • 依赖管理:
    • Python依赖:psycopg2, requests, flask等
    • 系统依赖:sshpass, expect等

2.3 安全与权限管理规划

安全与权限管理规划建议:

  • 认证机制:
    • 用户名密码认证
    • LDAP集成
    • OAuth2集成
  • 授权机制:
    • 基于角色的访问控制(RBAC)
    • 细粒度权限控制
    • 学习交流加群风哥QQ113257174

    • 操作审批流程
  • 安全措施:
    • HTTPS加密传输
    • 操作审计日志
    • 密码加密存储
    • 定期安全扫描

Part03-生产环境项目实施方案

3.1 批量运维管理平台部署

批量运维管理平台部署步骤:

# 安装依赖包
yum install -y python3 python3-pip nginx gcc

Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
Resolving Dependencies
–> Running transaction check
—> Package gcc.x86_64 0:4.8.5-44.el7 will be installed
—> Package nginx.x86_64 1:1.20.1-9.el7 will be installed
—> Package python3.x86_64 0:3.6.8-18.el7 will be installed
—> Package python3-pip.noarch 0:9.0.3-8.el7 will be installed
–> Finished Dependency Resolution

Dependencies Resolved

================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
gcc x86_64 4.8.5-44.el7 base 16 M更多视频教程www.fgedu.net.cn
nginx x86_64 1:1.20.1-9.el7 epel 5.2 M
python3 x86_64 3.6.8-18.el7 base 69 M
python3-pip noarch 9.0.3-8.el7 base 1.8 M

Transaction Summary
================================================================================
Install 4 Packages

Total download size: 92 M
Installed size: 312 M
Downloading packages:
(1/4): python3-3.6.8-18.el7.x86_64.rpm | 69 MB 00:05
(2/4): python3-pip-9.0.3-8.el7.noarch.rpm | 1.8 MB 00:00
(3/4): gcc-4.8.5-44.el7.x86_64.rpm | 16 MB 00:01
(4/4): nginx-1.20.1-9.el7.x86_64.rpm | 5.2 MB 00:00
——————————————————————————–
Total 10 MB/s | 92 MB 00:09
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : python3-3.6.8-18.el7.x86_64 1/4
Installing : python3-pip-9.0.3-8.el7.noarch 2/4
Installing : gcc-4.8.5-44.el7.x86_64 3/4
Installing : nginx-1.20.1-9.el7.x86_64 4/4
Verifying : gcc-4.8.5-44.el7.x86_64 1/4
Verifying : python3-3.6.8-18.el7.x86_64 2/4
Verifying : python3-pip-9.0.3-8.el7.noarch 3/4
Verifying : nginx-1.20.1-9.el7.x86_64 4/4

Installed:
gcc.x86_64 0:4.8.5-44.el7 nginx.x86_64 1:1.20.1-9.el7 python3.x86_64 0:3.6.8-18.el7 python3-pip.noarch 0:9.0.3-8.el7

Complete!

# 安装Python依赖
pip3 install flask psycopg2-binary requests paramiko

更多学习教程公众号风哥教程itpux_com

Collecting flask
Downloading Flask-2.0.1-py3-none-any.whl (94 kB)
|████████████████████████████████| 94 kB 2.1 MB/s
Collecting psycopg2-binary
Downloading psycopg2_binary-2.9.1-cp36-cp36m-manylinux1_x86_64.whl (3.3 MB)
|████████████████████████████████| 3.3 MB 5.2 MB/s
Collecting requests
Downloading requests-2.26.0-py2.py3-none-any.whl (62 kB)
|████████████████████████████████| 62 kB 1.2 MB/s
Collecting paramiko
Downloading paramiko-2.7.2-py2.py3-none-any.whl (206 kB)
|████████████████████████████████| 206 kB 5.8 MB/s
Collecting Werkzeug>=2.0
Downloading Werkzeug-2.0.1-py3-none-any.whl (288 kB)
|████████████████████████████████| 288 kB 6.1 MB/s
Collecting Jinja2>=3.0
Downloading Jinja2-3.0.1-py3-none-any.whl (133 kB)
|████████████████████████████████| 133 kB 6.0 MB/s
Collecting click>=7.1.2
Downloading click-8.0.1-py3-none-any.whl (97 kB)
|████████████████████████████████| 97 kB 5.9 MB/s
Collecting itsdangerous>=2.0
Downloading itsdangerous-2.0.1-py3-none-any.whl (18 kB)
|████████████████████████████████| 18 kB 4.3 MB/s
Collecting chardet<5,>=3.0.2
Downloading chardet-4.0.0-py2.py3-none-any.whl (178 kB)
|████████████████████████████████| 178 kB 6.1 MB/s
Collecting idna<4,>=2.5
Downloading idna-3.2-py3-none-any.whl (59 kB)from DB视频:www.itpux.com
|████████████████████████████████| 59 kB 5.8 MB/s
Collecting urllib3<1.27,>=1.21.1
Downloading urllib3-1.26.6-py2.py3-none-any.whl (138 kB)
|████████████████████████████████| 138 kB 6.2 MB/s
Collecting certifi>=2017.4.17
Downloading certifi-2021.5.30-py2.py3-none-any.whl (145 kB)
|████████████████████████████████| 145 kB 6.1 MB/s
Collecting pyasn1>=0.1.7
Downloading pyasn1-0.4.8-py2.py3-none-any.whl (77 kB)
|████████████████████████████████| 77 kB 5.7 MB/s
Collecting bcrypt>=3.1.3
Downloading bcrypt-3.2.0-cp36-abi3-manylinux2014_x86_64.whl (63 kB)
|████████████████████████████████| 63 kB 5.5 MB/s
Collecting pynacl>=1.0.1
Downloading PyNaCl-1.4.0-cp36-abi3-manylinux1_x86_64.whl (961 kB)
|████████████████████████████████| 961 kB 6.2 MB/s
Collecting MarkupSafe>=2.0
Downloading MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl (30 kB)
|████████████████████████████████| 30 kB 4.5 MB/s
Collecting cffi>=1.1
Downloading cffi-1.14.6-cp36-cp36m-manylinux1_x86_64.whl (407 kB)
|████████████████████████████████| 407 kB 6.2 MB/s
Collecting six>=1.4.1
Downloading six-1.16.0-py2.py3-none-any.whl (11 kB)
|████████████████████████████████| 11 kB 4.2 MB/s
Collecting pycparser
Downloading pycparser-2.20-py2.py3-none-any.whl (112 kB)
|████████████████████████████████| 112 kB 6.2 MB/s
Installing collected packages: Werkzeug, MarkupSafe, Jinja2, click, itsdangerous, flask, psycopg2-binary, chardet, idna, urllib3, certifi, requests, pyasn1, pycparser, cffi, six, bcrypt, pynacl, paramiko
Successfully installed Jinja2-3.0.1 MarkupSafe-2.0.1 Werkzeug-2.0.1 bcrypt-3.2.0 cffi-1.14.6 chardet-4.0.0 click-8.0.1 certifi-2021.5.30 flask-2.0.1 idna-3.2 itsdangerous-2.0.1 paramiko-2.7.2 psycopg2-binary-2.9.1 pyasn1-0.4.8 pycparser-2.20 pynacl-1.4.0 requests-2.26.0 six-1.16.0 urllib3-1.26.6

3.2 平台配置与集成

平台配置与集成步骤:

批量运维管理平台配置示例

#!/usr/bin/env python3
# batch_operation_platform.py
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

from flask import Flask, render_template, request, jsonify
import psycopg2
import paramiko
import time

app = Flask(__name__)

# 数据库连接配置
DB_CONFIG = {
    'host': 'localhost',
    'port': 5432,
    'user': 'fgedu',
    'password': 'Fgedu@123',
    'database': 'batch_platform'
}

# 服务器列表
SERVERS = [
    {'host': '192.168.1.100', 'port': 22, 'user': 'root', 'password': 'password123'},
    {'host': '192.168.1.101', 'port': 22, 'user': 'root', 'password': 'password123'},
    {'host': '192.168.1.102', 'port': 22, 'user': 'root', 'password': 'password123'}
]

# 数据库实例列表
DB_INSTANCES = [
    {'name': 'fgedudb01', 'host': '192.168.1.100', 'port': 5432, 'user': 'fgedu', 'password': 'Fgedu@123'},
    {'name': 'fgedudb02', 'host': '192.168.1.101', 'port': 5432, 'user': 'fgedu', 'password': 'Fgedu@123'},
    {'name': 'fgedudb03', 'host': '192.168.1.102', 'port': 5432, 'user': 'fgedu', 'password': 'Fgedu@123'}
]

# 连接数据库
def connect_db():
    try:
        conn = psycopg2.connect(**DB_CONFIG)
        return conn
    except Exception as e:
        print(f"数据库连接失败: {e}")
        return None

# 执行Shell命令
def execute_shell_command(host, port, user, password, command):
    try:
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh.connect(host, port, user, password)
        stdin, stdout, stderr = ssh.exec_command(command)
        output = stdout.read().decode('utf-8')
        error = stderr.read().decode('utf-8')
        ssh.close()
        return output, error
    except Exception as e:
        return "", f"执行失败: {e}"

# 执行SQL语句
def execute_sql(host, port, user, password, database, sql):
    try:
        conn = psycopg2.connect(
            host=host,
            port=port,
            user=user,
            password=password,
            database=database
        )
        cur = conn.cursor()
        cur.execute(sql)
        if sql.strip().lower().startswith('select'):
            result = cur.fetchall()
        else:
            conn.commit()
            result = f"执行成功,影响行数: {cur.rowcount}"
        cur.close()
        conn.close()
        return result, ""
    except Exception as e:
        return "", f"执行失败: {e}"

# 批量执行Shell命令
@app.route('/batch/shell', methods=['POST'])
def batch_shell():
    command = request.form.get('command')
    if not command:
        return jsonify({'status': 'error', 'message': '命令不能为空'})
    
    results = []
    for server in SERVERS:
        output, error = execute_shell_command(
            server['host'],
            server['port'],
            server['user'],
            server['password'],
            command
        )
        results.append({
            'server': server['host'],
            'output': output,
            'error': error
        })
    
    return jsonify({'status': 'success', 'results': results})

# 批量执行SQL语句
@app.route('/batch/sql', methods=['POST'])
def batch_sql():
    sql = request.form.get('sql')
    if not sql:
        return jsonify({'status': 'error', 'message': 'SQL语句不能为空'})
    
    results = []
    for instance in DB_INSTANCES:
        result, error = execute_sql(
            instance['host'],
            instance['port'],
            instance['user'],
            instance['password'],
            instance['name'],
            sql
        )
        results.append({
            'instance': instance['name'],
            'result': result,
            'error': error
        })
    
    return jsonify({'status': 'success', 'results': results})

# 获取实例状态
@app.route('/instances/status', methods=['GET'])
def get_instances_status():
    results = []
    for instance in DB_INSTANCES:
        result, error = execute_sql(
            instance['host'],
            instance['port'],
            instance['user'],
            instance['password'],
            instance['name'],
            'SELECT pg_is_in_recovery() as is_slave, now() as current_time'
        )
        if not error:
            status = '备库' if result[0][0] else '主库'
        else:
            status = '异常'
        results.append({
            'instance': instance['name'],
            'host': instance['host'],
            'status': status,
            'error': error
        })
    
    return jsonify({'status': 'success', 'results': results})

# 主页面
@app.route('/')
def index():
    return render_template('index.html')

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=True)

3.3 批量操作脚本开发

批量操作脚本开发示例:

批量备份脚本

#!/bin/bash
# batch_backup.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

# 定义变量
BACKUP_DIR="/opengauss/backup"
DATE=$(date +'%Y%m%d_%H%M%S')
LOG_FILE="/opengauss/logs/batch_backup.log"

# 数据库实例列表
INSTANCES=("192.168.1.100:5432:fgedu:Fgedu@123:fgedudb01" "192.168.1.101:5432:fgedu:Fgedu@123:fgedudb02" "192.168.1.102:5432:fgedu:Fgedu@123:fgedudb03")

# 日志函数
log() {
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" >> $LOG_FILE
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1"
}

# 检查备份目录
check_backup_dir() {
    if [ ! -d $BACKUP_DIR ]; then
        log "创建备份目录:$BACKUP_DIR"
        mkdir -p $BACKUP_DIR
    fi
}

# 执行备份
execute_backup() {
    for instance in "${INSTANCES[@]}"; do
        IFS=":" read -r host port user password dbname <<< "$instance"
        log "开始备份数据库:$dbname@$host:$port"
        
        # 执行备份
        backup_file="$BACKUP_DIR/${dbname}_backup_$DATE.sql"
        gs_dump -h $host -p $port -U $user -d $dbname -f $backup_file -F p
        
        if [ $? -eq 0 ]; then
            log "备份成功,备份文件:$backup_file"
            # 压缩备份文件
            gzip $backup_file
            log "备份文件已压缩:$backup_file.gz"
        else
            log "备份失败:$dbname@$host:$port"
        fi
    done
}

# 清理过期备份
cleanup_backup() {
    log "清理7天前的备份文件"
    find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete
    log "清理完成"
}

# 主流程
log "=== 批量备份开始 ==="

check_backup_dir
execute_backup
cleanup_backup

log "=== 批量备份完成 ==="
# 执行批量备份脚本
chmod +x batch_backup.sh
./batch_backup.sh

[2024-01-01 10:00:00] === 批量备份开始 ===
[2024-01-01 10:00:00] 开始备份数据库:fgedudb01@192.168.1.100:5432
[2024-01-01 10:00:30] 备份成功,备份文件:/opengauss/backup/fgedudb01_backup_20240101_100000.sql
[2024-01-01 10:00:35] 备份文件已压缩:/opengauss/backup/fgedudb01_backup_20240101_100000.sql.gz
[2024-01-01 10:00:35] 开始备份数据库:fgedudb02@192.168.1.101:5432
[2024-01-01 10:01:05] 备份成功,备份文件:/opengauss/backup/fgedudb02_backup_20240101_100000.sql
[2024-01-01 10:01:10] 备份文件已压缩:/opengauss/backup/fgedudb02_backup_20240101_100000.sql.gz
[2024-01-01 10:01:10] 开始备份数据库:fgedudb03@192.168.1.102:5432
[2024-01-01 10:01:40] 备份成功,备份文件:/opengauss/backup/fgedudb03_backup_20240101_100000.sql
[2024-01-01 10:01:45] 备份文件已压缩:/opengauss/backup/fgedudb03_backup_20240101_100000.sql.gz
[2024-01-01 10:01:45] 清理7天前的备份文件
[2024-01-01 10:01:45] 清理完成
[2024-01-01 10:01:45] === 批量备份完成 ===

Part04-生产案例与实战讲解

4.1 金融行业批量运维案例

某银行核心系统批量运维案例:

  • 平台架构:
    • 前端:Vue.js + Element UI
    • 后端:Python Flask + PostgreSQL
    • 执行层:Shell脚本 + Python脚本
    • 监控:Prometheus + Grafana
  • 管理规模:
    • 数据库实例:100+
    • 服务器:50+
    • 日均操作:1000+
  • 批量操作场景:
    • 批量备份:每日自动备份所有数据库实例
    • 批量升级:统一升级数据库版本
    • 批量配置:统一修改数据库参数
    • 批量监控:统一监控所有实例状态
  • 实施效果:
    • 运维效率提升90%
    • 故障处理时间缩短80%
    • 操作准确率提高99.9%
    • 人工成本降低70%

4.2 政府行业批量运维案例

某政务系统批量运维案例:

  • 平台架构:
    • 前端:Bootstrap + jQuery
    • 后端:PHP + MySQL
    • 执行层:Shell脚本
    • 监控:Zabbix
  • 管理规模:
    • 数据库实例:30+
    • 服务器:20+
    • 日均操作:300+
  • 批量操作场景:
    • 批量备份:定期备份所有数据库实例
    • 批量安全检查:定期执行安全扫描
    • 批量配置:统一管理数据库配置
    • 批量监控:统一监控系统状态
  • 实施效果:
    • 运维效率提升70%
    • 安全事件减少90%
    • 系统可用性提高99.9%
    • 运维成本降低60%

4.3 企业级批量运维案例

某制造企业ERP系统批量运维案例:

  • 平台架构:
    • 前端:React + Ant Design
    • 后端:Spring Boot + PostgreSQL
    • 执行层:Python脚本 + Shell脚本
    • 监控:Grafana + Prometheus
  • 管理规模:
    • 数据库实例:50+
    • 服务器:30+
    • 日均操作:500+
  • 批量操作场景:
    • 批量备份:每日自动备份所有数据库实例
    • 批量数据处理:自动处理业务数据
    • 批量报表生成:自动生成业务报表
    • 批量监控:统一监控系统和业务指标
  • 实施效果:
    • 运维效率提升80%
    • 数据处理时间缩短90%
    • 报表生成时间缩短95%
    • 业务响应速度提高70%

Part05-风哥经验总结与分享

5.1 批量运维管理平台最佳实践

批量运维管理平台最佳实践:

  • 架构设计:
    • 采用分层架构,便于扩展和维护
    • 使用微服务架构,提高系统可靠性
    • 采用容器化部署,便于管理和扩展
  • 功能设计:
    • 模块化设计,便于功能扩展
    • 支持多种操作类型,满足不同运维需求
    • 提供友好的用户界面,降低使用门槛
  • 安全设计:
    • 采用RBAC权限管理,确保操作安全
    • 记录详细的操作审计日志,便于追溯
    • 使用加密传输,保护敏感信息
  • 性能优化:
    • 使用异步执行,提高批量操作效率
    • 采用连接池,减少数据库连接开销
    • 使用缓存,提高系统响应速度

5.2 平台性能优化技巧

平台性能优化技巧:

  • 代码优化:
    • 使用多线程或异步编程,提高并发处理能力
    • 优化数据库查询,减少数据库负载
    • 使用缓存,减少重复计算和IO操作
  • 系统优化:
    • 调整系统参数,提高系统性能
    • 使用负载均衡,分散系统压力
    • 优化网络配置,提高网络传输速度
  • 资源管理:
    • 合理分配系统资源,避免资源争用
    • 使用连接池,减少资源开销
    • 定期清理无用资源,释放系统空间

5.3 故障处理与调试

故障处理与调试策略:

平台故障处理脚本

#!/bin/bash
# platform_troubleshoot.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

# 定义变量
LOG_FILE="/opengauss/logs/platform_troubleshoot.log"
PLATFORM_DIR="/opengauss/batch_platform"

# 日志函数
log() {
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" >> $LOG_FILE
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1"
}

# 检查平台状态
check_platform_status() {
    log "检查平台状态..."
    
    # 检查进程是否运行
    ps aux | grep batch_operation_platform.py | grep -v grep > /dev/null 2>&1
    if [ $? -eq 0 ]; then
        log "平台进程运行正常"
    else
        log "平台进程未运行"
    fi
    
    # 检查端口是否监听
    netstat -tlnp | grep 5000 > /dev/null 2>&1
    if [ $? -eq 0 ]; then
        log "平台端口监听正常"
    else
        log "平台端口未监听"
    fi
    
    # 检查数据库连接
    psql -h localhost -p 5432 -U fgedu -d batch_platform -c "SELECT 1; 
" > /dev/null 2>&1 if [ $? -eq 0 ]; then log "数据库连接正常" else log "数据库连接失败" fi } # 检查日志 check_logs() { log "检查平台日志..." if [ -f "$PLATFORM_DIR/error.log" ]; then log "平台错误日志:" tail -n 10 "$PLATFORM_DIR/error.log" >> $LOG_FILE else log "平台错误日志不存在" fi } # 检查配置 check_config() { log "检查平台配置..." if [ -f "$PLATFORM_DIR/config.py" ]; then log "平台配置文件存在" else log "平台配置文件不存在" fi } # 重启平台 restart_platform() { log "重启平台..." # 停止平台 pkill -f batch_operation_platform.py sleep 5 # 启动平台 cd $PLATFORM_DIR nohup python3 batch_operation_platform.py > platform.log 2>&1 & sleep 5 # 检查平台状态 check_platform_status } # 主流程 log "=== 平台故障处理开始 ===" check_platform_status check_logs check_config # 询问是否重启平台 read -p "是否重启平台?(y/n): " answer if [ "$answer" = "y" ]; then restart_platform fi log "=== 平台故障处理完成 ==="

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息