操作系统: redhat 6.5 x64,本文采用rpm方式安装haproxy,keepalived。
app1: 192.168.0.24
app1: 192.168.0.25
vip : 192.168.0.26
http1:192.168.0.24:8080 主机配置lap环境。
http2:192.168.0.25:8080 主机配置lap环境。
实现一个vip出现,出例采用vip地址是192.168.0.26。
说明:rhel/centos/oel6.x安装版本中已经集成了keepalive-1.2.7,以及haproxy软件包经过安装没有问题。
在app1,app2两个节点上直接采用rpm包安装。
1
2
3
4
5
6
7
8
9
10
<code># rpm -ivh keepalived-1.2.7-3.el6.x86_64.rpm net-snmp-utils-5.5-49.el6.x86_64.rpm net-snmp-libs-5.5-49.el6.x86_64.rpm lm_sensors-3.1.1-17.el6.x86_64.rpm lm_sensors-</code>
<code>devel-3.1.1-17.el6.x86_64.rpm lm_sensors-libs-3.1.1-17.el6.x86_64.rpm </code>
<code>preparing... </code><code>########################################### [100%] </code>
<code> </code><code>1:lm_sensors-libs </code><code>########################################### [ 17%] </code>
<code> </code><code>2:net-snmp-libs </code><code>########################################### [ 33%] </code>
<code> </code><code>3:keepalived </code><code>########################################### [ 50%] </code>
<code> </code><code>4:net-snmp-utils </code><code>########################################### [ 67%] </code>
<code> </code><code>5:lm_sensors </code><code>########################################### [ 83%] </code>
<code> </code><code>6:lm_sensors-devel </code><code>########################################### [100%] </code>
<code>#</code>
1) 在app1 节点一上配置文件
说明: 修改配置文件, 绑定的网卡是eth0,从机就是优先级与本机ip不一样外,其它都是一样,相比之前的示例增加了监控脚本。
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<code># vi /etc/keepalived/keepalived.conf </code>
<code>! configuration file </code><code>for</code> <code>keepalived </code>
<code>global_defs { </code>
<code> </code><code>notification_email { </code>
<code> </code><code>[email protected] </code>
<code> </code><code>} </code>
<code> </code><code>notification_email_from [email protected] </code>
<code> </code><code>smtp_server 127.0.0.1 </code>
<code> </code><code>smtp_connect_timeout 30 </code>
<code> </code><code>router_id lvs_devel </code>
<code>}</code>
<code>vrrp_script chk_haproxy { </code>
<code> </code><code>script </code><code>"killall -0 haproxy"</code>
<code> </code><code>interval 1 </code>
<code> </code><code>weight -2 </code>
<code>vrrp_instance vi_1 { </code>
<code> </code><code>state master </code>
<code> </code><code>interface eth0 </code>
<code> </code><code>virtual_router_id 51 </code>
<code> </code><code>mcast_src_ip 192.168.0.24 </code>
<code> </code><code>priority 100 </code>
<code> </code><code>advert_int 1 </code>
<code> </code><code>authentication { </code>
<code> </code><code>auth_type pass </code>
<code> </code><code>auth_pass 876543 </code>
<code> </code><code>} </code>
<code> </code><code>virtual_ipaddress { </code>
<code> </code><code>192.168.0.26</code><code>/24</code> <code>dev eth0 label eth0:1 </code>
<code> </code><code>track_interface { </code>
<code> </code><code>eth0 </code>
<code> </code><code>track_script { </code>
<code> </code><code>chk_haproxy </code>
2) 在app2节点二上配置文件
<code> </code><code>script </code><code>"killall -0 haproxy"</code>
<code> </code><code>interval 1 </code>
<code> </code><code>weight -2 </code>
<code> </code><code>mcast_src_ip 192.168.0.25 </code>
<code> </code><code>priority 99 </code>
<code> </code><code>192.168.0.26</code><code>/24</code> <code>dev eth0 label eth0:1 </code>
1) 启动服务并加为开机启动:
<code>service keepalived start </code>
<code>chkconfig keepalived on</code>
2) 测试并观察vip漂移情况
(1) vip地址切换观察
说明:两种方式切换vip, 一个是关闭haproxy代理服务,一个是关闭相关节点的keepalived服务。
<code>[root@app1 /]</code><code># service keepalived start </code>
<code>starting keepalived: [ ok ]</code>
<code>[root@app1 keepalived]</code><code># ip a </code>
<code>1: lo: <loopback,up,lower_up> mtu 16436 qdisc noqueue state unknown </code>
<code> </code><code>link</code><code>/loopback</code> <code>00:00:00:00:00:00 brd 00:00:00:00:00:00 </code>
<code> </code><code>inet 127.0.0.1</code><code>/8</code> <code>scope host lo </code>
<code> </code><code>inet6 ::1</code><code>/128</code> <code>scope host </code>
<code> </code><code>valid_lft forever preferred_lft forever </code>
<code>2: eth0: <broadcast,multicast,up,lower_up> mtu 1500 qdisc pfifo_fast state up qlen 1000 </code>
<code> </code><code>link</code><code>/ether</code> <code>00:0c:29:4c:39:43 brd ff:ff:ff:ff:ff:ff </code>
<code> </code><code>inet 192.168.0.24</code><code>/24</code> <code>brd 192.168.0.255 scope global eth0 </code>
<code> </code><code>inet 192.168.0.26</code><code>/24</code> <code>scope global secondary eth0:1 </code>
<code> </code><code>inet6 fe80::20c:29ff:fe4c:3943</code><code>/64</code> <code>scope link </code>
<code>[root@app1 keepalived]</code><code>#</code>
<code>[root@app2 keepalived]</code><code># ip a </code>
<code> </code><code>link</code><code>/ether</code> <code>00:0c:29:cf:05:99 brd ff:ff:ff:ff:ff:ff </code>
<code> </code><code>inet 192.168.0.25</code><code>/24</code> <code>brd 192.168.0.255 scope global eth0 </code>
<code> </code><code>inet6 fe80::20c:29ff:fecf:599</code><code>/64</code> <code>scope link </code>
<code>[root@app2 keepalived]</code><code>#</code>
<code>注:可以关闭keepalived服务,以及关闭haproxy服务,通过</code><code>tail</code> <code>-f </code><code>/var/log/messages</code><code>观察vip移动情况。</code>
<code>jan 11 12:54:19 app2 keepalived_vrrp[26911]: vrrp_instance(vi_1) received higher prio advert </code>
<code>jan 11 12:54:19 app2 keepalived_vrrp[26911]: vrrp_instance(vi_1) entering backup state </code>
<code>jan 11 12:54:19 app2 keepalived_vrrp[26911]: vrrp_instance(vi_1) removing protocol vips. </code>
<code>jan 11 12:54:19 app2 keepalived_healthcheckers[26910]: netlink reflector reports ip 192.168.0.26 removed</code>
app1, app2配置操作
# vi /etc/sysctl.conf
net.ipv4.ip_nonlocal_bind = 1
# sysctl -p
# rpm -ivh haproxy-1.4.24-2.el6.x86_64.rpm
1)app1上创建配置文件
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<code># vi /usr/local/haproxy/conf/haproxy.cfg</code>
<code>global </code>
<code> </code><code>log 127.0.0.1 local0 </code>
<code> </code><code>maxconn 4000 </code>
<code> </code><code>chroot </code><code>/var/lib/haproxy</code>
<code> </code><code>pidfile </code><code>/var/run/haproxy</code><code>.pid </code>
<code> </code><code>user haproxy </code>
<code> </code><code>group haproxy </code>
<code> </code><code>daemon </code>
<code> </code><code>nbproc 1 </code>
<code> </code><code>stats socket </code><code>/var/lib/haproxy/stats</code>
<code>defaults </code>
<code> </code><code>log global </code>
<code> </code><code>mode http </code>
<code> </code><code>option httplog </code>
<code> </code><code>option dontlognull </code>
<code> </code><code>option redispatch </code>
<code> </code><code>option httpclose </code>
<code> </code><code>option forwardfor </code>
<code> </code><code>retries 3 </code>
<code> </code><code>maxconn 2000 </code>
<code> </code><code>contimeout 5000 </code>
<code> </code><code>clitimeout 50000 </code>
<code> </code><code>srvtimeout 50000 </code>
<code> </code><code>timeout check 1s </code>
<code> </code><code>timeout http-request 10s </code>
<code> </code><code>timeout queue 1m </code>
<code> </code><code>timeout connect 10s </code>
<code> </code><code>timeout client 1m </code>
<code> </code><code>timeout server 1m </code>
<code> </code><code>timeout http-keep-alive 10s</code>
<code>listen stats </code>
<code> </code><code>mode http </code>
<code> </code><code>bind 0.0.0.0:91 </code>
<code> </code><code>stats </code><code>enable</code>
<code> </code><code>stats uri </code><code>/admin</code>
<code> </code><code>stats realm </code><code>"admin console"</code>
<code> </code><code>stats auth admin:123456 </code>
<code> </code><code>stats hide-version </code>
<code> </code><code>stats refresh 10s </code>
<code> </code><code>stats admin </code><code>if</code> <code>true</code>
<code>frontend web_proxy </code>
<code> </code><code>bind *:80 </code>
<code> </code><code>acl url_dynamic path_end -i .php </code>
<code> </code><code>use_backend phpserver </code><code>if</code> <code>url_dynamic </code>
<code> </code><code>default_backend webservers</code>
<code>backend webservers </code>
<code> </code><code>balance roundrobin </code>
<code> </code><code>option httpchk get </code><code>/test</code><code>.html http</code><code>/1</code><code>.0\r\nhost:192.168.0.26 </code>
<code> </code><code>server node01 192.168.0.24:8080 weight 3 check inter 2000 rise 2 fall 1 </code>
<code> </code><code>server node02 192.168.0.25:8080 weight 3 check inter 2000 rise 2 fall 1</code>
<code>backend phpserver </code>
<code> </code><code>option httpchk get </code><code>/test</code><code>.php </code>
<code> </code><code>server node01 192.168.0.24:8080 weight 3 check inter 2000 rise 2 fall 1</code>
2)app2上创建配置文件
<code> </code><code>maxconn 4000 </code>
<code> </code><code>option httpchk get </code><code>/test</code><code>.html </code>
说明:两节点互为主备模式,均优化将本机的节点应用做为主节点,也可以为负载均衡模式, 主例也配置了一个动静分离的模式。
haproxy日志配置,否则默认是不记haproxy日志的,注意与rhel/centos5.x版本的区别。
<code># vi /etc/rsyslog.conf</code>
<code>$modload imudp </code>
<code>$udpserverrun 514 </code>
<code>$udpserveraddress 127.0.0.1 </code>
<code>local0.* </code><code>/var/log/haproxy</code><code>.log </code>
<code>*.info;mail.none;authpriv.none;</code><code>cron</code><code>.none;local0.none </code><code>/var/log/messages</code>
<code>说明: 第五行是去掉在</code><code>/var/log/message</code><code>再记录haproxy.log日志的功能的。 </code>
<code>直接手动执行 </code>
<code>service rsyslog restart</code>
注:redhat/centos6.x 默认haproxy服务运行采用haproxy用户,rpm包安装haproxy,系统已自动配置日录文件轮询功能。
1,是否有多vip地址,如果有的话,需要配置多个vrrp_instance实例,双机互备。
2,监控脚本,用于监控nginx,或haproxy代理服务器的存活状态,用于切换vip地址。
3,两种方式切换vip,一个是关闭代理服务,一个是关闭相关节点的keepalived服务器。