
本章目录:
0x01 容灾恢复
1.主从同步异常恢复测试
2.集群数据整体迁移(思路)
0x02 测试优化
3.1 测试工具
3.2 优化参数
0x0n 入坑&出坑
描述: 假如此时 主 由于异常退出, 此时 正常运行,此时当我们想把文件上传到fastdfs时,它将自动通过中配置的地址,选择一个可用的地址进行文件上传,并在主 storage 节点服务恢复后自动同步到其storage数据目录中。
演示流程:
# (1) 故障演示将主 master 10.10.107.225 的 fdfs_storaged 和 fdfs_trackerd.service 进行停止
systemctl stop fdfs_storaged.service fdfs_trackerd.service
# (2) 从客户端查看fdfs storage相关信息。
fdfs_monitor /etc/fdfs/client.conf
# tracker server is 10.10.107.226:22122 # 此时发现 tracker server 变成slave的地址。
# Storage 1:
# id = 10.10.107.225
# ip_addr = 10.10.107.225 OFFLINE # 存储离线状态
# http domain = file1.weiyigeek.top
# Storage 2:
# id = 10.10.107.226
# ip_addr = 10.10.107.226 ACTIVE
# http domain = file2.weiyigeek.top
# (3) 客户端上传文件到fastdfs中。
fdfs_upload_file /etc/fdfs/client.conf ip.txt
# group1/M00/00/00/Cgpr4WF_PduAOZWzAAACU_pTy9w129.txt
# (4) slave 节点 storage 已正常存储, Master 肯定没有存储到。
Slave$ ls /home/fdfs/storage/data/00/00/Cgpr4WF_PduAOZWzAAACU_pTy9w129.txt
/home/fdfs/storage/data/00/00/Cgpr4WF_PduAOZWzAAACU_pTy9w129.txt
Master$ ls /home/fdfs/storage/data/00/00/Cgpr4WF_PduAOZWzAAACU_pTy9w129.txt
ls: cannot access '/home/fdfs/storage/data/00/00/Cgpr4WF_PduAOZWzAAACU_pTy9w129.txt': No such file or directory
# (5) 此时启动master节点的fdfs_storaged.service 和 fdfs_trackerd.service
systemctl start fdfs_storaged.service fdfs_trackerd.service
# (6) 验证是否slave节点的文件是否同步到master过来。
Master$ cat /home/fdfs/storage/data/sync/binlog.000
1635728859 c M00/00/00/Cgpr4WF_PduAOZWzAAACU_pTy9w129.txt
Master$ find /home/fdfs/storage/data/ -name *.png -ctime -0.5 -exec ls -lh {} \;
-rw-r--r-- 1 fdfs fdfs 295K Oct 31 16:08 /home/fdfs/storage/data/00/00/Cgpr4WF_PduAOZWzAAACU_pTy9w129.txt
描述: 当我们系统需要从一个地方迁移到另一个地方并且需要数据保持不变,假如此时ip地址和网络情况不一样了,通常我会将FastDFS存储的目录整体拷贝过去,该方法简单粗暴且有效,这样文件在文件系统中的位置也不会发生变化,访问文件时文件地址只需要修改为迁移后的ip即可。
解决方案流程:
Step 1.在需要迁移的那边用同样的docker镜像构建FastDFS文件系统,容器映射目录、http访问端口尽量保持不变。
Step 2.首先将tracker目录下的data文件夹直接拷贝过去,覆盖新的文件系统中的tracker中的data目录,进行如下的修改:
# 将下面文件中的旧ip改为新地址的ip即可。
storage_groups_new.dat
storage_servers_new.dat
storage_sync_timestamp.dat
Step 3.其次将storage目录下的data文件夹之际拷贝过去,覆盖新的文件系统中的storage中的data目录,进行如下的修改(可):
ls data/
.data_init_flag
sync/${IP_addr}_${port}.mark
将上述文件中的旧ip改为新地址的ip即可。
Step 4.将上面都修改完成之后,启动集群,关闭防火墙,在新的服务器环境下通过url访问文件系统中的文件,即可获取到文件。
Step 5.假如迁移前后ip地址和端口不变只是系统进行更换时,我们配置好服务后将可直接将data目录拷贝过去,不需要修改任何信息。
描述: 我们采用 fastdfs 客户端命令 fdfs_upload_file 和 xargs 并发执行工具,上传测试样本 10W 张表情包图片 ,大小在 8KB–128KB 之间,我们分别进行上传和下载测试。
# 上传测试命令:
pwd # /opt/photo
time ls | xargs -n 1 -I {} -P 256 sh -c "/usr/bin/fdfs_upload_file /etc/fdfs/client.conf {}"
# 下载测试命令:
time cat url.log | xargs -n 1 -I {} -P 256 sh -c "wget {}"
测试结果 使用 FastDFS 自带的上传测试工具和 xargs 并发执行工具,通过 xargs -P 参数指定的并发请求数,测得结果为单机性能在网络环境稳定的情况下可以达到 5000 并发上传请求。10W 张图片上传时间耗时 2 分 11 秒左右。使用定时脚本持续测试,总测试上传 100W 张图片。分析 tracker 服务器和 storage 服务器的日志,无论上传还是下载均未发现错误和异常,性能和稳定性较好。
描述: 根据业务需求和线上环境调整一下参数,可充分发挥 FastDFS 文件系统的性能.
# 接收请求的线程数数量
accept_threads=1
# work thread count, should <= max_connections
# default value is 4
# since V2.00
# 工作线程数量,应当小于等于最大连接数
work_threads=4
# min buff size
# default value 8KB
# 最小缓冲大小,默认值为 8KB
min_buff_size = 8KB
# max buff size
# default value 128KB
# 最大缓冲大小,默认值为 128KB
max_buff_size = 128KB
# thread stack size, should >= 64KB
# default value is 256KB
# 线程栈的大小,应当大于 64KB,默认为 256KB
thread_stack_size = 256KB
# if use connection pool
# default value is false
# since V4.05
# 是否使用连接池
use_connection_pool = false
# connections whose the idle time exceeds this time will be closed
# unit: second
# default value is 3600
# since V4.05
# 连接池的最大空闲时间
connection_pool_max_idle_time = 3600
问题1.在启动Fastdfs时Storage启动报one MUST be an inner IP and another is a outer IP, or two different types of inner IP addresses错误!
错误信息:
ERROR - file: ../client/client_func.c, line: 168, conf file: /etc/fdfs/storage.conf, tracker_s
erver is invalid, error info: invalid ip addresses 10.10.107.225 and 10.10.107.226, one MUST be an inner IP and another is a outer IP, or two different types of inner IP addresses
[2021-10-30 15:27:42] CRIT - exit abnormally!
错误原因: 由于/etc/fdfs/storage.conf中的 stracker_server = 10.10.107.225,10.10.107.226:22122 配置了同一个网段的地址,而非一个是内部地址,另外一个是外部地址。
解决办法:
# tracker server 地址以及端口(如果有多个则填写多个tracker_server)
tracker_server = 10.10.107.225:22122
tracker_server = 10.10.107.226:22122
问题2.tracker端工具链接storage时报无法连接到 storage 服务器
错误信息:
[2019-07-25 10:40:54] ERROR - file: ../client/storage_client.c, line: 996, fdfs_recv_response fail, result: 107
upload file fail, error no: 107, error info: Transport endpoint is not connected
[2019-07-25 10:40:54] ERROR - file: tracker_proto.c, line: 37, server: 10.20.172.192:23000, recv data fail, errno: 107, error info: Transport endpoint is not connected
解决办法: 首先是在 tracker.conf 配置文件中添加允许访问的 IP ,其次是系统添加防火墙规则,例如: ufw allow 23000/tcp
问题3. 当 storage 服务器磁盘存储空间用尽时报tracker_query_storage fail, error no: 28, error info: No space left on device错误。
错误信息:
[2019-07-26 16:16:45] ERROR - file: tracker_proto.c, line: 48, server: 10.10.107.232:22122, response status 28 != 0
[2019-07-26 16:16:45] ERROR - file: ../client/tracker_client.c, line: 907, fdfs_recv_response fail, result: 28
tracker_query_storage fail, error no: 28, error info: No space left on device
错误原因: 当 storage 服务器设定的上传存储目录所在的分区磁盘用尽将会出现无剩余空间的错误日志
解决办法: 增加 storage 存储磁盘空间或者临时解决办法设置tracker配置文件中的reserved_storage_space = 10%参数。
问题4.当 storage 服务器磁盘存储空间用尽时报bind port 22122 failed, errno: 98, error info: Address already in use.错误
错误信息: 使用service fdfs_trackerd restart重启 tracker 或者 storage 服务时会报错,会提示端口已经占用。
[2019-07-25 10:36:55] INFO - FastDFS v5.12, base_path=/home/dfs, run_by_group=, run_by_user=, connect_timeout=10s, network_timeout=60s, port=22122, bind_addr=, max_connections=1024, accept_threads=1, work_threads=4, min_buff_size=8,192, max_buff_size=131,072, store_lookup=2, store_group=, store_server=0, store_path=0, reserved_storage_space=10.00%, download_server=0, allow_ip_count=-1, sync_log_buff_interval=10s, check_active_interval=120s, thread_stack_size=256 KB, storage_ip_changed_auto_adjust=1, storage_sync_file_max_delay=86400s, storage_sync_file_max_time=300s, use_trunk_file=0, slot_min_size=256, slot_max_size=16 MB, trunk_file_size=64 MB, trunk_create_file_advance=0, trunk_create_file_time_base=02:00, trunk_create_file_interval=86400, trunk_create_file_space_threshold=20 GB, trunk_init_check_occupying=0, trunk_init_reload_from_binlog=0, trunk_compress_binlog_min_interval=0, use_storage_id=0, id_type_in_filename=ip, storage_id_count=0, rotate_error_log=0, error_log_rotate_time=00:00, rotate_error_log_size=0, log_file_keep_days=0, store_slave_file_use_link=0, use_connection_pool=0, g_connection_pool_max_idle_time=3600s
[2019-07-25 10:36:55] ERROR - file: sockopt.c, line: 868, bind port 22122 failed, errno: 98, error info: Address already in use.
[2019-07-25 10:36:55] CRIT - exit abnormally! 解决办法:
# 分别暂停 fdfs_trackerd 和 fdfs_storaged 服务即可。
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf stop
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf stop
# 最终解决的方案就是使用 kill -9 命令杀死 tracker 服务或者 storage 服务,然后再重新启动相应服务即可。 (不到万不得已千万不要用)
问题5.当启动storage服务器报fdht_client/fdht_func.c, line: 361, invalid group count: 0 <= 0!错误
错误信息:
2021-10-30 23:06:15] ERROR - file: fdht_client/fdht_func.c, line: 361, invalid group count: 0 &lt;= 0!
[2021-10-30 23:06:15] CRIT - exit abnormally!
错误原因: 由于 fast_dht 未正确配置或者启动导致。
解决办法: 在 storage.conf 中进行配置禁用重复文件校验。
check_file_duplicate = 0
file_signature_method = hash
keep_alive = 0
问题6.启动 Nginx 时报 load conf file "/etc/fdfs/mod_fastdfs.conf" fail, ret code: 2错误
错误信息:
[2021-10-30 21:51:31] ERROR - file: shared_func.c, line: 1214, file /etc/fdfs/mod_fastdfs.conf not exist
[2021-10-30 21:51:31] ERROR - file: /usr/local/src/fastdfs-nginx-module/src/common.c, line: 163, load conf file &quot;/et
c/fdfs/mod_fastdfs.conf&quot; fail, ret code: 2
2021/10/30 21:51:31 [alert] 1302417#0: worker process 1302418 exited with fatal code 2 and cannot be respawned
解决办法: 将拉取的fastdfs-nginx-module项目中的mod_fastdfs.conf复制到/etc/fdfs中。
cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/mod_fastdfs.conf
问题7.启动 Nginx 时报 the "user" directive makes sense only if the master process runs with super-user privileges警告
错误信息:
$ more /usr/local/nginx/logs/error.log
2021/10/30 21:51:31 [warn] 1302406#0: the &quot;user&quot; directive makes sense only if the master process runs with super-us
er privileges, ignored in /usr/local/nginx/conf/nginx.conf:2
ngx_http_fastdfs_process_init pid=1302418 错误原因: 由于我是采用systemd管理的nginx服务而我在其unit service文件中指定一个与nginx.conf配置文件中的相同的低权限用户。
解决办法: 在 /usr/lib/systemd/system/nginx.service 权限指定的 User 和 Group 字段或者将其设置root。问题7.在进行FastDHT安装配置时安装berkeley-dbb报错cp: cannot stat 'bdb-sql': No such file or directory。
问题信息:
问题原因: 18.1.40 版本的BUG
解决办法:
问题信息:
解决办法:
# (1) 解决db.h文件不存在的错误问题
vim /usr/local/src/fastdht/make.sh
27 行: CFLAGS=&#39;-Wall -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -I/usr/local/berkeley-db/include/ -L/usr/local/berkeley-db/lib/&#39;
# (2) 拷贝库文件并重新加载库文件否则启动时将会报错
cp /usr/local/berkeley-db/lib/libdb-18.so /usr/lib/ &amp;&amp; cp /usr/local/berkeley-db/lib/libdb-18.so /usr/lib64/
ldconfig
# ldd /usr/local/bin/fdhtd 错误信息:
more /home/fdfs/storage/logs/storaged.log
[2021-11-02 21:17:23] ERROR - file: fdht_client/fdht_func.c, line: 361, invalid group count: 0 &lt;= 0!
[2021-11-02 21:17:23] CRIT - exit abnormally! 错误原因: 通常两个原因,FastDHT 未配置成功(需要进一步验证是否正常运行),到成功运行工作时,验证storage接入FastDHT的参数是否有误。
$ cat /etc/fdht/fdht_servers.conf
group_count = 1
group0 = 10.10.107.225:11411
# group_count = 3
# group0 = CentOSA:11411
# group1 = CentOSB:11411
# group2 = CentOSC:11411
$ cat /etc/fdht/fdht_servers.conf
...
check_file_duplicate = 1
file_signature_method = hash
key_namespace = FastDFS
keep_alive = 1
#include /etc/fdht/fdht_servers.conf #我是此处出错导致。
... 至此本章完毕,下节更精彩。
欢迎各位志同道合的朋友一起学习交流,如文章有误请在下方留下您宝贵的经验知识,个人邮箱地址【master#weiyigeek.top】
更多文章来源: https://weiyigeek.top 【WeiyiGeek Blog - 为了能到远方,脚下的每一步都不能少】

从错误中比从混乱中易于发现真理。
如果你觉得这个专栏还不错的,请给这篇专栏点个赞、投个币、收个藏、关个注,转个发,这将对我有很大帮助。