文章

如何选择并迁移服务器

警告: 因为熬夜+没睡好+过度晨练+可能是没休息好导致的头痛,笔者今日的精神状态堪忧,本文章可能存在巨量语病和一些错误,还望见谅

上周四,我将服务器迁移到了腾讯云,详见这篇博客。用了一周末,发现了不少问题,之后又花了在阿里云香港和华为云香港之间辗转了两天,最后选择在华为云买了2c4g30m2t60g的机子。

过程中的一些事

记录之间的流水账,也算是某些吐槽吧。没啥营养,读者可以直接跳到经验一节。

为什么最后没有留在新加坡

之前的博客中我提到了新加坡使用体验尚可,但是在之后的使用中我发现这是建立在宽带连接或者非高峰期的情况下。使用手机的时候,web发包非常的不稳定。

我在使用memos服务,它记录一条大概需要发送五到七个有先后顺序的http请求。在实践中,往往我在楼下用手机发一条,出门到红绿灯还没请求好。

似乎前几个包会快一点,后面的包会发生巨大的延迟或者丢包,而且非常的不稳定。家里的网有时也会卡顿或者上传有些问题,我对象是移动的网络,在外面打开我的博客就是一整个白屏……。又看了些评测文章后决定将服务器迁移到香港,之前也主要是出于价格的考虑,但是根据下文的研究,其实没有价格问题。

当然这可能也不是新加坡的问题,而是一些特殊国家的网络问题就是了。

BTW,30m的带宽真是太爽了。

阿里云还是腾讯云

我最开始选择腾讯云新加坡都是因为三年前腾讯云2c4g低价机带来的一些路径依赖。腾讯云的价格比阿里云是要贵的(香港),而根据测评,似乎阿里云的网络更好些,美中不足的就是阿里云的需要抢。

image-ckqy.png

上面三个是腾讯云的,下面的阿里云的。虽然我也知道几十块钱是不太可能提供cn2的(后面查了下华为云似乎是)但是腾讯云直接说入门的不提供似乎就……。

此外,我的域名是阿里云的,都放在一起也好管理,省得太多控制台或者app。腾讯云虽然ui做的好看,但是没有app只能小程序,而且也没有密码登录只能扫码登录网页控制台,就挺离谱的,感觉像是腾讯干出的事。而且不知道是不是行业相关,控制台上的广告有点low。

image-20241126155806293.png

但是腾讯也不是毫无优点的。阿里的网页一缩小就出现一堆自适应的问题,但是腾讯云的ui设计还是下了一些功夫的。阿里的ui也比较老了,看上去好像awz之前ui。腾讯云在创建实例的时候就可以设定名称和秘钥,阿里云只能创建后一个个改。腾讯云支持debian12,阿里云只有11也是一个问题。

决定了阿里云,我就周日晚上定了个闹钟开始零点抢,实测刷新的当时24块的2c1g还有,刷新了下就没了。34元的也就几分钟抢完了,12:20去看就已经没了。

阿里与巨坑

也许是半夜的问题,这个实例在早上八九点才创建好。因为我睡了,所以我并没有发现这个问题。这也许在冥冥之中这已经预示了这台机子的不平凡之处。

因为已经经历过一次迁移了,所以这次就驾轻就熟的将服务器迁移到阿里云了。因为阿里云没有debian12,debian11又只有不到一年的长期支持了,所以就选择了ubantu24。虽然理论上自己升级也是可以的,但是Linux是个很奇妙的东西,改动任何都需要比较强的问题解决能力。懒得折腾加上想着官方提供的镜像除了监控和后面应该也有一些特殊的驱动、硬件适配(后面我研究了下实际上是没有的,就和自己安装升级的一样,单纯加了点控制)。

实测香港的网速还是不错的非常稳定,三网ping都很美丽,台式机上面ping大概也就30ms,基本上就和国内的服务器差不多。在外面访问也很稳定,最多说是稍微卡一点,而不是疯狂的丢包和随机延迟。

开始都蛮顺利的,但是在我在screen里面运行了go mod tidy指令时,机子就卡住了,我后来重置了机子又复现了一模一样的问题,还是一模一样的地方卡住。服务器直接宕机,阿里云自己的监控软件和命令助手都掉了,在控制台只能看到更底层的物理机计算出的CPU和硬盘占用量,硬盘占用量很高,CPU也是,基本上硬盘都是拉满的,ssh都连接不上。之前的ssh可以勉强退出screen以很卡的形式运作。因为读取不了zsh的插件,所以zsh会崩溃退出,可以调用一些命令,但是有些启动会失败。我尝试使用reboot,但是显示发送失败。

这种情况下只能选择强制重启,强制重启后恢复了。因为当时配置的一些问题,博客和memos都没有起来,再叠加梯子的解析滞后性,导致一度十分混乱,担心服务有问题查了很久还尝试了很多方法想让他起来,或者强制重启破坏了什么数据完整性。其实都没有。

我向阿里提交了工单。

怎么说呢,反应很快并提供了帮助以外的一切帮助。

先是来了个售前,说是ssh因为网络卡顿的问题,还给我科普远程的各种方式,然后问东问西,甚至听说我是做游戏的要给我介绍外包单子……然后问我是什么业务,让我把公司的正式业务也放上面,有xxx优惠。

然后迟一点得到了工单回复,就是把我自助诊断的报告重复了一遍,硬盘打满了所以宕机。售后看我没点完结工单,给我打了个电话。反正就是说我不懂他懂,就是硬盘满了,我说我就get一个包,能有多少读取量,不也就是慢一点,怎么会直接死掉呢。他说不是慢不慢的问题你懂不,就是直接卡死了,我问他那指令执行完了不就是好了,你算过一小时,每秒一百兆对应多少数据吗……售后也一副不是很懂的样子,我让他确认是不是你们的服务器硬盘只要满了就会卡死,他竟然也说是的。我问他在家里有尝试过打包或者简单的硬盘对拷文件吗……我发现他其实不太懂就和他说我有标准复现流程,你向上反馈吧,而且别的腾讯云什么的都没这个问题,他就让我升配置。

虽然我也不是什么消费了很多的客户,也不愿意麻烦别人的去行使自己应有权利(比如群晖我几乎都是看文档,不发工单)但是还是有点生气。看他什么都不懂,我就草草结束了电话,然后结束了工单。

因为晚上又出现了一次崩溃,这次是在后台崩溃的,并没有认为操作,所以我认为这是个必须要解决的问题,因此展开分析。

对于阿里云诊断为硬盘io打满的宕机问题的分析和解决

首先需要确认2g的机器,实际可用内存大概在1.6g左右,很容易就会溢出去。

我查询了后台,监控软件似乎在还能联通时还有一些数据上报,我发现检测到了内存上升(1.3g->1.5g),此后硬盘就一直读满,直到一个小时候我发现服务恢复,然后提交了一个memos请求又炸了。这次直到早上都没恢复,于是我重启机器,然后读取了syslog日志。

acd33f1bc95959a9356cf416970cc38.png

3d81f12c26b0cd51bc5be0651c30ab4.png
可以发现出现了oom现象,同时在互联网上查到了两个帖子。

https://v2ex.com/t/1091493

https://learnku.com/laravel/t/84685

都有提到轻量机子可能会在oom时出现这个现象,我猜测可能是oom之后触发了os的杀进程流程,又由于机子的一些缺陷破坏了什么底层结构。这是一个常见的现象。他们提到了可以通过加内存、加swap或者换机子的形式实现。

我查询了机子的swap配置,发现其实是有配800m的虚拟内存的,那就可以排除swap的问题,因为swap应该会提供一定量的低性能内存,不会因为内存波动而严重卡顿,同时swap的读写应该有限的。

同时我在同配置的服务器无法复现这个问题,所以我就怀疑是不是超售+机子的一些问题。

因为实例是没法换的只能重装,而这不能解决问题,阿里云又是限购的,我就打算直接切到4g机子算了,因为内存确实有一点不够用是真的。

但是此时我的朋友给我发了华为云的羊毛,可以白嫖401的代金券,我就自费17元买了服务器。

迁移到华为云

华为云坑爹的地方就更多了,首先是不太稳定的购买系统,勉强买下后,他也没办法直接设置秘钥,得手动设置,然后防火墙也没有开放常用端口。价格也比阿里云全面贵一截。网络也就一般,能用,有点小卡顿。

不过网络还可以,终端很跟手。ping大概60左右。访问memos有点小卡可以接受,当然对比阿里云是秒进的,华为云是卡一下下,不过也看机房,也有说法说华为云都是cn2。

此外就是华为云的术语都很奇怪,自己造术语显得很创新这件事情就挺华为的。常用的功能倒是能看懂,就是不明白为什么不用大家的词,例如防火墙、重置叫做安全组和重装系统。

不过虽然监控的位置非常的难找,但是监控的ui非常好看而且功能很全面(算是企业特色吗哈哈哈),可能是to g的时候数据面板的需求做多了。

有些专用术语非常费解,支付、创建逻辑也非常的草率,各方面都感觉是to g项目的那种完成度不足的大学生毕设的感觉。

似乎还有一些支付逻辑和扣费的问题,具体参考

image-20241126165853223.png

这里有debian12,但是没有ubantu24。因为后期肯定还是会回阿里云的(我相信宕机的问题是偶发事件)就选了ubuntu,方便之后继续迁移,半年就迁移走了也没过维护期。

终局

因为五天退订,我就把买的阿里云和腾讯云都退款了,也算是某一种摸摸党了。

之后服务就都稳定了。我以为还会有什么很麻烦的事情(折腾两天都习惯了)或者说有什么换了服务器很好玩的东西,也都没有,不过服务器或者说服务还是所谓平平淡淡才是真,当你意识到他的存在性说明多半是要出问题了……

总的来说这次优化了各种启动脚本、配置的问题、研究明白了如何搬家都挺不错的,很多低耦合的配置也该了,自动化部署platform也有了新思路。运维水平上去了,简单的指令清楚多了

经验

新加坡与香港

新加坡的网络不太行,高峰期或者非宽带或者移动联通可能会出现非常离谱的延迟。即使是网络比较好的环境也会出现ssh的一些卡顿。

建议选择香港,香港基本上就和内地一样,

需要提醒,国外的服务器似乎没有国内近似无限的下行,说多少带宽就是多少。

腾讯云香港与阿里云香港与华为云香港

服务商网络服务稳定性价格杂项
阿里极好迅捷,并提供了帮助以外的一切帮助不太行最便宜控制台ui一般
腾讯不清楚但是比阿里差不了解不太行最贵控制台易用性好,但是只能扫码且没有客户端
华为略差不了解不清楚次便宜控制台难看难用,“创新多”,似乎存在很多套路,监控好用

如何修改ssh的欢迎词

image-20241126171519647.png

建议可以搜索acg character ascii printing,找一些可爱的字符画,比如

     ⡿⣡⣿⣿⡟⡼⡁⠁⣰⠂⡾⠉⢨⣿⠃⣿⡿⠍⣾⣟⢤⣿⢇⣿⢇⣿⣿⢿
     ⣱⣿⣿⡟⡐⣰⣧⡷⣿⣴⣧⣤⣼⣯⢸⡿⠁⣰⠟⢀⣼⠏⣲⠏⢸⣿⡟⣿
     ⣿⣿⡟⠁⠄⠟⣁⠄⢡⣿⣿⣿⣿⣿⣿⣦⣼⢟⢀⡼⠃⡹⠃⡀⢸⡿⢸⣿
     ⣿⣿⠃⠄⢀⣾⠋⠓⢰⣿⣿⣿⣿⣿⣿⠿⣿⣿⣾⣅⢔⣕⡇⡇⡼⢁⣿⣿
     ⣿⡟⠄⠄⣾⣇⠷⣢⣿⣿⣿⣿⣿⣿⣿⣭⣀⡈⠙⢿⣿⣿⡇⡧⢁⣾⣿⣿
     ⣿⡇⠄⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⢻⠇⠄⠄⢿⣿⡇⢡⣾⣿⣿⣿
     ⣿⣷⢰⣿⣿⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⢰⣧⣀⡄⢀⠘⡿⣰⣿⣿⣿⣿⣿
     ⢹⣿⢸⣿⣿⠟⠻⢿⣿⣿⣿⣿⣿⣿⣿⣶⣭⣉⣤⣿⢈⣼⣿⣿⣿⣿⣿⣿
     ⢸⠇⡜⣿⡟⠄⠄⠄⠈⠙⣿⣿⣿⣿⣿⣿⣿⣿⠟⣱⣻⣿⣿⣿⣿⣿⠟⠁
     ⠄⣰⡗⠹⣿⣄⠄⠄⠄⢀⣿⣿⣿⣿⣿⣿⠟⣅⣥⣿⣿⣿⣿⠿⠋⠄⠄⣾
     ⠜⠋⢠⣷⢻⣿⣿⣶⣾⣿⣿⣿⣿⠿⣛⣥⣾⣿⠿⠟⠛⠉⠄⠄

docker与自启动

建议将所有服务的restart打开。如果不是开发环境也可以把一些二进制程序注册为服务做成自启动的。不过我的platform是开发中,都是screen起的。

dns与登录

换服务器可以不换域名仅换解析的ip,将老的数据全部迁移到新的,就可以把域名指向新的。如果ssh的私钥都是同一个基本上可以不用修改群辉的备份脚本和非命令行的ssh。有良好的服务部署,基本上也就是老服务器停机、打包传输,然后新的服务器解包、一键部署这几件事。

请注意如果要用命令行登录需要删除 known_hosts 里面的指纹,不然会拦截。

群晖备份

即使保留多个版本,备份也是增量的,就和不保留的一样。建议保留多个,避免勒索病毒之类的。

开发与部署最好将大的二进制文件单独存放,不要全部丢到数据库,不然备份的数据会越来越大(db文件每次都改且越来越大),而且后期就算改了配置,每次也都是需要备份数据库主文件的。

debian和ubantu

其实两者的服务端应用是没有什么很大的区别的,或者说ubantu也是debian的分支。ubantu的软件包一般会新一点,但是因为基本上都是docker或者手动安装的所以也问题不大。

当然linux同样是64位编译出的可执行文件一般都是通用的,拷自己写的程序的时候可以注意下。

dns与魔法带来的解析问题

改了解析之后会短暂出现部分域名访问不了的情况,如果确认关了魔法就可以的话,可以等一会,可能是一些地方缓存没刷上。不要盲目认为是自己的服务宕了

tar需要tar相对路径

执行tar指令打包的时候最好用相对路径,解包时在需要的地方重新解压,不然解压出的位置会有问题。例如tar时地址用的是 /root/data,解压时在 ~ 解压,实际会解压在 ~/root/data中。

同时解包后建议重新给整个文件夹授权,不然会出现git访问的权限问题。

阿里云盾起不来

更新完ubantu,阿里云盾会起不来,这里需要留意下是不是更新的时候有些服务需要重启。重启完一般就好了。

更新时ssh冲突

因为ssh更新会覆盖配置,所以选择保留本地配置就行。

设置hostname

ubantu可以简化配置

sudo hostnamectl set-hostname ubuntu-bionic-x64

官方的镜像

我以为官方提供的镜像除了监控和后面应该也有一些特殊的驱动、硬件适配,实际上后面我研究了下实际上是没有的,就和自己安装升级的一样,单纯加了点控制。

介意的话可以完全自己重装,似乎没有什么的兼容、稳定性、性能上的问题。

脚本

以下是我自己用的迁移脚本,主要留下做备份,需要用的读者也可以参考下

旧机子打包

cd data/docker-compose
docker-compose down

tar czvf data.tar.gz data
md5sum data.tar.gz

打包过程中可以先执行下一步

新机器安装基础环境

申请新机器,重置一个临时密码,然后使用临时密码ssh。

sudo apt update && sudo apt upgrade -y

sudo apt install -y apt-transport-https ca-certificates curl software-properties-common

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt update
sudo apt install -y docker-ce

sudo systemctl start docker
sudo systemctl enable docker
sudo docker --version

curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
sudo apt-get install -y nodejs
npm install -g yarn

sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version

sudo apt install -y git
git --version
sudo apt install -y python3 python3-pip
python3 --version
pip3 --version

wget https://go.dev/dl/go1.21.1.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.21.1.linux-amd64.tar.gz
echo "export PATH=$PATH:/usr/local/go/bin" >> ~/.profile
source ~/.profile
go version

sudo apt install -y screen
screen --version

# 1. 查看当前交换空间
free -h
# 2. 创建一个 4GB 的交换文件
sudo fallocate -l 4G /swapfile
# 3. 设置交换文件权限
sudo chmod 600 /swapfile
# 4. 格式化交换文件
sudo mkswap /swapfile
# 5. 启用交换空间
sudo swapon /swapfile
# 6. 验证交换空间
free -h
# 7. 配置开机自动挂载交换空间
echo "/swapfile none swap sw 0 0" | sudo tee -a /etc/fstab
# 8. 优先度调整
sudo sysctl vm.swappiness=30
echo "vm.swappiness=30" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

sudo apt install zsh
chsh -s $(which zsh)
sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

选择使用zsh,这里不能汇总为一个脚本,因为切换为zsh会中断。

git clone https://github.com/zsh-users/zsh-autosuggestions ~/.oh-my-zsh/custom/plugins/zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ~/.oh-my-zsh/custom/plugins/zsh-syntax-highlighting
git clone https://github.com/zsh-users/zsh-history-substring-search ~/.oh-my-zsh/custom/plugins/zsh-history-substring-search
git clone https://github.com/zsh-users/zsh-completions ~/.oh-my-zsh/custom/plugins/zsh-completions
vim ./.zshrc

手动修改插件

plugins=(git zsh-autosuggestions zsh-syntax-highlighting zsh-history-substring-search zsh-completions)

继续执行

source ~/.zshrc
echo "export PATH=\$PATH:/usr/local/go/bin" >> ~/.zshrc
source ~/.zshrc
reboot

旧机器 传输包到新机器

scp /root/data.tar.gz root@新机子:/root/

校验数据

md5sum data.tar.gz

对比md5然后执行

tar xzvpf ./data.tar.gz
chmod -R 755 data

新机器启动

建立主目录快捷方式并启动docker和plat

ln -s /root/data/plat/update.sh /root/更新plat.sh
ln -s /root/data/docker-compose/restart.sh /root/更新docker.sh
cd ~
./更新plat.sh
./更新docker.sh

添加秘钥登录

ssh-keygen
cd ~/.ssh
cat id_rsa.pub >> authorized_keys
chmod 600 authorized_keys
chmod 700 ~/.ssh
客户端机下载id_rsa并到.ssh
sudo vim /etc/ssh/sshd_config
设置
RSAAuthentication yes
PubkeyAuthentication yes
PermitRootLogin yes
确认后
PasswordAuthentication no

修改登录提示

vim /etc/motd
     ⡿⣡⣿⣿⡟⡼⡁⠁⣰⠂⡾⠉⢨⣿⠃⣿⡿⠍⣾⣟⢤⣿⢇⣿⢇⣿⣿⢿
     ⣱⣿⣿⡟⡐⣰⣧⡷⣿⣴⣧⣤⣼⣯⢸⡿⠁⣰⠟⢀⣼⠏⣲⠏⢸⣿⡟⣿
     ⣿⣿⡟⠁⠄⠟⣁⠄⢡⣿⣿⣿⣿⣿⣿⣦⣼⢟⢀⡼⠃⡹⠃⡀⢸⡿⢸⣿
     ⣿⣿⠃⠄⢀⣾⠋⠓⢰⣿⣿⣿⣿⣿⣿⠿⣿⣿⣾⣅⢔⣕⡇⡇⡼⢁⣿⣿
     ⣿⡟⠄⠄⣾⣇⠷⣢⣿⣿⣿⣿⣿⣿⣿⣭⣀⡈⠙⢿⣿⣿⡇⡧⢁⣾⣿⣿
     ⣿⡇⠄⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⢻⠇⠄⠄⢿⣿⡇⢡⣾⣿⣿⣿
     ⣿⣷⢰⣿⣿⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⢰⣧⣀⡄⢀⠘⡿⣰⣿⣿⣿⣿⣿
     ⢹⣿⢸⣿⣿⠟⠻⢿⣿⣿⣿⣿⣿⣿⣿⣶⣭⣉⣤⣿⢈⣼⣿⣿⣿⣿⣿⣿
     ⢸⠇⡜⣿⡟⠄⠄⠄⠈⠙⣿⣿⣿⣿⣿⣿⣿⣿⠟⣱⣻⣿⣿⣿⣿⣿⠟⠁
     ⠄⣰⡗⠹⣿⣄⠄⠄⠄⢀⣿⣿⣿⣿⣿⣿⠟⣅⣥⣿⣿⣿⣿⠿⠋⠄⠄⣾
     ⠜⠋⢠⣷⢻⣿⣿⣶⣾⣿⣿⣿⣿⠿⣛⣥⣾⣿⠿⠟⠛⠉⠄⠄

修改解析移除旧机子

将dns解析记录改为新的ip,客户端删除knows_hosts,确认能连上,确认服务数据基本上正常,然后备份新机器,确保迁移包被备份后删除迁移包。

旧机子保留一会儿,便于出现问题重新打迁移包。随后等待过期移除。

等待第二天需要看下备份是否正常。

License:  CC BY 4.0