keepalived 多个应用_Keepalived与LVS部署多个服务

本文详细介绍了如何使用Keepalived和LVS在Linux环境中部署多个服务。主要内容包括安装ipvsadm和keepalived,配置Keepalived的vrrp_instance和virtual_server,以及后端服务器的VIP脚本配置。通过这种方式,可以实现高可用性和负载均衡,确保服务的稳定性和可靠性。
摘要由CSDN通过智能技术生成

Keepalived与LVS部署多个服务

陈信

20120718

说明:

主从机都需要安装ipvsadm和keepalived;

后端机器不用安装,只需要启动vip脚本;

yum -y install kernel-devel

yum -y update kernel

modprobe ip_vs #内核加载ip_vs模块

lsmod |grep ip_vs #查看是否加载成功。

cp /usr/src/kernels/2.6.18-274.el5(版本不同路径会不同)/include/net/ip_vs.h /usr/inclide/net/ #这个很重要,否则在安装ipvsadm的时候会提示缺少*.h文件

yum -y install openssl openssl-devel #安装keepalived需要

前期准备工作完成;

比如gcc gcc-c++(yum install gcc* -y)之类的;

现在准备下载ipvsadm和keepalived了

wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz

wget http://www.keepalived.org/software/keepalived-1.2.2.tar.gz

tar xzvf ipvsadm-1.24.tar.gz

cd ipvsadm-1.24

make && make install

安装完成,会多出以下文件。

/sbin/ipvsadm

/sbin/ipvsadm-save

/sbin/ipvsadm-restore

/usr/man/man8/ipvsadm.8

/usr/man/man8/ipvsadm-save.8

/usr/man/man8/ipvsadm-restore.8

/etc/rc.d/init.d/ipvsadm

tar xzvf keepalived-1.2.2.tar.gz

cd keepalived-1.2.2

./configure --prefix=/usr/local/keepalived

make && make install

正确完成安装会显示如下信息:

Keepalived configuration

Keepalived version : 1.2.2

Compiler : gcc

Compiler flags : -g -O2

Extra Lib : -lpopt -lssl -lcrypto

Use IPVS Framework : Yes

IPVS sync daemon support : Yes

IPVS use libnl : No

Use VRRP Framework : Yes

Use Debug flags : No

然后对keepalived做以下操作:

cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/

cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig

mkdir /etc/keepalived

cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

cp /usr/local/keepalived/sbin/keepalived /usr/sbin/

配置keepalived.conf

vi /etc/keepalived/keepalived.conf

主机192.168.40.18 备机192.168.40.4 后端192.168.40.5 192.168.40.6 VIP192.168.40.7

主机.18:

cat keepalived.conf

global_defs { #可以在global_defs下定义邮件通知功能

router_id LVS_login

}

vrrp_instance VI_1 {

state BACKUP

nopreempt #设置为不抢占;注意该参数只能在BACKUP的state上设置,且priority必须比另外一台高

interface eth0 #实例绑定的网卡

track_interface { #设置额外的监控,内部的任何一块网卡出现问题,都会进入FAULT状态.

eth0 #可以设多块网卡

}

virtual_router_id 56 # 保持主从服务器一致,VRID的标记(0..255)

priority 150 # 优先级 (主服务器较高,数值大的竞选为master)

advert_int 1 # 心跳广播间隔(秒)

authentication { # 认证

auth_type PASS # 支持PASS和AH

auth_pass css74..tfwwapmzi4r

}

virtual_ipaddress { #指定漂移IP地址,即VIP.传递给ip addr 命令.

192.168.40.7/32 dev eth0 scope global # 虚拟IP地址,可以多个,掩码位设置为32,独立IP地址.dev eth0为设备eth0上添加地址.scope global为全局范围,此处的配置都是符合linux的ip命令的格式的.

}

}

virtual_server 192.168.40.7 4399 {

delay_loop 6 #检测的间隔时间

lb_algo wrr #lvs调度算法

lb_kind DR #lvs方式(TUN DR NAT)三种

nat_mask 255.255.0.0

persistence_timeout 50 #持久连接超时时间

protocol TCP #通信协议

sorry_server 192.168.100.100 80 #当后端realserver都挂掉时使用的server

real_server 192.168.40.5 4399 {

weight 1

TCP_CHECK { #健康检查方式

connect_timeout 10 #连接超时时间

nb_get_retry 3 #尝试连接次数

delay_before_retry 3 #两次成功retry之间的时间

connect_port 4399

}

}

real_server 192.168.40.6 4399 {

weight 1

TCP_CHECK {

connect_timeout 10

nb_get_retry 3

delay_before_retry 3

connect_port 4399

}

}

}

之后仍可以定义多个virtual_server 192.168.40.7 port

配置文件到此结束

从机.4

cat keepalived.conf

global_defs { #可以在global_defs下定义邮件通知功能

router_id LVS_login

}

vrrp_instance VI_1 {

state BACKUP

nopreempt #设置为不抢占;注意该参数只能在BACKUP的state上设置,且priority必须比另外一台高

interface eth1 #实例绑定的网卡

track_interface { #设置额外的监控,内部的任何一块网卡出现问题,都会进入FAULT状态.

eth1

}

virtual_router_id 56 # 保持主从服务器一致,VRID的标记(0..255)

priority 100 # 优先级 (主服务器较高,数值大的竞选为master)

advert_int 1 # 心跳广播间隔(秒)

authentication { # 认证

auth_type PASS # 支持PASS和AH

auth_pass css74..tfwwapmzi4r

}

virtual_ipaddress { #指定漂移IP地址,即VIP.传递给ip addr 命令.

192.168.40.7/32 dev eth1 scope global # 虚拟IP地址,可以多个,掩码位设置为32,独立IP地址.dev eth1为设备eth1上添加地址.scope global为全局范围,此处的配置都是符合linux的ip命令的格式的.

}

}

virtual_server 192.168.40.7 4399 {

delay_loop 6

lb_algo wrr

lb_kind DR

nat_mask 255.255.0.0

persistence_timeout 50

protocol TCP

real_server 192.168.40.5 4399 {

weight 1

TCP_CHECK {

connect_timeout 10

nb_get_retry 3

delay_before_retry 3

connect_port 4399

}

}

real_server 192.168.40.6 4399 {

weight 1

TCP_CHECK {

connect_timeout 10

nb_get_retry 3

delay_before_retry 3

connect_port 4399

}

}

}

后端机器配置脚本:

cat VIP.sh

!/bin/bash

LVS houduan

Chenxin 20120718

VIP=192.168.40.7

. /etc/rc.d/init.d/functions

case "$1" in

start)

ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up

/sbin/route add -host $VIP dev lo:0

echo "1">/proc/sys/net/ipv4/conf/lo/arp_ignore

echo "2">/proc/sys/net/ipv4/conf/lo/arp_announce

echo "1">/proc/sys/net/ipv4/conf/all/arp_ignore

echo "2">/proc/sys/net/ipv4/conf/all/arp_announce

sysctl -p >/dev/null 2>&1

echo "realServer Start ok"

;;

stop)

ifconfig lo:0 down

route del $VIP >/dev/null 2>&1

echo "0">/proc/sys/net/ipv4/conf/lo/arp_ignore

echo "0">/proc/sys/net/ipv4/conf/lo/arp_announce

echo "0">/proc/sys/net/ipv4/conf/all/arp_ignore

echo "0">/proc/sys/net/ipv4/conf/all/arp_announce

echo "realServer Stoped"

;;

*)

echo "Usage:$0{start|stop}"

exit 1

esac

exit 0

检查:

ip addr

1: lo: mtu 16436 qdisc noqueue state UNKNOWN

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

inet 127.0.0.1/8 scope host lo

inet6 ::1/128 scope host

valid_lft forever preferred_lft forever

2: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000

link/ether 00:0c:29:66:76:59 brd ff:ff:ff:ff:ff:ff

inet 192.168.40.18/26 brd 192.168.40.63 scope global eth0

inet 192.168.40.7/32 scope global eth0

inet6 fe80::20c:29ff:fe66:7659/64 scope link

valid_lft forever preferred_lft forever

[root@Sz-test keepalived]# ipvsadm

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

TCP 192.168.40.7:4399 wrr persistent 50

-> 192.168.40.6:4399 Route 1 1 0

-> 192.168.40.5:4399 Route 1 0 0

可以尝试登录4399端口,并ifconfig看一下在哪台机器上;同一台机器会一直连同一个后端,换一台机器就连另一个后端了。

详解keepalived配置文件

Configuration File for keepalived

global_defs {

notification_email {

admin@domain.com #可以写多个,用于接收邮件

....

}

notification_email_from keepalived@domain.com #发送通知邮件的地址

smtp_server 192.168.200.20 #邮件服务器地址

smtp_connect_timeout 30 #连接邮件服务器超时的时间

lvs_id LVS_MAIN #主管lvs的名字

}

vrrp_instance VI_1 {

state MASTER #备份服务器上改成BACKUP

interface eth0 #VIP所在的网卡接口

virtual_router_id 51

priority 100 #备份服务器上将100改成99

advert_int 1

#nopreempt #master和slave不抢占

authentication { #身份认证

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

192.168.200.15

#如果有多个VIP继续换行写

}

}

virtual_server 192.168.200.15 80 { # VIP的ip和端口

delay_loop 3 #检测的间隔时间

lb_algo wrr #lvs调度算法

lb_kind NAT #lvs方式(TUN|DR|NAT)三种方式

presistence_timeout 50 #持久连接超时的时间

protocol TCP #使用的协议TCP/UDP

sorry_server 192.168.100.100 80 #当后端realserver都down掉时使用的server

real_server 192.168.100.2 80 { #后端的real_server

weight 2 #权重

HTTP_GET { #健康检测的方式 HTTP_CHECK |SSL_GET|HTTP_GET|

url {

path /testurl/test.php #get的文件名称

digest 640205b7b0fc66clea91c463fac6334c

}

connect_timeout 3 # 连接超时时间

nb_get_retry 3 #尝试连接的次数

delay_before_retry 2 #两次成功retry之间的时间

}

}

real_server 192.168.100.3 80 { #后端的real_server

weight 2 #权重

HTTP_GET { #健康检测的方式 TCP_CHECK |SSL_GET|HTTP_GET|

url {

path /testurl/test.php #get的文件名称

digest 640205b7b0fc66clea91c463fac6334c

}

connect_timeout 3 # 连接超时时间

nb_get_retry 3 #尝试连接的次数

delay_before_retry 2 #两次成功retry之间的时间

}

}

}

virtual_server 192.168.200.15 443 {

delay_loop 20

lb_algo rr

lb_kind NAT

persistence_timeout 360

protocol TCP

real_server 192.168.100.2 443 {

weight 1

TCP_CHECK {

connect_timeout 3

}

}

real_server 192.168.100.3 443 {

weight 1

TCP_CHECK {

connect_timeout 3

}

}

}

· 全局定义块

1、 email通知。作用:有故障,发邮件报警。这是可选项目,建议不用,用nagios全面监控代替之。

2、 Lvs负载均衡器标识(lvs_id)。在一个网络内,它应该是唯一的。

3、 花括号“{}”。用来分隔定义块,因此必须成对出现。如果写漏了,keepalived运行时,不会得到预期的结果。由于定义块内存在嵌套关系,因此很容易遗漏结尾处的花括号,这点要特别注意。

· VRRP定义块

1、 同步vrrp组vrrp_sync_group。作用:确定失败切换(FailOver)包含的路由实例个数。即在有2个负载均衡器的场景,一旦某个负载均衡器失效,需要自动切换到另外一个负载均衡器的实例是哪些?

2、 实例组group.至少包含一个vrrp实例。

3、 Vrrp实例vrrp_instance.实例名出自实例组group所包含的那些名字。

(1) 实例状态state.只有MASTER和BACKUP两种状态,并且需要大写这些单词。其中MASTER为工作状态,BACKUP为备用状态。当MASTER所在的服务器失效时,BACKUP所在的系统会自动把它的状态有BACKUP变换成MASTER;当失效的MASTER所在的系统恢复时,BACKUP从MASTER恢复到BACKUP状态。

(2) 通信接口interface。对外提供服务的网络接口,如eth0,eth1.当前主流的服务器都有2个或2个以上的接口,在选择服务接口时,一定要核实清楚。

(3) lvs_sync_daemon_inteface。负载均衡器之间的监控接口,类似于HA HeartBeat的心跳线。但它的机制优于Heartbeat,因为它没有“裂脑”这个问题,它是以优先级这个机制来规避这个麻烦的。在DR模式中,lvs_sync_daemon_inteface 与服务接口interface 使用同一个网络接口。

(4) 虚拟路由标识virtual_router_id.这个标识是一个数字,并且同一个vrrp实例使用唯一的标识。即同一个vrrp_stance,MASTER和BACKUP的virtual_router_id是一致的,同时在整个vrrp内是唯一的。

(5) 优先级priority.这是一个数字,数值愈大,优先级越高。在同一个vrrp_instance里,MASTER 的优先级高于BACKUP。若MASTER的priority值为150,那么BACKUP的priority只能是140或更小的数值。

(6) 同步通知间隔 advert_int .MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位为秒。

(7) 验证authentication。包含验证类型和验证密码。类型主要有PASS、AH两种,通常使用的类型为PASS,据说AH使用时有问题。验证密码为明文,同一vrrp实例MASTER与BACKUP 使用相同的密码才能正常通信。

4、 虚拟ip地址virtual_ipaddress . 可以有多个地址,每个地址占一行,不需要指定子网掩码。注意:这个ip必须与我们在lvs客户端设定的vip相一致!

· 虚拟服务器virtual_server定义块

虚拟服务器定义是keepalived框架最重要的项目了,是keepalived.conf必不可少的部分。

1、 虚拟服务器virtual_server. 这个ip来自于vrrp定义块的第“4”步,后面一个空格,然后加上端口号。定义一个vip,可以实现多个tcp端口的负载均衡功能。

(1) delay_loop。健康检查时间间隔,单位是秒。

(2) lb_algo. 负载均衡调度算法,互联网应用常使用wlc或rr。

(3) lb_kind. 负载均衡转发规则。一般包括DR,NAT,TUN3种,在我的方案中,都使用DR的方式。

(4) persistence_timeout.会话保持时间,单位是秒。这个选项对动态网站很有用处:当用户从远程用帐号进行登陆网站时,有了这个会话保持功能,就能把用户的请求转发给同一个应用服务器。在这里,我们来做一个假设,假定现在有一个lvs 环境,使用DR转发模式,真实服务器有3个,负载均衡器不启用会话保持功能。当用户第一次访问的时候,他的访问请求被负载均衡器转给某个真实服务器,这样他看到一个登陆页面,第一次访问完毕;接着他在登陆框填写用户名和密码,然后提交;这时候,问题就可能出现了—登陆不能成功。因为没有会话保持,负载均衡器可能会把第2次的请求转发到其他的服务器。

(5) 转发协议protocol.一般有tcp和udp两种。实话说,我还没尝试过udp协议类的转发。

2、 真实服务器real_server.也即服务器池。Real_server的值包括ip地址和端口号。多个连续的真实ip,转发的端口相同,是不是可以以范围表示?需要进一步实验。如写成real_server 61.135.20.1-10 80 .

(1) 权重weight.权重值是一个数字,数值越大,权重越高。使用不同的权重值的目的在于为不同性能的机器分配不同的负载,性能较好的机器,负载分担大些;反之,性能差的机器,则分担较少的负载,这样就可以合理的利用不同性能的机器资源。

(2) Tcp检查 tcp_check.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值