1. 项目部署全流程解析
最近在帮客户部署一套分布式文件存储系统时,完整记录了从环境准备到上线的全过程。这个看似标准的部署流程,在实际操作中遇到了不少预料之外的问题。今天就把这次实战经验整理成完整的部署checklist,包含每个环节的详细操作和避坑指南。
这套系统需要跨三个可用区部署,包含12个节点集群,涉及网络配置、存储挂载、服务依赖等多项关键配置。无论你是第一次部署类似系统,还是遇到过部署失败的情况,这份经验总结都能帮你少走弯路。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备阶段
2.1 硬件资源配置
我们使用的是Dell R740xd服务器,每台配置如下:
- CPU: 2×Intel Xeon Gold 6248R (24核/48线程)
- 内存: 384GB DDR4 ECC
- 存储: 4×800GB SSD (RAID10) + 12×8TB HDD (JBOD)
- 网卡: 2×10GbE + 2×25GbE
重要提示:JBOD模式必须通过HBA卡直通,任何形式的RAID都会影响存储系统的数据分布算法
网络拓扑采用spine-leaf架构,每个节点需要配置:
- 管理网络: 10GbE x1 (VLAN100)
- 存储网络: 25GbE x2 (VLAN200, VLAN201)
- 需要为每个网口配置独立的subnet
2.2 操作系统安装
选择CentOS 7.9最小化安装,关键配置项:
bash复制# 禁用默认防火墙
systemctl disable firewalld
systemctl stop firewalld
# 关闭SELinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
# 配置大页内存
echo "vm.nr_hugepages = 1024" >> /etc/sysctl.conf
# 优化内核参数
cat >> /etc/sysctl.conf <<EOF
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 1024 65000
net.core.somaxconn = 32768
EOF
遇到的首个坑是CentOS默认的udev规则会导致磁盘设备名随机变化。解决方案:
bash复制# 创建持久化设备命名规则
vim /etc/udev/rules.d/10-persistent-disk.rules
3. 软件部署阶段
3.1 依赖包安装
存储系统需要以下基础组件:
bash复制yum install -y \
epel-release \
gcc-c++ \
cmake3 \
libaio-devel \
zlib-devel \
openssl-devel \
libcurl-devel \
python3-devel
特别注意:必须使用gcc 9.3+版本,CentOS 7默认的4.8.5不兼容:
bash复制# 安装devtoolset-9
yum install -y centos-release-scl
yum install -y devtoolset-9
scl enable devtoolset-9 bash
3.2 存储服务部署
核心组件安装流程:
bash复制tar xzf storage-core-3.2.1.tar.gz
cd storage-core-3.2.1
mkdir build && cd build
cmake3 -DCMAKE_BUILD_TYPE=Release ..
make -j$(nproc)
make install
配置文件关键参数:
ini复制[cluster]
node_id = 01 # 必须与zk注册ID一致
zone = AZ1
[network]
listen_addr = 10.10.100.1
advertise_addr = 10.10.100.1
[storage]
data_disks = /dev/sdb,/dev/sdc,/dev/sdd # 必须与udev规则一致
journal_disk = /dev/nvme0n1
4. 集群配置阶段
4.1 Zookeeper集群搭建
三节点ZK集群配置:
properties复制# zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zk
clientPort=2181
server.1=zk1:2888:3888
server.2=zk2:2888:3888
server.3=zk3:2888:3888
常见问题排查:
- 节点无法加入集群:检查防火墙和SELinux状态
- 选举失败:确保所有节点的myid文件内容唯一
- 连接超时:验证网络延迟(<2ms)和带宽(>1Gbps)
4.2 存储节点注册
通过管理API注册节点:
bash复制curl -X POST http://manager:8080/api/v1/nodes \
-H "Content-Type: application/json" \
-d '{
"node_id": "01",
"ip": "10.10.100.1",
"zone": "AZ1",
"disks": ["/dev/sdb","/dev/sdc"],
"tags": {"ssd": "true"}
}'
5. 典型问题解决方案
5.1 磁盘IO性能异常
现象:dd测试正常,但实际写入速度只有预期1/10
排查步骤:
- 检查调度器:
cat /sys/block/sdb/queue/scheduler - 验证NR请求:
echo 1024 > /sys/block/sdb/queue/nr_requests - 测试裸设备性能:
fio --filename=/dev/sdb --direct=1 --rw=write --ioengine=libaio --bs=4k --numjobs=16 --size=10G --runtime=60 --name=test
最终发现是磁盘预读参数不合理:
bash复制blockdev --setra 1024 /dev/sdb
5.2 网络闪断问题
现象:每5-10分钟出现1-2秒网络中断
诊断工具:
bash复制# 持续ping测试
ping -A -i 0.1 -w 600 manager > ping.log
# 网络质量分析
yum install -y iperf3
iperf3 -c storage-node2 -t 600 -i 10
解决方案:
- 更换网卡驱动版本
- 禁用节能模式:
ethtool -s enp5s0f0 wol d - 调整中断平衡:
irqbalance --oneshot
6. 上线检查清单
正式上线前必须验证的项目:
-
容灾测试
- 随机停止1个节点服务
- 拔掉1个交换机电源
- 断开1个可用区网络
-
性能基准
bash复制# 顺序写 fio --name=seqwrite --rw=write --bs=1M --size=100G --runtime=300 --time_based # 随机读 fio --name=randread --rw=randread --bs=4k --size=100G --runtime=300 --time_based -
监控项配置
- 节点存活状态
- 磁盘使用率
- 网络丢包率
- 请求延迟P99
这套部署方案最终支撑了超过5PB的存储容量,在三个月的运行期间保持了99.99%的可用性。最深刻的教训是:所有网络配置必须在上线前用长期压力测试验证,任何短时间的测试都可能掩盖间歇性问题。
