博客 / Others/ 支持S3接口的分布式存储系统LeoFS集群部署笔记

支持S3接口的分布式存储系统LeoFS集群部署笔记

支持S3接口的分布式存储系统LeoFS集群部署笔记

前言

近期,笔者对一款由日本开发者主导的分布式对象存储系统 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-readpublic-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,适合作为私有云存储或测试开发环境。在实际使用中,需要根据数据量、访问模式和硬件条件,进一步调整存储配置、网关参数以及制定合适的维护计划(如定期压缩、一致性检查)。对于生产环境,建议进行更充分的性能测试、高可用验证并密切关注项目发展。

发表评论

您的邮箱不会公开。必填项已用 * 标注。