温馨提示×

CentOS Java自动化运维怎么做

小樊
50
2025-11-23 18:30:12
栏目: 编程语言

CentOS Java自动化运维落地方案

一 基础环境与标准化部署

  • 安装与配置 Java
    • 使用包管理器安装 OpenJDK(示例为 Java 8),并配置全局环境变量,便于统一调用与后续脚本复用。
    • 示例脚本要点:yum 安装 java-1.8.0-openjdk 与 devel 包,写入 /etc/profile 的 JAVA_HOME/PATH/CLASSPATH,执行 source 生效,java -version 验证。
  • 标准化目录与启停脚本
    • 建议目录结构:/opt/apps/{app}/bin、/opt/apps/{app}/conf、/opt/apps/{app}/logs、/opt/apps/{app}/run(PID)。
    • 提供统一的 Shell 启停脚本(支持 start/stop/restart/status),内置 PID 管理、日志重定向、启动前环境校验,减少手工误操作。
  • 以 systemd 托管服务(推荐)
    • 创建 /etc/systemd/system/{app}.service,Type=simple,ExecStart 指向你的启动脚本或 java 命令,设置 Restart=on-failure,WantedBy=multi-user.target;执行 systemctl daemon-reload、enable、start、status 完成托管与自启。

二 持续交付与批量编排

  • 使用 Ansible 做标准化与批量执行
    • 将“安装 JDK → 分发包 → 渲染配置 → 替换 JVM 参数 → 启动/重启服务”编排为可复用 Role;利用 systemd 的 service 模块进行启停,避免不同发行版命令差异(如 systemctl/service)。
    • 通过变量管理多环境差异(如 Xmx/Xms、端口、日志路径、环境变量),实现一套剧本多环境复用。
  • 与 CI/CD 集成
    • 在 Jenkins/GitLab CI 中编译打包(如 mvn package),产出产物(如 app.jarconfig),通过 Ansible 推送到目标主机并滚动重启,实现从代码提交到上线的自动化闭环。

三 运行监控与告警

  • JVM 与应用指标
    • 命令行工具:使用 jps/jstat/jstack/jmap/jinfo 做现场诊断(GC、线程、内存、类加载、生成堆转储等),适合应急排查。
    • 指标与可视化:通过 JMX Exporter → Prometheus → Grafana 暴露 JVM 指标(如堆内存、GC 次数/时间、线程数),结合 Micrometer/Prometheus 在 Spring Boot 应用中埋点,形成可观测性面板与阈值告警。
    • APM 与分布式追踪:引入 SkyWalking/New Relic/AppDynamics 做调用链、慢事务与错误分析,补足 JVM 之外的业务级观测。
  • 进程存活与自愈
    • 守护脚本:定时检测 JAR 进程是否存在,异常则自动拉起,并写入日志;可扩展企业微信/钉钉 Webhook 进行告警通知,缩短恢复时间。
    • 定时任务:使用 crontab 执行健康检查脚本(如每分钟一次),或在 systemd 服务中配置 Restart 策略实现“故障即重启”。

四 日志与备份清理

  • 日志轮转
    • 使用 logrotate 按天/按大小切割应用日志与 GC 日志,保留策略(如近 7/30 天),压缩归档,避免磁盘被撑满导致服务异常。
  • 定时备份与清理
    • 数据库与配置:通过 crontab 调度 mysqldump 全量/增量备份,保留 N 天并清理过期文件;同时对应用日志、临时目录执行周期清理,确保磁盘健康。

五 一键落地清单与最小示例

  • 快速清单
    • 安装 JDK 并配置 JAVA_HOME → 放置应用包与配置 → 编写启停脚本 → 配置 systemd 托管与自启 → 接入监控(JMX Exporter/Prometheus/Grafana)→ 配置日志轮转 → 接入备份/清理定时任务 → 用 Ansible 批量推送与滚动发布。
  • 最小示例
    • systemd 服务文件(/etc/systemd/system/demo.service)
      [Unit]
      Description=Demo Java App
      After=network.target
      
      [Service]
      Type=simple
      User=app
      WorkingDirectory=/opt/apps/demo
      ExecStart=/usr/bin/java -Xms256m -Xmx512m -jar /opt/apps/demo/app.jar
      Restart=on-failure
      StandardOutput=journal
      StandardError=journal
      
      [Install]
      WantedBy=multi-user.target
      
      常用命令:
      • systemctl daemon-reload
      • systemctl enable --now demo
      • systemctl status demo
      • journalctl -u demo -f
    • 健康检查与自愈脚本(示例)
      #!/usr/bin/env bash
      APP_DIR=/opt/apps/demo
      JAR_NAME=app.jar
      LOG_FILE=$APP_DIR/logs/health.log
      PID_FILE=$APP_DIR/run/app.pid
      
      check() {
        pgrep -f "$JAR_NAME" >/dev/null 2>&1
      }
      
      start() {
        if check; then
          echo "$(date) $JAR_NAME is running." >> "$LOG_FILE"
        else
          cd "$APP_DIR" || exit 1
          nohup /usr/bin/java -Xms256m -Xmx512m -jar "$JAR_NAME" >> logs/stdout.log 2>&1 &
          echo $! > "$PID_FILE"
          echo "$(date) $JAR_NAME started, PID=$!" >> "$LOG_FILE"
        fi
      }
      
      stop() {
        if [ -f "$PID_FILE" ]; then
          pid=$(cat "$PID_FILE")
          kill "$pid" && rm -f "$PID_FILE"
          echo "$(date) $JAR_NAME stopped, PID=$pid" >> "$LOG_FILE"
        fi
      }
      
      case "$1" in
        start) start ;;
        stop)  stop  ;;
        restart) stop; start ;;
        *) echo "Usage: $0 {start|stop|restart}" ;;
      esac
      
      定时自愈(crontab,每分钟检查一次):
      */1 * * * * /opt/apps/demo/health.sh restart >> /opt/apps/demo/logs/health-cron.log 2>&1
      
      告警扩展:在 restart 分支中调用企业微信 Webhook 发送文本告警,便于及时响应。

0