我需要在 2.6.32 Linux 内核上提供具有静态加密的高可用性 MySQL 数据库。“高可用性”部分并不难,但与 HA 结合使用时,“静态加密”被证明是一项挑战。
关键问题在于安装加密存储。在我们所有其他静态加密系统中,都有一个命令需要由人来运行,然后提示输入加密密钥。当涉及到集群安排时,这种模式有一个相当明显的缺陷,服务必须从集群安排开始自动地。
我目前不知道如何在 HA 环境中提供静态加密,并且不在同一系统上存储密钥密码。
我能看到两种可能的情况,其中任何一种都可以在我的环境中工作,但我不确定使它们工作的细节。或者甚至不知道是否有可能。
场景 1:CLVM 和集群
- 我的集群成员之间共享一个卷。
- 本卷的设置大致如下:
- 物理设备上的 cryptsetup 内容
- 新 crypt 设备上的 LVM 内容
- 集群服务设置为不是自动加入集群,依靠人工干预。
- 集群服务通过人工运行的命令启动,该命令提供解密密钥,进而激活 CLVM。
这样,正在运行的节点就可以访问 CLVM 卷,因此它们可以在集群管理器发出指令时启动服务。节点的重新启动仍需要人工操作,并且加密密码永远不会保存在磁盘上的任何地方。
场景 2:DRBD 和集群
- 在每个集群成员上创建一个卷
- cryptsetup 在物理设备上运行
- drbd 配置在加密设备上,用于在每个节点之间进行复制
- LVM 或文件系统位于 drbd 卷的顶部
- 集群服务设置为不是自动加入集群,依靠人工干预。
- 集群服务由提供解密密钥的人启动,这反过来使得 LVM(或文件系统)可见但未安装。
与 CLVM 设置一样,节点只有在能够看到可能共享的存储时才会加入集群。
问题是,我不确定上述任何一种方法是否能以这种方式工作。两者都假设可以将 LVM PV 分层在加密卷之上(例如pvcreate /dev/mapper/cryptmysql
)。这可能是不可能的。
答案1
主要挑战似乎是密钥输入的人为干预。对此有一些帮助:dm-crypt 支持 TPM,您的平台可能提供此功能。请参阅IBM 蓝图了解配置详情。此外LUKS/cryptsetup支持从文件/标准输入读取插槽密钥。如果你能将密钥安全地存储在某个地方(就像智能卡一样),这可能是一个可行的选择。
至于您是否可以在 dm-crypt 卷上拥有 LVM PV 的问题:可以,您只需要在插槽解锁后运行pvscan
/vgchange -a -y
即可。几年前,我们曾使用更旧的内核运行过这种设置。最后,由于性能原因,我们放弃了它,转而使用 SED 来处理具有静态数据加密要求的应用程序(dm-crypt 当时曾经为每个加密设备使用一个线程,这导致我们的设置出现 CPU 瓶颈)。
答案2
事实证明,正如 syneticon-dj 所建议的那样,使用 LVM 完全可以做到这一点。从那时起,我已经验证了它适用于集群配置。然而,这样做并不像你想象的那么容易。
在 cLVM 卷组可见之前,必须通过cryptsetup luksOpen
需要加密的设备对其进行解密。这必然发生在集群服务启动后,因此基于它的任何资源都不应是任何关键设备(如 stonith 设备)的成员。
设置集群与往常相同,但存在一些差异:
- 集群中最好有一个未加密的第二个存储设备,可供 stonith 使用(外部/sbd 类型)。
- 当所有节点都通过相同的 cryptsetup 命令打开加密卷并映射到相同的设备名称(例如
cryptsetup luksOpen /dev/sdd cryptmysql
)时,创建 clvm 资源 - 在 cryptsetup 创建的设备上创建集群卷组(例如
vgcreate ClusterMySQLVG /dev/mapper/cryptmysql
) - 创建一个简单的 bash 脚本,每次都以相同的方式运行解密,操作员将在重启后使用它来获取可访问的卷。
由于节点需要手动干预才有资格进行故障转移,因此在故障转移群集中拥有两个以上的节点是个好主意。
一旦卷组和逻辑卷正常创建,就可以安装 MySQL。此时,安装将按照正常集群安装的方式运行。
当节点重新启动时:
- 集群服务将在启动时启动,节点将加入集群。但是,由于它无法查看 MySQL 卷,因此无法进行故障转移。
- 操作员通过 ssh 连接到节点,并运行上面创建的解密脚本,该脚本提示输入解密密钥。
- 该脚本运行并在中创建所需的映射
/dev/mapper
,然后 LVM 获取该映射。 - LVM 服务应自动刷新并查看新的卷组元数据。
- 此时,集群服务将看到 MySQL 卷组可用,并且该节点将有资格进行故障转移。