服务器 - 从一台服务器切换至另一台服务器(损失数十条PV记录)
服务器 - 从一台服务器切换至另一台服务器(损失数十条PV记录为代价)
看着四年的服务器正式到期,没什么轰轰烈烈的告别,就像目送老朋友转身走远,只默默记下:哦,原来它陪了我这么久啊。
前言
一台陪伴了我4年的服务器昨天晚上到期了,数据和服务迁移到新服务器上有两点想尽可能保证的:
- 服务不中断
- 数据不丢失
最终结果是服务没中断,迁移过程中丢失了约数十条的PV记录。
大致流程是:新服务器部署环境安装依赖同步静态数据 –> 新服务器上准备好服务启动命令准备按回车 –> 旧服务器导出数据库数据传输到新服务器上并导入新服务器数据库 –> 新服务器快速启动服务 –> 将流量切到新服务器上。
中间从旧服务器开始导出数据
到流量切到新服务器上
这段时间的产生的十几条PV记录写到了旧服务器上并与新服务器数据库产生了冲突。由于影响不是很大就没去处理。
当然想做到数据也不丢失似乎也可以通过主从数据库的方式来保证,但主要是我不会。
过程
新服务器安装依赖部署环境同步旧服务器的静态数据
我有一个习惯,旧服务器上的配置几乎都存放在一个专门的文件夹TFpath
,然后ln -s
软链接到原始位置,这样不论我修改什么配置,实质上配置文件都会在TFpath
文件夹下被修改。
也就是说这些静态配置我只需要scp
到新服务器上并在新服务器上将他们分别软链接到对应位置就好了。
这样在新服务器上安装好各个服务后一启动,配置就和旧服务器一样了。 万物皆文件好啊(bushi)
代码什么的统统复制到新服务器上,该安装的依赖安装好,坐等数据库改好后一键启动。
旧服务器导出数据库数据传输到新服务器上并导入新服务器数据库
我所涉及的动态数据主要存储在MySQL中,mysqldumps -u xx -p --all-databases > all.sql
可方便导出整个数据库,scp all.sql user@ip:path
可将数据库文件拷贝到新服务器上,新服务器上在MySQL命令行中执行source all.sql
即可一键将数据库变得和旧服务器相同,连用户名密码都会变得一致。
有了数据之后,新服务器上的服务就可以启动,等待流量的到来了。
将流量切换到新服务器上
我使用的是CloudFlare的DNS(以及CDN),代理模式为完全。虽然名义上是CDN实际上在国内就是个减速器,这样做的目的主要是友好为数不多的国外用户以及隐匿我的真实IP。
实质上当你访问我的域名如https://letmefly.xyz
时,DNS服务器将请求定向到其中一个Cloudflare节点上,Cloudflare节点再去请求我的源服务器,这样第三方用户就不知道我的真实IP了。
虽然通过一些特殊手段还是可能反映射到,但是cloudflare已经在很大程度上保证源服务器的安全了。请大家把赛博菩萨打在公屏上。
这样还有一个好处,就是切流量异常地顺利,几乎可以说是秒级。因为这种机制导致切流量时无需更新DNS,用户仍然访问cloudflare节点,cloudflare直接把流量切到新机器上就好了。
现在可以公开的情报
旧服务器IP是123.56.114.139
,这个倒背如流的IP可以公开了。
新服务器的IP还藏在坚强的CloudFlare护盾后面,以防一波应该不会出现的针对源IP服务器直接的DDoS。
Q&A
有人说为何不借助云服务商的一键迁移或者镜像导入导出?
这样是很省事儿,一个是迁移过程中可能仍然会有部分数据修改到旧服务器上,一个是阿某云轻量应用服务器不支持大磁盘机器向小磁盘机器的一键迁移(想一键迁移还得氪金)。
有人说备案问题怎么解决?新服务器会不会因为没有备案导致流量被拦截?
不会。个人备案主要备的是域名不是IP,工信部规定解析到中国IP的域名都需要进行备案否则将会被拦截,但是我这个域名在旧服务器上的时候已经备案过了,所以不会被拦截。
Last But Not Least
陪伴了我4年的老战友,值得一个小小的纪念仪式。
介绍后想起来两台同区域的阿里云服务器之间数据应该是可以通过局域网IP快速传,免受公网IP带宽限制。
End
当然这也许并非最优解,也许会有很多更简单好用的方法。如果有,请不要吝惜告诉我。
同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~
千篇源码题解已开源