记一次Node线上服务迁移_java

原有的Node服务,需要迁移到新的主机上,故需要准备一套新的环境,以及对应的迁移方案。

Node安装

 

手动安装

下载地址:https://nodejs.org/en/download/ 选择:Linux Binaries (x64) 右键复制下载链接

 

# 下载到机器上,放在/opt目录[work@40-14-22 opt]$ wget https://nodejs.org/dist/v12.16.2/node-v12.16.2-linux-x64.tar.xz# 解压[work@40-14-22 opt]$ tar -xvf node-v12.16.2-linux-x64.tar.xz# 重命名[work@40-14-22 opt]$ mv node-v12.16.2-linux-x64 nodejs
# 添加软链让node、npm命令能够全局访问(需要 ROOT权限)[root@40-14-22 opt]# ln -s /opt/nodejs/bin/node /usr/local/bin/[root@40-14-22 opt]# node -vv12.16.2
[root@40-14-22 opt]# ln -s /opt/nodejs/bin/npm /usr/local/bin/[root@40-14-22 opt]# npm -v6.14.4

使用NVM安装

 

# 安装NVM:https://github.com/nvm-sh/nvmwget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash# 安装Nodenvm install v12.16.3

使用NVM的好处在于可以管理Node版本,同一机器上可灵活切换不同Node版本,一键安装较方便

NVM常用命令

  • nvm install v12.16.3:安装指定版本的Node
  • nvm use v12.16.2:使用指定版本的Node
  • nvm ls: 查看当前使用的Node版本
  • nvm -h: 查看帮助文档

运行环境准备

 

安装PM2

 

# 全局安装[root@40-14-22 opt]# npm install pm2 -g# 如果不支持全局使用,需配置软链[root@40-14-22 bin]# ln -s /opt/nodejs/lib/node_modules/pm2/bin/pm2 /usr/local/bin/

日志分割

官方文档:https://www.npmjs.com/package/pm2-logrotate

 

# 安装pm2-logrotate[work@40-14-22 log]$ pm2 install pm2-logrotate# 设置超过1G分割pm2 set pm2-logrotate:max_size 1G# 设置最多保存200个日志文件pm2 set pm2-logrotate:retain 200# 是否通过gzip压缩日志pm2 set pm2-logrotate:compress falsepm2 set pm2-logrotate:dateFormat YYYY-MM-DD_HH-mm-sspm2 set pm2-logrotate:workerInterval 30# 每天晚上23:59:30分割pm2 set pm2-logrotate:rotateInterval '30 59 23 * * *'pm2 set pm2-logrotate:rotateModule true

设置完成后可以通过pm2 conf pm2-logrotate查看设置的是否正确

 

[work@40-14-22 .pm2]$ pm2 conf pm2-logrotateModule: pm2-logrotate$ pm2 set pm2-logrotate:max_size 1G$ pm2 set pm2-logrotate:retain 200$ pm2 set pm2-logrotate:compress false$ pm2 set pm2-logrotate:dateFormat YYYY-MM-DD_HH-mm-ss$ pm2 set pm2-logrotate:workerInterval 30$ pm2 set pm2-logrotate:rotateInterval 0 0 * * *$ pm2 set pm2-logrotate:rotateModule trueModule: module-db-v2$ pm2 set module-db-v2:pm2-logrotate [object Object]

安装Git

安装git是为了让pm2部署时能够从仓库中拉取代码,并部署

安装

 

[root@40-14-22 ~]# yum install git

配置公钥

拷贝机器的公钥串(当前用户的.ssh目录下的.pub文件内容),粘贴到公共的gitlab下的授权下即可;目的是允许机器拉取gitlab仓库中的私有代码

 

# 生成公钥-一直回车即可[work@40-14-22 .ssh]$ ssh-keygen -t rsa

最好使用公共账号,不要使用个人账号

如不配置ssh,pm2拉代码的时候会提示如下无权限错误

记一次Node线上服务迁移_java_02

服务器授信

记一次Node线上服务迁移_java_03

部署机与服务器

目的: 部署机可免密访问目标机

编辑目标机.ssh目录下的authorized_keys文件,粘贴保存部署机上.ssh目录下.pub文件内容即可

vim快捷键:https://www.cnblogs.com/junwen5599/p/9996873.html

服务器与Gitlab服务器

向服务器的known_hosts中新增Gitlab服务器的公钥

缺少配置在部署时会报如下错误

记一次Node线上服务迁移_java_04

其他

 

查看Linux内核版本

 

[work@37-14-42 log]$ uname -aLinux 37-14-42 2.6.32-573.22.1.el6.x86_64 #1 SMP Wed Mar 23 03:35:39 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

查看centos版本

 

[work@37-14-42 log]$ cat /etc/redhat-releaseCentOS release 6.5 (Final)

在centos6上安装最新的Node12会报如下错误

 

[work@40-31-60 ~]$ node -vnode: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by node)node: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.18' not found (required by node)node: /usr/lib64/libstdc++.so.6: version `CXXABI_1.3.5' not found (required by node)node: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by node)node: /lib64/libc.so.6: version `GLIBC_2.16' not found (required by node)node: /lib64/libc.so.6: version `GLIBC_2.17' not found (required by node)node: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by node)

原因为gcc版本过低,要么升级gcc,要么系统升级到centos7

建议不要折腾,在centos6上升级gcc版本,耗力费时,可能还会存在版本匹配问题;最好选择一步到位升级系统到centos7

迁移方案

 

测试验证

服务器环境准备好后,接下来就是按照线上的部署流程在新服务器上部署Node服务。

此时,由于没有经过验证,不能够直接让外网流量进来;另外,线上服务环境与公司内网环境一般也是隔离的,那么如何才能请求到新的服务验证新服务是否可用呢?

这种情况,可以借助部署机,部署机比较特殊,既可以访问内网的gitlab服务拉取代码,又可以把拉取到的代码部署到线上环境,可以部署机为跳板访问线上新的Node服务,在内网环境验证服务是否可用。

具体可参见这篇文章:通过Nginx解决网络隔离实践记录

切流量

当验证完服务正常后,接下来就是切流量操作了,可以采用如下两种方案

  • 把线上某一台机器的流量切到新服务上
  • 把线上流量的10%切到新的服务上

流量进来后,观察服务器的各项参数是否有异常,观察Node服务的日志监控是否有异常上报。

运行一段时间无异常,再切50%,循序渐进,最终把全部流量切到新主机。

https://mp.weixin.qq.com/s/CBJ21kOtN1N_Rkq6z8OyHQ