一、背景说明

在一些政务、医院、企业内网环境中,服务器通常无法直接访问公网,因此无法通过 yum installpip install 在线安装工具。

本次场景是在 银河麒麟 V10SP3 测试机上,离线安装 s3cmd 2.4.0,然后通过 深信服 AD 硬件 IP 负载 访问后端 X10000 分布式存储资源池 的 S3 服务。

整体访问链路如下:

源测试机 -> 深信服 AD 硬件负载 -> X10000 分布式存储资源池

二、测试环境

项目内容
操作系统银河麒麟 V10SP3
Python 版本Python 2.7
S3 客户端s3cmd 2.4.0
访问协议S3 over HTTP
HTTPSFalse
负载设备深信服 AD 硬件负载
后端存储X10000 分布式存储资源池
测试 Buckets3://fztest-demo

三、离线安装包准备

由于服务器无法访问公网,所以需要提前下载好源码包,然后拷贝到目标服务器。

本次使用的安装包如下:

s3cmd-2.4.0.tar.gz
six-1.16.0.tar.gz
python-magic-0.4.27.tar.gz
python-dateutil-2.6.1.tar.gz

下载地址可以从 PyPI 获取:

https://pypi.org/project/s3cmd/2.4.0/#files
https://pypi.org/project/six/1.16.0/#files
https://pypi.org/project/python-magic/0.4.27/#files
https://pypi.org/project/python-dateutil/2.6.1/#files

注意:这里使用 python-dateutil-2.6.1,不要直接使用 2.8.22.7.5,因为在 Python2.7 离线环境中,它们会尝试下载 setuptools_scm,导致安装失败。(我测试了 2.8.2 和 2.7.5 都安装失败)

四、上传离线安装包

将安装包上传到服务器目录,例如:

/home/squiduser

查看文件:

cd /home/squiduser

ll

示例:

python-dateutil-2.6.1.tar.gz
python-magic-0.4.27.tar.gz
s3cmd-2.4.0.tar.gz
six-1.16.0.tar.gz

在这里插入图片描述

五、安装 Python 依赖

建议先安装依赖,再安装 s3cmd

1. 安装 six

cd /home/squiduser

tar xzf six-1.16.0.tar.gz

cd six-1.16.0

python setup.py install

cd ..

2. 安装 python-dateutil

cd /home/squiduser

tar xzf python-dateutil-2.6.1.tar.gz

cd python-dateutil-2.6.1

python setup.py install

cd ..

安装成功后一般会看到类似输出:

Installed /usr/lib/python2.7/site-packages/python_dateutil-2.6.1-py2.7.egg
Finished processing dependencies for python-dateutil==2.6.1

3. 安装 python-magic

cd /home/squiduser

tar xzf python-magic-0.4.27.tar.gz

cd python-magic-0.4.27

python setup.py install

cd ..

4. 安装 s3cmd

cd /home/squiduser

tar xzf s3cmd-2.4.0.tar.gz

cd s3cmd-2.4.0

python setup.py install

安装完成后验证版本:

s3cmd --version

正常输出:

s3cmd version 2.4.0

在这里插入图片描述

六、验证 Python 模块是否正常

执行:

python - <<'PY'
for m in ("six", "dateutil", "magic"):
    mod = __import__(m)
    print(m, "OK", getattr(mod, "__file__", ""))
PY

正常情况下会看到:

six OK ...
dateutil OK ...
magic OK ...

如果 python-magiclibmagic.so 相关错误,需要安装系统库:

yum install -y file file-libs

七、配置 s3cmd

s3cmd 的配置文件一般位于:

~/.s3cfg

可以执行:

vi ~/.s3cfg

示例配置如下:

[default]
access_key = YOUR_ACCESS_KEY
secret_key = YOUR_SECRET_KEY

host_base = 10.xx.xx.xx:1234
host_bucket = 10.xx.xx.xx:1234

use_https = False
bucket_location = default
signature_v2 = False

在这里插入图片描述

说明:

access_key       S3 访问 AK
secret_key       S3 访问 SK
host_base        S3 服务访问地址
host_bucket      Bucket 访问地址模板
use_https        是否使用 HTTPS
bucket_location  默认区域
signature_v2     是否使用 V2 签名

注意不要把 access_key 写成 sccess_key,否则会导致认证失败(我当时写错了排查了半天)

如果你的对象存储需要 path-style 访问,也可以尝试:

host_bucket = 10.xx.xx.xx:xxxx/%(bucket)s

具体以现场对象存储服务兼容方式为准。

八、基础连通性验证

1. 查看 s3cmd 版本

s3cmd --version

2. 查看当前配置

cat ~/.s3cfg

确认以下字段正确:

access_key
secret_key
host_base
host_bucket
use_https

3. 查看已有 Bucket

s3cmd ls

在这里插入图片描述

九、Bucket 创建测试

创建测试 Bucket:

s3cmd mb s3://fztest-demo

查看 Bucket:

s3cmd ls

在这里插入图片描述

十、小文件上传下载测试

1. 创建测试目录

mkdir -p /tmp/s3test
mkdir -p /tmp/download

2. 创建小文件

echo "hello s3cmd" > /tmp/s3test/test1.txt

查看文件内容:

cat /tmp/s3test/test1.txt

输出:

hello s3cmd

3. 上传小文件

s3cmd put /tmp/s3test/test1.txt s3://fztest-demo/

4. 查看 Bucket 内容

s3cmd ls s3://fztest-demo/

正常可以看到:

s3://fztest-demo/test1.txt

5. 下载文件

s3cmd get s3://fztest-demo/test1.txt /tmp/download/

6. 校验内容

cat /tmp/download/test1.txt

在这里插入图片描述

十一、大对象上传测试

1. 生成 10MiB 测试文件

dd if=/dev/zero of=/tmp/s3test/test10m.bin bs=1M count=10

查看大小:

ls -lh /tmp/s3test/test10m.bin

2. 上传 10MiB 文件

s3cmd put /tmp/s3test/test10m.bin s3://fztest-demo/

3. 查看容量统计

s3cmd du s3://fztest-demo

4. 递归查看对象

s3cmd ls --recursive s3://fztest-demo

在这里插入图片描述

本次现场测试中,10MiB 对象上传成功,容量统计与递归列表结果均符合预期,截图中 10MiB 单对象上传速率约为 67.13 MB/s。该速率只能作为现场参考值,不等同于完整性能压测结论。

十二、大数据传输测试流程

如果需要进一步做大数据传输测试,可以增加 1GB、10GB、并发上传、下载校验等测试。

1. 创建 1GB 文件

dd if=/dev/zero of=/tmp/s3test/test1g.bin bs=1M count=1024

查看文件:

ls -lh /tmp/s3test/test1g.bin

2. 上传 1GB 文件

time s3cmd put /tmp/s3test/test1g.bin s3://fztest-demo/

3. 下载 1GB 文件

time s3cmd get s3://fztest-demo/test1g.bin /tmp/download/

4. MD5 校验

md5sum /tmp/s3test/test1g.bin

md5sum /tmp/download/test1g.bin

两个 MD5 值一致,说明文件传输完整。

十三、10GB 大文件测试

1. 生成 10GB 文件

dd if=/dev/zero of=/tmp/s3test/test10g.bin bs=1M count=10240

查看文件:

ls -lh /tmp/s3test/test10g.bin

2. 上传 10GB 文件

time s3cmd put /tmp/s3test/test10g.bin s3://fztest-demo/

3. 下载 10GB 文件

time s3cmd get s3://fztest-demo/test10g.bin /tmp/download/

4. 校验 MD5

md5sum /tmp/s3test/test10g.bin

md5sum /tmp/download/test10g.bin

十四、并发上传测试

创建多个 1GB 文件:

cd /tmp/s3test

cp test1g.bin test1g_1.bin
cp test1g.bin test1g_2.bin
cp test1g.bin test1g_3.bin
cp test1g.bin test1g_4.bin

执行 4 并发上传:

time (
s3cmd put /tmp/s3test/test1g_1.bin s3://fztest-demo/ &
s3cmd put /tmp/s3test/test1g_2.bin s3://fztest-demo/ &
s3cmd put /tmp/s3test/test1g_3.bin s3://fztest-demo/ &
s3cmd put /tmp/s3test/test1g_4.bin s3://fztest-demo/ &
wait
)

查看结果:

s3cmd ls --recursive s3://fztest-demo

十五、持续上传稳定性测试

可以循环上传同一个文件,观察是否出现中断、超时、速度下降等情况。

for i in {1..20}
do
    echo "===== upload round $i ====="
    time s3cmd put /tmp/s3test/test1g.bin s3://fztest-demo/test1g_round_${i}.bin
done

查看对象数量和容量:

s3cmd du s3://fztest-demo

s3cmd ls --recursive s3://fztest-demo

十六、测试过程中建议观察的系统指标

1. 查看 CPU 和内存

top
free -h

2. 查看网卡流量

sar -n DEV 1

3. 查看磁盘 IO

iostat -x 1

重点关注:

1. 上传速度是否稳定
2. 下载速度是否稳定
3. 是否出现超时
4. 是否出现认证失败
5. CPU 是否打满
6. 网卡是否跑满
7. 磁盘 IO 是否成为瓶颈
8. 大文件 MD5 是否一致
9. 并发上传是否存在失败对象

十七、清理测试数据

测试完成后,可以清理 Bucket 中的数据。

1. 删除所有对象

s3cmd del --recursive s3://fztest-demo

2. 删除 Bucket

s3cmd rb s3://fztest-demo

3. 最终确认

s3cmd ls

确认测试 Bucket 已删除。

我遇到的问题及处理

问题 1:安装 s3cmd 时自动访问 PyPI

报错示例:

Reading https://pypi.org/simple/python-magic/
Download error ...
No local packages or working download links found for python-magic

原因:

离线环境无法访问 PyPI,但 setup.py 会尝试自动下载依赖。

解决方法:

提前下载 python-magic、python-dateutil、six 源码包,先离线安装依赖,再安装 s3cmd。

问题 2:python-dateutil 安装时报 setuptools_scm

报错示例:

Could not find suitable distribution for Requirement.parse('setuptools_scm')

原因:

部分 python-dateutil 版本安装时需要 setuptools_scm,离线环境无法自动下载。

解决方法:

安装 python-dateutil-2.6.1。

问题 3:配置文件中 access_key 写错

错误示例:

sccess_key = xxxxx

正确写法:

access_key = xxxxx

问题 4:host_bucket 配置不兼容

可以先使用:

host_bucket = 10.xx.xx.xx:1234

如果访问 Bucket 异常,可以尝试:

host_bucket = 10.xx.xx.xx:1234/%(bucket)s

具体取决于对象存储服务使用 path-style 还是 virtual-hosted-style。

问题 5:python-magic 报 libmagic.so 找不到

解决方法:

yum install -y file file-libs

更多推荐