
场景:某电商平台双十一前的紧急上云
接手过一个项目,它属于典型的传统企业项目,是一个电商平台,该电商平台日活数十万,其原先托管在IDC机房的服务器,面临着硬件老化的状况,还存在带宽瓶颈的问题。
老板要求“双十一前必须上云,且不能超过4小时停机窗口”。
这般实战当中,我们挑选了阿里云当作目标平台,接下来还原完好的操作链路。
准备:环境评估与清单梳理
起先的环境是,CentOS 7.9 ,PHP 部署的版本为 7.2 ,MySQL 所采用的是 5.7 版本 ,Nginx 运用的是 1.16。
数据总量约500GB(含数据库、商品图片、静态文件)。
策划云上的布局,对VPC网络予以规划,缔造处在相同地域的两台ECS(一台是Web,另一台是MySQL),打造一个RDS(MySQL拥有高可用版本的那种),构建一个OSS(专门用于静态资源的),设立一个SLB(负载均衡的那个)。
至关重要的准备:预先申请妥善域名ICP备案(此在云上是必须要做的),并且于域名注册商那里准备好能够修改DNS解析的权限。
第一步:云环境初始化与基础安全
登录阿里云控制台,首先动手搭建地基:
一种网络,名为VPC网络,要创造出一个跟IDC内网不会产生冲突的网段,比如说原来的IDC是/16 ,在云上就選擇/16 ,它是内网进行隔离的基础。
2. ECS予以购买以及进行配置:挑选Web服务器为Alibaba Cloud Linux 3(具备与CentOS的兼容性,并且是针对云内核来加以优化的)。
登录后执行基础优化:
# 更新系统并安装常用工具
yum update -y
yum install -y wget curl git vim net-tools
# 关闭防火墙(交由安全组管控)
systemctl stop firewalld && systemctl disable firewalld
# 关闭SELinux(云上环境通常关闭,简化权限问题)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
需留意,安全策略借助云平台的安全组达成,仅开放80端口、443端口以及22端口,并且对SSH登录IP予以限制。
3. LNMP环境的布置:凭借自身手动进行编译的话速度太过迟缓,故而我们选用宝塔面板来迅速构建,然而出于生产安全性的考量,在安装完毕之后必须即刻对默认端口予以更改(像是将8888转变为28888),并且要绑定域名用以访问面板。
# 宝塔面板官方安装命令(注意:生产环境使用,务必先在安全组放行临时端口)
yum install -y wget && wget -O install.sh && bash install.sh
安装完成后,记录面板地址和账号密码。
借由面板经由一键来安装,安装对象为Nginx + MySQL + PHP - 7.2,此三者版本需同旧环境维持相符,以此防止出现兼容性方面的问题,有标点符号。
第二步:数据迁移(核心步骤,停机窗口倒计时开始)
我们运用一种策略,叫做混合迁移,先是进行全量的同步行动,最后才开展增量的同步举措,以此来把最终的停机时间给缩短。
1. 代码和静态文件迁移:
一段代码,它是要从那旧的服务器去进行打包,所针对的是/www/wwwroot/这个目录,运用rsync这种方式来实施增量同步,同步的目标是新的ECS。
# 在旧服务器执行(使用内网或高带宽公网)
rsync -avz --progress --delete /www/wwwroot/project/ root@:/www/wwwroot/project/
静态资源:后续规划将图片切到OSS。
首先呀,要拿着ossutil这个工具去做同步操作,同步的目标呢是OSS Bucket,然后呢,还要把它跟自定义的CDN域名进行绑定,比方说这个自定义域名是static.xxx.com。
# 安装ossutil,配置AK信息,执行同步
./ossutil cp /www/wwwroot/project/upload oss:///upload/ -r -u
适应配置文件:对新环境当中的Nginx配置作出修改,把如图片之类的静态资源朝着OSS的CDN域名去进行指向。
2. 数据库迁移(核心难点):
全量备份与恢复:在旧数据库上执行锁表读操作,导出全量数据。
FLUSH TABLES WITH READ LOCK;
然后立即执行mysqldump:
mysqldump -u root -p --all-databases --single-transaction --master-data=2 > alldb.sql

解锁表:UNLOCK TABLES;。
将SQL文件导入到云RDS。
配置主从同步:这是关键!
对于alldb.sql,去查看其头部,从而找到MASTER_LOG_FILE,以及找到MASTER_LOG_POS。
在RDS管理控制台当中,对从旧数据库那儿拉取binlog来开展同步的操作予以配置,达成增量追平的效果。
第三步:切换与割接(4小时内完成)
1. 进行应用层切换,要修改Web服务器的.env,而且要修改数据库配置文件,把数据库连接地址从旧IP改成为RDS的内网域名。
2. 域名解析切换:
准备工作如下,在SLB之上配置监听,监听的端口号设定为80这一数值以及443这一数值,并且把后端的ECS添加进服务器组之内,接着上传SSL证书,最后启用HTTPS强制跳转。
重点操作:于DNS控制台,像阿里云DNS那样,把A记录或者CNAME记录,由先前的服务器IP,变更为SLB的CNAME地址。
TTL值提前调低至60秒,加速解析生效。
3. 关于CDN配置:要是使用了CDN,那就得把源站信息变更为SLB的域名或者IP,并且去刷新CDN缓存,以此保障用户能够获取到最新内容。
第四步:安全加固与故障排查(割接后24小时监控)
1. 安全加固:
关于系统层面,其中Web服务器要做到禁止root进行远程登录,接着还需要创建普通用户,之后赋予该普通用户sudo权限。
安装fail2ban防护SSH暴力破解。
云平台层面:配置WAF防护Web攻击,启用DDoS高防。
数据库RDS只允许Web服务器内网访问,不开放公网端口。
2. 故障排查实录:
现象1:割接后,用户反馈上传图片失败。
查找错误:查看Nginx错误日志,也就是在这个位置/var/log/nginx/error.log,结果发现,upload目录的权限是不够的。
进行,chown -R www:www /www/wwwroot/project/upload这项操作来予以修复。
现象2:部分页面提示数据库连接超时。
排错:登录RDS控制台查看监控,发现连接数打满。
原因是应用代码中数据库连接未释放。
暂且马上增添RDS最大连接数,与此同时赶忙修复代码连接池配置,而后重新启动PHP-FPM。
现象3:HTTPS访问提示证书不安全。
排错:检查SLB上证书是否完整上传,是否包含中间证书。
重新下载正确格式的证书(Nginx格式)并上传绑定。
总结:一次平稳过渡的上云实战
这次迁移,完成了500GB数据的平稳转移,而且,在双十一大促里,扛住了10倍于平常的流量。
核心经验存在三条,第一条便是,数据是一定要进行校验的,主从同步属于保命符;第二条为,安全组跟防火墙规则绝对得提前梳理清楚,方能避免面临“通了网然而业务却不通”这种尴尬情况;第三条是,监控告警必然得提前设置,借助云平台的云监控以及日志服务,在第一时间找出瓶颈。云上并非终点,而是精细化运维的起始点。

Comments NOTHING