网站Logo linux从入门到入土

企业级Kodbox集群部署实战:从单机到高可用架构

admin
10
2023-10-12

企业级Kodbox集群部署实战:从单机到高可用架构

项目概述

业务背景

在企业数字化转型过程中,文件管理与协作平台成为核心基础设施。Kodbox作为一款优秀的开源云盘系统,需要构建高可用、可扩展的集群架构来支撑企业级应用。

项目目标

构建具备以下特性的Kodbox集群:

  • 高可用性:消除单点故障,实现服务不间断
  • 可扩展性:支持水平扩展,应对业务增长
  • 数据安全:多层次备份,保障数据可靠性
  • 负载均衡:智能流量分发,优化用户体验

架构设计

系统架构图

image (1).png

image.png

用户访问 → [Keepalived VIP: 10.0.0.3] → [负载均衡层: lb01/lb02] → [应用层: web01/web02] → [数据层: db01]
                                      ↓
                                [共享存储: nfs01] → [备份层: backup] → [异地容灾: 阿里云]

服务器规划

角色 主机名 IP地址 核心职责
应用服务器 web01 10.0.0.7 Nginx+PHP,业务处理
应用服务器 web02 10.0.0.8 Nginx+PHP,业务处理
负载均衡器 lb01 10.0.0.5 流量分发,主Keepalived
负载均衡器 lb02 10.0.0.6 流量分发,备Keepalived
数据库服务器 db01 10.0.0.51 MariaDB数据库服务
共享存储 nfs01 10.0.0.31 文件共享,实时同步
备份服务器 backup 10.0.0.41 数据备份,异地同步
异地容灾 aliyun 公网IP 异地数据保护

详细实施步骤

第一阶段:基础环境部署

1.1 数据库服务器部署 (db01)

MariaDB安装与配置:

# 安装MariaDB服务器
yum install -y mariadb-server

# 启动并设置开机自启
systemctl enable --now mariadb

# 验证服务状态
ss -lntup | grep mysql
ps -ef | grep mysql

数据库安全初始化:

# 执行安全配置脚本
mysql_secure_installation

# 按照提示完成以下配置:
# - 设置root密码
# - 移除匿名用户
# - 禁止root远程登录  
# - 移除测试数据库
# - 重新加载权限表

业务数据库创建:

-- 登录数据库
mysql -uroot -p

-- 创建Kodbox专用数据库
CREATE DATABASE kodb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 创建本地访问用户
GRANT ALL PRIVILEGES ON kodb.* TO 'kodb'@'localhost' IDENTIFIED BY 'kodb';

-- 创建网络访问用户(按需调整网段)
GRANT ALL PRIVILEGES ON kodb.* TO 'kodb'@'10.0.0.%' IDENTIFIED BY 'kodb';

-- 刷新权限
FLUSH PRIVILEGES;

-- 验证用户创建
SELECT user, host FROM mysql.user;

1.2 应用服务器部署 (web01/web02)

PHP环境部署:

# 安装PHP及相关扩展
yum -y install php php-fpm php-bcmath php-cli php-common php-devel \
              php-embedded php-gd php-intl php-mbstring php-mysqlnd \
              php-opcache php-pdo php-process php-xml php-json

# 配置PHP-FPM
cat > /etc/php-fpm.d/www.conf << 'EOF'
[www]
user = nginx
group = nginx
listen = 127.0.0.1:9000
listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
slowlog = /var/log/php-fpm/www-slow.log
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
EOF

# 启动PHP-FPM服务
systemctl enable --now php-fpm
php-fpm -t  # 配置语法检查

Nginx环境部署:

# 配置Nginx官方YUM源
cat > /etc/yum.repos.d/nginx.repo << 'EOF'
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
EOF

# 安装Nginx
yum install -y nginx

# 配置Kodbox站点
cat > /etc/nginx/conf.d/kodbox.xiaozhi.cn.conf << 'EOF'
server {
    listen 80;
    server_name kodbox.xiaozhi.cn;
    root /app/code/kodbox;
    index index.php index.html;
  
    access_log /var/log/nginx/kodbox-access.log main;
    error_log /var/log/nginx/kodbox-error.log notice;
  
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
  
    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
  
        # 优化性能参数
        fastcgi_buffering on;
        fastcgi_buffers 512 128k;
        fastcgi_buffer_size 128k;
    }
  
    # 静态资源缓存
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
    }
}
EOF

# 创建应用目录
mkdir -p /app/code/kodbox

# 验证配置并启动服务
nginx -t
systemctl enable --now nginx

服务验证:

# 创建测试文件验证各服务
cat > /app/code/kodbox/chk_php.php << 'EOF'
<?php
phpinfo();
?>
EOF

cat > /app/code/kodbox/chk_db.php << 'EOF'
<?php
$db_host = '10.0.0.51';
$db_user = 'kodb';
$db_pass = 'kodb';
$db_name = "kodb";

$link_id = mysqli_connect($db_host, $db_user, $db_pass, $db_name);
if ($link_id) {
    echo "Database connection successful!\n";
} else {
    echo "Connection failed: " . mysqli_connect_error() . "\n";
}
?>
EOF

1.3 Kodbox应用部署

代码部署:

# 上传并解压Kodbox代码
unzip -t kodbox.1.59.zip  # 验证压缩包完整性
unzip kodbox.1.59.zip -d /app/code/kodbox/

# 设置正确的文件权限
chown -R nginx:nginx /app/code/kodbox/
find /app/code/kodbox/ -type d -exec chmod 755 {} \;
find /app/code/kodbox/ -type f -exec chmod 644 {} \;

# 设置运行时目录权限
chmod -R 777 /app/code/kodbox/data/
chmod -R 777 /app/code/kodbox/plugins/

Web安装:
通过浏览器访问 http://kodbox.xiaozhi.cn 完成安装:

  1. 接受许可协议
  2. 配置数据库连接(使用db01服务器)
  3. 设置管理员账户
  4. 完成安装

第二阶段:共享存储与高可用

2.1 NFS共享存储部署 (nfs01)

NFS服务端配置:

# 安装NFS服务
yum install -y nfs-utils rpcbind

# 创建共享用户和目录
useradd -s /sbin/nologin -M -u 1999 www
mkdir -p /nfs/kodbox
chown -R www:www /nfs/kodbox/

# 配置NFS导出
cat > /etc/exports << 'EOF'
/nfs/kodbox 10.0.0.0/24(rw,sync,all_squash,anonuid=1999,anongid=1999)
EOF

# 启动NFS服务
systemctl enable --now rpcbind nfs
exportfs -v  # 验证导出配置

客户端挂载配置 (web01/web02):

# 安装NFS客户端
yum install -y nfs-utils

# 创建共享用户(UID必须与服务端一致)
useradd -s /sbin/nologin -M -u 1999 www

# 迁移现有数据到临时位置
mv /app/code/kodbox/data/files /tmp/files_backup

# 配置自动挂载
cat >> /etc/fstab << 'EOF'
10.0.0.31:/nfs/kodbox /app/code/kodbox/data/files nfs defaults 0 0
EOF

# 执行挂载
mkdir -p /app/code/kodbox/data/files
mount -a

# 恢复数据(如有)
cp -r /tmp/files_backup/* /app/code/kodbox/data/files/ 2>/dev/null || true

# 更新服务运行用户
sed -i 's/^user.*$/user www;/' /etc/nginx/nginx.conf
sed -i 's/^user = .*$/user = www/' /etc/php-fpm.d/www.conf
sed -i 's/^group = .*$/group = www/' /etc/php-fpm.d/www.conf

# 重启服务
systemctl restart nginx php-fpm

2.2 负载均衡部署 (lb01/lb02)

Nginx负载均衡配置:

# 安装Nginx(参考web服务器安装步骤)

# 配置负载均衡
cat > /etc/nginx/conf.d/kodbox.xiaozhi.cn.conf << 'EOF'
upstream kodbox_backend {
    server 10.0.0.7:80 weight=3 max_fails=3 fail_timeout=30s;
    server 10.0.0.8:80 weight=2 max_fails=3 fail_timeout=30s;
  
    # 会话保持(可选)
    ip_hash;
}

server {
    listen 80;
    server_name kodbox.xiaozhi.cn;
  
    access_log /var/log/nginx/lb-access.log main;
    error_log /var/log/nginx/lb-error.log notice;
  
    location / {
        proxy_pass http://kodbox_backend;
  
        # 透传客户端信息
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
  
        # 超时设置
        proxy_connect_timeout 30s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
  
        # 缓冲区优化
        proxy_buffering on;
        proxy_buffer_size 4k;
        proxy_buffers 8 4k;
    }
  
    # 负载均衡状态监控
    location /nginx_status {
        stub_status on;
        access_log off;
        allow 127.0.0.1;
        allow 10.0.0.0/24;
        deny all;
    }
}
EOF

# 验证并重载配置
nginx -t
systemctl reload nginx

2.3 Keepalived高可用配置

主负载均衡器配置 (lb01):

# 安装Keepalived
yum install -y keepalived

# 配置Keepalived
cat > /etc/keepalived/keepalived.conf << 'EOF'
! Configuration File for keepalived
global_defs {
    router_id lb01
    script_user root
    enable_script_security
}

vrrp_script chk_nginx {
    script "/server/scripts/check_nginx.sh"
    interval 2
    weight -10
    fall 2
    rise 1
    timeout 2
}

vrrp_instance VI_KODBOX {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
  
    authentication {
        auth_type PASS
        auth_pass 1111
    }
  
    virtual_ipaddress {
        10.0.0.3/24 dev ens33 label ens33:0
    }
  
    track_script {
        chk_nginx
    }
  
    # 通知脚本(可选)
    notify_master "/server/scripts/notify_master.sh"
    notify_backup "/server/scripts/notify_backup.sh"
}
EOF

备负载均衡器配置 (lb02):

cat > /etc/keepalived/keepalived.conf << 'EOF'
! Configuration File for keepalived
global_defs {
    router_id lb02
    script_user root
    enable_script_security
}

vrrp_script chk_nginx {
    script "/server/scripts/check_nginx.sh"
    interval 2
    weight -10
    fall 2
    rise 1
    timeout 2
}

vrrp_instance VI_KODBOX {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90
    advert_int 1
  
    authentication {
        auth_type PASS
        auth_pass 1111
    }
  
    virtual_ipaddress {
        10.0.0.3/24 dev ens33 label ens33:0
    }
  
    track_script {
        chk_nginx
    }
}
EOF

健康检查脚本:

# 创建脚本目录
mkdir -p /server/scripts

# 编写Nginx健康检查脚本
cat > /server/scripts/check_nginx.sh << 'EOF'
#!/bin/bash
# Nginx服务健康检查脚本

COUNT=$(ps -ef | grep nginx | grep -v grep | wc -l)

if [ $COUNT -eq 0 ]; then
    echo "Nginx is not running"
    exit 1
else
    # 进一步检查Nginx是否真正可用
    if curl -f http://localhost/nginx_status >/dev/null 2>&1; then
        exit 0
    else
        echo "Nginx is running but not responding"
        exit 1
    fi
fi
EOF

chmod +x /server/scripts/check_nginx.sh

# 启动Keepalived服务
systemctl enable --now keepalived

第三阶段:数据备份与容灾

3.1 实时同步配置 (nfs01 → backup)

NFS服务器配置实时同步:

# 安装lsyncd
yum install -y lsyncd

# 配置lsyncd
cat > /etc/lsyncd.conf << 'EOF'
settings {
    logfile = "/var/log/lsyncd/lsyncd.log",
    statusFile = "/var/log/lsyncd/lsyncd.status",
    inotifyMode = "CloseWrite",
    maxProcesses = 8
}

sync {
    default.rsync,
    source = "/nfs/kodbox",
    target = "backup@10.0.0.41::kodbox_backup",
    rsync = {
        binary = "/usr/bin/rsync",
        archive = true,
        compress = true,
        verbose = true,
        password_file = "/etc/rsync.pass",
        _extra = {"--bwlimit=10000"}
    },
    delay = 1
}
EOF

# 创建密码文件
echo "password123" > /etc/rsync.pass
chmod 600 /etc/rsync.pass

# 创建日志目录
mkdir -p /var/log/lsyncd

# 启动lsyncd服务
systemctl enable --now lsyncd

3.2 异地备份配置 (backup → 阿里云)

备份服务器配置:

# 配置Rsync服务端(参考之前项目)
# 创建定时备份脚本
cat > /server/scripts/backup_to_aliyun.sh << 'EOF'
#!/bin/bash
# 异地备份脚本

BACKUP_SRC="/backup/kodbox"
REMOTE_SERVER="aliyun_backup@your-aliyun-ip::kodbox_dr"
LOG_FILE="/var/log/backup_to_aliyun.log"
DATE_TAG=$(date +%Y%m%d_%H%M%S)

export RSYNC_PASSWORD="YourSecurePassword"

echo "[$DATE_TAG] Starting backup sync..." >> $LOG_FILE

rsync -avz --progress --delete \
    --exclude="tmp/" \
    --exclude="cache/" \
    $BACKUP_SRC/ $REMOTE_SERVER >> $LOG_FILE 2>&1

if [ $? -eq 0 ]; then
    echo "[$DATE_TAG] Backup completed successfully" >> $LOG_FILE
else
    echo "[$DATE_TAG] Backup failed!" >> $LOG_FILE
    # 发送告警邮件
    echo "Backup to Aliyun failed at $(date)" | mail -s "Backup Alert" admin@company.com
fi
EOF

chmod +x /server/scripts/backup_to_aliyun.sh

# 添加到定时任务
echo "0 2 * * * /server/scripts/backup_to_aliyun.sh" >> /etc/crontab

监控与维护

服务状态监控

# 创建统一的监控脚本
cat > /server/scripts/cluster_monitor.sh << 'EOF'
#!/bin/bash
# 集群状态监控脚本

SERVERS=("10.0.0.7" "10.0.0.8" "10.0.0.5" "10.0.0.6" "10.0.0.51" "10.0.0.31")
ALERT_EMAIL="admin@company.com"

for server in "${SERVERS[@]}"; do
    if ! ping -c 1 -W 3 $server >/dev/null 2>&1; then
        echo "ALERT: Server $server is unreachable at $(date)" | \
        mail -s "Server Down Alert" $ALERT_EMAIL
    fi
done

# 检查VIP状态
if ip addr show ens33 | grep -q "10.0.0.3"; then
    echo "VIP is active on local machine"
else
    echo "VIP is not active on local machine"
fi
EOF

性能优化建议

Nginx优化:

# 在nginx.conf的http块中添加
keepalive_timeout 65;
keepalive_requests 1000;
client_max_body_size 100m;  # 适应大文件上传

PHP优化:

; 在php.ini中调整
memory_limit = 256M
max_execution_time = 300
upload_max_filesize = 100M
post_max_size = 100M

项目成果

技术成果

  1. 高可用架构:实现服务99.9%可用性
  2. 线性扩展:支持无缝添加web服务器
  3. 数据安全:多层次数据保护机制
  4. 性能优化:智能负载均衡和缓存策略

业务价值

  1. 业务连续性:消除单点故障,保障服务不中断
  2. 用户体验:快速响应,支持大文件传输
  3. 运维效率:自动化监控和备份,降低运维成本
  4. 成本控制:基于开源技术,性价比极高
动物装饰