http://blog.csdn.net/chengxuyuanyonghu/article/details/60779391
keepalived的HA分为抢占模式(默认)和非抢占模式.
抢占模式即MASTER从故障中恢复后,会将VIP从BACKUP节点中抢占过来。
非抢占模式即MASTER恢复后不抢占BACKUP升级为MASTER后的VIP。
http://blog.csdn.net/kkdelta/article/details/39433137
http://www.lampchina.net/ask/MTYzMjEyNg.html
http://qq85609655.iteye.com/blog/1864271
http://blog.163.com/qiantu1986@126/blog/static/3592266920115211149139/
http://my.oschina.net/hncscwc/blog/158746
	Keepalived使用的vrrp协议方式,虚拟路由冗余协议 (Virtual Router Redundancy Protocol,简称VRRP);
Heartbeat是基于主机或网络的服务的高可用方式;
keepalived的目的是模拟路由器的双机
heartbeat的目的是用户service的双机
lvs的高可用建议用keepalived
业务的高可用用heartbeat
主keepalived关闭,会切换到从,如果主再次重启,那么会漂移到主。
从keepalived
	http://blog.csdn.net/catoop/article/details/41351103
两款高可用开源方案:Keepalived和Heartbeat。两者都很流行,但差异还是很大的,现将试用过程中的感受以及相关知识点简单总结一下,供大家选择方案的时候参考。
1)Keepalived使用更简单:从安装、配置、使用、维护等角度上对比,Keepalived都比Heartbeat要简单得多,尤其是Heartbeat2.1.4后拆分成3个子项目,安装、配置、使用都比较复杂,尤其是出问题的时候,都不知道具体是哪个子系统出问题了;而Keepalived只有1个安装文件、1个配置文件,配置文件也简单很多;
2)Heartbeat功能更强大:Heartbeat虽然复杂,但功能更强大,配套工具更全,适合做大型集群管理,而Keepalived主要用于集群倒换,基本没有管理功能;
3)协议不同:Keepalived使用VRRP协议进行通信和选举,Heartbeat使用心跳进行通信和选举;Heartbeat除了走网络外,还可以通过串口通信,貌似更可靠;
4)使用方式基本类似:如果要基于两者设计高可用方案,最终都要根据业务需要写自定义的脚本,Keepalived的脚本没有任何约束,随便怎么写都可以;Heartbeat的脚本有约束,即要支持servicestart/stop/restart这种方式,而且Heartbeart提供了很多默认脚本,简单的绑定ip,启动apache等操作都已经有了;
使用建议:优先使用Keepalived,当Keepalived不够用的时候才选择Heartbeat
通常情况下,利用keepalived做热备,其中一台设置为master,一台设置为backup。当master出现异常后,backup自动切换为master。当backup成为master后,master恢复正常后会再次抢占成为master,导致不必要的主备切换。因此可以将两台keepalived初始状态均配置为backup,设置不同的优先级,优先级高的设置nopreempt解决异常恢复后再次抢占的问题。
然而keepalived只能做到对网络故障和keepalived本身的监控,即当出现网络故障或者keepalived本身出现问题时,进行切换。但是这些还不够,我们还需要监控keepalived所在服务器上的其他业务进程,根据业务进程的运行状态决定是否需要进行主备切换。这个时候,我们可以通过编写脚本对业务进程进行检测监控。
例如编写个简单脚本查看haproxy进程是否存活
| 
							1
						 
							2
						 
							3
						 
							4
						 
							5
						 
							6
						 
							7
						 | 
								#!/bin/bash
							 
								count = `psaux |grep-vgrep|grephaproxy |wc-l`
							 
								if[ $count > 0 ];then
							 
								    exit0
							 
								else
							 
								    exit1
							 
								fi
							 | 
在keepalived的配置文件中增加相应配置项
| 
							1
						 
							2
						 
							3
						 
							4
						 
							5
						 
							6
						 
							7
						 
							8
						 
							9
						 
							10
						 
							11
						 
							12
						 
							13
						 
							14
						 
							15
						 
							16
						 
							17
						 
							18
						 | 
								vrrp_script checkhaproxy
							 
								{
							 
								    script"/home/check.sh"
							 
								    interval 3
							 
								    weight -20
							 
								}
							 
								vrrp_instancetest
							 
								{
							 
								    ...
							 
								    track_script
							 
								    {
							 
								        checkhaproxy
							 
								    }
							 
								    ...
							 
								}
							 | 
keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。
如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加
如果脚本执行结果非0,并且weight配置的值小于0,则优先级相应的减少
其他情况,维持原本配置的优先级,即配置文件中priority对应的值。
这里需要注意的是:
1) 优先级不会不断的提高或者降低
2) 可以编写多个检测脚本并为每个检测脚本设置不同的weight
3) 不管提高优先级还是降低优先级,最终优先级的范围是在[1,254],不会出现优先级小于等于0或者优先级大于等于255的情况
这样可以做到利用脚本检测业务进程的状态,并动态调整优先级从而实现主备切换。
但是利用该方式会存在一个问题,例如:A,B两台keepalived
A的配置大概为:
| 
							1
						 
							2
						 
							3
						 
							4
						 
							5
						 
							6
						 
							7
						 
							8
						 
							9
						 
							10
						 
							11
						 
							12
						 
							13
						 
							14
						 
							15
						 
							16
						 
							17
						 
							18
						 
							19
						 
							20
						 
							21
						 
							22
						 
							23
						 | 
								vrrp_script checkhaproxy
							 
								{
							 
								    script"/etc/check.sh"
							 
								    interval 3
							 
								    weight -20
							 
								}
							 
								vrrp_instancetest
							 
								{
							 
								    ....
							 
								    state backup
							 
								    priority 80
							 
								    nopreempt
							 
								    track_script
							 
								    {
							 
								        checkhaproxy
							 
								    }
							 
								    ....
							 
								}
							 | 
B的配置大概为:
| 
							1
						 
							2
						 
							3
						 
							4
						 
							5
						 
							6
						 
							7
						 
							8
						 
							9
						 
							10
						 
							11
						 
							12
						 
							13
						 
							14
						 
							15
						 
							16
						 
							17
						 
							18
						 
							19
						 
							20
						 
							21
						 | 
								vrrp_script checkhaproxy
							 
								{
							 
								    script"/etc/check.sh"
							 
								    interval 3
							 
								    weight -20
							 
								}
							 
								vrrp_instancetest
							 
								{
							 
								    ....
							 
								    state backup
							 
								    priority 70
							 
								    track_script
							 
								    {
							 
								        checkhaproxy
							 
								    }
							 
								    ....
							 
								}
							 | 
A,B同时启动后,由于A的优先级较高,因此通过选举会成为master。当A上的业务进程出现问题时,优先级会降低到60。此时B收到优先级比自己低的vrrp广播包时,将切换为master状态。那么当B上的业务出现问题时,优先级降低到50,尽管A的优先级比B的要高,但是由于设置了nopreempt,A不会再抢占成为master状态。
所以,可以在检测脚本中增加杀掉keepalived进程(或者停用keepalived服务)的方式,做到业务进程出现问题时完成主备切换。
Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。
iptables -t nat -A PREROUTING -p tcp -d 虚拟服务ip --dport 80 -j REDIRECT
	http://blog.chinaunix.net/uid-23078678-id-2554511.html
http://blog.sina.com.cn/s/blog_9e3d56cf0101bpfx.html
ubuntu
	1.sudo apt-get install libssl-dev 
2.sudo apt-get install openssl 
3.sudo apt-get install libpopt-dev
	http://blog.sina.com.cn/s/blog_5f54f0be0101eyff.html
	http://deidara.blog.51cto.com/400447/302402/
http://bbs.linuxtone.org/thread-20630-1-1.html
主服务器
	 1 global_defs {
  2     router_id NodeA
  3 }
  4 vrrp_script nginx_pid {
  5                 script "/root/nginx_pid.sh"
  6  interval 3
  7          weight -2
  8         fall 2
  9         rise 1
 10 }
 11 vrrp_instance VI_1 {
 12    state MASTER    #设置为主服务器
 13    interface wlan0  #监测网络接口
 14    virtual_router_id 51  #主、备必须一样
 15    priority 100   #(主、备机取不同的优先级,主机值较大,备份机值较小,值越大优先级越高)
 16    advert_int 1   #VRRP Multicast广播周期秒数
 17    authentication {
 18         auth_type PASS  #VRRP认证方式,主备必须一致
 19         auth_pass 1111   #(密码)
 20    }
 21 
 22 virtual_ipaddress {
 23      #192.168.1.118/24  #VRRP HA虚拟地址
 24      192.168.1.118  #VRRP HA虚拟地址
 25 }
 26    track_script  {
 27                     nginx_pid
 28     }
 29 }
从服务器
	  1 global_defs {
  2     router_id NodeB
  3 }
  4 vrrp_instance VI_1 {
  5    state BACKUP    #设置为主服务器
  6    interface wlan0  #监测网络接口
  7    virtual_router_id 51  #主、备必须一样
  8    priority 90   #(主、备机取不同的优先级,主机值较大,备份机值较小,值越大优先级越高)
  9    advert_int 1   #VRRP Multicast广播周期秒数
 10    authentication {
 11         auth_type PASS  #VRRP认证方式,主备必须一致
 12         auth_pass 1111   #(密码)
 13    }
 14    virtual_ipaddress {
 15         #192.168.1.118/24  #VRRP HA虚拟地址
 16         192.168.1.118  #VRRP HA虚拟地址
 17    }
 18 }
启动root@yanisyu-Aspire-E1-571G:~# keepalived -D -f /usr/local/etc/keepalived/keepalived.conf
cat /root/nginx_pid.sh
	#!/bin/bash
# varsion 0.0.2
# 根据一网友说这样做不科学,如果nginx服务起来了,但是我把keepalived 杀掉了,我的理由是,如果nginx down了,我觉得就很难在起来,再有就是nagios 当然要给你报警了啊。不过这位同学说的有道理,所以就稍加改了一下脚本
	 A=`ps -C nginx --no-header |wc -l`                ## 查看是否有 nginx进程 把值赋给变量A 
#echo $A;exit;
if [ $A -eq 0  ];then                                         ## 如果没有进程值得为 零
killall keepalived                        ## 则结束 keepalived 进程
/usr/sbin/nginx -c /etc/nginx/nginx.conf
sleep 3
fi



