# 高可用-Haproxy+keepalived



```
yum install keepalived haproxy -y
```

### 两个 haproxy 配置

```bash
cat > /etc/haproxy/haproxy.cfg << EOF
global
  # 最大连接数
  maxconn  2000

  # 所属用户
  group haproxy

  # 所属组
  group haproxy

  # 在本机记录日志
  log  127.0.0.1 local0 info

  # 超时时间
  stats timeout 30s

  # 以后台守护进程运行
  daemon

  # 软件的工作目录
  chroot      /var/lib/haproxy

  # Pid 文件
  pidfile     /var/run/haproxy.pid


defaults
  # 默认的模式mode { tcp|http|health }，tcp是4层，http是7层，health只会返回OK
  mode  http

  # 采用全局定义的日志
  log global

  # 三次连接失败，则判断服务不可用
  retries 3

  # 如果后端有服务器宕机，强制切换到正常服务器
  option redispatch

  # 启用日志记录HTTP请求，默认haproxy日志记录是不记录HTTP请求日志
  option  httplog

  # 不记录健康检查的日志信息
  option  dontlognull 

  # 每次请求完毕后主动关闭http通道
  option http-server-close

  # 如果后端服务器需要获得客户端真实ip需要配置的参数，可以从Http Header中获得客户端ip
  option forwardfor       except 127.0.0.0/8 

  # 连接超时
  timeout connect 5000

  # 客户端连接超时
  timeout client  50000

  # 服务器连接超时
  timeout server  50000

  # http请求超时时间
  timeout http-request 15s

  # 设置http-keep-alive的超时时间
  timeout http-keep-alive 15s

  # 统计页面 URL 路径
  stats uri /haproxy
  
  # 统计页面自动刷新时间
  stats refresh 30s

  # 统计页面输入密码框提示信息
  stats realm haproxy-status

  # 统计页面用户名和密码
  stats auth admin:dxInCtFianKtL]36

  # 隐藏统计页面上 HAProxy 版本信息
  stats hide-version



frontend http-in
  # 监听的端口
  bind *:80

  # 运行模式 tcp、 http、 health
  mode http

  # 启用日志记录
  option httplog

  # 每次请求完毕后主动关闭 http 通道
  option httpclose

  #规则设置，-i 后面是要访问的域;如果多个域名，就写多个规则，一规则对应一个域名；即后面有多个域名，就写 is_c、 is-d….，这个名字可以随意起。但要与下面的use_backend 对应
  acl is_a hdr_beg(host) -i www.aaa.com
  acl is_b hdr_beg(host) -i www.bbb.com

  # 如果访问 is_a 设置的域名，就负载均衡到下面backend 设置的对应 web-server 上,web-server所负载的域名要都部署到下面的web01和web02上。如果是不同的域名部署到不同的机器上，就定义不同的web-server。
  use_backend web-server if is_a
  use_backend web-server if is_b
  

backend web-server
  mode http
  # 设置负载均衡模式，source 保存 session 值，roundrobin 轮询模式
  balance roundrobin                
  option httpclose
  option forwardfor

  # inter 2000 心跳检测时间；rise 2 三次连接成功，表示服务器正常；fall 3 三次连接失败，表示服务器异常； weight 1 权重设置
  server web01 IP:PORT weight 1 check inter 2000 rise 2 fall 3
  server web02 IP:PORT weight 1 check inter 2000 rise 2 fall 3


EOF
```

### 两个keepalived配置

master

```bash
! Configuration File for keepalived

global_defs {
    router_id nginx
}

vrrp_instance VI_1 {
    state MASTER
    virtual_router_id 100
    interface eth0
    priority 100
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1234
    }

virtual_ipaddress {
    192.168.10.101
    }
}
```

backup

```bash
! Configuration File for keepalived

global_defs {
    router_id nginx
}

vrrp_instance VI_1 {
    state BACKUP
    virtual_router_id 100
    interface eth0
    priority 99
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1234
    }

virtual_ipaddress {
    192.168.10.101
    }
}
```
