记一次 FastDFS 存储节点迁移:基于 scp 的实践与经验分享
一、背景
某某项目,机房到期,需要迁移至其他机房; 此项目已经运行了3年多,fastdfs累计数据大概在250G 左右,现需要把旧的fastdfs数据迁移到新的fastdfs上;
采用scp物理迁移数据的方式,停机迁移。
二、环境信息
机房 | 操作系统 | IP | 版本信息 | 备注 |
---|---|---|---|---|
机房A | centos7.9 | 172.16.10.28 | fastdfs-v6.06 | 源码编译安装 |
机房B | openeuler22.03 LTS SP4 | 172.22.33.201 | fastdfs-v6.10.0,docker-27.1.1,docker-compose-v2.10.2 | docker-compose部署 |
三、迁移前准备
3.1 在B机房,使用docker-compose部署fastdfs环境
docker,docker-compose 环境部署过程省略;
⚠️ 需要注意的是,fastdfs采用的宿主机网络直接通信的,请修改IP为宿主机IP地址
- 创建fastdfs工作目录
vim /home/application/Middleware/fastdfs/docker-compose.yml
- 编辑docker-compose.yml
version: '3'
services:fastdfs:image: srebro/fastdfs:6.10.0container_name: fastdfsrestart: alwaysvolumes:- "/home/application/Middleware/fastdfs/fastdfs_data:/home/dfs/data"ports: - "22122:22122"- "23000:23000"environment:FASTDFS_IPADDR: "172.22.33.201"network_mode: host
- 运行docker-compose创建容器
$ docker-compose up -d
$ docker-compose ps
NAME COMMAND SERVICE STATUS PORTS
fastdfs "/home/fastdfs.sh" fastdfs running
- 模拟测试上传下载
#登录到fastdfs容器内部
$ docker exec -it fastdfs bash#创建client.conf 配置文件
$ cat > /etc/fdfs/client.conf << EOF
base_path=/tmp
tracker_server=172.22.33.201:22122
EOF#创建一个测试文件,模拟写入一些内容$ cat > /tmp/test << EOF
hello, srebro.cn | 运维小弟
EOF#使用fdfs_upload_file,上传测试文件
$ fdfs_upload_file /etc/fdfs/client.conf /tmp/test
group1/M00/00/05/rBYhyWbayPGAWUFtAAAAIAqGCgY7719471#看到返回group1/M00/00/05/rBYhyWbayPGAWUFtAAAAIAqGCgY7719471, 在 fastdfs 数据目录上相应目录中均能查看到该文件$ ls -l /home/dfs/data/00/05/rBYhyWbayPGAWUFtAAAAIAqGCgY7719471
-rw-r--r-- 1 root root 32 Sep 6 17:18 /home/dfs/data/00/05/rBYhyWbayPGAWUFtAAAAIAqGCgY7719471$ cat /home/dfs/data/00/05/rBYhyWbayPGAWUFtAAAAIAqGCgY7719471
hello, srebro.cn | 运维小弟
- 测试完没有问题之后,停掉新的fastdfs服务,准备接收迁移旧数据;
⚠️ 需要保持fastdfs_data 目录下内容为空,因为我们是采用直接物理拷贝的方式,把数据直接拷贝到fastdfs_data 目录下
$ cd /home/application/Middleware/fastdfs/
$ docker-compose down
[+] Running 1/1
⠿ Container fastdfs Removed # 删除 fastdfs 数据目录下的所有内容
# 删除前的fastdfs 数据目录下的所有内容
$ ls -l /home/application/Middleware/fastdfs/fastdfs_data/
总用量 1056
drwxr-xr-x 258 root root 4096 5月 16 22:24 00
drwxr-xr-x 258 root root 4096 5月 16 22:24 01
drwxr-xr-x 258 root root 4096 5月 16 22:24 02
drwxr-xr-x 258 root root 4096 5月 16 22:24 03
drwxr-xr-x 258 root root 4096 5月 16 22:24 04
drwxr-xr-x 258 root root 4096 5月 16 22:24 05
drwxr-xr-x 258 root root 4096 5月 16 22:24 06
drwxr-xr-x 258 root root 4096 5月 16 22:24 07
drwxr-xr-x 258 root root 4096 5月 16 22:24 08
drwxr-xr-x 258 root root 4096 5月 16 22:24 09
drwxr-xr-x 258 root root 4096 5月 16 22:24 0A
drwxr-xr-x 258 root root 4096 5月 16 22:24 0B
drwxr-xr-x 258 root root 4096 5月 16 22:24 0C
drwxr-xr-x 258 root root 4096 5月 16 22:24 0D
drwxr-xr-x 258 root root 4096 5月 16 22:24 0E
...........................
-rw-r--r-- 1 root root 2 9月 6 17:10 fdfs_storaged.pid
-rw-r--r-- 1 root root 2 9月 6 17:10 fdfs_trackerd.pid
drwxr-xr-x 258 root root 4096 5月 16 22:24 FE
drwxr-xr-x 258 root root 4096 5月 16 22:24 FF
-rw-r--r-- 1 root root 48 9月 4 16:40 storage_changelog.dat
-rw-r--r-- 1 root root 240 9月 4 16:40 storage_groups_new.dat
-rw-r--r-- 1 root root 1366 9月 4 16:40 storage_servers_new.dat
-rw-r--r-- 1 root root 1083 9月 6 17:20 storage_stat.dat
-rw-r--r-- 1 root root 23 9月 4 16:40 storage_sync_timestamp.dat
drwxr-xr-x 2 root root 4096 5月 16 22:24 sync
...........................# 删除 fastdfs 数据目录下的所有内容
$ rm -rf /home/application/Middleware/fastdfs/fastdfs_data/*# 删除后的fastdfs 数据目录下的所有内容
$ ls -l /home/application/Middleware/fastdfs/fastdfs_data/
总用量 0
3.2 测试A-B机房网络是否联通
#A机房服务器上
[root@localhost ~]# ping 172.22.33.201 -c 8
PING 172.22.33.201 (172.22.33.201) 56(84) bytes of data.
64 bytes from 172.22.33.201: icmp_seq=1 ttl=63 time=0.365 ms
64 bytes from 172.22.33.201: icmp_seq=2 ttl=63 time=0.372 ms
64 bytes from 172.22.33.201: icmp_seq=3 ttl=63 time=0.389 ms
64 bytes from 172.22.33.201: icmp_seq=4 ttl=63 time=0.368 ms
64 bytes from 172.22.33.201: icmp_seq=5 ttl=63 time=0.372 ms
64 bytes from 172.22.33.201: icmp_seq=6 ttl=63 time=0.396 ms
64 bytes from 172.22.33.201: icmp_seq=7 ttl=63 time=0.292 ms
64 bytes from 172.22.33.201: icmp_seq=8 ttl=63 time=0.339 ms--- 172.22.33.201 ping statistics ---
8 packets transmitted, 8 received, 0% packet loss, time 6999ms
rtt min/avg/max/mdev = 0.292/0.361/0.396/0.037 ms#B机房服务器上
[root@localhost 05]# ping 172.16.10.28 -c 8
PING 172.16.10.28 (172.16.10.28) 56(84) bytes of data.
64 bytes from 172.16.10.28: icmp_seq=1 ttl=63 time=0.260 ms
64 bytes from 172.16.10.28: icmp_seq=2 ttl=63 time=0.378 ms
64 bytes from 172.16.10.28: icmp_seq=3 ttl=63 time=0.393 ms
64 bytes from 172.16.10.28: icmp_seq=4 ttl=63 time=0.392 ms
64 bytes from 172.16.10.28: icmp_seq=5 ttl=63 time=0.356 ms
64 bytes from 172.16.10.28: icmp_seq=6 ttl=63 time=0.349 ms
64 bytes from 172.16.10.28: icmp_seq=7 ttl=63 time=0.363 ms
64 bytes from 172.16.10.28: icmp_seq=8 ttl=63 time=0.293 ms--- 172.16.10.28 ping statistics ---
8 packets transmitted, 8 received, 0% packet loss, time 7184ms
rtt min/avg/max/mdev = 0.260/0.348/0.393/0.044 ms
四、停机迁移
4.1 登录A机房服务器上,停止🛑旧的fastdfs服务
#停止fastdfs服务
$ /etc/init.d/fdfs_storaged stop
Stopping fdfs_storaged (via systemctl): [ 确定 ]$ /etc/init.d/fdfs_trackerd stop
Stopping fdfs_trackerd (via systemctl): [ 确定 ]#查看是否还存在fdfs进程
$ ps -ef | grep fdfs | grep -v grep
#返回为空,表示fastdfs已经退出了
4.1 登录A 机房,旧的fastdfs服务器上
只需要拷贝数据目录下,两字符的目录,其他的不要
#切换到数据目录下
$ cd /home/data/fdfs/data# 查看数据目录下所有两字符目录个数【包含子目录】
$ ls -l ./[0-9A-F][0-9A-F] | wc -l
66303#scp拷贝所有数据到新的服务器上
scp -rp /home/data/fdfs/data/[0-9A-F][0-9A-F] root@172.22.33.201:/home/application/Middleware/fastdfs/fastdfs_data/
4.2 登录B 机房,新的fastdfs服务器上
# 验证新的fastdfs服务器上,数据目录下所有两字符目录个数【包含子目录】
$ cd /home/application/Middleware/fastdfs/fastdfs_data/
$ ls -l ./[0-9A-F][0-9A-F] | wc -l
66303
两边数据保持一致,✅ 完成数据的迁移
4.3 启动 新的fastdfs服务器
$ cd /home/application/Middleware/fastdfs$ docker-compose up -d$ docker-compose ps
NAME COMMAND SERVICE STATUS PORTS
fastdfs "/home/fastdfs.sh" fastdfs running
五、业务端,测试新平台是否可用
六、其他
- ⚠️注意事项: 注意FastDFS中有预留空间的概念,在tracker.conf中设置,配置项为:reserved_storage_space,为磁盘总空间的20%,请酌情设置reserved_storage_space这个参数,配合监控系统,及时关注磁盘剩余空间大小
- Docker 环境下,FastDFS Tracker 必须使用 Host 网络,https://github.com/happyfish100/fastdfs/issues/224
相关文章:

记一次 FastDFS 存储节点迁移:基于 scp 的实践与经验分享
一、背景 某某项目,机房到期,需要迁移至其他机房; 此项目已经运行了3年多,fastdfs累计数据大概在250G 左右,现需要把旧的fastdfs数据迁移到新的fastdfs上; 采用scp物理迁移数据的方式,停机迁移…...

http连接github远程仓库密码问题解决办法
目录 一、问题:使用http连接失败 二、解决办法:使用个人访问令牌。 1、生成访问令牌: 步骤 1: 登录 GitHub 步骤 2: 进入设置页面 步骤 3: 生成新的访问令牌 步骤 4: 配置访问令牌 步骤 5: 复制令牌 2. 使用访问令牌 一、问题&#…...

LAMP环境下项目部署
目录 目录 1、创建一台虚拟机 centos 源的配置 备份源 修改源 重新加载缓存 安装软件 2、关闭防火墙和selinux 查看防火墙状态 关闭防火墙 查看SELinux的状态 临时关闭SELinux 永久关闭SELinux:编辑SELinux的配置文件 配置文件的修改内容 3、检查系统…...

Visual Studio 2022从外部引入dll导致的问题
这里以我学MapGIS二次开发的一个小demo为例 一、如何引入dll 1、在解决方案资源管理器中,有个引用的选项 2、然后右键点击添加引用 点击之后会出现如下: 3、点击浏览选项,选择想要引入dll的路径,这里我选择下载MapGIS 10的路径 …...

大模型从失败中学习 —— 微调大模型以提升Agent性能
人工智能咨询培训老师叶梓 转载标明出处 以往的研究在微调LLMs作为Agent时,通常只使用成功的交互轨迹,而丢弃了未完成任务的轨迹。这不仅造成了数据和资源的浪费,也可能限制了微调过程中可能的优化路径。论文《Learning From Failure: Integ…...

10.web应用体系以及windows网络常见操作应用
一、Dos命令 1.启动方式:winR,输入cmd 2.切换盘符/路径:盘符名称: (C:) cd 目录 (cd B111)(目录名按table键自动补全) 3.查看目录:dir dir /p 分页展示目录及…...

【数据结构与算法 | 灵神题单 | 前后指针(链表)篇】力扣19, 61,1721
1. 力扣19:删除链表的倒数第N个节点 1.1 题目: 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5]示例 2: …...

机器学习之实战篇——MNIST手写数字0~9识别(全连接神经网络模型)
机器学习之实战篇——Mnist手写数字0~9识别(全连接神经网络模型) 文章传送MNIST数据集介绍:实验过程实验环境导入模块导入MNIST数据集创建神经网络模型进行训练,测试,评估模型优化 文章传送 机器学习之监督学习&#…...

ICLR2024: 大视觉语言模型中对象幻觉的分析和缓解
https://arxiv.org/pdf/2310.00754 https://github.com/YiyangZhou/LURE 背景 对象幻觉:生成包含图像中实际不存在的对象的描述 早期的工作试图通过跨不同模式执行细粒度对齐(Biten et al.,2022)或通过数据增强减少对象共现模…...

数据库系统 第54节 数据库优化器
数据库优化器是数据库管理系统(DBMS)中的一个关键组件,它的作用是分析用户的查询请求,并生成一个高效的执行计划。这个执行计划定义了如何访问数据和执行操作,以最小化查询的执行时间和资源消耗。以下是数据库优化器的…...

微服务杂谈
几个概念 还是第一次听说Spring Cloud Alibaba ,真是孤陋寡闻了,以前只知道 SpringCloud 是为了搭建微服务的,spring boot 则是快速创建一个项目,也可以是一个微服务 。那么SpringCloud 和 Spring boot 有什么区别呢?S…...

【Pandas操作2】groupby函数、pivot_table函数、数据运算(map和apply)、重复值清洗、异常值清洗、缺失值处理
1 数据清洗 #### 概述数据清洗是指对原始数据进行处理和转换,以去除无效、重复、缺失或错误的数据,使数据符合分析的要求。#### 作用和意义- 提高数据质量:- 通过数据清洗,数据质量得到提升,减少错误分析和错误决策。…...

如何分辨IP地址是否能够正常使用
在互联网的日常使用中,无论是进行网络测试、网站访问、数据抓取还是远程访问,一个正常工作的IP地址都是必不可少的。然而,由于各种原因,IP地址可能无法正常使用,如被封禁、网络连接问题或配置错误等。本文将详细介绍如…...

Sqoop 数据迁移
Sqoop 数据迁移 一、Sqoop 概述二、Sqoop 优势三、Sqoop 的架构与工作机制四、Sqoop Import 流程五、Sqoop Export 流程六、Sqoop 安装部署6.1 下载解压6.2 修改 Sqoop 配置文件6.3 配置 Sqoop 环境变量6.4 添加 MySQL 驱动包6.5 测试运行 Sqoop6.5.1 查看Sqoop命令语法6.5.2 测…...

【数据结构】排序算法系列——希尔排序(附源码+图解)
希尔排序 算法思想 希尔排序(Shell Sort)是一种改进的插入排序算法,希尔排序的创造者Donald Shell想出了这个极具创造力的改进。其时间复杂度取决于步长序列(gap)的选择。我们在插入排序中,会发现是对整体…...

c++(继承、模板进阶)
一、模板进阶 1、非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。 非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中…...

【机器学习】从零开始理解深度学习——揭开神经网络的神秘面纱
1. 引言 随着技术的飞速发展,人工智能(AI)已从学术研究的实验室走向现实应用的舞台,成为推动现代社会变革的核心动力之一。而在这一进程中,深度学习(Deep Learning)因其在大规模数据处理和复杂问题求解中的卓越表现,迅速崛起为人工智能的最前沿技术。深度学习的核心是…...

WebLogic 笔记汇总
WebLogic 笔记汇总 一、weblogic安装 1、创建用户和用户组 groupadd weblogicuseradd -g weblogic weblogic # 添加用户,并用-g参数来制定 web用户组passwd weblogic # passwd命令修改密码# 在文件末尾增加以下内容 cat >>/etc/security/limits.conf<<EOF web…...

leetcode:2710. 移除字符串中的尾随零(python3解法)
难度:简单 给你一个用字符串表示的正整数 num ,请你以字符串形式返回不含尾随零的整数 num 。 示例 1: 输入:num "51230100" 输出:"512301" 解释:整数 "51230100" 有 2 个尾…...

Python GUI入门详解-学习篇
一、简介 GUI就是图形用户界面的意思,在Python中使用PyQt可以快速搭建自己的应用,自己的程序看上去就会更加高大上。 有时候使用 python 做自动化运维操作,开发一个简单的应用程序非常方便。程序写好,每次都要通过命令行运行 pyt…...

QT5实现https的post请求(QNetworkAccessManager、QNetworkRequest和QNetworkReply)
QT5实现https的post请求 前言一、一定要有sslErrors处理1、问题经过2、代码示例 二、要利用抓包工具1、问题经过2、wireshark的使用3、利用wireshark查看服务器地址4、利用wireshark查看自己构建的请求报文 三、返回数据只能读一次1、问题描述2、部分代码 总结 前言 QNetworkA…...

vscode 使用git bash,路径分隔符缺少问题
window使用bash --login -i 使用bash时候,在系统自带的terminal里面进入,测试conda可以正常输出,但是在vscode里面输入conda发现有问题 bash: C:\Users\marswennaconda3\Scripts: No such file or directory实际路径应该要为 C:\Users\mars…...

F12抓包10:UI自动化 - Elements(元素)定位页面元素
课程大纲 1、前端基础 1.1 元素 元素是构成HTML文档的基本组成部分之一,定义了文档的结构和内容,比如段落、标题、链接等。 元素大致分为3种:基本结构、自闭合元素(self-closing element)、嵌套元素。 1、基本结构&…...

android 删除系统原有的debug.keystore,系统运行的时候,重新生成新的debug.keystore,来完成App的运行。
1、先上一个图:这个是keystore无效的原因 之前在安装这个旧版本android studio的时候呢,安装过一版最新的android studio,然后通过模拟器跑过测试的demo。 2、运行旧的项目到模拟器的时候,就报错了: Execution failed…...

SQL入门题
作者SQL入门小白,此栏仅是记录一些解题过程 1、题目 用户访问表users,记录了用户id(usr_id)和访问日期(log_date),求出连续3天以上访问的用户id。 2、解答过程 2.1数据准备 通过navicat创建数据…...

Python实战:实战练习案例汇总
Python实战:实战练习案例汇总 **Python世界系列****Python实践系列****Python语音处理系列** 本文逆序更新,汇总实践练习案例。 Python世界系列 Python世界:力扣题43大数相乘算法实践Python世界:求解满足某完全平方关系的整数实…...

zabbix之钉钉告警
钉钉告警设置 我们可以将同一个运維组的人员加入到同一个钉钉工作群中,当有异常出现后,Zabbix 将告警信息发送到钉钉的群里面,此时,群内所有的运维人员都能在第一时间看到这则告警详细。 Zabbix 监控系统默认没有开箱即用…...

《OpenCV计算机视觉》—— 对图片进行旋转的两种方法
文章目录 一、用numpy库中的方法对图片进行旋转二、用OpenCV库中的方法对图片进行旋转 一、用numpy库中的方法对图片进行旋转 numpy库中的 np.rot90 函数方法可以对图片进行旋转 代码实现如下: import cv2 import numpy as np# 读取图片 img cv2.imread(wechat.jp…...

Python 错误 ValueError 解析,实际错误实例详解 (一)
文章目录 前言Python 中错误 ValueError: No JSON object Could Be Decoded在 Python 中解码 JSON 对象将 JSON 字符串解码为 Python 对象将 Python 对象编码为 JSON 字符串Python 中错误 ValueError: Unsupported Pickle Protocol: 3Python 中的 Pickling 和 UnpicklingPython…...

[java][git]上传本地代码及更新代码到GitHub教程
上传本地代码及更新代码到GitHub教程 上传本地代码 第一步:去github上创建自己的Repository,创建页面如下图所示: 红框为新建的仓库的https地址 第二步: echo "# Test" >> README.md 第三步:建立g…...