前言
近期,笔者对一款由日本开发者主导的分布式对象存储系统 LeoFS 进行了实践部署与测试。该系统架构设计清晰,实现了 Amazon S3 协议的大部分核心功能。本着实践出真知的原则,本文记录了在多个虚拟服务器上搭建 LeoFS 集群的详细过程。总体而言,LeoFS 表现尚可,值得持续关注,但鉴于其社区活跃度与生产环境验证案例,目前暂不推荐直接用于核心生产环境。
测试环境规划
本次测试在多个云服务器上进行,节点规划如下:
- Manager 节点 (2台):负责集群元数据管理与协调。
- IP: 45.79.96.27, 45.79.75.81
- 节点名: manager_0@45.79.96.27, manager_1@45.79.75.81
- Gateway 节点 (1台):提供 S3 API 访问入口。
- IP: 45.33.47.145
- 节点名: gateway_0@45.33.47.145
- Storage 节点 (3台):负责实际对象数据的存储。
- IP: 173.255.242.49, 45.33.36.211, 45.33.48.247
- 节点名: storage_01@173.255.242.49, storage_02@45.33.36.211, storage_03@45.33.48.247
部署准备
1. 主控节点初始化
在 Manager 主节点 (45.79.96.27) 上执行以下操作,安装必要的工具并进入 screen 会话以便长时间运行任务。
yum install screen epel-release -y && screen -S leofs
yum install ansible -y
2. 配置 Ansible 主机清单
编辑 Ansible 的主机清单文件 /etc/ansible/hosts,添加所有集群节点的 IP 地址。注意,如果 Ansible 控制端自身也在清单中,需要指定本地连接方式。
45.79.96.27 ansible_connection=local
45.79.75.81
45.33.47.145
173.255.242.49
45.33.36.211
45.33.48.247
编辑 Ansible 配置文件 /etc/ansible/ansible.cfg,关闭首次连接时的 SSH 主机密钥检查,便于批量操作。
[defaults]
host_key_checking = False
3. 配置 SSH 免密登录
在主控节点生成 SSH 密钥对,并将公钥分发到所有被控节点,实现免密登录。
ssh-keygen -t rsa -f /root/.ssh/id_rsa -N ""
ssh-copy-id -i /root/.ssh/id_rsa.pub root@45.79.96.27
ssh-copy-id -i /root/.ssh/id_rsa.pub root@45.79.75.81
ssh-copy-id -i /root/.ssh/id_rsa.pub root@45.33.47.145
ssh-copy-id -i /root/.ssh/id_rsa.pub root@173.255.242.49
ssh-copy-id -i /root/.ssh/id_rsa.pub root@45.33.36.211
ssh-copy-id -i /root/.ssh/id_rsa.pub root@45.33.48.247
提示:后续如需更新密钥,可使用 Ansible 的 authorized_key 模块批量推送。
ansible all -m authorized_key -a "user=root key='{{ lookup('file', '/root/.ssh/id_rsa.pub') }}'"
4. 验证与基础环境配置
验证所有节点是否可通过 Ansible 正常连接。
ansible all -m ping
为简化测试环境,关闭所有节点的防火墙(生产环境应配置安全组或防火墙规则)。
ansible all -m shell -a "systemctl stop firewalld && systemctl disable firewalld"
为每个节点设置主机名并更新 /etc/hosts 文件,确保节点间可通过主机名互相解析。以下命令为示例,需为每个节点分别执行对应的命令。
# 在 Manager 0 节点执行
hostnamectl set-hostname M0
echo "45.79.96.27 M0" >> /etc/hosts
# 在 Gateway 节点执行,需添加用于 S3 访问的域名
hostnamectl set-hostname G0
echo "45.33.47.145 G0" >> /etc/hosts
echo "45.33.47.145 s3.blog.youquso.com" >> /etc/hosts
echo "45.33.47.145 *.s3.blog.youquso.com" >> /etc/hosts
# 在 Storage 1 节点执行
hostnamectl set-hostname S1
echo "173.255.242.49 S1" >> /etc/hosts
注意:修改完成后,需要重启所有服务器使主机名生效。
ansible all -m shell -a "reboot"
# 等待重启后验证
ansible all -m shell -a "hostname && cat /etc/hosts"
5. 安装系统依赖
在所有节点上安装编译和运行 LeoFS 所需的基础软件包。
ansible all -m shell -a "yum update -y && yum install wget curl git netcat redhat-lsb-core gcc gcc-c++ glibc-devel make automake ncurses-devel openssl-devel autoconf libuuid-devel cmake check check-devel java-1.8.0-openjdk-devel vim -y"
6. 安装 Erlang 运行环境
LeoFS 基于 Erlang/OTP 开发,需要安装指定版本。此步骤较耗时,可考虑手动在各节点执行。
ansible all -m shell -a "cd / && wget -c --no-check-certificate http://erlang.org/download/otp_src_18.3.tar.gz && tar -zxvf otp_src_18.3.tar.gz && cd /otp_src_18.3 && ./otp_build autoconf && ./configure && make && make install"
使用 Ansible 部署 LeoFS 集群
1. 获取部署脚本
在主控节点下载官方的 Ansible 部署脚本。
cd / && mkdir -p /codefiles && cd /codefiles
git clone https://github.com/leo-project/leofs_ansible.git
cd leofs_ansible
2. 配置部署清单
复制示例配置文件并编辑 hosts 文件,根据规划定义各节点角色与版本。
cp hosts.sample hosts
cat > hosts << 'EOF'
[all:vars]
leofs_version=1.4.2
build_temp_path="/tmp/leofs_builder"
build_install_path="/tmp/"
build_branch="master"
source="package"
[builder]
45.79.96.27
[leo_manager_0]
45.79.96.27
[leo_manager_1]
45.79.75.81
[leo_storage]
173.255.242.49 leofs_module_nodename=storage_01@173.255.242.49
45.33.36.211 leofs_module_nodename=storage_02@45.33.36.211
45.33.48.247 leofs_module_nodename=storage_03@45.33.48.247
[leo_gateway]
45.33.47.145 leofs_module_nodename=gateway_0@45.33.47.145
[leofs_nodes:children]
leo_manager_0
leo_manager_1
leo_gateway
leo_storage
EOF
3. 执行部署流程
重要:以下所有 ansible-playbook 命令均需在 /codefiles/leofs_ansible/ 目录下执行。
- 构建 LeoFS 包:在 builder 节点上编译 LeoFS。
ansible-playbook -i hosts build_leofs.yml
- 安装 LeoFS:将构建好的包分发并安装到所有节点。
ansible-playbook -i hosts install_leofs.yml
- 配置 LeoFS:根据 hosts 文件生成各节点的配置文件。
ansible-playbook -i hosts config_leofs.yml
- 启动集群:启动所有 LeoFS 服务。
ansible-playbook -i hosts start_leofs.yml
部署完成后,可以使用以下命令管理集群:
# 停止集群
ansible-playbook -i hosts stop_leofs.yml
# 清空集群数据与配置(谨慎使用)
ansible-playbook -i hosts purge_leofs.yml
基础配置与管理
1. 设置 S3 访问端点
在任一 Manager 节点上,为 S3 服务设置访问端点(域名)。
leofs-adm add-endpoint s3.blog.youquso.com
2. 用户与存储桶管理
- 创建用户:
leofs-adm create-user testuser
- 创建存储桶:
leofs-adm add-bucket mybucket
- 设置存储桶访问权限:权限可选
private(默认)、public-read、public-read-write。
leofs-adm update-acl mybucket <access_key_id> public-read
3. 常用管理命令查询
- 查询用户:
leofs-adm get-users - 查询端点:
leofs-adm get-endpoints - 查询所有存储桶:
leofs-adm get-buckets - 查看集群状态:
leofs-adm status
存储节点配置优化
1. 文件系统建议
LeoFS 官方推荐使用 XFS 文件系统,因其对大文件和高并发 I/O 支持更好。可以为存储节点单独挂载 XFS 格式的数据盘。
# 假设新磁盘为 /dev/vdb
mkfs.xfs /dev/vdb
mkdir -p /data/leofs
echo "/dev/vdb /data/leofs xfs defaults 0 0" >> /etc/fstab
mount -a
2. 调整存储配置
编辑 Storage 节点的配置文件 /usr/local/leofs/1.4.2/leo_storage/etc/leo_storage.conf,指向数据目录并设置容器数量。
managers = [manager_0@45.79.96.27, manager_1@45.79.75.81]
obj_containers.path = [/data/leofs]
obj_containers.num_of_containers = [8]
nodename = storage_01@173.255.242.49
3. 磁盘监控参数(可选)
在配置文件中可以启用并调整磁盘监控(Watchdog)参数,例如磁盘使用率、读写吞吐量阈值等,以便在异常时告警。
watchdog.disk.is_enabled = true
watchdog.disk.threshold_disk_use = 85
watchdog.disk.threshold_disk_rkb = 131072 # 128 MB/s 读阈值
watchdog.disk.threshold_disk_wkb = 131072 # 128 MB/s 写阈值
网关节点配置优化
编辑 Gateway 节点的配置文件 /usr/local/leofs/1.4.2/leo_gateway/etc/leo_gateway.conf。
managers = [manager_0@45.79.96.27, manager_1@45.79.75.81]
protocol = s3
http.port = 8080 # S3 API 服务端口
nodename = gateway_0@45.33.47.145
# 缓存配置
cache.cache_ram_capacity = 268435456 # 256MB 内存缓存
cache.cache_disc_capacity = 0 # 禁用磁盘缓存
cache.cache_expire = 300 # 缓存过期时间(秒)
# 大对象处理线程池
large_object.put_worker_pool_size = 16
large_object.put_worker_buffer_size = 32
集群运维操作
1. 节点扩缩容
- 添加 Storage 节点:启动新节点服务后,执行重平衡将数据迁移到新节点。
leofs-adm rebalance
- 移除 Storage 节点:先将节点状态置为
detached,再执行重平衡。
leofs-adm detach storage_03@45.33.48.247
leofs-adm rebalance
- 挂起/恢复节点:用于临时维护。
leofs-adm suspend storage_01@173.255.242.49
# ... 执行维护操作 ...
leofs-adm resume storage_01@173.255.242.49
2. 数据一致性维护
在最终一致性系统中,建议定期在业务低峰期执行一致性恢复操作。
leofs-adm recover-consistency
也可以调整一致性级别(写、删除、读的确认节点数)。
leofs-adm update-consistency-level 2 2 1 # W=2, D=2, R=1
3. 数据压缩(Compaction)
Storage 节点上的数据文件需要定期压缩以回收空间、提升性能。
# 启动节点压缩,使用3个并行进程
leofs-adm compact-start storage_01@173.255.242.49 all 3
# 查看压缩状态
leofs-adm compact-status storage_01@173.255.242.49
# 暂停压缩
leofs-adm compact-suspend storage_01@173.255.242.49
4. 磁盘使用情况查看
leofs-adm du # 查看概要
leofs-adm du detail # 查看详细信息
总结
本文详细记录了使用 Ansible 自动化部署 LeoFS 分布式对象存储集群的步骤,涵盖了从环境准备、软件安装、集群初始化到基础运维的完整流程。LeoFS 提供了与 S3 兼容的 API,适合作为私有云存储或测试开发环境。在实际使用中,需要根据数据量、访问模式和硬件条件,进一步调整存储配置、网关参数以及制定合适的维护计划(如定期压缩、一致性检查)。对于生产环境,建议进行更充分的性能测试、高可用验证并密切关注项目发展。