細細.魚 发表于 2018-12-29 10:13:00

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
# wgethttp://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.24.tar.gz
# tar zxvfhaproxy-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 安装之后所在的目录
# makeinstall 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
      optionhttplog
      optiondontlognull
      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
      optionforwardfor
      optionhttpclose
      optionhttpchk GET /haproxy.html   #这个文件必须存在在两台web服务器,用来检测服务器的状态的,如果不存在,会被认为相应的服务器不可用
      servers1      192.168.150.130:8080 cookie app1inst1 check inter 2000 rise 2 fall 5      #一台真实的服务器指向130
      servers2      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 zxvfkeepalived-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 {
#   acassen@firewall.loc
#   failover@firewall.loc
#   sysadmin@firewall.loc
#   }
#   notification_email_from Alexandre.Cassen@firewall.loc
#   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 {
#   acassen@firewall.loc
#   failover@firewall.loc
#   sysadmin@firewall.loc
#   }
#   notification_email_from Alexandre.Cassen@firewall.loc
#   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: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)等。大厨作为一个有经验的大厨,发现满汉全席很火爆,一个人搞不定,于是雇佣了一帮小弟,大厨拿到业务之后,就看看其中的某个小弟是否可以做(是否空闲),如果是的话,就把订单丢个小弟了,小弟一想闲着也是闲着,就做了。
  

  




页: [1]
查看完整版本: keepalived+haproxy配置