高可用解决方案:
heartbeat
corosync
cman
keepalived
前面我们讲解了,LVS(负载均衡器)、Heartbeat、Corosync、Pacemaker、Web高可用集群、MySQL高可用集群、DRDB、iscsi、gfs2、cLVM等,唯一没有讲解的就是LVS可用,也就是前端高可用,我们这一篇博文主要讲解内容。在说这个之前我们得和大家讨论一个问题,也是好多博友问的问题。Heartbeat、Corosync、Keepalived这三个集群组件我们到底选哪个好,首先我想说明的是,Heartbeat、Corosync是属于同一类型,Keepalived与Heartbeat、Corosync,根本不是同一类型的。Keepalived使用的vrrp协议方式,虚拟路由冗余协议 (Virtual Router Redundancy Protocol,简称VRRP);Heartbeat或Corosync是基于主机或网络服务的高可用方式;简单的说就是,Keepalived的目的是模拟路由器的高可用,Heartbeat或Corosync的目的是实现Service的高可用。所以一般Keepalived是实现前端高可用,常用的前端高可用的组合有,就是我们常见的LVS+Keepalived、Nginx+Keepalived、HAproxy+Keepalived。而Heartbeat或Corosync是实现服务的高可用,常见的组合有Heartbeat v3(Corosync)+Pacemaker+NFS+Httpd 实现Web服务器的高可用、Heartbeat v3(Corosync)+Pacemaker+NFS+MySQL 实现MySQL服务器的高可用。总结一下,Keepalived中实现轻量级的高可用,一般用于前端高可用,且不需要共享存储,一般常用于两个节点的高可用。而Heartbeat(或Corosync)一般用于服务的高可用,且需要共享存储,一般用于多节点的高可用。这个问题我们说明白了,又有博友会问了,那heartbaet与corosync我们又应该选择哪个好啊,我想说我们一般用corosync,因为corosync的运行机制更优于heartbeat,就连从heartbeat分离出来的pacemaker都说在以后的开发当中更倾向于corosync,所以现在corosync+pacemaker是最佳组合。但说实话我对于软件没有任何倾向性,所以我把所有的集群软件都和大家说了一下,我认为不管什么软件,只要它能存活下来都有它的特点和应用领域,只有把特定的软件放在特定的位置才能发挥最大的作用,那首先我们得对这个软件有所有了解。学习一种软件的最好方法,就是去查官方文档。好了说了那么多希望大家有所收获,下面我们来说一说keepalived。
keepalived与heartbeat/corosync等比较:
Heartbeat、Corosync、Keepalived这三个集群组件我们到底选哪个好呢?
首先要说明的是,Heartbeat、Corosync是属于同一类型,Keepalived与Heartbeat、Corosync,根本不是同一类型的。
Keepalived使用的vrrp协议方式,虚拟路由冗余协议 (Virtual Router Redundancy Protocol,简称VRRP);
Heartbeat或Corosync是基于主机或网络服务的高可用方式;
简单的说就是,Keepalived的目的是模拟路由器的高可用,Heartbeat或Corosync的目的是实现Service的高可用。
所以一般Keepalived是实现前端高可用,常用的前端高可用的组合有,就是我们常见的LVS+Keepalived、Nginx+Keepalived、HAproxy+Keepalived。而Heartbeat或Corosync是实现服务的高可用,常见的组合有Heartbeat v3(Corosync)+Pacemaker+NFS+Httpd 实现Web服务器的高可用、Heartbeat v3(Corosync)+Pacemaker+NFS+MySQL 实现MySQL服务器的高可用。总结一下,Keepalived中实现轻量级的高可用,一般用于前端高可用,且不需要共享存储,一般常用于两个节点的高可用。而Heartbeat(或Corosync)一般用于服务的高可用,且需要共享存储,一般用于多节点的高可用。这个问题我们说明白了。
那heartbaet与corosync又应该选择哪个好?
一般用corosync,因为corosync的运行机制更优于heartbeat,就连从heartbeat分离出来的pacemaker都说在以后的开发当中更倾向于corosync,所以现在corosync+pacemaker是最佳组合。
双机高可用一般是通过虚拟IP(飘移IP)方法来实现的,基于Linux/Unix的IP别名技术。
双机高可用方法目前分为两种:
1)双机主从模式:即前端使用两台服务器,一台主服务器和一台热备服务器,正常情况下,主服务器绑定一个公网虚拟IP,提供负载均衡服务,热备服务器处于空闲状态;当主服务器发生故障时,热备服务器接管主服务器的公网虚拟IP,提供负载均衡服务;但是热备服务器在主机器不出现故障的时候,永远处于浪费状态,对于服务器不多的网站,该方案不经济实惠。
2)双机主主模式:即前端使用两台负载均衡服务器,互为主备,且都处于活动状态,同时各自绑定一个公网虚拟IP,提供负载均衡服务;当其中一台发生故障时,另一台接管发生故障服务器的公网虚拟IP(这时由非故障机器一台负担所有的请求)。这种方案,经济实惠,非常适合于当前架构环境。
一、keepalived简介
keepalived不同于以前三种高可用解决方案的是为了调用ipvsd命令,并且自动生成规则,并将用户请求访问转移到各个节点上实现的,实质就是对ipvs的高可用。
keepalived通过vrrp协议通过各个高可用节点上的信息,保证设备的高可用,主节点称为master,备用节点称为backup。
模块化设计
核心:
vrrp的实现
基于vrrp之上的对虚拟服务器的控制
checkers:监控服务器是否正常,如果主节点故障通过降低优先级并通过来转移服务。
特点:
只能有一个节点处于活动状态,并不能实现负载均衡。如何实现负载均衡呢,这里可以创建多组资源,每组资源定义不同的内容,使他们直接产生相互主被的关系。
应用场景:
基于上面所讲的负载均衡方式,必然会产生两个完全不同的地址,这样的话对于用户来说就由两个不同的选择,如何实现负载均衡呢?
1、适用于路由器,网关设备,可以将用户自定义不同的网关,来分担路由器的负担。
2、适用于应用类服务,比如web服务,可以通过修改DNS来对同一个域名定义多个ip地址来实现负载均衡。
安全认证机制:
1、明文认证
2、md5认证
主配置文件:/etc/keepalived/keepalived.conf
启动脚本:/etc/init.d/keepalived
通过man命令可以查看keepalived.conf的使用帮助
[[email protected] ~]# man keepalived.conf
配置文件讲解:
1、global configuration
全局定义
静态路由
2、vrrpd configuration
vrrpd同步组(一般不用)
vrrp实例(instance),不同节点的实例配置不同。
3、lvs configuration
虚拟服务器组
虚拟服务器,包含realserver。
global_defs {
notification_email {
[email protected] #设置报警邮件地址,可以设置多个,每行一个。需要开启sendmail服务。
}
notification_email_from keepalived@localhost #设置邮件的发送地址
smtp_server 127.0.0.1 #设置SMTP Server地址
smtp_connect_timeout 30 #设置SMTP Server的超时时间
router_id LVS_DEVEL #表示运行Keepalived服务器的一个标识。发邮件时显示大邮件主题中的信息
}
vrrp_instance VI_1 { #vrrp 实例定义部分
state MASTER #指定Keepalived的角色,MASTER表示此主机是主服务器。BACKUP表示此主机是备用服务器
interface eth1 #指定HA监测网络的接口
virtual_router_id 51 #虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识,即同一个vrrp_instance下MASTER与BACKUP必须是一致的
priority 50 #定义优先级,数字越大,优先级越高
authentication {
auth_type PASS #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
auth_pass 1111
}
virtual_ipaddress { #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
192.168.100.250
}
}
virtual_server 192.168.100.250 80 { #设置虚拟服务器,需要指定虚拟IP地址和服务端口,IP与端口之间用空格隔开
delay_loop 6 #设置运行情况检查时间,单位为秒
lb_algo rr #设置负载调度算法,这里设置rr,即轮询算法
lib_kind DR #设置LVS实现负载均衡机制,有NAT、TUN、DR三个模式可选
persistence_timeout 60 #会话保持单位时间,单位是秒
protocol TCP #指定转发协议类型,有TCP和UDP两种
real_server 192.168.100.60 80 { #配置服务节点1,需要指定real server的真实IP地址和端口
weight 1 #配置服务节点的权值,权值数字越大,权值越高
TCP_CHECK { #relserve的状态检测设置部分,单位是秒
connect_timeout 10 #表示10秒无响应超时
nb_get_retry 3 #表示重试次数
dealy_before_retry 3 #表示重试间隔
}
}
real_server 192.168.100.80 80 {
weight 1
TCP_CHECK {
connect_timeout 10 #表示10秒无响应超时
nb_get_retry 3 #表示重试次数
dealy_before_retry 3 #表示重试间隔
}
}
}
============================================================================================
全局配置:
global_defs {
notification_email {
[email protected] 接收报警的邮箱,可以用多个。
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1 本机转发email(smtp.server地址)
smtp_connect_timeout 30 连接snmp超时时间
router_id LVS_MASTER 运行Keepalived服务器的一个标识。发邮件时显示在邮件标题中
的信息
}
VRRP实例虚拟服务器部分:
vrrp_instance VI_1 {
state MASTER 状态级别,根据priority来设定的,master的值大于slave的值
interface eth0 检测端口
virtual_router_id 相当于组ID master.slave必须在一个组内,这样slave才能接收到
master发送的vrrp包。
priority 100 优先级
advert_int 1 主从通告间隔秒数
authentication {
auth_type PASS 密钥
auth_pass 1111
}
virtual_ipaddress {
192.168.200.16 (VIP可有多个)
192.168.200.17
192.168.200.18
}
}
virtual_server 192.168.200.100 80{
delay_loop 6 每隔6秒查询realserver状态
lb_algo rr lvs调度算法,这里使用轮询
lb_kind DR lvs负载均衡机制,这里使用直连路由
nat_mask 255.255.255.0
persistence_timeout 60 同一IP的连接60秒内被分配到同一台realserver
protocol TCP 指定转发协议类型,有tcp和udp两种
real_server 192.168.201.100 80 {
weight 1 根据性能分配权值大小,负载不同
TCP_CHECK {
connect_timeout 3 连接超时3秒
nb_get_retry 3 重试次数
delay_before_retry 3 重试间隔
}
}
real_server 192.168.201.101 80{
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
global_defs {
notification_email {
[email protected] ##收件人地址
}
notification_email_from [email protected] ##发件人地址
smtp_server 127.0.0.1 ##centos5使用的是sendmail.centos6使用的是postfix,如果要发送到外外网邮箱,需要单独配置postfix配置文件。
smtp_connect_timeout 30 ##超时时间
router_id LVS_DEVEL_dtedu ##路由器标识,可以不用管
}
vrrp_instance VI_1 { ##一个instance定义一个实例
state MASTER ##定义当前服务器是主状态,如果有多个keepalived节点,同一个实例只能有一个master。
interface eth0 ##通告选举使用的网卡接口
virtual_router_id 51 ##虚拟路由id,此id也是虚拟mac最后一位地址的来源。
priority 100 ##主的优先级要高于backup的优先级
advert_int 1 ##通告时间间隔
authentication { ##认证方式pass(明文)
auth_type PASS
auth_pass 123123
}
virtual_ipaddress { ##虚拟ip地址
10.40.0.227
}
}
#virtual_server 192.168.200.100 443 {
# delay_loop 6 ##ipvs工作模型
# lb_algo rr ##负载均衡算法
# lb_kind NAT
# nat_mask 255.255.255.0
# persistence_timeout 50 ##持久链接时间多长,不使用则为 “0”
# protocol TCP ##使用的协议,目前只支持tcp
#
# real_server 192.168.201.100 443 {
# weight 1
# SSL_GET {
# url {
# path /
# digest ff20ad2481f97b1754ef3e12ecd3a9cc
# }
# url {
# path /mrtg/
# digest 9b3a0c85a887a256d6939da88aabd8cd
# }
# connect_timeout 3
# nb_get_retry 3
# delay_before_retry 3
# }
# }
#}
#
#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 { ##适用于httpd服务,tcp_check适用于msyql之类的链接检查,ssl_check适用于https。
# url {
# path /testurl/test.jsp
# digest 640205b7b0fc66c1ea91c463fac6334d
# }
# url {
# path /testurl2/test.jsp
# digest 640205b7b0fc66c1ea91c463fac6334d
# }
# url {
# path /testurl3/test.jsp
# digest 640205b7b0fc66c1ea91c463fac6334d
# }
# connect_timeout 3 ##链接超时时间为3秒
# nb_get_retry 3 ##超时后尝试次数为3次
# delay_before_retry 3 ##每次尝试链接等待时间为3秒
# }
# }
#
# real_server 192.168.200.3 1358 {
# weight 1
# HTTP_GET {
# url {
# path /testurl/test.jsp