如何利用Heartbeat与Floating IP在Ubuntu 14.04上创建高可用性设置

Ubuntu高可用实战:Heartbeat+预留IP实现秒级故障转移 高可用(HA)是保障业务连续性的核心能力,其本质是通过冗余节点与自动故障检测机制,在主服务失效时快速接管流量。Heartbeat作为轻量级集群管理器,基于UDP心跳协议实现节点状态感知;Reserved IPs则是云平台提供的稳定IP资源,支持API级绑定/解绑,规避了传统浮动IP的网络冲突与DNS缓存问题。二者结合,可在Ubuntu等Linux系统上构建低成本、高可控的双机热备方案,适用于Web服务、API网关、数据库代理等关键中间件场景。本方案不依赖K8s或商业负载均衡,聚焦内核级IP切换与云基础设施协 阅读详情

提供 ZStack社区

内容简介

Heartbeat是一款开源程序,负责将集群基础设施容量——包括集群成员与消息收发——交付至客户服务器。Hearbeat在高可用性服务器基础设施当中扮演着关键性角色。我们通常需要将Heartbeat与Pacemaker等集群资源管理器(简称CRM)相结合,从而实现完整的高可用性设置。不过在今天的教程中,我们将演示如何利用Heartbeat与DigitalOcean Floating IP轻松创建一套双节点高可用性服务器设置。

如果大家希望进一步提升可用性水平,不妨尝试Corosync与Pacemaker这一组合或者Keepalived。

目标设定

在完成之后,这套高可用性设置将由两台Ubuntu 14.04服务器建立的主动/被动配置构成。要实现这项目标,我们需要借助Floating IP——负责指定用户访问服务或者网站的实际方式——以指向主服务器或者说活动服务器,除非其检测到该服务器存在故障。一旦Hearbeat服务发现主服务器不可用,第二台服务器将自动运行一套脚本以将Floating IP通过DigitalOcean API重新分配给自己。如此一来,指向Floating IP的后续网络流量将会被定向至我们的辅助服务器,并在主服务器恢复正常之前由其担任活动服务器的角色(在主服务器恢复正常后,其同样会将Floating IP分配给自己以实现切换)。

Active/passive Diagram

备注:今天的教程只涉及在网关层级设置主动/被动高可用性体系,其中包含Floating IP以及负载均衡服务器——主服务器与副服务器。此外,出于演示的目的,我们不会为每台服务器配置反向代理负载均衡器,而是通过简单配置使其分别响应对应的主机名与公共IP地址。

为实现这一目标,我们将采取以下步骤:

  • 创建2个Droplet用于接收流量
  • 创建Floating IP并将其分别给其中1个Droplet
  • 创建DNS A记录并指向Floating IP(可选)
  • 在2个Droplet上安装Heartbeat
  • 配置Heartbeat以运行Floating IP重新分配服务
  • 创建Floating IP重新分配服务
  • 测试故障转移效果

先决条件

为了实现Floating IP的自动重新分配,我们必须使用DigitalOcean API。这意味着大家需要生成一条个人访问令牌(简称PAT),该API令牌能够用于认证我们的DigitalOcean账户,并根据API指南部分《如何生成个人访问令牌》章节的指导实现读取与写入访问。大家的PAT将通过脚本进行使用,而该脚本则被添加至集群中的两台服务器内,从而确保其安全访问DIgitalOcean账户以供引用。

除了该API,这分教程还将采用以下DigitalOcean元素:

大家可以点击对应链接了解更多与之相关的细节信息。

创建Droplet

第一步是在同一数据中心之内创建2个Ubuntu Droplet,二者将分别作为之前所提到的主、副服务器。在我们的示例设置当中,二者将分别被命名为“primary”与“secondary”以便于引用。我们将在2个Droplet上分别安装Nginx并利用其惟一标识信息替换掉其索引页。通过这种方式,我们能够轻松证明这套高可用性设置是否实际起效。在真实设置当中,大家的服务器应当根据实际需求运行Web服务器或者负载均衡器。

创建2个Ubuntu 14.04 Droplet,分别为primary与secondary,而以下bash脚本则作为用户数据:

用户数据示例:

#!/bin/bash

apt-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地址(通过引用Metadata服务)替换index.html的内容。在通过公共IP地址进行访问时,对应Droplet将显示一套包含该Droplet主机名称与IP地址的基本页面,帮助用户测试任意时段内该Floating IP指向哪个Droplet。

创建Floating IP

在DigitalOcean控制面板中,点击顶部菜单中的“Networking”,接下来在后续菜单中选定“Floating IPs”。

No Floating IPs

为我们的primary Droplet分配一个Floating IP,而后点击“Assign Floating IP”按钮。

在Floating IP分配完成后,通过网络浏览器对该IP进行访问,以确认其被正确分配至既定Droplet。

http://your_floating_ip

这时大家应该能够看到自己的primary Droplet索引页。

配置DNS(可选)

如果大家希望通过域名访问自己的主可用性设置,则可在DNS当中创建一条A记录,其负责将域名指向对应的Floating IP地址。如果大家的域名使用DigitalOcean的域名服务器,则可遵循《如何利用DigitalOcean设置一项主机名称》教程中的第三步指引。设置完成后,大家即可通过该域名访问自己的活动服务器。

在这里我们使用的示例域名为example.com。如果大家暂时没有域名可用,则应使用Floating 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方案进行设置时无需使用此文件。

我们还需要提供一套脚本,负责在primary Droplet的可用性发生变更时执行Floating IP重新分配。

收集节点信息

在对ha.cf进行配置之前,我们应当首先查看各节点名称。Heartbeat要求每个节点的名称与其对应的uname -n输出结果相匹配。

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

* uname -n

请注意该命令的输出结果。示例中的节点名称为“primary”与“secondary”,与我们的Droplet命名完全匹配。

我们还需要查看各个节点用于同集群内其它节点进行通信的网络接口与IP地址,从而了解当前哪些节点处于可用状态。大家可以使用任意网络接口,只要确保集群内各节点的相互通信能力即可。在这里我们使用Droplet的公共接口,恰好为eth0。

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

* ip addr show eth0





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

请注意该网络接口的IP地址(在本示例中以高亮显示)。确保获取两台服务器的对应IP地址。

创建ha.cf文件

在两台服务器上利用大家熟悉的编辑器打开/etc/ha.d/ha.cf文件。我们在这里使用vi:

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

该文件的内容此次应当为空。我们需要向其中添加集群内各节点的网络接口与名称。

将该配置复制并粘贴到此文件当中,而后利用前面查找到的对应主机名称与IP地址替换其中的具体值。在本次示例中,primary的IP地址为104.236.6.11,而secondary的IP地址为104.236.6.22:

node primary
ucast eth0 104.236.6.11
node secondary
ucast eth0 104.236.6.22

保存并退出。接下来,我们将设置这套集群的验证密钥。

创建authkeys文件

验证密钥的作用是允许各集群成员加入集群。出于这一目的,我们可以轻松创建一条随机密钥。

在primary节点当中运行以下命令,从而在名为AUTHKEY的环境变量当中生成一条合适的验证密钥:

if [ -z "${AUTH_KEY}" ]; then  
export 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 auth1  
echo 1 sha1 $AUTH_KEY  
} > /etc/ha.d/authkeys" 

通过以下命令检查该authkeys文件内容:

* sudo cat /etc/ha.d/authkeys   

执行结果应该如下所示(只是具体验证密钥有所区别):

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

确保该文件只可供root读取:

sudo chmod 600 /etc/ha.d/authkeys

现在将该/etc/ha.d/authkeys 文件从primary节点复制到我们的secondary节点当中。大家可以通过手动方式或者利用scp实现。

在secondary服务器上,确保对该authkeys文件的权限进行设置:

sudo chmod 600 /etc/ha.d/authkeys

现在两台服务器应该已经拥有相同的/etc/ha.d/authkeys 文件了。

创建haresources文件

这里的haresources文件负责指定与集群所管理的各项服务对应的preferred host。所谓preferred host即首选主机,指服务在对应节点处于可用状态时应优先选择的运行选项。如果首选主机不可用,即无法由集群接入,则另一节点则将接掌其职责。换言之,secondary服务器将在primary服务器发生故障时顶替其角色。

在两台服务器上通过大家熟悉的编辑器打开该haresources文件。在这里我们使用vi:

sudo vi /etc/ha.d/haresources

现在将以下一行添加至该文件中,并将我们自己的primary节点名称替换进去:

/etc/ha.d/haresources

primary floatip

保存并退出。现在该primary服务器已经被配置为floatip服务的首选主机,不过floatip服务本身尚未进行定义。因此下一步任务就是设置floatip服务。

创建Floating IP重新分配服务

我们的Heartbeat集群的配置目标在于保证floatip服务能够始终正常运行,其中一个节点用于将Floating IP分配给自身。不过这项服务本身也需要单独创建。在设置服务本体之前,我们首先创建一套脚本,用于通过DigitalOcean API将该Floating IP分配至其运行所在的节点。接下来,我们将创建负责运行该Floating IP重新分配脚本的floatip服务。

创建assign-ip脚本

在示例中,我们将下载一套基础Python脚本以利用DigitalOcean API向给定Droplet ID分配一个Floating 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脚本还需要注意以下细节:

  • Floating IP: 该脚本中的第一项参数,指定需要分配的Floating IP。
  • Droplet ID: 该脚本中的第二项参数,指定该Floating IP被分配到的Droplet ID。
  • DigitalOcean PAT (API令牌): 作为环境变量DOTOKEN进行传递,即我们的读取/写入DigitalOcean PAT。

在进行下一步之前,请大家认真审查这部分脚本内容。

现在我们已经做好了创建floatip服务的一切准备。

创建floatip服务

要创建floatip服务,我们需要首先创建一个init脚本以调用此前编写完成的assign-ip脚本,同时响应start与stop子命令。该init脚本将负责通过Droplet Metadata服务查找服务器的Droplet ID。另外,该脚本还需要获取被分配Floating IP以及DigitalOcean API令牌(即我们在先决条件部分中提到过的个人访问令牌)。

在两台服务器上,利用编辑器打开/etc/init.d/floatip :

sudo vi /etc/init.d/floatip

而后将以下内容复制并粘贴到init脚本当中,同时利用大家自己的DigitalOcean API密钥与需要分配的Floating IP替换其中的高亮部分:

/etc/init.d/floatip

#!/bin/bash

param=$1
export DO_TOKEN='b7d03a6947b217efb6f3ec3bd3504582'
IP='45.55.96.8'
ID=$(curl -s http://169.254.169.254/metadata/v1/id)
if [ "start" == "$param" ] ; then
    python /usr/local/bin/assign-ip $IP $ID 
    exit 0
elif [ "stop" == "$param" ] ; then
    exit 0;
elif [ "status" == "$param" ] ; then
    exit 0;
else
    echo "no such command $param"
    exit 1;
fi

保存并退出。

为该脚本提供执行权限。

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

当该floatip服务启动时,其会直接调用assign-ip Python脚本并将指定的Floating IP分配至执行该脚本的Droplet。在正常运行情况下,该脚本供secondary服务器使用以将Floating IP分配给自身,从而实现primary服务器的故障转移能力。同样的,该脚本亦可在primary重新加入集群后被其用于将Floating IP重新分配给自身。

启动Heartbeat

现在Heartbeat已经配置完成,而其运行所需要的全部脚本亦已准备就绪——我们可以马上启动这套Heartbeat集群了!

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

sudo service heartbeat start

大家应该看到以下输出结果:

Heartbeat output:
Starting High-Availability services: Done.

我们的高可用性设置已经完成!接下来是对其工作状态进行测试。

测试高可用性

对高可用性设置的工作状态进行测试非常重要,因此我们这就着手开始。

目前,该Floating IP被分配至primary节点。我们可以通过IP地址或者指向它的域名对Floating IP加以访问,并由此查看primary服务器的索引页面。如果大家使用示例提供的用户数据脚本,则显示结果应如下所示:
Floating IP is pointing to primary server
Droplet: primary, IP Address: 104.236.6.11

这意味着该Floating IP实际上被分配至primary Droplet处。
现在让我们打开终端,并使用curl以1秒循环访问该Floating IP。大家可使用以下命令实现这一目标,不过请注意将URL部分替换成各位的实际域名或者Floating IP地址:

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

目前其会输出同样的Droplet名称与primary服务器IP地址。如果我们让primary服务器处于不可用状态——例如将其关闭或者停止Heartbeat服务,则会看到Floating IP被重新分配至secondary服务器。

现在让我们关闭primary服务器。大家可以通过DigitalOcean控制面板或者在primary服务器上运行以下命令将其关闭:

sudo poweroff

片刻之后,该primary服务器将不再可用。需要注意运行在终端内的curl循环的输出结果。大家应该会看到以下输出内容:

curl loop output:
Droplet: primary, IP Address: 104.236.6.11
...
curl: (7) Failed to connect to example.com port 80: Connection refused
Droplet: secondary, IP Address: 104.236.6.22
Droplet: secondary, IP Address: 104.236.6.22
...

这时Floating IP地址应该被重新分配至secondary服务器的IP地址,也就是说我们的高可用性设置已经正常起效,即成功实现了自动化故障转移功能。

大家可能会发现一项Connection refused错误——当然也可能不会,原因在于大家的Floating IP访问尝试发生在primary服务器故障与该Floating IP重新分配完成这两个事件之间。

现在大家可以通过DigitalOcean控制面板重新启动自己的primary Droplet。由于Heartbeat在配置当中将primary Droplet作为preferred host以运行Floating IP重新分配脚本,因此该Floating IP会在可用性恢复后自动重新指向primary服务器。

总结

恭喜大家!现在我们已经拥有了一套利用Heartbeat与DigitalOcean Floating IP实现的基础高可用性服务器设置。

如果大家希望进一步提高可用性水平,亦可考虑使用Corosync与Pacemaker组合或者Keepalived。

如果大家希望扩展自己的Heartbeat设置,那么下一步工作就是利用反向代理负载均衡器替代示例中的Nginx设置。大家也可以使用Nginx或者HAProxy实现同样的效果。需要注意的是,大家需要将该负载均衡器绑定至另一个IP地址,从而确保用户只能够通过Floating IP地址访问服务器(而非通过各服务器的公共IP地址)。

本文源自DigitalOcean Community。英文原文:How To Create a High Availability Setup with Heartbeat and Floating IPs on Ubuntu 14.04 by Mitchell Anicas

翻译:diradw

OpenStack Neutron手动安装:从内核参数到OVS流表的深度实践 Neutron是OpenStack中实现软件定义网络(SDN)的核心组件,其本质是通过控制平面(Neutron Server)、插件(如ML2)与数据平面代理(OVS Agent、L3 Agent等)协同,将网络策略转化为Linux内核路由、iptables规则及Open vSwitch流表。理解其工作原理需掌握三大技术基座:Linux内核网络参数(如ip_forward、rp_filter)决定数据包能否转发;Keystone作为统一认证中心,为所有API调用提供token鉴权;OVS流表则是网络策略在数 阅读详情

相关推荐

【信息科学与工程学】【通信工程】计算机科学与自动化——第二百三十三篇 云NaaS服务 系列二02

字段内容类型​云网络自定义路由表(Custom Route Table):允许用户自定义 VPC 或子网的路由规则,控制流量走向,支持黑白名单、策略路由。端计算节点->边缘计算节点->边缘DC->中心云的网络情况及存储需求及配置情况列表​端计算节点为 VPC 内的云资源。边缘计算节点不适用。边缘 DC 和中心云为路由表管理平台。存储需求:路由条目存储于数据库。网络:路由表在虚拟路由器中执行。QoS:无。网络的端到端配置(从接入到汇聚到核心)​。

weixin_49199313的博客 331

【oracle】oracle集群 rac DG MAA

ORACLE集群概念和原理 转载:https://www.cnblogs.com/baiboy/p/orc2.html#_label1 目录 集群概念介绍(一) ORACLE集群概念和原理(二) RAC 工作原理和相关组件(三) 缓存融合技术(四) RAC 特殊问题和实战经验(五) ORACLE 11 G版本2 RAC在LINUX上使用NFS安装前准备(六) OR...

gonglei155的博客 904

IPAssign_v1.1.2

菲尼克斯PLC程序下载前,对PLC分配IP的工具

mysql心跳检测_MySQL配置HeartBeat实现心跳监控和浮动IP

1. 初始化环境配置/sbin/chkconfig --add mysqld/sbin/chkconfig mysqld onln -s /usr/local/mysql/bin/mysql /sbin/mysqlln -s /usr/local/mysql/bin/mysqladmin /sbin/mysqladminecho "/usr/local/mysql/lib/mysql" >&...

weixin_35651612的博客 958

Assign_IP_TIA_ipassign软件_TIAip_

TIA软件IP设置,详细介绍,TIA软件的IP设置方法,让您更容易上手!!!

k8s 100个高频面试题

以下是 100 个 Kubernetes(k8s)高频面试题及其答案,涵盖了 Kubernetes 的核心概念、架构、组件、工作原理以及实际应用。答案:Master 节点组件:API Server:提供 RESTful API 接口,用于与集群交互。etcd:分布式键值存储,用于存储集群的配置数据和状态信息。Controller Manager:运行各种控制器进程,负责维护集群的状态。Scheduler:负责将 Pod 调度到合适的节点上运行。Worker 节点组件:Kubelet:运行在每个节点上的代理,

wankll的专栏 2781

web集群之二 heartbeat实现ip漂移

此文章是实现多台apache+tomcat集群功能的操作的部分之一 ------- 使用Heartbeat实现IP飘移(虚拟机vm中部署) 使用Heartbeat实现”双机热备”或者称为“双机互备” heartbeat的工作原理:heartbeat最核心的包括两个部分,心跳监测部分和资源接管部分,心跳监测可以通过网络链路(本次测试使用网络)和串口进行,而且支持冗余链路,它们之间相互发送报文

lgstudyvc的专栏 5649

SCRFD算法解读及环境安装实践

SCRFD检测算法及环境安装

lishanlu136的博客 1009

heartbeat+浮动IP 实现HA——http 、mysql、nfs的双机热备

预备知识 .虚拟IP 虚拟IP地址(VIP) 是一个不与特定计算机或一个计算机中的网络接口卡(NIC)相连的IP地址。数据包被发送到这个VIP地址,但是所有的数据还是经过真实的网络接口。VIPs大部分用于连接冗余;一个VIP地址也可能在一台计算机或NIC发生故障时可用,交由另一个可选计算机或NIC响应连接。虚拟IP地址的例子如:一个Loopback(无电路IP地址)作为不与在主机或路由器中...

李思苇 2728

【vue看板】

大屏看板提示:以下是本篇文章正文内容,下面案例可供参考提示:这里对文章进行总结:代码量较多,看板中的。

weixin_46223284的博客 2772

数字麦克风PDM信号采集与STM32 I2S接口应用(二)

在使用STM32的数字麦克风I2S接口时,计算采样率让人头疼,芯片手册上没有明确的说法,而手册上的计算方法经过测试却和实验不符。借助搜索引擎,大部分资料都是来自于开发板卖家或开发板论坛,主要是咪头采集然后配置WM89系列解码芯片,然后配合FatFS、MP3解码等模式,主要是讲解I2S录音、存储、放音等。外文资料得到的也寥寥无几,也没有找到讲解STM32数字麦克风配置、计算的文档。加上网上资料转载、抄袭、浅尝辄止的笔记教程,这些更是让检索大海捞针,过程艰辛一言难尽,有些网文三言两语抑或作者都没有搞清楚随手一写

XIAOYOUDUODUO的博客 6055

在liunx双机下自己动手实现浮动IP技术

http://www.360doc.com/content/11/0823/18/5907545_142730623.shtml 有两台Linux服务器,其中一台主机(IP:139.24.214.22)对外提供了一定的网络服务,另一台从机(IP:139.24.214.24)能提供相同的服务,但IP地址没有对外部公开。 客户端连接的都是139.24.214.22这个IP地址,如果主机故障,则

bytxl的专栏 2077

PyTorch视觉项目实战:从数据加载到模型部署

PyTorch视觉项目实战:从数据加载到模型部署 ,人工智能,计算机视觉,大模型,AI,随着深度学习在计算机视觉领域的飞速发展,PyTorch 凭借其简洁的代码风格、动态计算图特性以及强大的社区支持,成为众多开发者和研究人员的首选框架。从数据加载、模型构建与训练,到最终的模型部署,PyTorch 提供了一套完整且灵活的解决方案。本文将通过实际项目案例,详细阐述基于 PyTorch 的视觉项目全流程,结合丰富的代码示例和概念解析,帮助读者掌握从项目起步到落地的关键技术。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 4万+

怎样利用Heartbeat与Floating IP在Ubuntu 14.04上创建高可用性设置

提供 ZStack社区 内容简单介绍 Heartbeat是一款开源程序,负责将集群基础设施容量——包括集群成员与消息收发——交付至客户server。Hearbeat在高可用性server基础设施其中扮演着关键性角色。我们通常须要将Heartbeat与Pacemaker等集群资源管理器(简称CRM)相结合。从而实现完整的高可用性设置。只是在今天的教程中。我们将演示怎样利用He...

weixin_30305735的博客 145

基于simulink的低通滤波器(Low-pass Filter, LPF)

摘要:本文详细介绍了如何在Simulink中搭建低通滤波器进行噪声抑制仿真。通过定义系统需求(50Hz信号+250Hz噪声)、添加信号源、设计6阶巴特沃斯低通滤波器(截止频率100Hz)、连接各模块并配置仿真参数,最终实现高频噪声的有效滤除。该教程包含从模型创建到结果分析的完整流程,为信号处理系统开发提供了基础框架,并可进一步扩展为自适应滤波等高级应用。所需MATLAB版本为R2023a及以上,需安装Simulink和DSPSystemToolbox。

amy_mhd的博客 1303

FCC 首个扫地机器人豁免落地,Matic 凭什么抢先?

Matic获FCC首个扫地机器人豁免,实为提前布局的合规姿态。其产品在美国组装,并采用已认证射频模组,虽未达65%美国成分门槛,但已具备“本土制造”优势。豁免本质是对既有合规状态的确认,而非解救。此举在商业上放大品牌价值,抢占“安全、合规、本土”叙事高地,凸显供应链安全正取代技术标准成为监管核心。未来合规成本将攀升,规则主导权仍在FCC手中。

致力于lidar应用开发 101

Heartbeat+保留IP实现双机高可用:Ubuntu下3秒故障切换实战

高可用集群本质是通过心跳检测与IP漂移保障服务连续性,其核心原理在于节点健康感知、虚拟IP动态接管及网络层快速重定向。Heartbeat作为轻量级心跳守护进程,配合Reserved IP(保留IP)或浮动IP,构成低开销、高可控的主备容灾方案,技术价值体现在RTO<5秒、配置透明、故障可追溯,广泛适用于传统LAMP/Java栈、MySQL主从、裸金属或VPS环境下的关键业务系统。本文基于Ubuntu 16.04真实生产案例,详解Heartbeat配置要点、IP漂移机制、脑裂防护及mysql-check健康检

weixin_33725270的博客 337

泛微OA集成阿里云短信(E9保姆教程)

泛微OA集成阿里云短信(E9保姆教程)

技术分享 517

Ubuntu 18.04 部署 OpenLiteSpeed 实战指南

Web 服务器是现代应用交付的基础设施核心,其性能与稳定性直接影响用户体验和系统可扩展性。OpenLiteSpeed 作为事件驱动型高性能 Web 服务器,依托 LSAPI 内置 PHP 处理、零拷贝文件传输和 TLS 1.3 硬件加速等机制,在资源受限场景下显著优于传统 Apache 和 Nginx。尤其在 Ubuntu 18.04 这一广泛部署的 LTS 版本中,其内核(4.15)、glibc(2.27)与 systemd(237)组合为 OpenLiteSpeed 提供了稳定 ABI 兼容与系统级优化

weixin_34128237的博客 438

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

浮动IP

浮动IP,就像它名字一样——它会动,说白了就是这个IP可以循环使用,你用完我也可以用。这个IP地址可以漂浮在任何一台主机上,而且IP地址本身的值也不会发生变化!我的实际操作:在实体机上面利用ubuntu创建一个虚拟机实例,给这个虚拟机实例分配绑定浮动IP,这个虚拟机实例看上去有两个IP。实际上浮动IP只干了一件事,就是让别人可以通过浮动IP访问到这台虚拟机实例。如果我把我这个虚拟机实例删除了,再创...

Taylor-NG的博客 2356

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Heartbeat安装与配置

1、环境描述   服务器A(主) 192.85.1.175   服务器B(从) 192.85.1.176   Mysql版本:5.1.61        系统版本:System OS:ubuntu 10.10 X86 2.安装heartbeat   1)安装heartbeat    2)配置说明     heartbeat的安装目录为/etc/ha.d目录下,     

JenMinZhang的专栏 1万+

Ubuntu 安装 Heartbeat 过程

1. 首先建立相关用户hacluster和组haclient,然后设定环境变量,最后就是安装heartbeat 过程如下: (1)添加用户和组 groupadd haclient useradd -g haclient hacluster (2)设置环境变量 vi /root/.bash_profile,添加如下内容: export PREFIX=/usr/local/ha exp

路在脚下 2767

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

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

rubys007的博客 1173

heartbeat配置

由于在CentOS 6 (6.0以及6.2)上没有找到Linux Heartbeat的源,所以最终选择在Ubuntu 8.04上安装。         假设两个节点分别为node1和node2(运行uname -n 命令可以察看本机的名字),node1的ip为192.168.164.116,node2的ip为192.168.164.117,它们公用的ip为192.168.164.118,

yuanhangq220的专栏 620

ubuntu 安装heartbeat+drbd

一、安装包 autoconf-latest.tar.gz automake-1.11.tar.bz2 pkg-config-0.25.tar.gz drbd-8.3.8.1.tar.gz flex.tar.bz2 glue-1.0.7.tar.bz2 heartbeat.tar.bz2 libtool-2.4.tar.gz bzip2-1.0.6.tar.gz   ====...

经验之谈,不做搬运工 539
上一篇: Docker实用指南:将Python Web应用容器化
下一篇: 使用Git Hooks实现开发部署任务自动化
普通网友
博客等级 码龄10年 769粉丝 269原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值