如何在 Linux 中配置和维护高可用性/集群
高可用性(HA)简单来说就是指系统能够长时间连续运行而不出现故障的质量。 HA解决方案可以使用硬件和/或软件来实现,实现HA的常见解决方案之一是集群。
在计算中,集群由两台或多台计算机(通常称为节点或成员)组成,它们协同工作来执行任务。在这样的设置中,只有一个节点提供服务,辅助节点在发生故障时接管。
集群分为四种主要类型:
- 存储:在集群中的服务器之间提供一致的文件系统映像,允许服务器同时读取和写入单个共享文件系统。
- 高可用性:消除单点故障,并在某个节点无法运行时将服务从一个集群节点故障转移到另一个集群节点。
- 负载均衡:将网络服务请求分发到多个集群节点,以平衡集群节点之间的请求负载。
- 高性能:进行并行或并发处理,从而有助于提高应用程序的性能。
另一种广泛使用的提供高可用性的解决方案是复制(特别是数据复制)。复制是一个或多个(辅助)数据库可以与单个主(或主)数据库保持同步的过程。
要设置集群,我们至少需要两台服务器。出于本指南的目的,我们将使用两台 Linux 服务器:
- 节点1:192.168.10.10
- 节点2:192.168.10.11
在本文中,我们将演示如何在 Ubuntu 16.04/18.04 和 CentOS 7 中部署、配置和维护高可用性/集群的基础知识。我们将演示如何将 Nginx HTTP 服务添加到集群。
在每台服务器上配置本地 DNS 设置
为了使两台服务器能够相互通信,我们需要在两台服务器上的 /etc/hosts 文件中配置适当的本地 DNS 设置。
使用您最喜欢的命令行编辑器打开并编辑该文件。
sudo vim /etc/hosts
添加以下条目以及您服务器的实际 IP 地址。
192.168.10.10 node1.example.com
192.168.10.11 node2.example.com
保存更改并关闭文件。
安装 Nginx Web 服务器
现在使用以下命令安装 Nginx Web 服务器。
sudo apt install nginx [On Ubuntu]
sudo yum install epel-release && sudo yum install nginx [On CentOS 7]
安装完成后,暂时启动Nginx服务并使其在启动时自动启动,然后使用systemctl命令检查它是否已启动并运行。
在Ubuntu上,该服务应该在包预配置完成后立即自动启动,您只需启用它即可。
sudo systemctl enable nginx
sudo systemctl start nginx
sudo systemctl status nginx
启动 Nginx 服务后,我们需要创建自定义网页来识别和测试两台服务器上的操作。我们将修改默认 Nginx 索引页的内容,如图所示。
echo "This is the default page for node1.example.com" | sudo tee /usr/share/nginx/html/index.html #VPS1
echo "This is the default page for node2.example.com" | sudo tee /usr/share/nginx/html/index.html #VPS2
安装和配置 Corosync 和 Pacemaker
接下来,我们必须在每个节点上安装Pacemaker、Corosync和Pcs,如下所示。
sudo apt install corosync pacemaker pcs #Ubuntu
sudo yum install corosync pacemaker pcs #CentOS
安装完成后,请确保 pcs 守护程序在两台服务器上运行。
sudo systemctl enable pcsd
sudo systemctl start pcsd
sudo systemctl status pcsd
创建集群
在安装过程中,会创建一个名为“hacluster”的系统用户。因此我们需要设置pcs所需的身份验证。首先为“hacluster”用户创建一个新密码,我们需要在所有服务器上使用相同的密码:
sudo passwd hacluster
接下来,在其中一台服务器 (Node1) 上运行以下命令来设置 pcs 所需的身份验证。
sudo pcs cluster auth node1.example.com node2.example.com -u hacluster -p password_here --force
现在,在 Node1 服务器上创建一个集群并在其中填充一些节点(集群名称不能超过 15 个字符,在本示例中,我们使用了 examplecluster)。
sudo pcs cluster setup --name examplecluster node1.example.com node2.example.com
现在在启动时启用集群并启动服务。
sudo pcs cluster enable --all
sudo pcs cluster start --all
现在使用以下命令检查集群服务是否已启动并正在运行。
sudo pcs status
OR
sudo crm_mon -1
从上述命令的输出中,您可以看到有关于没有 STONITH 设备的警告,但 STONITH 在集群中仍处于启用状态。此外,尚未配置集群资源/服务。
配置集群选项
第一个选项是禁用 STONITH(或 Shoot The Other Node In The Head),这是 Pacemaker 上的隔离实现。
该组件有助于保护您的数据免遭并发访问损坏。出于本指南的目的,我们将禁用它,因为我们尚未配置任何设备。
要关闭STONITH,请运行以下命令:
sudo pcs property set stonith-enabled=false
接下来,还可以通过运行以下命令来忽略 Quorum 策略:
sudo pcs property set no-quorum-policy=ignore
设置上述选项后,运行以下命令查看属性列表,并确保上述选项 stonith 和 仲裁策略 已禁用。
sudo pcs property list
添加资源/集群服务
在本节中,我们将了解如何添加集群资源。我们将配置一个浮动IP,它是可以立即从同一网络或数据中心内的一台服务器移动到另一台服务器的IP地址。简而言之,浮动IP是一个技术通用术语,用于指不严格绑定到单个接口的IP。
在这种情况下,它将用于支持高可用性集群中的故障转移。请记住,浮动 IP 不仅仅适用于故障转移情况,它们还有一些其他用例。我们需要以这样的方式配置集群,即在任何给定时间只有集群的活动成员“拥有”或响应浮动 IP。
我们将添加两个集群资源:名为“floating_ip”的浮动 IP 地址资源和名为“http_server”的 Nginx Web 服务器资源。
首先添加 float_ip,如下所示。在此示例中,我们的浮动 IP 地址是 192.168.10.20。
sudo pcs resource create floating_ip ocf:heartbeat:IPaddr2 ip=192.168.10.20 cidr_netmask=24 op monitor interval=60s
在哪里 :
- floating_ip:是服务的名称。
- “ocf:heartbeat:IPaddr2”:告诉 Pacemaker 使用哪个脚本,在本例中为 IPaddr2,它位于哪个命名空间 (pacemaker) 以及它符合 ocf 的标准。
- “op监视间隔=60s”:指示Pacemaker通过调用代理的监视操作每隔一分钟检查一次该服务的运行状况。
然后添加第二个资源,名为http_server。这里,服务的资源代理是ocf:heartbeat:nginx。
sudo pcs resource create http_server ocf:heartbeat:nginx configfile="/etc/nginx/nginx.conf" op monitor timeout="20s" interval="60s"
添加集群服务后,请发出以下命令来检查资源的状态。
sudo pcs status resources
查看命令的输出,已经列出了两个添加的资源:“floating_ip”和“http_server”。由于主节点正在运行,floating_ip服务已关闭。
如果您的系统上启用了防火墙,则需要允许所有到 Nginx 的流量和所有高可用性服务通过防火墙,以便节点之间进行正确的通信:
-------------- CentOS 7 --------------
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=high-availability
sudo firewall-cmd --reload
-------------- Ubuntu --------------
sudo ufw allow http
sudo ufw allow high-availability
sudo ufw reload
测试高可用性/集群
最后也是重要的一步是测试我们的高可用性设置是否有效。打开网络浏览器并导航到地址 192.168.10.20,您应该会看到来自 node2.example.com 的默认 Nginx 页面,如屏幕截图所示。
要模拟故障,请运行以下命令来停止 node2.example.com 上的集群。
sudo pcs cluster stop http_server
然后重新加载 192.168.10.20 页面,您现在应该从 node1.example.com 访问默认的 Nginx 网页。
或者,您可以通过告诉服务直接停止来模拟错误,而不停止任何节点上的集群,在其中一个节点上使用以下命令:
sudo crm_resource --resource http_server --force-stop
然后你需要以交互模式(默认)运行crm_mon,在2分钟的监控间隔内,你应该能够看到集群通知http_server失败并移动它到另一个节点。
为了使集群服务高效运行,您可能需要设置一些约束。您可以查看 pcs 手册页 (man pcs) 以获取所有使用命令的列表。
有关 Corosync 和 Pacemaker 的更多信息,请查看:https://clusterlabs.org/
概括
在本指南中,我们展示了如何在 Ubuntu 16.04/18.04 和 CentOS 7 中部署、配置和维护高可用性/集群/复制的基础知识。我们演示了如何将 Nginx HTTP 服务添加到集群。如果您有任何想法要分享或有疑问,请使用下面的反馈表。