高可用集群(High Availability Cluster,简称HA Cluster),是指以减少服务中断时间为目的得服务器集群技术。它通过保护用户得业务程序对外部间断提供的服务,把因为软件,硬件,认为造成的故障对 业务得影响降低到最小程度。总而言之就是保证公司业务7*24小时不宕机。
衡量集群的可用性(HA)高低,可以从MTTF(平均无故障时间)和MTTR(平均故障维修时间)进行考 量,公式为:HA=MTTF/(MTTF+MTTR)*100%,具体衡量标准可以参考下表

对集群中的服务器进行负载均衡、健康监测,并在服务器出现故障时能进行故障转移,自动切换到正常服务器是高可用保障的必要手段。
常见的负载均衡手段如下:
硬件负载均衡,如F5 软件负载均衡,如nginx、haproxy、lvs 几种软件负载均衡技术比较

常见的健康监测和自动切换软件有keepAlived和heartBeat,其二者对比如下:
Keepalived使用更简单:从安装、配置、使用、维护等角度上对比,Keepalived都比Heartbeat要简单;
Heartbeat功能更强大:Heartbeat虽然复杂,但功能更强大,配套工具更全,适合做大型集群管理,而Keepalived主要用于集群倒换,基本没有管理功能。

LVS是Linux Virtual Server的简写,在1998年5月由章文嵩博士成立。 工作在OSI模型的四层,基于IP进行负载均衡。 在linux2.2内核时,IPVS就已经以内核补丁的形式出现。 从2.4版本以后,IPVS已经成为linux官方标准内核的一部分。
LVS服务器(DS)
集群中节点服务器(RS)
虚拟IP地址(VIP),用于向客户端提供服务的IP地址(配置于负载均衡器上)
真实服务器的IP地址(RIP), 集群中节点服务器的IP地址
负载均衡器IP地址(DIP),负载均衡器的IP地址,物理网卡上的IP
客户端主机IP地址(CIP),终端请求用户的主机IP地址
LVS负载均衡调度技术是在linux内核中实现的,使用配置LVS时,不是直接配置内核中的IPVS,而是通 过IPVS的管理工具IPVSADM来管理配置,LVS集群负载均衡器接受所有入站客户端的请求,并根据算法 来决定由哪个集群的节点来处理请求。
NAT(Network Address Translation)模式是基于NAT技术实现的。在此模式中,LVS服务器既要处理请求的接入,又要处理请求的响应。因此存在较大的性能瓶颈。

DR(Direct Routing)模式是LVS的默认工作模式,也叫直接路由模式。只处理请求的接入,不处理请求的响应。因此性能高,瓶颈小。


注意:需要设置lo接口的VIP不能在共网上出现。
总结:
淘宝定制化的技术,linux内核不支持。
无论是 DR 还是 NAT 模式,不可避免的都有一个问题:LVS 和 RS 必须在同一个 VLAN 下,否则 LVS 无法作为 RS 的网关。
这引发的两个问题是:
对于lvs的操作,主要是通过ipvsadm软件实现,Linux内核已集成lvs。常用的lvs操作命令如下:
# 此命令用来添加一个lvs策略,IP指VIP,调度算法是12种调度算法 的一种
ipvsadm -A -t IP -s 调度算法
# 此命令用来清除一个lvs策略
ipvsadm -C
# 此命令用来保存一个lvs策略
ipvsadm -S
# 此命令用来加载一个lvs策略
ipvsadm -R
# 此命令用来查看策略
ipvsadm -L
# 添加一台RS,
# IP1指VIP
# IP2指RIP
# -m|g|i中m是NAT
# g是 DR,
ipvsadm -a -t IP1 -r IP2 - m|g|i
# 此命令用来删除一台RS,IP1指VIP,IP2指RIP
ipvsadm -d -t IP1 -r IP2
ARP(Address Resolution Protocol)地址解析协议,是根据IP地址获取物理地址 (MAC)的一个 TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的 所有主机,并接收返 回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址 存入本机ARP缓存中并 保留一定时间,下次请求时直接查询ARP缓存以节约资源。

服务器准备:
通过拓扑图可以发现,需要让LVS和RS在同一个网段,并且在两个RS服务器上也需要绑定VIP。操作步骤如下:
# arp抑制,修改内核
echo 1 > /proc/sys/net/ipv4/conf/ens33/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/ens33/arp_announce
# 安装ifconfig,centos7没有ifconfig
yum install net-tools.x86_64 -y
# 配置VIP到lo网卡 这里的子网掩码需要4个255。
ifconfig lo:8 192.168.88.88 netmask 255.255.255.255
# 查看IP
ifconfig

查看网关是否生效
[root@q111 ~]# route -n

# 下载安装httpd服务,命令如下
yum install -y httpd
# 设置首页内容(RS2把内容改为this is RS2)
echo this is RS01 > /var/www/html/index.html
# 启动httpd
systemctl start httpd
通过单独访问192.168.88.111和192.168.88.112可以正常访问。
# 1)安装ipvsadm
yum install -y ipvsadm
# 2)在lvs的ens33网卡上绑定VIP192.168.88.100
ifconfig ens33:8 192.168.88.88/24
# 查看ip
ifconfig

4. LVS服务器上设置DR策略和负载规则
# 设置规则
ipvsadm -A -t 192.168.88.88:80 -s rr
# 添加RS
ipvsadm -a -t 192.168.88.88:80 -r 192.168.88.111 -g -w 1
ipvsadm -a -t 192.168.88.88:80 -r 192.168.88.112 -g -w 1
#查看策略
ipvsadm -Ln


LVS上查看调度情况
[root@q110 ~]# ipvsadm -Lnc

FIN_WAIT:正常情况
以上以DR模型搭建了一套简单的负载均衡环境,但是存在几个问题:
Keepalived的作用是检测服务器状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中。
tcp_check:
工作在第4层,keepalived向后端服务器发起一个tcp连接请求,如果后端服务器 没有响应或超时,那么这个后端将从服务器池中移除。
http_get:
工作在第5层,向指定的URL执行http请求,将得到的结果用md5加密并与指定的 md5值比较看是否匹配,不匹配则从服务器池中移除;此外还可以指定http返回 码来判断检测是否成功。HTTP_GET可以指定多个URL用于检测,这个一台服务器有多个虚拟主机的情况下比较好用。
misc_check:
用脚本来检测,脚本如果带有参数,需将脚本和参数放入双引号内。
ssl_get:
和http_get相似,不同的只是用SSL连接。
smtp_check:
主要用于邮件系统SMTP协议的检测
VRRP协议
在现实的网络环境中。主机之间的通信都是通过配置静态路由或者(默认网关)来完成的,而主机之间的 路由器一旦发生故障,通信就会失效,因此这种通信模式当中,路由器就成了一个单点瓶颈,为了解决 这个问题,就引入了VRRP协议。
VRRP协议是一种容错的主备模式的协议,保证当主机的下一跳路由出现故障时,由另一台路由器来代 替出现故障的路由器进行工作,通过VRRP可以在网络发生故障时透明的进行设备切换而不影响主机之 间的数据通信。
故障迁移原理
在 Keepalived 服务正常工作时,主 Master 节点会不断地向备节点发送(多播的方式)心跳消息,用以告诉备 Backup 节点自己还活着,当主 Master 节点发生故障时,就无法发送心跳消息,备节点也就 因此无法继续检测到来自主 Master 节点的心跳了,于是调用自身的接管程序,接管主 Master 节点的 IP 资源及服务。而当主 Master 节点恢复时,备 Backup 节点又会释放主节点故障时自身接管的 IP 资源 及服务,恢复到原来的备用角色。
Keepalived工作在TCP/IP参考模型的三层、四层、五层,其原理如下:
网络层
Keepalived通过ICMP协议向服务器集群中的每一个节点发送一个ICMP数据包(有点类似与 Ping的功能),如果某个节点没有返回响应数据包,那么认为该节点发生了故障, Keepalived将报告这个节点失效,并从服务器集群中剔除故障节点。
传输层
Keepalived在传输层里利用了TCP协议的端口连接和扫描技术来判断集群节点的端口是否 正常。 比如对于常见的WEB服务器80端口。或者SSH服务22端口,Keepalived一旦在传输 层探测到这些端口号没有数据响应和数据返回,就认为这些端口发生异常,然后强制将这些 端口所对应的节点从服务器集群中剔除掉。
应用层
Keepalived的运行方式更加全面化和复杂化,用户可以通过自定义Keepalived工作方式。 例如:可以通过编写程序或者脚本来运行Keepalived,而Keepalived将根据用户的设定参 数检测各种程序或者服务是否正常,如果Keepalived的检测结果和用户设定的不一致时, Keepalived将把对应的服务器从服务器集群中剔除。
在一个一主多备的Keepalived集群中,priority值最大的将成为集群中的MASTER节点,而其他都是 BACKUP节点。在MASTER节点发生故障后,BACKUP节点之间将进行“民主选举”,通过对节点优先级值 priority和weight的计算,选出新的MASTER节点接管集群服务。
weight值为正数时
在vrrp_script中指定的脚本如果检测成功,那么MASTER节点的权值将是weight值与priority值之和;如 果脚本检测失效,那么MASTER节点的权值保持为priority值
MASTER 节点vrrp_script脚本检测失败时,如果MASTER节点priority值小于BACKUP节点weight值与 priority值之和,将发生主、备切换。
MASTER节点vrrp_script脚本检测成功时,如果MASTER节点weight值与priority值之和大于BACKUP节 点weight值与priority值之和,主节点依然为主节点,不发生切换。
weight值为负数时
在vrrp_script中指定的脚本如果检测成功,那么MASTER节点的权值仍为priority值,当脚本检测失败时,MASTER节点的权值将是priority值与weight值之差 MASTER节点vrrp_script脚本检测失败时,如果MASTER节点priority值与weight值之差小于BACKUP节点priority值,将发生主、备切换。 MASTER节点vrrp_scrip脚本检测成功时,如果MASTER节点priority值大于BACKUP节点priority值时,主节点依然为主节点,不发生切换。
对于weight值的设置,有一个简单的标准,即weight值的绝对值要大于MASTER和BACKUP节点priority 值之差。由此可见,对于weight值的设置要非常谨慎,如果设置不好,主节点发生故障时将导致集群角 色选举失败,使集群陷于瘫痪状态。

为了测试lvs的高可用,这里需要增加一台lvs服务器,需在此服务器上安装ipvsadm。RS1 和 RS2保持不变。
在两台lvs服务器上都需要安装keepAlived,安装命令如下:
yum install -y keepalived
keepAlived安装完成后,在/etc/keepalived目录下有一个keepalived.conf原配置文件,内容如下:
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
#上面的配置无需关注,重点关注和修改下面的配置
vrrp_instance VI_1 {
#标识当前lvs是主,根据实际lvs服务器规划确定,可选值
state MASTER
MASTER和BACKUP
#lvs服务器提供服务器的网卡,根据实际服务器网卡进行修改
interface eth0
#lvs提供的服务所属ID,目前无需修改
virtual_router_id 51
#lvs服务器的优先级,主服务器最高,备份服务器要低于主服务器
priority 100
# VRRP Multicast 广播周期秒数
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.88.88/24 dev ens33 label ens33:8
}
}
#virtual_ipaddress用于配置VIP和LVS服务器的网卡绑定关系,一般需要修改
#示例: 192.168.25.100/24 dev ens33 label ens33:9
virtual_ipaddress {
192.168.200.16
192.168.200.17
192.168.200.18
} }
#配置lvs服务策略,相当于ipvsadm -A -t 192.168.25.100:80 -s rr,一般需要修改
virtual_server 192.168.200.100 443 {
delay_loop 6
#配置lvs调度算法,默认轮询
lb_algo rr
#配置lvs工作模式,可以改为DR
lb_kind NAT
#用于指定同一个client在多久内,只去请求第一次提供服务的RS,为查看轮询效果,这里需要改为0
persistence_timeout 50
#TCP协议
protocol TCP
#配置RS信息,相当于ipvsadm -a -t 192.168.25.100:80 -r 192.168.25.112 -g
real_server 192.168.201.100 443 {
#当前RS的权重
weight 1
#SSL_GET健康检查,一般改为HTTP_GET
SSL_GET {
#两个url可以删除一个,url内的内容改为path /和status_code 200,digest删除
url {
path /
digest ff20ad2481f97b1754ef3e12ecd3a9cc
}
url {
path /mrtg/
digest 9b3a0c85a887a256d6939da88aabd8cd
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
#下面的配置实际是两组lvs服务的配置,含义和上面的lvs服务配置一致。如果用不到,下面的配置可以全部 删除
virtual_server 10.10.10.2 1358 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
sorry_server 192.168.200.200 1358
real_server 192.168.200.2 1358 {
weight 1
HTTP_GET {
url {
....
基于上述配置文件和实战拓扑图及服务器规划,对两台lvs服务器分别修改keepalived.conf配置如下:
LVS主服务器(Q110)
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
#主服务器
state MASTER
interface ens33
virtual_router_id 51
#优先级高
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.88.88/24 dev ens33 label ens33:8
}
}
virtual_server 192.168.88.88 80 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 0
protocol TCP
real_server 192.168.88.111 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.88.112 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
LVS备用服务器
# 拷贝主服务器配置到备用服务器并覆盖
scp /etc/keepalived/keepalived.conf root@192.168.88.120:`pwd`
# 进入备用服务器修改配置
vi /etc/keepalived/keepalived.conf
# 调整内容1:vrrp_instance VI_1 中state 改为 BACKUP,权重priority 50
注意:配置文件中的key和大括号之间一定要有空格
在两台lvs服务器上分别启动keepAlived,命令如下:
systemctl start keepalived
上述步骤执行完毕后,可以在lvs主服务器和备份服务器分别执行ifconfig命令,可以查看到VIP被绑定到 了主服务器,如下:

在客户端发起请求,测试负载均衡,如下:
# qin @ QinMac in ~ [8:54:24]
$ curl 192.168.88.88
this is RS02
# qin @ QinMac in ~ [8:56:05]
$ curl 192.168.88.88
this is RS01
# qin @ QinMac in ~ [8:56:15]
$ curl 192.168.88.88
this is RS02
# qin @ QinMac in ~ [8:56:16]
$ curl 192.168.88.88
this is RS01
关闭一台RS1后(这里可以使用systemctl stop httpd),客户端继续发起请求,查看是 否可以正常访问。
# qin @ QinMac in ~ [8:56:19]
$ curl 192.168.88.88
this is RS02
# qin @ QinMac in ~ [9:01:21]
$ curl 192.168.88.88
this is RS02
# qin @ QinMac in ~ [9:01:23]
$ curl 192.168.88.88
this is RS02
会发现,此时客户端可以正常访问,但只有RS2在提供服务。这说明,keepAlived检测到了RS1服务器异常,将其剔除了。
此时再启动RS1服务器,客户端继续访问,会发现响应结果如下,keepAlived检测到RS1服务器恢复正 常,又将其加入服务列表了
测试lvs主服务宕机
使用ifconfig 网卡名 down命令,关闭主服务器网卡,此时主服务器不能提供服务。观察备份服务器是否将VIP绑定到自己,以及客户端是否可以继续正常访问。如下: 关闭主服务器网卡
[root@q110 keepalived]# ifconfig ens33 down
观察备份服务器,会发现VIP已经绑定过来了。这里实际是keepAlived检测到了主服务器的异常,而做 出的故障转移和自动切换。

观察客户端是否可以继续正常访问
# qin @ QinMac in ~ [9:02:32]
$ curl 192.168.88.88
this is RS01
# qin @ QinMac in ~ [9:04:24]
$ curl 192.168.88.88
this is RS02
测试lvs主服务器恢复 上述测试通过后,可以开启主服务器网卡,让其能够提供服务,然后观察VIP是否会回到主服务器。 开启主服务器网卡
ifconfig ens33 up
查看主服务器和备份服务器
主服务器

备服务器

会发现,VIP重新绑定到了主服务器。
我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel
我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie
我可以在Azure网站上部署RubyonRails吗? 最佳答案 还没有。目前仅支持.NET和PHP。 关于ruby-on-rails-RubyonRails可以部署在Azure网站上吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/12964010/
前置步骤我们都操作完了,这篇开始介绍jenkins的集成。话不多说,看操作1、登录进入jenkins后会让你选择安装插件,选择第一个默认的就行。安装完成后设置账号密码,重新登录。2、配置JDK和Git都需要执行路径,所以需要先把执行路径找到,先进入服务器的docker容器,2.1JDK的路径root@69eef9ee86cf:/usr/bin#echo$JAVA_HOME/usr/local/openjdk-82.2Git的路径root@69eef9ee86cf:/#whichgit/usr/bin/git3、先配置JDK和Git。点击:ManageJenkins>>GlobalToolCon
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal
Ocra无法处理需要“tk”的应用程序require'tk'puts'nope'用奥克拉http://github.com/larsch/ocra不起作用(如链接中的一个问题所述)问题:https://github.com/larsch/ocra/issues/29(Ocra是1.9的"new"rubyscript2exe,本质上它用于将rb脚本部署为可执行文件)唯一的问题似乎是缺少tcl的DLL文件我不认为这是一个问题据我所知,问题是缺少tk的DLL文件如果它们是已知的,则可以在执行ocra时将它们包括在内有没有办法知道tk工作所需的DLL依赖项? 最佳答
我是一名决定学习Ruby和RubyonRails的ASP.NETMVC开发人员。我已经有所了解并在RoR上创建了一个网站。在ASP.NETMVC上开发,我一直使用三层架构:数据层、业务层和UI(或表示)层。尝试在RubyonRails应用程序中使用这种方法,我发现没有关于它的信息(或者也许我只是找不到它?)。也许有人可以建议我如何在RubyonRails上创建或使用三层架构?附言我使用ruby1.9.3和RubyonRails3.2.3。 最佳答案 我建议在制作RoR应用程序时遵循RubyonRails(RoR)风格。Rails
我的rails3.1.6应用程序中有一个自定义访问器方法,它为一个属性分配一个值,即使该值不存在。my_attr属性是一个序列化的哈希,除非为空白,否则应与给定值合并指定了值,在这种情况下,它将当前值设置为空值。(添加了检查以确保值是它们应该的值,但为简洁起见被删除,因为它们不是我的问题的一部分。)我的setter定义为:defmy_attr=(new_val)cur_val=read_attribute(:my_attr)#storecurrentvalue#makesureweareworkingwithahash,andresetvalueifablankvalueisgiven
我有一个类unzipper.rb,它使用Rubyzip解压文件。在我的本地环境中,我可以成功解压缩文件,而无需使用require'zip'明确包含依赖项但是在Heroku上,我得到一个NameError(uninitializedconstantUnzipper::Zip)我只能通过使用明确的require来解决问题:为什么这在Heroku环境中是必需的,但在本地主机上却不是?我的印象是Rails自动需要所有gem。app/services/unzipper.rbrequire'zip'#OnlyrequiredforHeroku.Workslocallywithout!class
出于某种原因,heroku尝试要求dm-sqlite-adapter,即使它应该在这里使用Postgres。请注意,这发生在我打开任何URL时-而不是在gitpush本身期间。我构建了一个默认的Facebook应用程序。gem文件:source:gemcuttergem"foreman"gem"sinatra"gem"mogli"gem"json"gem"httparty"gem"thin"gem"data_mapper"gem"heroku"group:productiondogem"pg"gem"dm-postgres-adapter"endgroup:development,:t