当前位置: 首页 > news >正文

记一次 FastDFS 存储节点迁移:基于 scp 的实践与经验分享

一、背景

某某项目,机房到期,需要迁移至其他机房; 此项目已经运行了3年多,fastdfs累计数据大概在250G 左右,现需要把旧的fastdfs数据迁移到新的fastdfs上;

采用scp物理迁移数据的方式,停机迁移。

image-20240906164022920

二、环境信息

机房操作系统IP版本信息备注
机房Acentos7.9172.16.10.28fastdfs-v6.06源码编译安装
机房Bopeneuler22.03 LTS SP4172.22.33.201fastdfs-v6.10.0,docker-27.1.1,docker-compose-v2.10.2docker-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/

image-20240906175728404

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

五、业务端,测试新平台是否可用

image-20240906181256063

image-20240906181237339

六、其他

  • ⚠️注意事项: 注意FastDFS中有预留空间的概念,在tracker.conf中设置,配置项为:reserved_storage_space,为磁盘总空间的20%,请酌情设置reserved_storage_space这个参数,配合监控系统,及时关注磁盘剩余空间大小
  • Docker 环境下,FastDFS Tracker 必须使用 Host 网络,https://github.com/happyfish100/fastdfs/issues/224

相关文章:

记一次 FastDFS 存储节点迁移:基于 scp 的实践与经验分享

一、背景 某某项目&#xff0c;机房到期&#xff0c;需要迁移至其他机房&#xff1b; 此项目已经运行了3年多&#xff0c;fastdfs累计数据大概在250G 左右&#xff0c;现需要把旧的fastdfs数据迁移到新的fastdfs上&#xff1b; 采用scp物理迁移数据的方式&#xff0c;停机迁移…...

http连接github远程仓库密码问题解决办法

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

LAMP环境下项目部署

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

Visual Studio 2022从外部引入dll导致的问题

这里以我学MapGIS二次开发的一个小demo为例 一、如何引入dll 1、在解决方案资源管理器中&#xff0c;有个引用的选项 2、然后右键点击添加引用 点击之后会出现如下&#xff1a; 3、点击浏览选项&#xff0c;选择想要引入dll的路径&#xff0c;这里我选择下载MapGIS 10的路径 …...

大模型从失败中学习 —— 微调大模型以提升Agent性能

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

10.web应用体系以及windows网络常见操作应用

一、Dos命令 1.启动方式&#xff1a;winR&#xff0c;输入cmd 2.切换盘符/路径&#xff1a;盘符名称&#xff1a; &#xff08;C:) cd 目录 &#xff08;cd B111&#xff09;&#xff08;目录名按table键自动补全&#xff09; 3.查看目录&#xff1a;dir dir /p 分页展示目录及…...

【数据结构与算法 | 灵神题单 | 前后指针(链表)篇】力扣19, 61,1721

1. 力扣19&#xff1a;删除链表的倒数第N个节点 1.1 题目&#xff1a; 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; …...

机器学习之实战篇——MNIST手写数字0~9识别(全连接神经网络模型)

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

ICLR2024: 大视觉语言模型中对象幻觉的分析和缓解

https://arxiv.org/pdf/2310.00754 https://github.com/YiyangZhou/LURE 背景 对象幻觉&#xff1a;生成包含图像中实际不存在的对象的描述 早期的工作试图通过跨不同模式执行细粒度对齐&#xff08;Biten et al.&#xff0c;2022&#xff09;或通过数据增强减少对象共现模…...

数据库系统 第54节 数据库优化器

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

微服务杂谈

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

【Pandas操作2】groupby函数、pivot_table函数、数据运算(map和apply)、重复值清洗、异常值清洗、缺失值处理

1 数据清洗 #### 概述数据清洗是指对原始数据进行处理和转换&#xff0c;以去除无效、重复、缺失或错误的数据&#xff0c;使数据符合分析的要求。#### 作用和意义- 提高数据质量&#xff1a;- 通过数据清洗&#xff0c;数据质量得到提升&#xff0c;减少错误分析和错误决策。…...

如何分辨IP地址是否能够正常使用

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

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 测…...

【数据结构】排序算法系列——希尔排序(附源码+图解)

希尔排序 算法思想 希尔排序&#xff08;Shell Sort&#xff09;是一种改进的插入排序算法&#xff0c;希尔排序的创造者Donald Shell想出了这个极具创造力的改进。其时间复杂度取决于步长序列&#xff08;gap&#xff09;的选择。我们在插入排序中&#xff0c;会发现是对整体…...

c++(继承、模板进阶)

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

【机器学习】从零开始理解深度学习——揭开神经网络的神秘面纱

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解法)

难度&#xff1a;简单 给你一个用字符串表示的正整数 num &#xff0c;请你以字符串形式返回不含尾随零的整数 num 。 示例 1&#xff1a; 输入&#xff1a;num "51230100" 输出&#xff1a;"512301" 解释&#xff1a;整数 "51230100" 有 2 个尾…...

Python GUI入门详解-学习篇

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

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...