534 lines
14 KiB
Markdown
534 lines
14 KiB
Markdown
# Debian 12 高可用集群部署手册
|
||
|
||
## 一、环境准备
|
||
|
||
### 1.1 虚拟机配置要求
|
||
|
||
| 节点 | IP地址 | CPU | 内存 | 磁盘 | 操作系统 |
|
||
|------|--------|-----|------|------|----------|
|
||
| Node-01 | 192.168.1.101 | 4核 | 8GB | 100GB | Debian 12 (Bookworm) |
|
||
| Node-02 | 192.168.1.102 | 4核 | 8GB | 100GB | Debian 12 (Bookworm) |
|
||
| Node-03 | 192.168.1.103 | 4核 | 8GB | 100GB | Debian 12 (Bookworm) |
|
||
|
||
### 1.2 Debian 12 安装建议
|
||
|
||
下载地址: https://www.debian.org/distrib/
|
||
|
||
推荐使用 **Debian 12 Netinst** 最小化安装:
|
||
- 选择 "无图形界面" 安装
|
||
- 仅安装 SSH server 和标准系统工具
|
||
- 使用 LVM 分区,便于扩展
|
||
|
||
### 1.3 系统初始化
|
||
|
||
在每台虚拟机上执行以下操作:
|
||
|
||
```bash
|
||
# 切换到 root 用户
|
||
su -
|
||
|
||
# 上传 init-debian12.sh 脚本并执行
|
||
chmod +x init-debian12.sh
|
||
./init-debian12.sh
|
||
|
||
# 使环境变量生效
|
||
source /etc/profile
|
||
|
||
# 验证安装
|
||
java -version
|
||
mvn -version
|
||
docker --version
|
||
docker compose version
|
||
```
|
||
|
||
### 1.4 网络配置
|
||
|
||
#### 配置静态 IP
|
||
|
||
```bash
|
||
# 编辑网络配置
|
||
vim /etc/network/interfaces
|
||
|
||
# 添加以下内容 (根据实际网络调整)
|
||
#(VMware虚拟机版)
|
||
# Node-01
|
||
# The primary network interface
|
||
auto ens33
|
||
iface ens33 inet static
|
||
address 192.168.1.101
|
||
netmask 255.255.255.0
|
||
gateway 192.168.1.2
|
||
dns-nameservers 8.8.8.8 114.114.114.114
|
||
|
||
# 重启网络
|
||
systemctl restart networking
|
||
reboot
|
||
```
|
||
|
||
#### 配置主机名
|
||
|
||
```bash
|
||
# Node-01
|
||
hostnamectl set-hostname node-01
|
||
echo "192.168.1.101 node-01" >> /etc/hosts
|
||
echo "192.168.1.102 node-02" >> /etc/hosts
|
||
echo "192.168.1.103 node-03" >> /etc/hosts
|
||
|
||
# Node-02
|
||
hostnamectl set-hostname node-02
|
||
# 添加 hosts...
|
||
|
||
# Node-03
|
||
hostnamectl set-hostname node-03
|
||
# 添加 hosts...
|
||
```
|
||
|
||
#### 配置 SSH 免密登录
|
||
|
||
```bash
|
||
# 在 Node-01 生成密钥
|
||
ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
|
||
|
||
# 分发公钥到其他节点
|
||
ssh-copy-id root@192.168.1.102
|
||
ssh-copy-id root@192.168.1.103
|
||
|
||
# 测试连接
|
||
ssh node-02 "hostname"
|
||
ssh node-03 "hostname"
|
||
```
|
||
|
||
---
|
||
|
||
## 二、部署步骤
|
||
|
||
### 2.1 克隆项目
|
||
|
||
### 建议配好github账号
|
||
|
||
```bash
|
||
# 在所有节点执行
|
||
cd /opt
|
||
git clone <项目地址> HA-OVP
|
||
cd HA-OVP
|
||
```
|
||
|
||
### 2.2 构建项目
|
||
|
||
```bash
|
||
# 在 Node-01 执行 (只需执行一次)
|
||
|
||
# 构建所有模块
|
||
mvn clean install -Dmaven.test.skip=true
|
||
|
||
# 构建 Sentinel 镜像
|
||
cd sentinel-dashboard
|
||
docker build -t sentinel-dashboard:1.8.6 .
|
||
cd ..
|
||
|
||
# 验证构建产物
|
||
ls -la video-*/target/*.jar
|
||
```
|
||
|
||
### 2.3 同步构建产物
|
||
|
||
```bash
|
||
apt install rsync -y #三个节点都需要安装
|
||
# 从 Node-01 同步到其他节点
|
||
rsync -avz --progress /opt/HA-OVP/ root@192.168.1.102:/opt/HA-OVP/
|
||
rsync -avz --progress /opt/HA-OVP/ root@192.168.1.103:/opt/HA-OVP/
|
||
```
|
||
|
||
### 2.4 启动服务
|
||
|
||
#### Node-01 启动 (主节点)
|
||
|
||
```bash
|
||
cd /opt/HA-OVP
|
||
|
||
# 启动所有服务
|
||
docker compose -f docker-compose-node-01.yml --env-file config/.env.node-01 up -d
|
||
|
||
# 查看日志
|
||
docker compose -f docker-compose-node-01.yml logs -f
|
||
```
|
||
|
||
#### Node-02 启动 (从节点)
|
||
|
||
```bash
|
||
cd /opt/HA-OVP
|
||
|
||
# 等待 Node-01 完全启动后 (约3分钟)
|
||
docker compose -f docker-compose-node-02.yml --env-file config/.env.node-02 up -d
|
||
|
||
# 查看日志
|
||
docker compose -f docker-compose-node-02.yml logs -f
|
||
```
|
||
|
||
#### Node-03 启动 (备份节点)
|
||
|
||
```bash
|
||
cd /opt/HA-OVP
|
||
|
||
# 启动基础设施
|
||
docker compose -f docker-compose-node-03.yml --env-file config/.env.node-03 up -d
|
||
```
|
||
|
||
### 2.5 初始化数据库
|
||
|
||
```bash
|
||
# 在 Node-01 执行,等待MySQL完全启动后
|
||
|
||
# 创建 Nacos 数据库并导入表结构
|
||
docker exec -i mysql mysql -uroot -proot123456 << 'EOF'
|
||
CREATE DATABASE IF NOT EXISTS nacos_config CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||
EOF
|
||
|
||
docker exec -i mysql mysql -uroot -proot123456 nacos_config < config/nacos-mysql.sql
|
||
|
||
# 导入业务数据库
|
||
docker exec -i mysql mysql -uroot -proot123456 < sql/init.sql
|
||
```
|
||
|
||
### 2.6 配置 MySQL 主从复制
|
||
|
||
```bash
|
||
# 在 Node-01 (主节点) 创建复制用户
|
||
docker exec mysql mysql -uroot -proot123456 << 'EOF'
|
||
CREATE USER IF NOT EXISTS 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'repl_password_2024';
|
||
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
|
||
FLUSH PRIVILEGES;
|
||
SHOW MASTER STATUS;
|
||
EOF
|
||
|
||
# 在 Node-02 和 Node-03 (从节点) 分别配置主从
|
||
docker exec mysql mysql -uroot -proot123456 << 'EOF'
|
||
CHANGE MASTER TO
|
||
MASTER_HOST='192.168.1.101',
|
||
MASTER_USER='repl',
|
||
MASTER_PASSWORD='repl_password_2024',
|
||
MASTER_AUTO_POSITION=1;
|
||
START SLAVE;
|
||
SHOW SLAVE STATUS\G
|
||
EOF
|
||
|
||
# 确认 Slave_IO_Running 和 Slave_SQL_Running 都为 Yes
|
||
```
|
||
|
||
### 2.7 配置 Redis 主从复制
|
||
|
||
```bash
|
||
# 在 Node-02 和 Node-03 执行
|
||
docker exec redis redis-cli -a redis_HA_Cluster_2024 REPLICAOF 192.168.1.101 6379
|
||
|
||
# 验证主从状态
|
||
docker exec redis redis-cli -a redis_HA_Cluster_2024 INFO replication
|
||
```
|
||
|
||
### 2.8 配置 Nacos
|
||
|
||
访问 http://192.168.1.101:8848/nacos (账号: nacos/nacos)
|
||
|
||
1. 创建命名空间: `public`
|
||
2. 添加各服务的配置文件 (参考 `config/nacos-config/` 目录)
|
||
|
||
### 2.9 初始化 MinIO
|
||
|
||
```bash
|
||
# 安装 mc 客户端
|
||
wget https://dl.min.io/client/mc/release/linux-amd64/mc
|
||
chmod +x mc
|
||
mv mc /usr/local/bin/
|
||
|
||
# 配置别名 (注意端口是 9100)
|
||
mc alias set myminio http://192.168.1.101:9100 minioadmin minioadmin123
|
||
|
||
# 创建存储桶
|
||
mc mb myminio/video-platform --ignore-existing
|
||
|
||
# 设置公开访问策略
|
||
mc anonymous set download myminio/video-platform
|
||
|
||
# 验证
|
||
mc ls myminio
|
||
```
|
||
|
||
---
|
||
|
||
## 三、端口分配汇总
|
||
|
||
### 3.1 各节点端口分配
|
||
|
||
| 服务 | Node-01 | Node-02 | Node-03 | 说明 |
|
||
|------|---------|---------|---------|------|
|
||
| **MySQL** | 3306 | 3306 | 3306 | 数据库主从 |
|
||
| **Redis** | 6379 | 6379 | 6379 | 缓存主从 |
|
||
| **Redis Sentinel** | 26379 | 26379 | 26379 | 哨兵监控 |
|
||
| **Nacos** | 8848 | 8848 | 8848 | 配置中心集群 |
|
||
| **RocketMQ NameServer** | 9876 | 9876 | 9876 | NameServer集群 |
|
||
| **RocketMQ Broker** | - | 10911 | 10911 | Broker双主 |
|
||
| **MinIO API** | 9100 | 9100 | 9000 | 对象存储API |
|
||
| **MinIO Console** | 9101 | 9101 | 9001 | 对象存储控制台 |
|
||
| **Sentinel Dashboard** | 8880 | 8880 | 8880 | 熔断控制台 |
|
||
| **video-gateway** | 9000 | 9000 | - | API网关 |
|
||
| **video-auth** | 9001 | 9001 | - | 认证服务 |
|
||
| **video-user** | 9002 | 9002 | - | 用户服务 |
|
||
| **video-content** | 9003 | 9003 | - | 内容服务 |
|
||
| **video-comment** | 9004 | 9004 | - | 评论服务 |
|
||
| **video-recommend** | 9005 | 9005 | - | 推荐服务 |
|
||
| **video-admin** | 9006 | 9006 | - | 管理后台 |
|
||
| **Nginx** | 80 | - | - | 负载均衡 |
|
||
|
||
### 3.2 端口说明
|
||
|
||
- **MinIO 端口调整**: Node-01 和 Node-02 的 MinIO 端口改为 9100(API) 和 9101(Console),避免与微服务端口冲突
|
||
- **Node-03**: 仅部署基础设施,不部署微服务,作为热备份节点
|
||
|
||
---
|
||
|
||
## 四、验证部署
|
||
|
||
### 4.1 检查服务状态
|
||
|
||
```bash
|
||
# 检查 Docker 容器状态
|
||
docker ps
|
||
|
||
# 检查 Nacos 服务注册
|
||
curl http://192.168.1.101:8848/nacos/v1/ns/service/list
|
||
|
||
# 检查 MySQL 主从
|
||
docker exec mysql mysql -uroot -proot123456 -e "SHOW SLAVE STATUS\G" | grep Running
|
||
|
||
# 检查 Redis 主从
|
||
docker exec redis redis-cli -a redis_HA_Cluster_2024 INFO replication | grep role
|
||
|
||
# 检查 Sentinel 状态
|
||
docker exec redis-sentinel redis-cli -p 26379 SENTINEL master mymaster
|
||
```
|
||
|
||
### 4.2 访问控制台
|
||
|
||
| 服务 | 地址 | 账号密码 |
|
||
|------|------|---------|
|
||
| Nacos | http://192.168.1.101:8848/nacos | nacos/nacos |
|
||
| Sentinel | http://192.168.1.101:8880 | sentinel/sentinel |
|
||
| MinIO Console | http://192.168.1.101:9101 | minioadmin/minioadmin123 |
|
||
| API Gateway | http://192.168.1.101:9000 | - |
|
||
|
||
### 4.3 API 测试
|
||
|
||
```bash
|
||
# 获取验证码
|
||
curl http://192.168.1.101:9000/auth/captcha
|
||
|
||
# 健康检查
|
||
curl http://192.168.1.101:9000/actuator/health
|
||
curl http://192.168.1.102:9000/actuator/health
|
||
```
|
||
|
||
---
|
||
|
||
## 五、高可用测试
|
||
|
||
### 5.1 测试服务故障转移
|
||
|
||
```bash
|
||
# 停止 Node-01 的网关
|
||
docker stop video-gateway
|
||
|
||
# 测试 API (应该自动切换到 Node-02)
|
||
curl http://192.168.1.102:9000/auth/captcha
|
||
|
||
# 恢复服务
|
||
docker start video-gateway
|
||
```
|
||
|
||
### 5.2 测试 Redis 主从切换
|
||
|
||
```bash
|
||
# 停止 Node-01 的 Redis
|
||
docker stop redis
|
||
|
||
# 查看 Sentinel 日志 (自动将从节点提升为主)
|
||
docker logs redis-sentinel
|
||
|
||
# 验证新的主节点
|
||
docker exec redis redis-cli -a redis_HA_Cluster_2024 INFO replication
|
||
|
||
# 恢复 Redis (会自动变为从节点)
|
||
docker start redis
|
||
```
|
||
|
||
### 5.3 测试 Nacos 集群
|
||
|
||
```bash
|
||
# 停止 Node-01 的 Nacos
|
||
docker stop nacos
|
||
|
||
# 验证服务注册仍然可用
|
||
curl http://192.168.1.102:8848/nacos/v1/ns/service/list
|
||
|
||
# 恢复 Nacos
|
||
docker start nacos
|
||
```
|
||
|
||
---
|
||
|
||
## 六、常见问题
|
||
|
||
### Q1: Docker 镜像拉取失败
|
||
|
||
```bash
|
||
# 配置国内镜像源
|
||
vim /etc/docker/daemon.json
|
||
# 添加镜像加速器
|
||
|
||
# 重启 Docker
|
||
systemctl restart docker
|
||
```
|
||
|
||
### Q2: Nacos 集群无法启动
|
||
|
||
```bash
|
||
# 检查时间同步
|
||
apt-get install -y ntpdate
|
||
ntpdate pool.ntp.org
|
||
|
||
# 检查数据库连接
|
||
docker exec mysql mysql -uroot -proot123456 -e "SHOW DATABASES;"
|
||
```
|
||
|
||
### Q3: 内存不足
|
||
|
||
```bash
|
||
# 查看内存使用
|
||
free -h
|
||
|
||
# 调整 JVM 参数
|
||
# 编辑 config/.env.node-xx 文件中的 JAVA_OPTS
|
||
JAVA_OPTS=-Xms128m -Xmx256m
|
||
```
|
||
|
||
### Q4: 端口冲突
|
||
|
||
```bash
|
||
# 查看端口占用
|
||
ss -tlnp | grep -E '3306|6379|8848|9000|9002'
|
||
|
||
# 停止冲突服务
|
||
systemctl stop mysql
|
||
systemctl stop redis
|
||
```
|
||
|
||
---
|
||
|
||
## 七、日常运维
|
||
|
||
### 7.1 日志查看
|
||
|
||
```bash
|
||
# 查看服务日志
|
||
docker logs -f --tail 100 video-gateway
|
||
docker logs -f --tail 100 video-auth
|
||
|
||
# 查看所有服务状态
|
||
docker compose -f docker-compose-node-01.yml ps
|
||
```
|
||
|
||
### 7.2 服务重启
|
||
|
||
```bash
|
||
# 重启单个服务
|
||
docker restart video-gateway
|
||
|
||
# 重启所有服务
|
||
docker compose -f docker-compose-node-01.yml restart
|
||
```
|
||
|
||
### 7.3 数据备份
|
||
|
||
```bash
|
||
# MySQL 备份
|
||
docker exec mysql mysqldump -uroot -proot123456 --all-databases > backup_$(date +%Y%m%d).sql
|
||
|
||
# Redis 备份
|
||
docker exec redis redis-cli -a redis_HA_Cluster_2024 BGSAVE
|
||
docker cp redis:/data/dump.rdb redis_backup_$(date +%Y%m%d).rdb
|
||
|
||
# MinIO 备份
|
||
mc mirror myminio/video-platform minio_backup_$(date +%Y%m%d)
|
||
```
|
||
|
||
---
|
||
|
||
## 八、性能调优
|
||
|
||
### 8.1 JVM 调优
|
||
|
||
根据实际内存调整 JVM 参数:
|
||
|
||
```bash
|
||
# 8GB 内存服务器建议配置
|
||
JAVA_OPTS=-Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m -XX:+UseG1GC
|
||
|
||
# 16GB 内存服务器建议配置
|
||
JAVA_OPTS=-Xms1g -Xmx2g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -XX:+UseG1GC
|
||
```
|
||
|
||
### 8.2 MySQL 调优
|
||
|
||
```bash
|
||
# 编辑 MySQL 配置
|
||
vim config/mysql/my-master.cnf
|
||
|
||
# 关键参数
|
||
innodb_buffer_pool_size = 2G # 设置为物理内存的 50-70%
|
||
innodb_log_file_size = 512M
|
||
max_connections = 500
|
||
```
|
||
|
||
### 8.3 Redis 调优
|
||
|
||
```bash
|
||
# 编辑 Redis 配置
|
||
vim config/redis/redis-master.conf
|
||
|
||
# 关键参数
|
||
maxmemory 2gb
|
||
maxmemory-policy allkeys-lru
|
||
```
|
||
|
||
---
|
||
|
||
## 九、架构图
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────────┐
|
||
│ 高可用集群架构 │
|
||
├─────────────────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
||
│ │ Node-01 │ │ Node-02 │ │ Node-03 │
|
||
│ │ 192.168.1.101 │ │ 192.168.1.102 │ │ 192.168.1.103 │
|
||
│ ├─────────────────┤ ├─────────────────┤ ├─────────────────┤
|
||
│ │ MySQL Master │ ──────▶ │ MySQL Slave │ ──────▶ │ MySQL Slave │
|
||
│ │ Redis Master │ ◀────── │ Redis Slave │ ◀────── │ Redis Slave │
|
||
│ │ Nacos Node1 │ ◀─────▶ │ Nacos Node2 │ ◀─────▶ │ Nacos Node3 │
|
||
│ │ NameServer │ │ NameServer │ │ NameServer │
|
||
│ │ MinIO :9100 │ │ Broker-A :10911 │ │ Broker-B :10911 │
|
||
│ │ Sentinel :8880 │ │ MinIO :9100 │ │ MinIO :9000 │
|
||
│ ├─────────────────┤ │ Sentinel :8880 │ │ Sentinel :8880 │
|
||
│ │ Gateway :9000 │ ├─────────────────┤ └─────────────────┘
|
||
│ │ Auth :9001 │ │ Gateway :9000 │ (备份节点)
|
||
│ │ User :9002 │ │ Auth :9001 │
|
||
│ │ Content :9003 │ │ User :9002 │
|
||
│ │ Comment :9004 │ │ Content :9003 │
|
||
│ │ Recommend :9005 │ │ Comment :9004 │
|
||
│ │ Admin :9006 │ │ Recommend :9005 │
|
||
│ │ Nginx :80 │ │ Admin :9006 │
|
||
│ └─────────────────┘ └─────────────────┘
|
||
│ (主节点) (从节点)
|
||
└─────────────────────────────────────────────────────────────────────────────┘
|
||
```
|