keepalived+haproxy配置

写在前面:

    很早之前就知道用keepalived和haproxy可以实现负载和高可用性,一直都没有亲手实践。最近闲来没事,自己就按照网上的教程配置了一下,加深了对于keepalived和haproxy的理解。


    本人所有的环境都是基于linux虚拟机的,1台linux安装了Apache+mysql+php,1台安装了Nginx+mysql+php,环境如下:

Apache:192.168.150.131   8080

Nginx:192.168.150.130    80


这里因为之前的一些历史问题,两台web服务器绑定的端口并不一致,其实更好的做法是把Nginx绑定的80端口释放出来,留作haproxy使用。为什么要释放80呢?因为为了方便,我们让用户使用默认的80端口来访问haproxy所做的代理服务,所以要把80留给haproxy使用。不过我这里懒得改了,反正大家自己是新处理的web服务器,建议改成非80的端口,反正也是对用户可见的。


两台服务器的VIP都是192.168.150.140


第一步:130和131都安装haproxy

# cd /usr/local/src
# wget  http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.24.tar.gz
# tar zxvf  haproxy-1.4.24.tar.gz
# cd haproxy-1.4.24
# make TARGET=linux26 ARCH=x86_64 PREFIX=/usr/local/haproxy
#编译参数参考README,其中TARGET是指定内核版本,ARCH指定CPU架构, PREFIX 安装之后所在的目录
# make  install PREFIX=/usr/local/haproxy


第二步:创建启动文件

# useradd -s /sbin/nologin haproxy
# passwd haproxy
# chown -R haproxy.haproxy /usr/local/haproxy
# cd /usr/local/haproxy
# mkdir /etc/haproxy
# cp examples/haproxy.cfg  /etc/haproxy
# cp examples/haproxy.init  /etc/init.d/haproxy
# chmod +x /etc/init.d/haproxy
# ln -s /usr/local/sbin/haproxy /usr/sbin/


第三步:编辑配置文件

# vim /etc/haproxy/haproxy.cfg

# this config needs haproxy-1.1.28 or haproxy-1.2.1

global
        log 127.0.0.1   local0
        log 127.0.0.1   local1 notice
        #log loghost    local0 info
        maxconn 4096
        chroot /usr/local/haproxy
        user haproxy
        group haproxy
        daemon
        #debug
        #quiet

defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        option abortonclose             #当服务器负载很高的时候,自动结束掉当前队列处理比较久的连接
        retries 3
        option redispatch
        maxconn 2000
        contimeout      5000
        clitimeout      50000
        srvtimeout      50000
        timeout check 2000              #心跳检测超时

frontend www
        bind *:8000                    #我这里的haproxy使用8000代理服务器,更好的是用80
        default_backend server_pool

backend server_pool
        mode    http
        balance roundrobin
        option  forwardfor
        option  httpclose
        option  httpchk GET /haproxy.html   #这个文件必须存在在两台web服务器,用来检测服务器的状态的,如果不存在,会被认为相应的服务器不可用
        server  s1      192.168.150.130:8080 cookie app1inst1 check inter 2000 rise 2 fall 5        #一台真实的服务器指向130
        server  s2      192.168.150.131:80 cookie app1inst3 check inter 2000 rise 2 fall 5 #另一台真实的服务器指向131


第四步:启动服务

# service haproxy start

# 查看服务是否起来

# ps aux| grep haproxy



第五步:130和131都安装keepalived

# wget http://www.keepalived.org/software/keepalived-1.2.7.tar.gz
# tar zxvf  keepalived-1.2.7.tar.gz
# cd keepalived-1.2.7
# ./configure --prefix=/usr/local/keepalived
# make
# make install
# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
# mkdir /etc/keepalived
# cp /usr/local/keepalived/etc/keepalived/keepalived.conf  /etc/keepalived/


第六步:130配置keepalived.conf

# vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
#   notification_email {
#     [email protected]
#     [email protected]
#     [email protected]
#   }
#   notification_email_from [email protected]
#   smtp_server 192.168.200.1
#   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state MASTER            #此处表明此机器具有优先获取vip请求的能力
    interface eth0
    virtual_router_id 51
    priority 100            #此优先级必须比131中的要高,要不然131会有优先获取vip请求的能力
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.150.140
        #192.168.200.17
        #192.168.200.18
        # 可以绑定多个IP
    }
}

#当系统中安装了haproxy,virtual_server不是必须的,因为keepalived的主要目的是虚拟出一个相同的ip给到不同的机器,用户通过虚拟IP,keepalived通过竞争使其中一台真实的服务器响应用户的请求,此请求通过端口被haproxy监听,提供服务,而且我个人在未使用haproxy的情况下试验virtual_server中的real_server提供的服务器,发现一直没有成功,通过查看发现8888端口并没有被任何程序绑定,不知为何。望知情的小伙伴不吝指教。


#所以此处就权当写着玩吧
virtual_server 192.168.150.140 8888 {
    delay_loop 6
    lb_algo rr
    protocol TCP

    real_server 192.168.150.130 80 {
        weight 1
        TCP_CHECK {
                connect_timeout 5
                connect_port 8000
        }
    }
}


第七步:131配置keepalived

# vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
#   notification_email {
#     [email protected]
#     [email protected]
#     [email protected]
#   }
#   notification_email_from [email protected]
#   smtp_server 192.168.200.1
#   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state BACKUP            #此处表明此机器是个备份机器,当MASTER不可用的时候才出手
    interface eth0
    virtual_router_id 51
    priority 99            #此优先级必须比130中的要低,要不然就反客为主了
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.150.140
        #192.168.200.17
        #192.168.200.18
        # 可以绑定多个IP
    }
}

# 当系统中安装了haproxy,virtual_server不是必须的,因为keepalived的主要目的是虚拟出一个相同的ip给到不同的机器,用 户通过虚拟IP,keepalived通过竞争使其中一台真实的服务器响应用户的请求,此请求通过端口被haproxy监听,提供服务,而且我个人在未使 用haproxy的情况下试验virtual_server中的real_server提供的服务器,发现一直没有成功,通过查看发现8888端口并没有 被任何程序绑定,不知为何。望知情的小伙伴不吝指教。


#所以此处就权当写着玩吧
virtual_server 192.168.150.140 8888 {
    delay_loop 6
    lb_algo rr
    protocol TCP

    real_server 192.168.150.130 80 {
        weight 1
        TCP_CHECK {
                connect_timeout 5
                connect_port 8000
        }
    }
}


第八步:130和131上启动keepalived

# service keepalived start

# 查看网卡是否绑定了vip

# ip addr

这里可能要等个一两秒钟,之前我太心急发现没有绑定,又去折腾配置文件,发现白搭,老老实实的等绑定成功吧,如果成功应该能看到类似以下的信息:

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:ad:a4:8a brd ff:ff:ff:ff:ff:ff
    inet 192.168.150.131/24 brd 192.168.150.255 scope global eth0
    inet 192.168.150.140/32 scope global eth0
    inet6 fe80::20c:29ff:fead:a48a/64 scope link
       valid_lft forever preferred_lft forever


表明140已经成功绑定到网卡eth0上了,130也是一样的。


第九步:测试

通过浏览器访问 http://192.168.150.140:8000,  不停的狂刷新,你会发现页面的内容时而改变,说明haproxy根据负载的情况选择了不同的web服务器来相应用户的请求。


停掉130上的keepalived服务器

# service keepalived stop


再次访问,发现访问的服务器只是131上的

同理,停掉131的keepalived,只能访问130的服务。


想要测试haproxy是否工作了,将某一台服务器上的web服务器停掉即可。



总结:

通过keepalived和haproxy可以增加程序的健壮性,扩展起来也不复杂,所以对于一般的用户来讲,实在是出门旅行,强身健体的不二之选。


整个请求的流程大致如下:

1:用户打电话到XXX酒店说要定一个满汉全席(XXX酒店是个连锁酒店,旗下有上百间店面)

2:XXX酒店一看有活干了,挺高兴的,但是作为老大(开了上百间大酒店),不能自己亲自干活啊,所以大手一挥,随便(通过一定的机制)叫了个小弟(某一个酒店)接手了

3:小弟一看用户要的是满汉全席,好办,通知大厨(haproxy)准备开工

4:大厨作为一个大厨,手上业务也很多,除了会做满汉全席(apache,ngxin),还会做法国大餐(mysql)等。大厨作为一个有经验的大厨,发现满汉全席很火爆,一个人搞不定,于是雇佣了一帮小弟,大厨拿到业务之后,就看看其中的某个小弟是否可以做(是否空闲),如果是的话,就把订单丢个小弟了,小弟一想闲着也是闲着,就做了。



你可能感兴趣的:(haproxy,keepalived)