服务器迁移搬家全流程&无缝平滑&可行性方案记录

阅读23评论0

网站搬家很轻松,服务器迁移很烦人,时隔多年没搞过服务器迁移了,有点生疏了,记录一下。

各方面原因吧,服务器更换云服务商了,得迁移,想想都头大。。

大方面讲就是:文件迁移、数据库迁移、以及任务调度迁移。但说谁都会说。。。是吧。。。

分阶段整理下,以备不时之需。

阶段一

新服务器各种环境的准备,老生常谈了,不多说了。

不过要注意,新服务器环境如何有差异,注意代码的兼容。

阶段二

mysql数据库的迁移,这块头大。有人说,data文件备份拷过去就行了。

试过,data文件备份需要关掉mysql,但业务不能停止了,要保证所有业务的正常运行。

咋办,凉拌呗。笨方法搞吧,全量 + 增量 + 主从呗。

show master status;

记录好bin log的文件名称和pos位置,后面要用

mysqldump导出下:

mysqldump --single-transaction --master-data=2 -uroot -p databaseName > databaseName.sql

再把备份同步到新服务器:

scp -P 22 databaseName.sql root@1.1.1.1:/www/

1.1.1.1是新服务器IP,/www/同步到新服务器的位置。

新服务器导入备份的SQL:

source databaseName.sql

数据体量大的时候很慢,可以暂时关闭下外键约束和unique检查(关闭的话,请务必保证数据的合法性)。

SET foreign_key_checks = 0;
SET unique_checks = 0;

就这样机械式的导出->同步->导入,把十几个库小100G的数据搞完了。

阶段三

增量同步,为避免主从的时候,新旧数据差异,需要增量追一下数据

mysqlbinlog --start-position=420373249 /www/server/data/mysql-bin.000088 > /www/binlog.sql
sed -i 's/^INSERT INTO/INSERT IGNORE INTO/' /www/binlog.sql
mysql -uroot -p < /www/binlog.sql

然后同步到新服务器,再导入,和上面方法一样。

阶段四

开启主从同步,开启前最好再跑一下增量同步,确保两边数据的一致性,记得记录最后跑增量时候的pos位置。

老服务器创建主从用的用户和权限:

CREATE USER 'slave1'@'1.1.1.1' IDENTIFIED with mysql_native_password BY '123456';
GRANT replication slave on *.* to 'slave1'@'1.1.1.1';
flush privileges;

1.1.1.1是新服务器IP,安全,别用%

123456是密码。

新服务器也设置下,mysql的配置文件中[mysqld]改下ID:

server-id = 2

不一定得是2,但不要和主数据库(老服务器)的ID重复。

CHANGE MASTER to 
MASTER_HOST='2.2.2.2',
MASTER_USER='slave1',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000088',
MASTER_LOG_POS=420449126;
start slave;

ps:2.2.2.2是老服务器的IP

开启后,查看下状态:

SHOW SLAVE STATUS\G

看下Slave_IO_RunningSlave_SQL_Running是否是yes

为了保证主从正常运行,我定时监控了下,参考示例代码《mysql主从复制监控脚本小工具

阶段五

文件同步,这个就简单了,打包扔过去就行。

不过服务器迁移还涉及备案,业务还不能停。。so,还得复杂的来。

先rsync全量同步下文件

rsync -avz --progress --rsh='ssh -p 22' /www/wwwroot/aaa/  root@1.1.1.1:/www/wwwroot/web_aaa/

增量同步,示例代码:

#!/bin/bash
# 定义映射关系
declare -A dir_map=(
    ["/www/wwwroot/aaa/"]="/www/wwwroot/web_aaa/"
    ["/www/wwwroot/bbb/"]="/www/wwwroot/web_bbb/"
)
while true; do
    echo "开始同步 $(date)"
    for src in "${!dir_map[@]}"
    do
        dest=${dir_map[$src]}
        echo "Syncing $src $dest"
        rsync -avz --progress --delete --rsh='ssh -p 22' "$src" "root@1.1.1.1:$dest"
        if [ $? -eq 0 ]; then
            echo "Successfully synced $src $dest"
        else
            echo "Failed to sync $src $dest"
        fi
    done
    echo "同步完成 at $(date). 等待下次执行..."
    # 等待 1 分钟
    sleep 60
done

阶段六

同步任务调度,主要是crontab的任务,和各种服务的同步。

然后就是测试,看下各项业务是否正常。

OK,至此迁移完毕,累死个人。。。

0 位网友评论:

欢迎来评论

请填写验证码