宿舍角落里的“数据中心”

宿舍角落里的“数据中心”

(并不)简要的介绍

从去年夏天开始,寝室里一直运行着一台 华硕 pn61s 小主机,上面用 PVE 作为 Hypervisor 跑着几个虚拟机。
这个机器是由在京东二手买的带 八代移动端 i5 的准系统,外加闲鱼入的低价 16g*2 ddr4、拆机西数黑盘 500g hdd 和一块西数蓝盘 1t m2 组成的。特点就是非常小巧,115mm x 115mm x 49mm 的体积在哪都能找个地方容纳。这里还有 刚到手时的记录,那时是挺高兴的(算是当时用过的最高的配置的服务器了,能不高兴嘛)。后面由于气温越来越高,于是去淘宝找了个散热支架将它包围起来,就像这样

pn61s 的主要用途是跑从云上搬下来的自建 GitLab(那就是 git.toay 啦,话说 Java 真得巨占内存,憋再继续浪费我资源呐),以及用做 k3s 跨云集群的一个 control plane 节点,顺便还可以用 Pydio 搭个简易的 WebDAV 网盘利用一下剩余的硬盘空间。

在除了供电故障外稳定运行一年多得时间后,pn61s 却在上个月中旬的一次寝室停电后突然就罢工了。
于是出差时得空闲时间就在调研,打算搞台算力强些的 桌面级 u 小主机用做主力服务器。最后在闲鱼上收了一台 ThinkStation P340 Tiny 准系统,然后去淘宝买了块散片,以及到京东把内存拉满。
将从 pn61s 上取下的固态直接装上并一次性点亮后,要不干脆就直接升级成数据中心吧, 抱着 一步到位能用服役年限拉低平均成本 的心态顺便搞了台 MikroTik RB5009UG,一台 TerraMaster D5 Hybrid 硬盘柜 和一块 8T 的酷狼 3.5 SATA。。。
最后趁 618 打折再准备了一台 APC BK650 UPS,避免寝室突然断电硬关机造成的硬盘与数据丢失问题,以及一个 100 出头就能入手的机柜,然后就把所有的设备整理在角落里了:

P.S.1 看得出来我非常喜欢联想的工业设计。除了完全贴合我审美的简约外观外,p340 tiny 的散热效果真的逆天。刚开始在等待机架时放在桌边测试了几天,一米外基本上听不见一点声音;而在虚拟机开满的情况下能听到的声音很低沉,像是呼吸一般,根本谈不上是“噪声”。放在一起对比之下,pn61s 不加外部散热时不仅有个频率更高些、明显给人带来厌烦感的噪声,严重的积热使我怀疑它是否能承受长时间的开机。

P.S.2 pn61s 现在已经复工了,大概只是纽扣电池没电导致断电后 BIOS 配置丢失+内存重新 training,同时华硕默认的 Windows 安全启动不能正常地拉起 GRUB 进行 PVE 的引导,但在当时几次三番长达十几分钟的黑屏后掉电的经历让我误以为低价的自组装内存已经准备就此退役le ^_^")

那就组成集群吧!

配置与组成

简单整理一下,现在集群的配置大概是这样的:

物件 配置 参考价格与备注
准系统 P340 Tiny 890 闲鱼全新
230W电源 联想原装 270 淘宝
cpu 10代桌面端 i5 10600 680 淘宝散片
内存 英睿达 DDR4 32G * 2 366+415 京东
m2 西数蓝盘 sn580 1t 600 直接从 pn61s 搬过来
sata 西数黑盘 wd5000 500g 50 淘宝拆机,也是直接从 pn61s 搬过来
硬盘柜 铁威马 D5 Hybrid 800 淘宝
3.5 sata 希捷酷狼 8T 1400 京东
Homelab 有线路由 MikroTik RB5009UG 1200 淘宝 带机架固定器
机柜 12u 100 淘宝 600mm x 550mm x 400mm
UPS APC BK650 440 淘宝

上面的大概就是一个 All in One 的组合,去年的 pn61s 就不算在这里面了。

话说硬盘真贵啊,硬盘柜和硬盘加起来基本上就是 p340 无盘系统的价格了,况且我小主机所有配件选的还是成色非常好的。。。
但怎么说呢我觉得还是挺值得的:首先是有了相机后对存储的要求突增了许多;另外科研上的各种资料项目工程文件越来越多,除了网盘外还是得有一个离线的备份方案。

基础设施

画了张图,能够清楚地描述整个小 dc 的组成;其他只是与 dc 相关而并不隶属的部分我就简单概括一下咯:(话说 draw.io 挺好用的)



其中部分系统服务的编排,我认为是能保证集群稳定运行的比较好的实践,接下来我简要地说明下,供大家参考。

PVE

即 Proxmox Virtual Environment,是在 Debian 的下游开发的虚拟化平台。PVE 的好处是非常稳定,24*7 连续运行时基本上宿主系统不会出现什么大问题,非常可靠。相比另一个常用的虚拟化平台 VMWare ESXi 更多的驱动和更完善的折腾记录和参考。自带的集群管理功能可以很方便地集中管理,或者在 host 之间迁移数据,而其它各项功能就跟 VMWare Workstation 在 Windows 上的操作一样(或者说虚拟化平台之间的功能都差不太多),就不再具体说明了。

DNS

DNS 作为集群网络中的基础设施,其稳定性保证几乎所有服务的质量,因此需要一个良好易实施与维护的方案。

在这之前,我所有的域名都在 Cloudflare 上配置解析,其中也包括内网中的部分。在实际使用时就会发现这是不太方便的做法:将内网的服务地址往外暴露不仅配置麻烦,而且没有必要(暂且不说明安全方面也会有一定的隐患)。
因为现在有了 NAS,为了方便 SMB 共享的用户验证,我搭建了 Windows Server 用做 Active Directory 服务器的同时,发现域控本身就是在 DNS 基础上实现的,于是就顺便将域控的 DNS 用作集群的内部 DNS。当然你也可以不使用 Windows Server 的 DNS 实现,而选择广泛使用的 bind9 作为替代。

使用 Windows Server 在同一个域中搭建多个 DNS 服务器时域配置会自动同步,因此可以轻松地实现高可用。
对于 DNS 这种需要保证稳定性的服务,建议再搭建几个次级 DNS 放在公网的云服务器上(但只开放内网访问)。bind9 能够很方便的完成次级 DNS 的配置,将域中的主 DNS 记录完整地同步过来。

待 DNS 部署完成后,可在 Tailscale 控制台中开启 Split DNS 功能,Tailscale 的客户端会在解析域名时自动将属于内网的部分发送至你配置的内网 DNS 上进行解析:

这算是 Tailscale 一大便利功能,因为配置完成之后,你不再需要为要访问内网服务的设备手动配置内网 DNS 了。

网络代理

集群中的代理主要分为两种:一种是给集群中所有的机器进行镜像拉取、软件包脚本下载等使用的内部代理,配置 http proxy 即可;另一种是给自己的设备使用的外部代理,具体的角色设定为旁路由。

之前的文章 有介绍过我解决大陆服务器网络问题的策略:不使用 Tailscale exit-node,而是在多个外网节点搭建简单的 http-proxy (http proxy over wireguard ¿) 后通过 openwrt+openclash 中继的方式实现 failover/load balancing。

流量入口与负载均衡

如架构图所示,虽然所有的虚拟机都通过网桥直接连接在路由器上,但访问应用程序的流量均通过固定的 Load Balancer 进入。

这样做的好处是很明显的:

  1. 不会再出现 main-server:9100, sidecar:9090, nas:8080 之类乱七八糟的访问地址,转而由 prometheus.plam.toay.io, insight.plam.toay.io, cells.attic.plam.toay.io 替代并开启 https,让自己看起来更像是 Saas 提供商。😝
  2. 统一管理所有的域名和证书;这一点通过 通配符解析 和 acme.sh 就可以完美实现。
  3. 仅将服务通过指定的一两台机器暴露出去,大大减少可能的安全问题。访问日志、流量统计、WAF、统一缓存什么的很轻松就能部署。
  4. 负载均衡,特别是对于使用 k3s 部署的微服务,load balancing+traefik ingress+动态缩扩容非常方便。

这个任务 Nginx 可以轻松承担。
另外,若想把服务暴露给公网,可以再在带宽稍高点的云服务器上部署一个 Nginx 来负责外网流量的导入,就像我在 git.toay.io 上做的那样。

状态监测

状态监测(包括 MetricsLogging)是维护集群稳定的必要方式以及出现问题后排查与解决的参考来源。

  • Grafana: 可视化 Web 应用
  • Prometheus: 从 *_exporter 采集指标数据
  • Loki: 日志数据采集
  • *_exporter: 指标数据收集与统一 expose
  • promtail: 收集与提交日志数据至 Loki

这里推荐一个用于 MikroTik 设备数据与日志收集的工具 mktxp,可收集各种运行时产生的数据用于分析:

UPS

对于寝室这种可能会突然断电的环境,如果你想让你的设备在役时间更长久一些,UPS 可以说是必须准备的物件了。
APC 的 UPS 貌似全平台都有各种官方的/开源的上位机控制软件的支持;在 Linux 下官方的上位机守护程序 apcupsd 直接用 apt 安装即可。

虽然 BK650 通过 USB 仅直接连接到一台物理机上,但是这台机器上运行的 apcupsd 可以开启一个 Network Information Server 作为 Master 给其他主机的 apcupsd 作为 Slave 来使用,可以实现 UPS 在电量即将耗尽之前将所有的物理机关机,那就非常方便了。

k3s+rancher

k3s 用于除了 NAS 相关、以及部分重要的基础设施之外服务的编排,部署在云服务器上的 Rancher 则作为远程可视化管理工具,可以方便的跟自动化工具联合。

虽然这个集群主要是为 k3s 构建的,但是我的博客已经花了不少篇幅介绍他们,这里也不再赘述了;更多内容可以通过下面的专栏链接来了解。

基础设施的介绍差不多就到这了;这里只是简要地介绍我的方案。如果想要了解更详细的部署步骤和实际遇到问题的细节说明,可以移步专栏 k3s 集群维护笔记。接下来就介绍下我部署的各种有意思的服务啦。😊

各种有意思的服务

目前两个小主机上加起来跑了十个左右的虚拟机,主要是软路由、反向代理、k3s 集群节点、NAS、Linux 开发环境,以及用于远程桌面、做域控和 DNS 的 Windows Server。

Git.Toay

Git.Toay 应该是 PlamNet 中寿命最长的一项了,也是截止目前使用的最多的一项;我将我绝大多数暂不公开的项目存在其中,有时也会从 GitHub 上 clone 一些有意思的项目下来做存档。GitLab 自带 CI/CD 工具和容器镜像库功能,现在也在探索中,之后会将其与 Rancher 集成,尝试构建部署全流程的自动化。

为了保证数据安全(针对于数据丢失的风险),特别为它启用了完善的备份措施:每天凌晨由 GitLab 自动创建备份到 p340 tiny 内置 sata 机械盘中,然后每周从机械盘增量备份至 NAS 中。
现在打算整理一下 Dropbox,按重要性筛选将较低的大文件下载到 NAS 中,然后在 NAS 中部署 rclone,每周将备份文件夹中的资料推到 Dropbox 备份;大概是我能/需要做到的备份计划之极限了吧?

NAS

对于 NAS 的实现,我的方案是:系统方面选择使用 OpenZFS 文件系统的 TrueNAS,并将硬盘盒直通到 TrueNAS 虚拟机中。

虚拟机里运行的服务主要有以下几类:

  1. SMB 服务器
  2. 作为网盘使用的 Pydio / Nextcloud
  3. 作为文件同步备份用的 Resilio Sync / Syncthing
  4. 作为网络相册的 Photoprism
  5. 作为辅助工具/基础设施的 n8n/nginx proxy manager

Gallery.Attic

网络相册是我认为购买硬盘/硬盘盒凑 NAS 后效益最大的一项功能。在之前,我整理照片的流程是在工作站上直接使用 Lightroom CC 导入 SD 卡内的照片到存在移动硬盘里的库中。由于我习惯拍照时都是自动保存 DNG 原片,因此每个快门都会产生一百多兆的数据;时间一长,我的 1T 小移动硬盘就招架不住了。

而现在,我的流程转为:将相机连接到小主机后,通过 Windows Server 远程桌面使用 Lightroom CC 将 DNG 原片导入到 TrueNAS 的 SMB 网络驱动器中,而只是保存预览和修改描述文件的库则通过 Resilio Sync 进行几大设备间的同步。另外,照片保存到 NAS 中的同时,Photoprism 也会自动导入并生成索引以供快速搜索与查看。因此我可以在空闲的时候将 Gallery.Attic 打开,将自认为尚可的照片挑选出来,一并导出到博客中来,而不是就尘封在移动硬盘中,直到自己都忘记曾拍过什么照片。

SMB 服务器

除此之外,SMB 服务器实现了“无线大容量硬盘”的功能。
备份数据什么的就不用说了,将其挂在到 Windows Server 上还可以用来 24h 挂机下载。下载完成后不需要拷贝到电脑上观看,能轻松跑满千兆的网络可以直接使用流传输;这个算是附带效益吧。

iSCSI/NFS 服务器

NAS 能提供的最高级的服务可能就是 为 k3s 集群提供存储支撑 了。有了 iSCSI/NFS 这两种 k3s/rancher 原生支持的选项,可以完美地实现 compute 与 storage 资源的分离,体验私有云效果的同时还能将资源分配利用率最大化。(简单举个例子,将价格低稳定性较差些但还有使用价值的硬盘用于虚拟机启动盘的存储,就算挂掉后数据仍在 NAS 中,换块差不多的硬盘用模板重新启动就可以了)

由于之前 k3s 的存储一直使用的 bind-mount,这种存储方式现在还在探索中。在我实践出经验后将会把经历记录在 k3s 维护 专栏中。

Bonus

感谢看到最后 (。•ᴗ-)_
既然看起来已经像模像样了,要不简单地回顾一下折腾史吧。

最早从线上(云服务器)折腾到线上线下双管齐下时当回溯到高一的暑假了。其实这么多年过去了博客上还保留着那时的记录。 当初的想法和现在也相差无几(要不把 06 年的 惠普畅游人 拿来搭个家庭媒体系统吧,大概),而在 17 年时 家用 NAS 应该是非常小众的。后来因为维护麻烦、噪声高利用率低等诸多原因,再加上长期不在家回校后根本用不上只得关机,于是断断续续累计运行总时不到一年就没再使用了。现在回想起来,Linux 的入门实践大概都是在那台古董上进行的。

后来接触到树莓派这种单板机,在宿舍角落挂几个 Home Assistant/OpenClash/Mqtt 容器什么的,顺便用 GPIO 与串口控制用单片机做成的不带任何界面的“隐形门锁”,就这么玩到本科毕业。然而在去年,在价格媲美 x86 而性能堪比 riscv 的 raspberry pi 5 出现后,我大概是放弃树莓派了,等几年后知识储备到位时会研究下自己的 Arm 板子。

弃坑之后,本文的内容便开始了。