将容器用于 Linux 上的 SQL Server
容器有助于组织创建灵活且可缩放的 SQL Server 安装。
Wide World Importers 支持着一些大规模数据库工作负荷,它们需要灵活且可缩放的托管体系结构。 你希望评估在虚拟机 (VM) 和容器等虚拟环境中托管 SQL Server 的可能性。
在这里,你将学习如何选择使用容器还是 VM 来承载数据库。
比较 VM 和容器
虚拟化是一种技术,管理员使用该技术在单个物理服务器上托管多个虚拟服务器。 使用虚拟化时,无需购买和安装额外的硬件即可轻松部署额外的实例,例如 SQL Server。 虚拟化有两种常见方法:
- VM:使用 VM 时,每个实例都是一个完整的虚拟服务器,其中包含自己的操作系统和硬件。
- 容器:使用容器时,每个实例与主计算机共享操作系统和硬件资源。
VM 和容器都提供隔离的环境,在该环境中,应用程序(如 SQL Server)可像在单独的物理计算机上一样运行。
VM 较大,创建所需的时间更长,但由于它们有自己的操作系统,因此可以使用与主计算机不同的配置和硬件。 还可以在同一主机上混合使用具有不同操作系统的 VM。 例如,在 Linux 主机上,可以安装运行 Linux 和 Apache 的 VM 来托管网站。 可能还有另一个运行 Windows 和 SQL Server 的 VM 来托管数据库。
容器更小,因此加载速度比 VM 快得多。 但是,如果主机运行的是 Linux Ubuntu,则该计算机上的所有容器必须运行相同版本的 Ubuntu。 在 Linux 主机上,可以安装运行 Linux 和 Apache 的容器,但数据库容器必须也运行 Linux。 只要运行 SQL Server 2017 或更高版本,就可以这样做。
在主计算机上,必须安装软件(如 Hyper-V 或 VirtualBox)来托管 VM。 对于容器,可以使用 Docker 系统、CRI-O、rkt 和其他容器主机。
使用虚拟机的理由
在某些情况下,容器并非最佳解决方案。 由于容器在单个操作系统上运行并共享系统资源,安全性是一个问题。 如果攻击者获得“超级用户”特权,一些矢量可能会导致其得到对应用程序的访问权限。 在容器中,应用程序必须与主计算机在同一 OS 上运行。 无法在 Windows 上的容器中运行基于 Linux 的应用程序。 利用 VM,可以在 Windows 上托管 Linux 虚拟机,也可以在 macOS 上托管 Windows 虚拟机,具有更高的灵活性。 利用 VM,可以在单个 VM 中托管多个应用程序,并进行紧密集成。 容器通常仅承载单一应用程序。
VM 效率低于容器。 在给定的一组硬件上,可以在容器中运行的应用程序数目至少要比使用 VM 时多两倍。 VM 使用更多资源,因为它需要操作系统的完整副本和所有硬件的虚拟化版本,以支持来宾操作系统。
使用容器的理由
相比较而言,容器更轻量,可以将应用打包到一个更小的内存占用空间。 由于使用单个操作系统托管容器,因此管理工作更少。 只需要修补和更新单个 OS,而无需维护每个 VM 上的每个来宾 OS。 容器更小、更简单,因此可以在数秒内启动,而不像启动 VM 那样需要数分钟。
资源协调
可以使用 Docker Swarm、Kubernetes 和其他解决方案协调容器。 业务流程协调程序可以监视,并且支持使用容器缩放应用,还提供一定程度的灾难恢复能力。 Microsoft 提供了有关如何使用 Kubernetes 的工具和示例,因此对于容器化 Linux 上的 SQL Server 是一个不错的选择。 有一个可与 Kubernetes 协同使用的 Linux 上的 SQL Server 容器映像。
容器化 Linux 上的 SQL Server
对于在容器中运行的数据库,有一个问题是持久存储。 必须在容器外提供一个存储位置,让数据库可以保存数据库文件。 这样即可对群集中的所有容器实现更改。 如果使用 Kubernetes,则可以将永久卷用于此位置。
首先,创建一个永久卷,然后添加一个永久卷声明 (PVC)。 为 Linux 上的 SQL Server 创建一个部署清单,让其使用 Microsoft 创建的 mssql-server-linux
容器映像。 该清单还包含 PVC 的定义和服务的负载均衡器,以确保一致的 IP 地址。 创建部署并检查 SQL Server 是否正在 pod 中运行。 完成此设置后,如果节点出现故障,Kubernetes 将启动新实例。 有一个简单的测试方法,就是删除该 pod,并检查是否有新实例自动启动。