云原生分布式系统综合实战:微服务网关、日志监控与对象存储架构

1.用 APISIX 双网关对接 Nacos 注册的商品服务 v1/v2,实现按 header 灰度 20% 流量并全程 JWT 鉴权热更新。

第一步:安装基础依赖

安装Java 11(若未装) sudo apt install -y openjdk-11-jdk # 安装Maven(若未装) sudo apt install -y maven # 验证版本 java -version # 输出openjdk 11.x即可 mvn -v # 输出Maven 3.x即可

安装etcd

下载

复制代码
下载etcd v3.5.10

解压

复制代码
将etcd和etcdctl复制到系统bin目录

配置 etcd 为 systemd 服务(开机自启)

  1. 创建 etcd 配置目录和数据目录:

    sudo mkdir -p /var/lib/etcd /etc/etcd

  2. 创建 systemd 服务文件:

    sudo vim /etc/systemd/system/etcd.service

粘贴以下内容(配置单机 etcd):

复制代码
[Unit]
Description=etcd key-value store
Documentation=https://github.com/etcd-io/etcd
After=network.target

[Service]
User=root
Type=notify
ExecStart=/usr/local/bin/etcd \
  --name default \
  --data-dir /var/lib/etcd \
  --listen-client-urls http://0.0.0.0:2379 \
  --advertise-client-urls http://127.0.0.1:2379 \
  --allow-none-authentication=true

Restart=always
RestartSec=10s
LimitNOFILE=4096

[Install]
WantedBy=multi-user.target

安装 Nacos 单机版

创建专属目录

下载

wget https://archive.apache.org/dist/nacos/nacos-server/2.3.0/nacos-server-2.3.0.tar.gz

解压

下载好后进行启动

登录网页查看

安装 APISIX

安装 APISIX 依赖

装仓库

看看版本

安装

查看状态

实验开始

初始化

用 Admin API 创建两个 upstream,从 Nacos 拉取服务

创建 v2 upstream

验证是否发现

配置 Route(灰度流量 + JWT 鉴权

先创建 consumer

创建 route

测试实验

  • 生成 JWT(用 consumer 密钥): text

    复制代码
    curl http://127.0.0.1:9080/apisix/plugin/jwt/sign?key=user-key -i  # 返回 JWT token
  • 测试正常流量(到 v1,无灰度): text

    复制代码
    curl http://127.0.0.1:9080/product/ -H "Authorization: Bearer your-jwt-token"
    • 预期:Product v1(无 X-Canary header,全到 v1)。
  • 测试灰度流量(20% 到 v2):

    • 重复请求带 header:curl http://127.0.0.1:9080/product/ -H "Authorization: Bearer your-jwt-token" -H "X-Canary: true"
    • 统计多次请求:约 20% 返回 Product v2(随机权重)。
    • 无 JWT:返回 401 Unauthorized。
  • 监控:用 tail -f /usr/local/apisix/logs/access.log 看流量路由。

  • 热更新测试:改 JWT secret 后,新签发 token 用新 secret,旧 token 失效(热生效)。

2.把 Nginx+Tomcat 的访问/异常日志、系统与中间件指标、接口心跳全送进 ES 热-温-冷三节点集群,在 Kibana 一分钟内定位模拟 OOM 全链路证据。

实验需要四台主机

基础配置

复制代码
# 1. 更新系统
sudo apt update && sudo apt upgrade -y

# 2. 关闭swap(ES强烈要求)
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

# 3. 提高系统限制
sudo tee /etc/sysctl.d/99-elasticsearch.conf <<EOF
vm.max_map_count=262144
fs.file-max=655360
EOF
sudo sysctl -p /etc/sysctl.d/99-elasticsearch.conf

sudo tee /etc/security/limits.d/99-elasticsearch.conf <<EOF
* soft nofile 655360
* hard nofile 655360
* soft nproc 4096
* hard nproc 4096
EOF

# 4. 设置主机名(根据上面表格改)
sudo hostnamectl set-hostname app-node   # 13这台改app-node,其他类似

# 5. 配置hosts解析(所有4台都执行相同内容)
sudo tee -a /etc/hosts <<EOF
10.0.0.13   app-node
10.0.0.100  es-hot
10.0.0.101  es-warm
10.0.0.103  es-cold
EOF

# 6. 重启使主机名生效
sudo reboot

第二步:10.0.0.13(app-node)安装 Nginx + Tomcat + Beats

安装nginx并开启

下载并安装Tomcat 10

关联并赋权

配置Tomcat开启访问日志

部署一个简单Web应用

创建触发页面

配置nginx反向代理

启动tomcat

网页查看

第三步:安装Beats

添加Elastic官方源

安装Filebeat、Metricbeat、Heartbeat

Filebeat采集Nginx和Tomcat日志

Metricbeat采集系统和Tomcat指标(用Jolokia简单方式)

先在Tomcat启用Jolokia(下载jar放lib)

配置Metricbeat

Heartbeat监控接口心跳

启动所有Beats

三台ES节点安装与配置(100、101、103)

安装Elasticsearch 8.x

修改配置文件(每台不同部分见下面) sudo vim /etc/elasticsearch/elasticsearch.yml

es-hot (10.0.0.100) 配置:

复制代码
cluster.name: elk-lab-cluster
node.name: es-hot
network.host: 0.0.0.0
discovery.seed_hosts: ["es-hot", "es-warm", "es-cold"]
cluster.initial_master_nodes: ["es-hot"]
node.roles: ["master", "data_hot", "ingest"]

# Hot节点建议更多内存和更快磁盘
xpack.security.enabled: false   # 学习用先关闭安全

es-warm (10.0.0.101) 配置

复制代码
cluster.name: elk-lab-cluster
node.name: es-warm
network.host: 0.0.0.0
discovery.seed_hosts: ["es-hot", "es-warm", "es-cold"]
node.roles: ["data_warm"]
xpack.security.enabled: false

es-cold (10.0.0.103) 配置

复制代码
cluster.name: elk-lab-cluster
node.name: es-cold
network.host: 0.0.0.0
discovery.seed_hosts: ["es-hot", "es-warm", "es-cold"]
node.roles: ["data_cold"]
xpack.security.enabled: false

然后均执行:sudo systemctl enable --now elasticsearch

第五步:在es-hot安装Kibana

复制代码
sudo apt install kibana -y

sudo tee /etc/kibana/kibana.yml <<EOF
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://es-hot:9200"]
EOF

sudo systemctl enable --now kibana

第六步:配置ILM策略(热-温-冷自动迁移)

在Kibana → Stack Management → Index Lifecycle Policies → Create policy

名称:app-lifecycle

  • Hot phase:Rollover at 500MB or 1d
  • Warm phase:After 2d → move to warm nodes, set replica=1
  • Cold phase:After 7d → move to cold nodes
  • Delete phase:After 30d(可先不设)

保存后,在Kibana → Index Management → Index Templates → Create template

创建三个模板(logs、metrics、heartbeat),分别把ILM policy设为app-lifecycle

或者直接用命令(在es-hot执行):

复制代码
curl -X PUT "http://localhost:9200/_ilm/policy/app-lifecycle" -H 'Content-Type: application/json' -d'
{
  "policy": {
    "phases": {
      "hot": {
        "actions": {
          "rollover": {
            "max_size": "500mb",
            "max_primary_shard_size": "500mb",
            "max_age": "1d"
          }
        }
      },
      "warm": {
        "min_age": "2d",
        "actions": {
          "allocate": {
            "require": { "data": "warm" }
          }
        }
      },
      "cold": {
        "min_age": "7d",
        "actions": {
          "allocate": {
            "require": { "data": "cold" }
          }
        }
      }
    }
  }
}'

第七步:模拟OOM并在Kibana快速定位全链路

  1. 浏览器访问 http://10.0.0.13/oom/index.jsp → 开始疯狂分配内存
  2. 几秒到几十秒后Tomcat OOM崩溃,catalina.out出现java.lang.OutOfMemoryError
  3. Heartbeat检测到服务down

打开Kibana → Discover

创建几个查询(一分钟内完成):

  • 查询1:tags: "tomcat" AND "OutOfMemoryError" → 看到异常日志
  • 查询2:tags: "nginx" 时间范围同上 → 看到大量访问/oom的请求
  • 查询3:索引app-metrics-* → JVM heap_usage 暴涨到100%
  • 查询4:索引app-heartbeat-* → 看到up → down
  • 在Stack Management → Indices → 查看索引shard已迁移到warm/cold节点

3.双机房各 4 节点 MinIO 集群通过 MC 配置 site replication 实现 200 GB 小文件双活同步,并演示磁盘故障自愈、定时备份及 Prometheus 复制延迟告警。

机房IP 地址主机名建议角色

Site A10.0.0.20minio-a1MinIO 节点 1

Site A10.0.0.21minio-a2MinIO 节点 2

Site A10.0.0.22minio-a3MinIO 节点 3

Site A10.0.0.23minio-a4MinIO 节点 4 + Prometheus

Site B10.0.0.24minio-b1MinIO 节点 1

Site B10.0.0.25minio-b2MinIO 节点 2

Site B10.0.0.26minio-b3MinIO 节点 3

Site B10.0.0.27minio-b4MinIO 节点 4

第一步:所有 8 台主机通用准备

每台执行以下命令(作为 root 或用 sudo):

复制代码
# 1. 更新系统
apt update && apt upgrade -y

# 2. 设置主机名(根据表格改,例如 minio-a1)
hostnamectl set-hostname minio-a1

# 3. 配置 /etc/hosts 解析(所有 8 台都添加相同内容,便于域名访问)
tee -a /etc/hosts <<EOF
10.0.0.20 minio-a1
10.0.0.21 minio-a2
10.0.0.22 minio-a3
10.0.0.23 minio-a4
10.0.0.24 minio-b1
10.0.0.25 minio-b2
10.0.0.26 minio-b3
10.0.0.27 minio-b4
EOF

# 4. 安装 MinIO 二进制(最新版,替换为当前日期的 RELEASE 标签)
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
mv minio /usr/local/bin/

# 5. 安装 MC (MinIO Client)
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
mv mc /usr/local/bin/

# 6. 创建存储目录(模拟 4 驱动器,每个节点用 loopback 或实际分区)
for i in {1..4}; do mkdir -p /data${i}; done
chown -R $USER:$USER /data*

# 7. 重启生效
reboot

第二步:配置 Site A 集群(10.0.0.20-23)

每台 Site A 主机上创建 MinIO 服务文件,并启动独立 4 节点分布式集群(纠删码模式,默认 EC:4)。

复制代码
# 创建 systemd 服务文件
tee /etc/systemd/system/minio.service <<EOF
[Unit]
Description=MinIO
Documentation=https://min.io/docs/minio/linux/index.html
Wants=network-online.target
After=network-online.target

[Service]
WorkingDirectory=/usr/local/
User=root
Group=root
EnvironmentFile=-/etc/default/minio
ExecStart=/usr/local/bin/minio server \
  --address ":9000" \
  --console-address ":9001" \
  http://minio-a{1...4}/data{1...4}

StandardOutput=journal
StandardError=inherit
SyslogIdentifier=minio
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

# 创建环境变量文件(替换为你的访问密钥)
tee /etc/default/minio <<EOF
MINIO_ROOT_USER=minioadmin
MINIO_ROOT_PASSWORD=minioadmin123
MINIO_VOLUMES="http://minio-a{1...4}/data{1...4}"
EOF

# 启动服务
systemctl daemon-reload
systemctl enable --now minio

# 检查状态
systemctl status minio
mc alias set sitea http://10.0.0.20:9000 minioadmin minioadmin123
mc admin info sitea

重复在 21-23 上(VOLUMES 相同,确保所有节点看到相同配置)。访问 http://10.0.0.20:9001 登录 Console,确认集群有 4 节点。

第三步:配置 Site B 集群(10.0.0.24-27)

类似第二步,但主机名为 minio-b{1...4},别名设为 siteb。

复制代码
# 服务文件类似,改 VOLUMES 为 http://minio-b{1...4}/data{1...4}
# 环境文件类似
# 启动并检查
mc alias set siteb http://10.0.0.24:9000 minioadmin minioadmin123
mc admin info siteb

第四步:通过 MC 配置 Site Replication(双活同步)

基于 MinIO 官方文档,实现 Active-Active 站点复制。

在 Site A 创建同步桶:mc mb sitea/sync-bucket --with-versioning

配置站点复制(在任意一台执行,mc 已设 alias)

添加 Site A 和 Site B 到 MC

mc admin replicate add sitea siteb

验证状态

mc admin replicate info sitea

mc admin replicate info siteb

为特定桶启用双向桶复制(Active-Active):

复制代码
mc replicate add sitea/sync-bucket \
  --remote-bucket http://10.0.0.24:9000/sync-bucket \
  --arn arn:minio:replication::sitea:sync-bucket \
  --replicate "delete,delete-marker,existing-objects,replica-metadata-sync" \
  --priority 1

# 对 Site B 反向配置
mc replicate add siteb/sync-bucket \
  --remote-bucket http://10.0.0.20:9000/sync-bucket \
  --arn arn:minio:replication::siteb:sync-bucket \
  --replicate "delete,delete-marker,existing-objects,replica-metadata-sync" \
  --priority 1

# 验证
mc replicate ls sitea/sync-bucket

现在两个站点会双向同步 sync-bucket 中的对象。

第五步:生成 200GB 小文件并演示双活同步

在任意一台(例如 10.0.0.20)生成文件并上传。

复制代码
# 生成 200,000 个 1MB 文件(总 200GB),用脚本
mkdir /tmp/small-files
for i in {1..200000}; do dd if=/dev/urandom of=/tmp/small-files/file${i}.dat bs=1M count=1; done

# 上传到 Site A
mc cp --recursive /tmp/small-files/ sitea/sync-bucket/

# 监控同步到 Site B(用 watch)
watch mc ls siteb/sync-bucket

# 验证同步完成(比较对象数)
mc ls --recursive sitea/sync-bucket | wc -l
mc ls --recursive siteb/sync-bucket | wc -l

上传后,从 Site B 下载一个文件验证一致性。演示双活:在 Site B 修改/删除一个文件,检查 Site A 同步。

第六步:演示磁盘故障自愈

MinIO 使用纠删码 (EC) 自动自愈。

模拟磁盘故障(在 minio-a1 上停掉一个磁盘)

mv /data1 /data1.bak # 模拟故障

systemctl restart minio

检查集群状态(在 Console 或):

mc admin info sitea # 看到一个驱动器 down,集群 degraded 但可用

自愈演示

替换"坏"磁盘

mkdir /data1 # 新磁盘

chown USER:USER /data1

systemctl restart minio

监控自愈

watch mc admin heal sitea/ --recursive

自愈完成后,集群恢复 green 状态。重复上传文件验证数据完整。

第七步:定时备份

用 MC mirror + cron 定时备份 sync-bucket 到本地或另一个桶

创建备份桶

mc mb sitea/backup-bucket

配置 cron 任务

crontab -e

添加:0 0 * * * mc mirror sitea/sync-bucket sitea/backup-bucket --overwrite --remove

手动测试

mc mirror sitea/sync-bucket sitea/backup-bucket --overwrite --remove

第八步:配置 Prometheus 复制延迟告警

在 Site A 的 minio-a4 (10.0.0.23) 上安装 Prometheus,监控 replication latency。

安装 Prometheus

apt install prometheus -y

配置 MinIO 暴露指标

MINIO_PROMETHEUS_AUTH_TYPE=public

配置 Prometheus scrape

scrape_configs:

  • job_name: 'minio-sitea'

static_configs:

  • targets: ['10.0.0.20:9000', '10.0.0.21:9000', '10.0.0.22:9000', '10.0.0.23:9000']

metrics_path: /minio/v2/metrics/cluster

  • job_name: 'minio-siteb'

static_configs:

  • targets: ['10.0.0.24:9000', '10.0.0.25:9000', '10.0.0.26:9000', '10.0.0.27:9000']

metrics_path: /minio/v2/metrics/cluster

添加告警规则

groups:

  • name: minio-replication

rules:

  • alert: HighReplicationLatency

expr: minio_replication_avg_latency_ms > 500 # 延迟 > 500ms 告警

for: 5m

labels:

severity: warning

annotations:

summary: "Replication latency high on {{ $labels.instance }}"

description: "Average replication latency is {{ $value }} ms"

演示告警

手动上传大文件或模拟延迟,访问 Prometheus UI http://10.0.0.23:9090/alerts 查看告警触发。

相关推荐
汪碧康2 小时前
【k8s-1.34.2安装部署】十.gateway Api v1.4.0和istio安装
云原生·容器·kubernetes·gateway·istio·cilium·xkube
阿坤带你走近大数据2 小时前
StarRocks(SR)的基本概念、架构及基本使用介绍
starrocks·架构·olap
小小工匠2 小时前
LLM - 生产级 AI Agent 设计手册:从感知、记忆到决策执行的全链路架构解析
人工智能·架构
赋创小助手11 小时前
融合与跃迁:NVIDIA、Groq 与下一代 AI 推理架构的博弈与机遇
服务器·人工智能·深度学习·神经网络·语言模型·自然语言处理·架构
纸上的彩虹11 小时前
半年一百个页面,重构系统也重构了我对前端工作的理解
前端·程序员·架构
FrameNotWork14 小时前
HarmonyOS 与 Android 架构对比:从“写页面”到“设计系统”的差异
android·架构·harmonyos
遇见火星14 小时前
MySQL 8.0复制架构主从自动切换脚本
mysql·adb·架构·mysql8.0·mysql主从
勇气要爆发16 小时前
Minio + CDN 架构实战:从入门到避坑
架构