可移动数据中心的构想与实现

问题描述

现在,在我们的工作环境中,以笔记本为办公平台,在其上完成例如 编码、远程、文档处理 等等工作。对于其他数据资源,则保存在远程文件托管服务(例如 NAS 或 云盘服务 等等)中,通过网络进行远程访问及数据备份。

但是,该方案的最大问题是我们无法保证网络总是可用或高速,在某些特殊工作环境中,或无法访问网络,或网络速度受限,或网络质量不稳定,导致我们无法访问远程文件托管服务中的资源。

所以,我们尝试将经常访问的__数据资源本地化__,即将常用访问的数据直接保存在笔记本电脑上,并在其上运行__备份服务__以将我们的数据备份到远程文件托管服务。鉴于此,即使网络资源成为瓶颈,也不会影响我们对数据资源的访问,而远程文件托管服务则作为 极低频访问资源的存储笔记本数据备份的后端存储 而存在。

但是,随着办公平台的扩大,我们平时不得不以 Linux 系统为主要办公环境,但是有的时候会用到 Windows 系统,尤其是需要运行仅支持 Windows 平台的软件(例如 企业微信、钉钉、微信 等等)。我们尝试更换 Macbook,但并不能解决问题;两个笔记本,携带也不方便;通过 Wine 方案,仅能解决部分软件的运行问题,仍旧存在部分软件无法通过 Wine 来运行。

所以,我们尝试在虚拟机中运行操作系统,将我们的办公环境迁移到虚拟机。我们在宿主机中运行 Linux 操作系统,并在其中部署桌面虚拟化(例如 VirtualBox 等等),并在虚拟机中运行 Windows 操作系统。同时,借助虚拟机的 Guest Additions 组件,实现宿主机与虚拟机之间互操作(例如 文件共享、复制粘贴 等等)

但是,很多时候两个操作系统(Windows/Linux)都要使用相同的服务。例如:或为了提供网络质量,两个操作系统都需要使用网络加速服务;或为了访问办公网络,两个操作系统都要接入企业 VPN 服务;

所以,我们开始思考,既然虚拟机的流量是通过 NAT 进行网络访问,那能不能在虚拟化中运行路由器操作系统,然后所有的虚拟机操作系统将数据包发往路由器操作系统,而路由器操作系统的其他接口负责将数据包发送到外部网络。这样的网络模型就更加贴近于现实环境的终端网络,事情也变得越来越疯狂。

关键词:可移动数据中心、边缘数据中心、便携式数据中心、虚拟数据中心

解决方案

根据我们的想法进行描绘,整个系统原型类似如下:

1
2
3
4
5
6
7
+-------------------------------------------------+
| OpenWrt | Windows VM | Linux VM | ... |
+-------------------------------------------------+
| LINUX + KVM + Storage |
+-------------------------------------------------+
| LAPTOP |
+-------------------------------------------------+

LAPTOP:最底层是笔记本物理硬件本身,所有的环境将运行在其上。这其中既有配电设施,又有冷却设施,运维管理中心则为本机。至于机柜和布线系统,鉴于整个系统的基于多种虚拟化技术实现,所以完全不需要机柜和布线系统。

LINUX + KVM + Storage:向上则是虚拟化环境,运行 Linux 操作系统,并在其中部署 KVM 虚拟化,最后将物理存储加入到 KVM 虚拟化的存储池中,以向上层虚拟机提供存储服务。

OpenWrt:作为虚拟机访问外部网络的网关,所有虚拟机流量将通过 OpenWrt 路由到外部网络。对于 KVM 环境,运行 OpenWrt in QEMU 路由,网络加速也在 OpenWrt 中实现,通过全局流量检查来同时实现Linux 和 Windows 的网络加速,如此便无需在两个系统中安装客户端。

Windows VM、Linux VM:作为实际我们办公的操作系统,且所有虚拟机网卡与 OpenWrt 网卡位于相同的二层网络,所有的虚拟机流量将发送到 OpenWrt,并由 OpenWrt 的另张网卡发送到外部网络。

虚拟机的数据共享:鉴于多个虚拟机间的很多数据、文件、程序是需要共享的,我们通过用 NFS 或 CIFS 来实现。但是存储还是落在主机上,所以需要使用 KVM 隔离网络来允许虚拟机访问宿主机,这导致但个虚拟机至少有两块网卡。

虚拟机的桌面访问:宿主机具备图形化桌面,我们使用 virt-manager 对 KVM 虚拟机进行管理及桌面访问,对于虚拟机间的复制粘贴,通过 SPICE Agent 能够解决。

如此,我们便能将数据中心装在包里,随身携带。硬件配置要求,取决于个人工作负载,我们平时运行 Linux 及相关的应用就要 16G 的内存,主要是应用程序开的多。

首个实现

我们已实现该技术方案的首个版本,但是多少有些出入(但差别并不大):

共 4 层(从上到下,L4、L3、L2、L1)

虚拟化选用 VirtalBox 的原因是:
1)鉴于是移动数据中心,所以涉及桌面环境事件响应(例如 休眠处理 等等),而桌面虚拟化软件处理的更好;
2)VritualBox 免费;

鉴于虚拟化(L2)及物理层(L1)暂无特殊配置,所以不再详细说明。该部分的后续内容将概述网络层(L3)与客户机层(L4)的实现,及相关问题处理。

第一步、创建 OpenWrt 实例

在 VirtualBox 中,部署 OpenWrt 服务:参考 [OpenWrt Wiki] OpenWrt on VirtualBox HowTo 文档,获取官方配置说明。

我们需要三张不同网络网络类型的网卡(尽量依序创建):
1)NAT:负责网络访问,否则 OpoenWrt 将无法上网;(相当于 WAN 接口)
2)Internal Network:实现 OpenWrt、Linux 的二层互联;(相当于 LAN 接口)
3)Host-only Adapter:能与主机通信,用于从主机连接和管理 OpenWrt 服务;

第二步、配置 OpenWrt 服务

我们需要配置 OpenWrt 服务,使其成为路由设备:
[OpenWrt Wiki] OpenWrt as router device

如果遇到问题,或许需要使用 TCPDump 抓包:
[OpenWrt Wiki] How to capture, filter and inspect packets using tcpdump or wireshark tools

第三步、配置 Linux Guest 实例

创建 Linux Guest 主机,并添加 Internal Network 类型网络,使其与 OpenWrt 二层互联;

然后,启动 Linux Guest 实例;

如果配置正确,Linux Guest 能够通过 OpenWrt 的 DHCP 获取 IP 地址;

后续的改进工作

首个版本已能够运行,但是还有很多改进工作:

1)继续使用 VirtualBox 桌面虚拟化:KVM 非桌面虚拟化,对桌面场景处理不是很好。比如 当 KVM 休眠恢复后,时间跳跃导致 Guest CPU Usage 飙升;

2)替换 Host 系统为 Linux 发行版:Window 10 + VirtualBox 的问题是,网卡插拔后(间隔久一点),Guest Bridage Network 无法就再也无法访问网络;Linux + VirtualBox 经过测试暂无问题。桥接网络是为了 OpenWrt 与 另个数据中心运行动态路由协议,如果用 NAT Network 就无法运行动态路由协议。另外,笔记本的有线网卡/无线网卡可以进行 主/备/负载。

3)引入存储(待定):该改进的目的是使得整个模型更加贴近于终端环境,并通过 FCoE 或 iSCSI 的方式提供块存储。但并无必要性,虚拟机的磁盘扩容也是在文件系统上扩容的,没必要引入独立的存储服务。后来(04/27/2022)我们觉得还是要引入存储服务,为多个 Guest 提供共享的网络文件系统存储,实现文件共享,同时使得整个模型更加贴近于数据中心。

改进工作的推进

我们确实对整个模型进行改进

1)替换 Host 系统为 Linux 发行版:Ubuntu 20.04 LTS + VirtualBox 6.1.32

2)引入存储:使用 OpenMediaVault 作为存储,目前主要是将其作为网络文件系统来使用:(1)在多个 Guest 间通过网络分享文件和数据;(2)将数据从 Linux Guest 脱离出来,数据备份工作转移到存储服务层面;

3)替换 OpenWrt 组件:我们引入 pfSense 防火墙,以利用其中的 FRR 模块与 L2TP 模块;

低廉的分布式数据中心

为了能从办公室访问家里的网络(我们没有出口路由的控制权),而且是任意访问(我们希望直接访问 80 端口,但是受限于网络环境,80 端口默认被运营商屏蔽),所以我们通过部署 L2TP VPN 解决。通过十分服务器部署 LNS 服务,家里的路由器和笔记都作为 LAC 拨号到 LNS,形成二层网络,我们便能通过内网地址直接访问家里的服务。但缺点也很明显,双端需要配置静态路由,否则网络无法互通。虽然需要静态路由,但也不影响使用。而在思考改进该缺点的时候,我们得到创建分布式的低廉数据中心的灵感。

我们的目标很简单:利用当前公网架构,将分散在各地理位置的资源集结到一起,形成大型逻辑网络。于是便产生如下拓扑(相关的技术细节不再赘述,该图已披露出关键的技术要点)