跨服务器数据迁移

起因

最近有台云服务器到期, 续费太贵, 打算换一台便宜的, 之前服务器上使用docker部署了几个网站, 涉及到数据和程序迁移的问题, 在此做个记录

持久化数据迁移

首先使用scp指令进行数据卷的迁移, 也就是跨服务器数据拷贝

假设两台机器IP分别为:

  • 服务器A: 114.238.161.75,

  • 服务器B: 143.224.34.73。

比如我在A服务器上操作,需要将B服务器上/home/lk/目录下所有的文件全部复制到本地的/root目录下,命令为:

1
scp -r  root@143.224.34.73:/home/lk /root

具体过程为:

1
2
3
4
5
6
7
8
9
10
[root@XX ~]# scp -r root@43.224.34.73:/home/lk /root
root@43.224.34.73's password:
k2.sql 100% 0 0.0KB/s 00:00
k.zip 100% 176 0.2KB/s 00:00
.bash_history 100% 32 0.0KB/s 00:00
.bash_logout 100% 18 0.0KB/s 00:00
.bashrc 100% 231 0.2KB/s 00:00
k3.sql 100% 0 0.0KB/s 00:00
.bash_profile 100% 193 0.2KB/s 00:00
[root@XX ~]# ls

或者在A服务器上将/root/lk目录下所有的文件传输到B的/home/lk/cpfile目录下,命令为:

1
scp -r /root/lk root@143.224.34.73:/home/lk/cpfile

具体过称为:

1
2
3
4
5
6
7
8
9
10
[root@XX lk]# scp -r /root/lk root@43.224.34.73:/home/lk/cpfile
root@43.224.34.73's password:
k2.sql 100% 0 0.0KB/s 00:00
k3.sql 100% 0 0.0KB/s 00:00
.bash_profile 100% 193 0.2KB/s 00:00
.bash_logout 100% 18 0.0KB/s 00:00
.bash_history 100% 32 0.0KB/s 00:00
k.zip 100% 176 0.2KB/s 00:00
.bashrc 100% 231 0.2KB/s 00:00
[root@XX lk]#

此外 加上-p参数还可以保留原文件的修改时间,访问权限:

1
scp -r  -p root@143.224.34.73:/home/lk /root
scp后台运行
  1. 方式一 使用nohup, 同时尾部加&

    1
    nohup scp -r  -p root@143.224.34.73:/home/lk /root &
    • nohup: 表示忽略hup信号, 终端关闭任务进程也不销毁

    • &: 表示后台运行

  2. 方式二 使用bg+disown

    1
    2
    3
    4
    1.输入ctrl + z 暂停任务
    2.输入jobs查看任务号
    3.使用 bg %任务号 将该任务号放入后台
    4.使用 disown -h %任务号 使后台任务忽略hup信号

    如下:

    image-20210913143619200

    : 执行disown后, 任务被移出jobs, 使用jobs指令已经无法查看该任务, 可以使用ps进程查看指令判断任务是否已经结束:

    1
    ps -aux

Docker容器迁移

  1. 首先 需要将容器保存为镜像

    1
    docker commit 容器名称 镜像名称
  2. 然后 将保存的镜像进行压缩

    1
    2
    3
    4
    docker save -o xxx.tar 镜像名称

    //如果多个镜像同时打包
    docker save [images] [images] > [name.tar]
  3. 使用scp指令将压缩包传至新服务器

    1
    scp -r xxx.tar root@143.224.34.73:/home/lk/cpfile
  4. 在新服务器中进行镜像恢复(新服务器需要先安装Docker)

    1
    2
    3
    docker load < xxx.tar

    docker load -i xxx.tar
  5. 最后创建并运行容器

    1
    docker run --name 容器名 -p 12309:80 -d 镜像名

数据库迁移

详情查看《mysql使用命令导入和导出sql文件

注意事项

docker容器在创建时配置的挂载目录, 如果宿主中挂载的目录不存在则自动创建并写入默认数据, 如果目录已经存在则使用已存在的目录和数据

也就是说我们在进行容器迁移重新运行时, 不用担心原先目录下的数据会被覆盖重写

但是有一点需要注意的是, 原先目录中的配置文件如果包含原服务器中的ip配置, 需要手动修改

比如我们迁移一个wordpress, 在新服务器中使用以下参数进行启动:

1
2
3
4
5
6
7
8
9
10
docker run -id \
--name=wordpress_sex \
-p 7778:80 \
-h wordpress_sex \
-v /root/wordpress/sex_www:/var/www/html \
-e WORDPRESS_DB_HOST=119.33.15.174:3306 \
-e WORDPRESS_DB_USESR=root \
-e WORDPRESS_DB_PASSWORD=123456 \
-e WORDPRESS_DB_NAME=wordpress_sex \
-d wordpress:latest

由于源文件目录和文件未被覆盖重写, 那么上面数据库相关的配置参数不起作用, 我们需要手动进如源文件目录, 对wp-config.php中数据库配置进行修改, 否则无法访问

数据库内网访问保证访问速度

一般来说 我们最好避免直接使用公网ip访问数据库, 而是使用Docker内部桥接网络的方式以容器名替代ip的方式进行访问, 这样既能减少迁移的风险, 又能加快数据的读取

网站的访问流畅度和数据库的访问速度有非常大的关系, 经测试, 使用桥接网络访问数据库的速度远快于使用公网映射访问

大部分人刚开始会将网站的访问速度归结于服务器硬件配置、带宽、程序语言甚至是数据库的数据量太大和sql查询语句不合理上, 殊不知 数据库的访问速度也是重中之重

本文为作者原创 转载时请注明出处 谢谢

B站入口

打赏通道

微信公众号二维码如下:

img

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

0%