服务器迁移搬家全流程&无缝平滑&可行性方案记录
网站搬家很轻松,服务器迁移很烦人,时隔多年没搞过服务器迁移了,有点生疏了,记录一下。
各方面原因吧,服务器更换云服务商了,得迁移,想想都头大。。
大方面讲就是:文件迁移、数据库迁移、以及任务调度迁移。但说谁都会说。。。是吧。。。
分阶段整理下,以备不时之需。
阶段一
新服务器各种环境的准备,老生常谈了,不多说了。
不过要注意,新服务器环境如何有差异,注意代码的兼容。
阶段二
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_Running和Slave_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 位网友评论: