如何在 Ubuntu 14.04 上使用 Heartbeat 和保留 IP 创建高可用性设置

简介

Heartbeat 是一个开源程序,为客户端服务器提供集群基础设施功能——集群成员资格和消息传递,这是高可用性(HA)服务器基础设施中的关键组件。通常,Heartbeat 与集群资源管理器(CRM)(如 Pacemaker)一起使用,以实现完整的 HA 设置。但是,在本教程中,我们将演示如何仅使用 Heartbeat 和 DigitalOcean 保留 IP 来创建一个 2 节点 HA 服务器设置。

如果您希望创建更强大的 HA 设置,请考虑使用 Corosync 和 Pacemaker 或 Keepalived。

目标

完成后,HA 设置将由两个 Ubuntu 14.04 服务器组成,处于主/备配置。这将通过将保留 IP 指向主服务器来实现,除非检测到故障。如果 Heartbeat 服务检测到主服务器不可用,次要服务器将自动运行脚本,通过 DigitalOcean API 将保留 IP 重新分配给自己。因此,随后对保留 IP 的网络流量将被定向到您的次要服务器,后者将充当活动服务器,直到主服务器再次可用(此时,主服务器将重新分配保留 IP 给自己)。

!主/备图表

为了实现这个目标,我们将按照以下步骤进行:

  • 创建 2 个将接收流量的 Droplets
  • 创建保留 IP 并将其分配给其中一个 Droplet
  • 创建指向保留 IP 的 DNS A 记录(可选)
  • 在 Droplets 上安装 Heartbeat
  • 配置 Heartbeat 以运行保留 IP 重新分配服务
  • 创建保留 IP 重新分配服务
  • 测试故障转移

先决条件

为了自动重新分配保留 IP,我们必须使用 DigitalOcean API。这意味着您需要生成一个个人访问令牌(PAT),这是一个 API 令牌,可用于通过遵循 API 教程中的“如何生成个人访问令牌”部分对您的 DigitalOcean 帐户进行身份验证,具有读取写入访问权限。您的 PAT 将在添加到集群中的两台服务器上使用,因此请确保将其保存在安全的地方——因为它允许完全访问您的 DigitalOcean 帐户——以供参考。

除了 API,本教程还利用以下 DigitalOcean 功能:

  • 保留 IP
  • 元数据
  • 用户数据(Cloud-Config 脚本)

如果您想了解更多信息,请阅读相关链接的教程。

创建 Droplets

第一步是在同一数据中心创建两个 Ubuntu Droplets,它们将充当上述主服务器和次要服务器。在我们的示例设置中,我们将它们命名为“primary”和“secondary”以便参考。我们将在两个 Droplets 上安装 Nginx,并用唯一标识它们的信息替换它们的索引页面。这将为我们提供一种简单的方法来演示 HA 设置是否正常工作。对于真实设置,您的服务器应该运行您选择的 Web 服务器或负载均衡器。

使用以下 bash 脚本作为用户数据创建两个 Ubuntu 14.04 Droplets,primarysecondary

#!/bin/bashapt-get -y update
apt-get -y install nginx
export HOSTNAME=$(curl -s http://169.254.169.254/metadata/v1/hostname)
export PUBLIC_IPV4=$(curl -s http://169.254.169.254/metadata/v1/interfaces/public/0/ipv4/address)
echo Droplet: $HOSTNAME, IP Address: $PUBLIC_IPV4 > /usr/share/nginx/html/index.html

这将安装 Nginx 并用 Droplet 的主机名和 IP 地址(通过引用元数据服务)替换 index.html 的内容。通过公共 IP 地址访问任一 Droplet 将显示一个基本网页,其中包含 Droplet 主机名和 IP 地址,这对于测试保留 IP 在任何给定时刻指向哪个 Droplet 将很有用。

创建保留 IP

在 DigitalOcean 控制面板中,点击顶部菜单中的Networking,然后点击侧边菜单中的Reserved IPs

!无保留 IP

将保留 IP 分配给您的primary Droplet,然后点击分配保留 IP按钮。

分配保留 IP 后,通过在 Web 浏览器中访问它来检查您是否可以访问它所分配的 Droplet。

http://your_reserved_ip

您应该看到您的主要 Droplet 的索引页面。

配置 DNS(可选)

如果您希望通过域名访问您的 HA 设置,请在您的 DNS 中创建一个A 记录,将您的域指向您的保留 IP 地址。如果您的域名使用 DigitalOcean 的域名服务器,请按照“如何在 DigitalOcean 上设置主机名”教程的第三步进行操作。一旦传播完成,您可以通过域名访问您的活动服务器。

我们将使用的示例域名是 example.com。如果您现在没有域名,您应该使用保留 IP 地址。

安装 Heartbeat

下一步是在两台服务器上安装 Heartbeat。安装 Heartbeat 最简单的方法是使用 apt-get:

sudo apt-get update
sudo apt-get install heartbeat

Heartbeat 现在已经安装,但在它开始工作之前需要进行配置。

配置 Heartbeat

为了启动我们期望的集群,我们必须在两台服务器上的 /etc/ha.d 目录中设置这些 Heartbeat 配置文件:

  1. ha.cf: Heartbeat 集群的全局配置,包括其成员节点
  2. authkeys: 包含一个安全密钥,为节点提供加入集群的身份验证方式
  3. haresources: 指定集群管理的服务以及首选拥有这些服务的节点。请注意,在使用像 Pacemaker 这样的 CRM 的设置中,此文件不会被使用

我们还需要提供一个脚本,以便在主要 Droplet 的可用性发生变化时执行保留 IP 重新分配。

收集节点信息

在配置 ha.cf 之前,我们应该查找每个节点的名称。Heartbeat 要求每个节点名称与它们各自的 uname -n 输出匹配。

两台服务器上,运行以下命令查找相应的节点名称:

uname -n

记录命令的输出。示例节点名称为 “primary” 和 “secondary”,与我们为 Droplets 命名的名称相匹配。

我们还需要查找每个节点用于与集群的其余部分进行通信的网络接口和 IP 地址,以确定哪些节点是可用的。您可以使用任何网络接口,只要每个节点都可以到达集群中的其他节点即可。我们将使用 Droplets 的公共接口 eth0

两台服务器上,使用以下命令查找 eth0 接口的 IP 地址(或在 DigitalOcean 控制面板中查找):

ip addr show eth0
[secondary_label ip addr show eth0 output:]
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 04:01:76:a5:45:01 brd ff:ff:ff:ff:ff:ffinet 104.236.6.11/18 brd 104.236.63.255 scope global eth0valid_lft forever preferred_lft foreverinet 10.17.0.28/16 scope global eth0valid_lft forever preferred_lft foreverinet6 fe80::601:76ff:fea5:4501/64 scope linkvalid_lft forever preferred_lft forever

记录网络接口的 IP 地址(在示例中突出显示)。确保获取两台服务器的 IP 地址。

创建 ha.cf 文件

两台服务器上,使用您喜欢的编辑器打开 /etc/ha.d/ha.cf

sudo vi /etc/ha.d/ha.cf

文件应该是新的和空的。我们需要在文件中添加集群的网络接口和每个节点的名称。

复制并粘贴以下配置到文件中,然后用我们之前查找到的值替换相应的节点名称和 IP 地址。在这个例子中,primary 的 IP 地址是 104.236.6.11secondary 的 IP 地址是 104.236.6.22

node primary
ucast eth0 104.236.6.11
node secondary
ucast eth0 104.236.6.22

保存并退出。接下来,我们将设置集群的授权密钥。

创建 authkeys 文件

授权密钥用于允许集群成员加入集群。我们可以简单地为此目的生成一个随机密钥。

主要节点上,运行以下命令以在名为 AUTH_KEY 的环境变量中生成合适的授权密钥:

if [ -z "${AUTH_KEY}" ]; thenexport AUTH_KEY="$(command dd if='/dev/urandom' bs=512 count=1 2>'/dev/null' \| command openssl sha1 \| command cut --delimiter=' ' --fields=2)"
fi

然后使用以下命令将 /etc/ha.d/authkeys 文件写入:

sudo bash -c "{echo auth1echo 1 sha1 $AUTH_KEY
} > /etc/ha.d/authkeys"

像这样检查 authkeys 文件的内容:

sudo cat /etc/ha.d/authkeys

它应该看起来像这样(具有不同的授权密钥):

[secondary_label /etc/ha.d/authkeys example:]
auth1
1 sha1 d1e6557e2fcb30ff8d4d3ae65b50345fa46a2faa

确保文件只能被 root 读取:

sudo chmod 600 /etc/ha.d/authkeys

现在将主节点的 /etc/ha.d/authkeys 文件复制到次要节点。您可以手动执行此操作,也可以使用 scp

次要服务器上,确保设置 authkeys 文件的权限:

sudo chmod 600 /etc/ha.d/authkeys

两台服务器应该有相同的 /etc/ha.d/authkeys 文件。

创建 haresources 文件

haresources 文件指定了与集群管理的服务配对的首选主机。首选主机是节点,如果该节点可用,则应该运行相关服务。如果首选主机不可用,即集群无法访问该节点,其他节点将接管。换句话说,如果主服务器宕机,辅助服务器将接管。

两台服务器上,使用你喜欢的编辑器打开 haresources 文件。我们将使用 vi

sudo vi /etc/ha.d/haresources

现在在文件中添加以下行,替换为你的主节点名称:

primary floatip

保存并退出。这将配置服务器为 floatip 服务的首选主机,该服务目前未定义。接下来让我们设置 floatip 服务。

创建保留 IP 重新分配服务

我们的 Heartbeat 集群配置为维护 floatip 服务,节点可以使用该服务将保留 IP 分配给自己,但我们仍然需要创建该服务。然而,在设置服务本身之前,让我们创建一个脚本,该脚本将通过 DigitalOcean API 为运行它的节点分配保留 IP。然后我们将创建 floatip 服务,该服务将运行保留 IP 重新分配脚本。

创建 assign-ip 脚本

在我们的示例中,我们将下载一个基本的 Python 脚本,该脚本使用 DigitalOcean API 为给定的 Droplet ID 分配保留 IP。

两台服务器上,下载 assign-ip Python 脚本:

sudo curl -L -o /usr/local/bin/assign-ip http://do.co/assign-ip

两台服务器上,将其设置为可执行:

sudo chmod +x /usr/local/bin/assign-ip

使用 assign-ip 脚本需要以下详细信息:

  • 保留 IP: 脚本的第一个参数,要分配的保留 IP
  • Droplet ID: 脚本的第二个参数,应将保留 IP 分配给的 Droplet ID
  • DigitalOcean PAT(API 令牌): 作为环境变量 DO_TOKEN 传递,你的 DigitalOcean 读/写 PAT

在继续之前,可以随时查看脚本的内容。

现在我们准备创建 floatip 服务。

创建 floatip 服务

要创建 floatip 服务,我们只需要创建一个初始化脚本,该脚本调用我们之前创建的 assign-ip 脚本,并响应 startstop 子命令。此初始化脚本将负责通过 Droplet Metadata 服务查找服务器的 Droplet ID。此外,它将需要将要重新分配的保留 IP 和 DigitalOcean API 令牌(先决条件部分提到的个人访问令牌)。

两台服务器上,打开 /etc/init.d/floatip

sudo vi /etc/init.d/floatip

然后复制并粘贴以下初始化脚本,将突出显示的部分替换为你的 DigitalOcean API 密钥和应重新分配的保留 IP:

#!/bin/bashparam=$1export DO_TOKEN='b7d03a6947b217efb6f3ec3bd3504582'
IP='45.55.96.8'
ID=$(curl -s http://169.254.169.254/metadata/v1/id)if [ "start" == "$param" ] ; thenpython /usr/local/bin/assign-ip $IP $IDexit 0
elif [ "stop" == "$param" ] ; thenexit 0;
elif [ "status" == "$param" ] ; thenexit 0;
elseecho "no such command $param"exit 1;
fi

保存并退出。

使脚本可执行:

sudo chmod u+x /etc/init.d/floatip

当启动此 floatip 服务时,它将简单地调用 assign-ip Python 脚本,并将指定的保留 IP 分配给执行该脚本的 Droplet。这是辅助服务器将调用的脚本,以将保留 IP 重新分配给自己,如果服务器失败。同样,一旦服务器重新加入集群,相同的脚本将被服务器使用,以重新获取保留 IP。

启动 Heartbeat

现在 Heartbeat 已配置,并且它所依赖的所有脚本都已设置好,我们准备启动 Heartbeat 集群!

两台服务器上,运行以下命令以启动 Heartbeat:

sudo service heartbeat start

你应该会看到如下输出:

[secondary_label Heartbeat output:]
Starting High-Availability services: Done.

我们的 HA 设置现在已经完成!在继续之前,让我们测试它是否按预期工作。

测试高可用性

测试高可用性设置的工作是非常重要的,让我们现在来做这个测试。

当前,保留 IP 地址被分配给了节点。现在访问保留 IP,通过 IP 地址或者指向它的域名,将只会显示服务器的首页。如果你使用了示例用户数据脚本,它会显示如下内容:

[secondary_label 保留 IP 指向主服务器]
Droplet: primary, IP 地址: 104.236.6.11

这表明保留 IP 实际上被分配给了主 Droplet。

现在,让我们打开一个终端并使用 curl 每秒访问保留 IP。使用以下命令来执行,但确保用你的域名或保留 IP 地址替换 URL:

while true; do curl http://example.com; sleep 1; done

当前,这将输出主服务器的相同 Droplet 名称和 IP 地址。如果我们导致主服务器失败,比如关闭电源或停止 Heartbeat 服务,我们将看到保留 IP 是否重新分配到次要服务器。

现在让我们关闭服务器。可以通过 DigitalOcean 控制面板执行此操作,或者在主服务器上运行以下命令:

sudo poweroff

几秒钟后,主服务器应该变得不可用。注意终端中运行的 curl 循环的输出。你应该注意到类似以下的输出:

[secondary_label curl 循环输出:]
Droplet: primary, IP 地址: 104.236.6.11
...
curl: (7) Failed to connect to example.com port 80: Connection refused
Droplet: secondary, IP 地址: 104.236.6.22
Droplet: secondary, IP 地址: 104.236.6.22
...

也就是说,保留 IP 地址应该被重新分配以指向次要服务器的 IP 地址。这意味着你的高可用性设置正在工作,因为成功的自动故障转移已经发生。

你可能会看到Connection refused错误,这可能发生在主服务器故障和保留 IP 重新分配完成之间尝试访问保留 IP 时。

现在,你可以通过 DigitalOcean 控制面板重新启动你的Droplet。因为 Heartbeat 配置了将保留 IP 重新分配脚本运行在主 Droplet 上作为首选主机,保留 IP 一旦再次可用,将自动指向主服务器。

结论

恭喜!现在你已经使用 Heartbeat 和 DigitalOcean 保留 IP 建立了一个基本的高可用性服务器设置。

如果你想创建一个更健壮的高可用性设置,可以考虑使用 Corosync 和 Pacemaker 或 Keepalived。

如果你想扩展你的 Heartbeat 设置,下一步是用反向代理负载均衡器替换示例 Nginx 设置。你可以使用 Nginx 或 HAProxy 来实现这个目的。请记住,你将希望将你的负载均衡器绑定到锚定 IP 地址,这样你的用户只能通过保留 IP 地址访问你的服务器(而不是通过每台服务器的公共 IP 地址)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/6045.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

R语言学习—4—数据矩阵及R表示

1、创建向量、矩阵 在R中&#xff0c;c()函数用于创建向量或组合数据对象。它在某些情况下可能会被省略&#xff0c;因为R有一些隐式的向量创建规则。例如&#xff0c;当你使用:操作符创建一个数字序列时&#xff0c;R会自动创建一个向量&#xff0c;所以你不需要显式地调用c()…

UI-Diffuser——使用生成式扩散模型的UI原型设计算法解析

概述。 移动UI是影响参与度的一个重要因素&#xff0c;例如用户对应用的熟悉程度和使用的便利性。如果你有一个类似的应用程序&#xff0c;你可能会选择一个具有现代、好看的设计的应用程序&#xff0c;而不是一个旧的设计。然而&#xff0c;要从头开始研究什么样的UI最适合应…

[leetcode]Z 字形变换

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:string convert(string s, int numRows) {int n s.length(), r numRows;if (r 1 || r > n) {return s;}int t r * 2 - 2;int c (n t - 1) / t * (r - 1);vector<string> mat(r, string(c, 0)…

商城数据库(51 52 53 54 55 56 57 58 59 60)

51 CREATE TABLE sxh_log_sms (smsId int(11) NOT NULL AUTO_INCREMENT COMMENT 自增id,smsSrc tinyint(4) NOT NULL DEFAULT 0 COMMENT 消息类型(0:系统消息 ,扩散),smsUserId int(11) NOT NULL DEFAULT 0 COMMENT 发现者ID,smsContent varchar(255) NOT NULL COMMENT 短信内…

Allure 测试报告框架提供了哪些标签,这些标签分别是什么意思

Allure 测试报告框架提供了一些标签&#xff08;Tags&#xff09;用于标识和组织测试报告中的测试用例和测试套件。以下是一些常用的 Allure 标签及其含义&#xff1a; Feature&#xff1a; 含义&#xff1a;用于标识测试用例或测试套件所属的功能模块或特性。示例&#xff1a…

LSM-Tree 原理分析

深入浅出分析LSM树&#xff08;日志结构合并树&#xff09; - 知乎 写得太好了&#xff0c;留下记录。便于复习。 LSM树详解 - 知乎 多了点点内容&#xff0c;也看看吧。

达梦(DM) SQL聚集函数及日期运算操作

达梦DM SQL聚集函数及日期运算操作 聚集函数MAX、MIN、SUM、AVG、COUNT使用分析函数 sum (…) over (order by…) 可以生成累计和更改累计和的值计算出现次数最多的值 日期运算加减日、月、年加减时、分、秒日期间隔之时、分、秒日期间隔之日、月、年求两个日期间的工作天数确定…

QT知识体系框架及对应文章汇总

文章目录 IDE用法基本界面实现基本控件和窗体控件布局和定位应用程序主窗口界面外观样式实现事件系统实现控件窗体关联通信 图形动画2D图形绘制3D图形绘制图形视图框架动画状态切换多媒体应用 数据处理和展示普通文件特殊文件模型视图框架数据库各种数据结构 通信及部署进程/线…

Java基础知识(三) -- 流程控制

不论哪种编程语言&#xff0c;都会提供两种基本的流程控制结构&#xff1a;分支结构和循环结构。其中分支结构用于实现根据条件来选择性地执行某段代码&#xff0c;循环结构则用于实现根据循环条件重复执行某段代码。 1. 顺序结构 任何编程语言中最常见的程序结构就是顺序结构…

单片机编程实例400例大全(100-200)

今天继续分享单片机编程实例第100-200例。 今天的实例会比前面100复杂一些&#xff0c;我大概看了下&#xff0c;很多都具备实际产品的参考价值。 今天继续分享单片机编程实例第100-200例。 今天的实例会比前面100复杂一些&#xff0c;我大概看了下&#xff0c;很多都具备实际…

频分复用系统设计及其MATLAB实现

引言 随着通信技术的飞速发展&#xff0c;通信系统的容量需求不断增长。频分复用&#xff08;Frequency Division Multiplexing, FDM&#xff09;作为一种重要的多路复用技术&#xff0c;被广泛应用于现代通信系统中。本文将介绍频分复用系统的设计原理&#xff0c;并展示如何…

简单工厂模式、工厂方法模式和抽象工厂模式

1、简单工厂模式 1.1 结构 简单工厂包含如下角色&#xff1a; 抽象产品 &#xff1a;定义了产品的规范&#xff0c;描述了产品的主要特性和功能。 具体产品 &#xff1a;实现或者继承抽象产品的子类 具体工厂 &#xff1a;提供了创建产品的方法&#xff0c;调用者通过该方法…

centos部署前后端项目

这一次我们不用宝塔面板了&#xff0c;用docker部署后端&#xff0c;nginx部署前端 1.python环境安装 1&#xff09;环境准备&#xff1a;centos7安装minicondaMiniconda入门&#xff1a;在CentOS上的安装、基本操作、目录结构、卸载_centos 安装miniconda-CSDN博客【Linux】…

革新未来电子:科研团队利用氢键操控超薄磁性材料,开辟纳米科技新纪元

德国亥姆霍兹德累斯顿-罗森多夫研究中心(Helmholtz-Zentrum Dresden-Rossendorf, HZDR)与德累斯顿工业大学(TUD)领导的一个德美研究团队&#xff0c;在《Nano Letters》期刊上提出了一项创新理念&#xff0c;旨在改善超薄材料的性能。该理念通过让二维(2D)材料与氢反应&#xf…

《青少年成长管理2024》087 “目标计划:制定目标”6_3

《青少年成长管理2024》087 “目标计划&#xff1a;制定目标”6_3 四、要素目标&#xff08;五&#xff09;能力要素目标&#xff08;六&#xff09;作为要素目标&#xff08;七&#xff09;思想要素目标 五、阶段目标&#xff08;一&#xff09;0-3岁&#xff08;早教阶段&…

springBootAdmin监控

简介 用于对 Spring Boot 应用的管理和监控。可以用来监控服务是否健康、是否在线、以及一些jvm数据等等 Spring Boot Admin 分为服务端(spring-boot-admin-server)和客户端(spring-boot-admin-client)&#xff0c;服务端和客户端之间采用 http 通讯方式实现数据交互&#xf…

一文get等保测评与密评的差异

“等保”即网络安全等级保护&#xff0c;旨在通过不同安全等级的管理和技术措施&#xff0c;确保信息系统的安全稳定运行。我国于2017年颁布的《网络安全法》中第二十一条规定“国家实行网络安全等级保护制度”。法律要求网络运营者需按照网络安全等级保护制度要求&#xff0c;…

快讯! MySQL 8.4.0 LTS 发布(MySQL 第一个长期支持版本)

MySQL 第一个长期支持版本 8.4.0 LTS 发布&#xff0c;社区版下载地址&#xff1a; https://dev.mysql.com/downloads/mysql/ 功能变更 添加或更改的功能 组复制&#xff1a;与组复制相关的两个服务器系统变量的默认值已更改&#xff1a; 系统变量的默认值为 group_replication…

Unity开发一个FPS游戏之四

在前面的系列中&#xff0c;我已介绍了如何实现一个基本的FPS游戏&#xff0c;这里将继续进行完善&#xff0c;主要是增加更换武器以及更多动作动画的功能。 之前我是采用了网上一个免费的3D模型来构建角色&#xff0c;这个模型自带了一把AR自动步枪&#xff0c;并且自带了一些…

Vue Cli脚手架—安装Nodejs和Vue Cli

一&#xff0c;Vue Cli 文档地址: https://cli.vuejs.org/zh/ 二&#xff0c;.环境配置&#xff0c;搭建项目 1.安装node.js 2.下载 node.js10.16.3 地址: https://nodejs.org/en/blog/release/v10.16.3/ 3.安装 node.js10.16.3 , 直接下一步即可, 安装到 d:\program\nodejs…