LVS负载均衡DR模式+keepalived

实验拓扑:

实验准备:

CentOS6.5-x86-64


node1 10.0.0.11    软件:ipvsadm+keepalived    角色:Director1

node2 10.0.0.12    软件:ipvsadm+keepalived    角色:Director2

node3 10.0.0.13    软件:nginx    角色:Realerver1

node4 10.0.0.14    软件:nginx    角色:Realerver2

一、在两台Director上安装配置ipvsadm和keepalived

1、安装ipvsadm

# yum install ipvsadm -y
# ipvsadm -v
ipvsadm v1.26 2008/5/15 (compiled with popt and IPVS v1.2.1)

2、安装keepalived

# sh hm-keepalived-install.sh  (keepalived安装脚本)
#!/bin/bash
kernel=/usr/src/kernels/$(uname -r)

yum install gcc gcc-c++ pcre-devel openssl-devel popt-devel libnl-devel libnfnetlink libnfnetlink-devel -y

[ -e keepalived-1.2.23.tar.gz ] || wget http://www.keepalived.org/software/keepalived-1.2.23.tar.gz
tar -zxf keepalived-1.2.23.tar.gz && cd keepalived-1.2.23 &&
./configure --prefix=/usr/local/keepalived --sysconf=/etc --with-kernel-dir=${kernel}
make && make install
chkconfig --add keepalived && chkconfig keepalived on
ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/

三、在两台Realserver上安装配置nginx

# sh hm-nginx-install.sh(nginx安装脚本,只需将nginx源码包放到/usr/local/src目录下,执行即可)
#!/bin/bash
nginx_s=/usr/local/src/nginx-1.8.1.tar.gz
nginx_v=nginx-1.8.1

for p in gcc gcc-c++ zlib pcre pcre-devel openssl openssl-devel
do
    if ! rpm -qa | grep -q "^$p";then
        yum install -y $p
    fi
done

if [ ! -d /etc/nginx -o ! -e /usr/sbin/nginx ];then
useradd -s /sbin/nologin nginx -M
cd /usr/local/src && tar -zxf ${nginx_s} -C . && cd $nginx_v &&
./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --pid-path=/var/run/nginx.pid --lock-path=/var/lock/subsys/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --http-client-body-temp-path=/tmp/nginx/client_body --http-proxy-temp-path=/tmp/nginx/proxy --http-fastcgi-temp-path=/tmp/nginx/fastcgi --with-http_degradation_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-pcre
make && make install
chown -R nginx:nginx /usr/local/nginx && mkdir /tmp/nginx/client_body -p && mkdir /etc/nginx/vhosts

# nginx.conf
cat > /etc/nginx/nginx.conf << EOF
user nginx nginx;
worker_processes $(cat /proc/cpuinfo | grep ‘processor‘ | wc -l);
error_log /var/log/nginx/error.log notice;
pid       /var/run/nginx.pid;
worker_rlimit_nofile 65535;
 
events
{   
    use epoll;
    worker_connections 65535;
}

http
{
    include mime.types;
    default_type application/octet-stream;
    server_names_hash_bucket_size 2048;
    server_names_hash_max_size 2048;
 
    log_format  main  ‘\$HTTP_X_REAL_IP - \$remote_user [\$time_local] "\$request" ‘
                      ‘\$status \$body_bytes_sent "\$http_referer" "\$request_time"‘
                      ‘"\$http_user_agent" \$HTTP_X_Forwarded_For‘;
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 60;

    client_header_timeout 3m;
    client_body_timeout 3m;
    client_max_body_size 10m;
    client_body_buffer_size 256k;
 
    send_timeout 3m;
    connection_pool_size 256;
    client_header_buffer_size 32k;
    large_client_header_buffers 4 64k;
    request_pool_size 4k;
    output_buffers 4 32k;
    postpone_output 1460;
     
    client_body_temp_path /tmp/nginx/client_body;
    proxy_temp_path /tmp/nginx/proxy;
    fastcgi_temp_path /tmp/nginx/fastcgi;
 
    gzip on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_comp_level 3;
    gzip_http_version 1.1;
    gzip_types text/plain application/x-javascript text/css text/htm application/xml;
    gzip_vary on;

    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;
    fastcgi_intercept_errors on;

    include vhosts/*.conf;
}
EOF

# nginx_vhosts.conf
cat > /etc/nginx/vhosts/www.conf << EOF
server {
    listen      80;
    server_name $(ifconfig eth0 | awk -F"[ :]+" ‘/inet addr/{print $4}‘);
    index index.html index.htm index.php index.jsp;
    charset UTF8;
    root        /data/www/html;
    access_log  /var/log/nginx/access.log main;

}
EOF
mkdir /data/www/html -p && echo $(ifconfig eth0 | awk -F"[ :]+" ‘/inet addr/{print $4}‘) > /data/www/html/index.html
/usr/sbin/nginx -t && /usr/sbin/nginx
echo
echo "--------------------------------"
echo "Install ${nginx_v} success"
echo "Test http://$(ifconfig eth0 | awk -F"[ :]+" ‘/inet addr/{print $4}‘)"
else
echo "Already installed ${nginx_v}"
fi

四、在两台Director上配置keepalived

1、配置keepalived

# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
    notification_email {
        [email protected]
        [email protected]
    }
    notification_email_from [email protected]
    smtp_server 127.0.0.1
    smtp_connect_timeout 30
    router_id LVS_HA
}

vrrp_instance LVS_HA {

    state BACKUP            # 主备服务器均为BACKUP
    interface eth0          # 指定keepalived监听网络的接口
    virtual_router_id 81    # ID标识,master和backup保持一致
    priority 100            # backup为90
    advert_int 2            # master和backup之间检查同步的时间间隔
    nopreempt               # 不抢占模式,仅在master上设置

    authentication {
        auth_type PASS
        auth_pass 1111
    }

    virtual_ipaddress {
        10.0.0.20/24 dev eth0   # VIP,可以设置多个,每行一个
    }
}

virtual_server 10.0.0.20 80 {      # (LVS配置)
    delay_loop 5                   # (每隔5秒查询realserver状态)
    lb_algo wlc                    # (lvs算法)
    lb_kind DR                     # (lvs负载均衡模式)
    persistence_timeout 0          # (保持会话时间,0表示永久保持)
    persistence_granularity 255.255.255.255  # (持久连接的粒度,默认为4个255,即一个单独的客户端IP分配到一个Realserver上)
    protocol TCP                   # (转发的协议类型,TCP或UDP)
    sorry_server 10.0.0.11 8080    # (备用Realserver节点,当所有的realserver节点失效后,将启用这个节点)

    real_server 10.0.0.13 80 {   # Realserver
        weight 2                 # (调度权重)
        HTTP_GET {               # (健康检测方式)
            url {                # (指定检测的url,可以指定多个)
            path /index.html     # (url详细路径)
            status_code 200
            }
        connect_port 80          # (检查的端口)
        #bindto 10.0.0.20         # (表示通过此地址来发送请求对服务器进行健康检查)
        connect_timeout 3        # (无响应超时时间)
        nb_get_retry 3           # (失败重试次数)
        delay_before_retry 1     # (重试时间间隔)
        }
    }
    real_server 10.0.0.14 80 {
        weight 2                 # (调度权重)
        HTTP_GET {               # (健康检测方式)
            url {                # (指定检测的url,可以指定多个)
            path /index.html     # (url详细路径)
            status_code 200
            }
        connect_port 80          # (检查的端口)
        #bindto 10.0.0.20         # (表示通过此地址来发送请求对服务器进行健康检查)
        connect_timeout 3        # (无响应超时时间)
        nb_get_retry 3           # (失败重试次数)
        delay_before_retry 1     # (重试时间间隔)
        }
}

2、分别启动keepalived服务

[[email protected] ~]# service keepalived start
[[email protected] ~]# service keepalived start
[[email protected] ~]# ps aux | grep keepalived
root       4008  0.0  0.1  44928  1080 ?        Ss   19:01   0:00 keepalived -D
root       4009  0.1  0.2  47152  2332 ?        S    19:01   0:00 keepalived -D
root       4010  0.1  0.1  47032  1608 ?        S    19:01   0:00 keepalived -D
root       4018  0.0  0.0 103256   864 pts/0    S+   19:03   0:00 grep keepalived

3、查看LVS状态

# master上
[[email protected] ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.0.20:80 wlc persistent 0
  -> 10.0.0.13:80                 Route   2      0          0         
  -> 10.0.0.14:80                 Route   2      0          0 

# backup上
[[email protected] ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.0.20:80 wlc persistent 0
  -> 10.0.0.13:80                 Route   2      0          0         
  -> 10.0.0.14:80                 Route   2      0          0

4、查看VIP(VIP默认分配在priority权值高的Director上)

[[email protected] ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 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: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:5a:9d:e0 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.11/24 brd 10.0.0.255 scope global eth0
    inet 10.0.0.20/24 scope global secondary eth0
    inet6 fe80::20c:29ff:fe5a:9de0/64 scope link 
       valid_lft forever preferred_lft forever

五、在两台Realserver上分别在回环接口上配置vip和关闭arp转发

# 查看系统默认arp规则
[[email protected] ~]# cat /proc/sys/net/ipv4/conf/lo/arp_ignore
0
[[email protected] ~]# cat /proc/sys/net/ipv4/conf/lo/arp_announce 
0
[[email protected] ~]# cat /proc/sys/net/ipv4/conf/all/arp_ignore 
0
[[email protected] ~]# cat /proc/sys/net/ipv4/conf/all/arp_announce 
0

在两台Realserver上执行以下脚本
# lvs_dr_rs.sh
#!/bin/bash
vip=10.0.0.20
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip 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

[[email protected] ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> 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
    inet 10.0.0.20/32 brd 10.0.0.20 scope global lo:0
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:c5:b4:19 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.13/24 brd 10.0.0.255 scope global eth0
    inet6 fe80::20c:29ff:fec5:b419/64 scope link 
       valid_lft forever preferred_lft forever

[[email protected] ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> 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
    inet 10.0.0.20/32 brd 10.0.0.20 scope global lo:0
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:42:34:4f brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.14/24 brd 10.0.0.255 scope global eth0
    inet6 fe80::20c:29ff:fe42:344f/64 scope link 
       valid_lft forever preferred_lft forever

六、测试LVS负载功能

# 这里分别在node3和node4上访问VIP,在我的keepalived配置里我配置了wlc最小连接调度算法,
  和权值为2,所以访问的效果如下
[[email protected] ~]# curl http://10.0.0.20
10.0.0.13
[[email protected] ~]# curl http://10.0.0.20
10.0.0.13

[[email protected] ~]# curl http://10.0.0.20
10.0.0.14
[[email protected] ~]# curl http://10.0.0.20
10.0.0.14

七、测试主Director故障,看是否实现故障转移(vip转至backup上)

# 关闭主Director的keepalived服务
[[email protected] ~]# service keepalived stop
Stopping keepalived:                                       [  OK  ]

# 查看BACKUP的ip
[[email protected] ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 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: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:42:43:20 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.12/24 brd 10.0.0.255 scope global eth0
    inet 10.0.0.20/24 scope global secondary eth0
    inet6 fe80::20c:29ff:fe42:4320/64 scope link 
       valid_lft forever preferred_lft forever

       
# 测试是否还能正常通过vip访问web服务
[[email protected] ~]# curl http://10.0.0.20
10.0.0.13
[[email protected] ~]# curl http://10.0.0.20
10.0.0.13

[[email protected] ~]# curl http://10.0.0.20
10.0.0.14
[[email protected] ~]# curl http://10.0.0.20
10.0.0.14

八、在Realserver配置DR模式启动服务脚本

# cat lvs-dr-rs.service
#!/bin/bash
. /etc/rc.d/init.d/functions
vip=10.0.0.20
RETVAL=$?
case "$1" in
    start)
        echo "Start realserver"
        ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
        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
    ;;
    stop)
        echo "Stop realserver"
        ifconfig lo:0 down
        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 Usage: $0 {start|stop}
        exit 1
esac
exit $RETVAL
时间: 2024-10-20 11:41:58

LVS负载均衡DR模式+keepalived的相关文章

LVS负载均衡-DR模式

环境: DIR:172.16.115.100.172.16.115.200(虚拟IP,用于转发) RS1:172.16.115.157 RS2:172.16.115.202 cilent:172.16.115.* DIR主机 1. 安装lvs软件包ipvsadm和nginx,编辑hosts文件/etc/hosts,修改hostname为dr 阿里云扩展源wget http://mirrors.aliyun.com/repo/epel-6.repo  -P /etc/yum.repos.d/ 命令

LVS负载均衡DR模式理论讲解

部署LVS_DR群集LVS_DR数据包流向分析为了方便进行原理分析,将Client0与群集机器放在同一网络中,数据包流经路线为1-2-3-41.Client向目标VIP发出请求,Director(负载均衡器)接收.此时IP包头及数据帧信息为:2.Director根据负载均衡算法选择RealServer_1,不修改也不封装IP报文,而是将数据帧的MAC地址改为RealServer_1的MAC地址,然后在局域网上发送.IP包头及数据帧头信息如下:3.RealServer_1收到这个帧,解封装后发现目

LVS负载均衡DR模式部署

目录: 1. 拓扑图 2. 搭建环境 3. LVS服务器部署 4. 测试 1. 拓扑图 LVS-DR模式采的IP地址全部为外网IP. 本例中IP的设置全部采用临时设置IP的方式,重启后会失效. 用户请求VIP,会由LVS服务器响应,分配至Real-Server服务器,真实服务器处理完后直接返回给用户,不再通过LVS服务器. 2. 搭建环境 (系统为 Centon 6.4 ) (1).LVS-server  IP:192.168.36.101 (2).Real-Server1 IP: 192.16

LVS负载均衡—NAT模式

LVS负载均衡-NAT模式 如下图所示,NAT模式中的一大缺点就是无论是请求的数据包,还是返回的数据包,都必须要经过负载的这个点,请求的数据包一般内容较少,问题不是很大,而返回的数据包,一般都是图片,视频等等,这会给中间的调度器带来巨大的负担 一.环境准备准备三台虚拟机LVS主机有两块网卡:VIP=192.168.1.2 (一般为公网IP)DIP=10.168.1.1RIP1=10.168.1.100RIP2=10.168.1.200二.LVS主机准备工作首先安装ipvsadm[root@loc

搭建LVS负载均衡环境(keepalived+lvs+nginx)

LVS简介: LVS集群有DR.TUN.NAT三种配置模式,可以对www服务.FTP服务.MAIL服务等做负载均衡,下面通过搭建www服务的负载均衡实例,讲述基于DR模式的LVS集群配置 Director-Server: LVS的核心服务器,作用类似于一个路由器,含有为LVS功能完成的路由表,通过路由表把用户的请求分发给服务器组层的应用服务器(Real_Server),同时监控Real-servers ,在Real-Server不可用时,将其从LVS路由表中剔除,再恢复时,重新加入. Real-

LVS负载均衡DR工作流程

LVS负载均衡DR工作流程 (a) 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链. 此时报文的源IP为CIP,目标IP为VIP (b) PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链 (c) IPVS比对数据包请求的服务是否为集群服务,若是,将请求报文中的源MAC地址修改为DIP的MAC地址,将目标MAC地址修改RIP的MAC地址,然后将数据包发至POSTROUTING链. 此时的源IP和目的IP均未修改,仅

linux lvs负载均衡nat模式

linux的lvs负载均衡主要用于提高服务器的处理能力,提高服务器的相应能力,提高并发处理能力,以及合理的资源分配. 地址转换:简称NAT模式,类似于防火墙的私有网络结构,负载调度器作为所有服务器节点的网关,即作为客户机的访问入口,也是各节点回应客户机的访问出口.服务器节点使用私有IP地址.与负载调度器位于同一个物理网络,安全性要优于其他两种方式,但是因为调度器既要提供入口又要提供出口所以性能方面不是很好. LVS现在已成为LINUX内核的一部分,默认编译为ip_vs模块,手动加载ip_vs模块

Centos7下lvs负载均衡lvs-tun模式配置

一.架构 director:172.28.18.69 vip:172.28.18.70 real server1:172.28.18.71 real server2:172.28.18.78 二.两台real server上安装nginx 配置nginx yum源 [[email protected] ~]# vim /etc/yum.repos.d/nginx.repo [nginx] name=nginx repo baseurl=http://nginx.org/packages/cent

LVS负载均衡-NAT模式

环境: DIR:192.168.11.190(网卡1:内网).192.168.21.190(网卡2:外网) RS1:192.168.11.160 RS2:192.168.11.20 cilent:192.168.21.180 DIR主机 1. 安装lvs软件包ipvsadm,编辑hosts文件/etc/hosts,修改hostname为dr 命令 yum install -y ipvsadm 2. 编写脚本文件/usr/local/sbin/lvs_nat.sh 内容:  #! /bin/bas