haproxy 负载均衡

haproxy概述

ha-proxy是一款高性能的负载均衡软件。因为其专注于负载均衡这一件事情,因此与nginx比起来在负载均衡这件事情上做更好,更专业。

软件:haproxy—主要是做负载均衡的7层,也可以做4层负载均衡

haproxy的特点

ha-proxy 作为目前流行的负载均衡软件,必须有其出色的一面

支持tcp / http 两种协议层的负载均衡,使得其负载均衡功能非常丰富。
支持8种左右的负载均衡算法,尤其是在http模式时,有许多非常实在的负载均衡算法,适用各种需求。
性能非常优秀,基于单进程处理模式(和Nginx类似)让其性能卓越。
拥有一个功能出色的监控页面,实时了解系统的当前状况。
功能强大的ACL支持,给用户极大的方便。

优点:支持session会话保持一致,四层和七层都支持;支持通过URL来检测后端服务器的状态。支持负载节点开/关
缺点:在七层转发支持上,不如nginx强大。

haproxy 使用

haproxy 安装

# 关闭SElinux 和 firewalld防火墙
setenforce 0
systemctl disable firewalld
# yum 安装
yum -y install haproxy

haproxy配置

  • haproxy 配置文件
    vim /etc/haproxy/ha
  • 配置文件说明
global							#全局配置
	log 127.0.0.1 local3 info	#日志配置
	maxconn 4096				#最大连接限制(优先级低)
    user nobody
    group nobody
	daemon						#守护进程运行
	nbproc 1					#haproxy进程数
defaults						# 针对(listen和backend块进行设置没如果块中没设置,则使用默认设置)默认配置
	log		   global			# 日志使用全局配置
	mode	   http				# 模式7层LB
	maxconn    2048				# 最大连接数(优先级中)
	retries    3				# 健康检查。3次连接失败就认为服务不可用
	option     redispatch		# 服务不可用后的操作,重定向到其他健康服务器
	stats uri /haproxy			# web页面状态模块功能开启
	stats auth admin:admin		# 状态模块认证(用户名admin:admin)
	contimeout 5000				# 定义haproxy将客户端请求转发至后端服务器,所等待的超时时长
    clitimeout 50000			# haproxy作为客户,和后端服务器之间空闲连接的超时时间,到时候发送fin指令
	srvtimeout 50000			# haproxy作为服务端,和用户之间空闲连接的超时时间,到时候发送fin指令断开tcp

frontend web-frontend 			# 前端配置块。面对用户侧 名称为main
	bind 0.0.0.0:880				# 监听地址和端口
	mode http					# http模式的LB
	stats uri /haproxy?status	# 状态页面
	log global					# 日志使用全局配置
    option httplog				# 默认日志格式非常简陋,仅包括源地址、目标地址和实例名称,而“option httplog参数将会使得日志格式变得丰富许多,其通常包括但不限于HTTP请求、连接计时器、会话状态、连接数、捕获的首部及cookie、“frontend”、“backend”及服务器名称,当然也包括源地址和端口号等。
    option httpclose			# 每次请求完毕后,关闭http通道
    default_backend web-backend	#默认的后端服务器是 html-server
 
backend web-backend				# 后端服务器名称为  web-backend
	mode http					# 模式为7层代理
	balance roundrobin			# 负载规则 轮循(rr)
	option httpchk GET /index.html # 允许用http协议检查server 的健康
	cookie SERVERID insert indirect nocache  # 轮询的同时,根据插入的cookie SERVERID  的值来做会话保持,将相同的用户请求,转发给相同的真实服务器。
	server web-A 127.0.0.1:80 weight 1 cookie 3 check inter 2000 rise 2 fall 5
	server web-B 127.0.0.2:81 weight 1 cookie 4 check inter 2000 rise 2 fall 5
								# 添加后端服务器 weight 权重 cookie 3 服务器ID,避免rr算法将客户机请求转发给其他服务器 ,对后端服务器的健康状况检查间隔为2000毫秒,连续2次健康检查成功,则认为是有效的,连续5次健康检查失败,则认为服务器宕机

访问haproxy 管理页面

127.0.0.1:880/haproxy?status

peeklink 负载均衡 负载均衡 haproxy_后端服务

lvs

安装

# 安装lvs
apt install ipvsadm

配置

# 创建一个负载均衡  端口 777  调度算法 轮询
ipvsadm -A -t 0.0.0.0:777 -s rr
## 添加后端
ipvsadm -a -t 127.0.0.1:777 -r 127.0.0.1:8889
ipvsadm -a -t 127.0.0.1:777 -r 127.0.0.1:9091

## 查看 策略
ipvsadm -ln


## 删除后端
ipvsadm -d -t 0.0.0.0:777 -r 127.0.0.1:8889

## 删除lvs
ipvsadm -D -t 0.0.0.0:777

## 保存 ipvsadm 策略
ipvsadm save

keepalived

keepalived说明

keepalived的主要由vrrp stack、checkers、ipvs wrapper以及控制组件配置文件分析器,IO复用器,内存管理这些组件组成,其中vrrp stack 是用来实现vip的高可用;checkers用于基于不同协议对后端服务做检测,它两都是基>于系统调用和SMTP协议来完成对vip的转移,以及故障转移后的邮件通知,以及vip和后端服务的检测;ipvs wrapper主要用于生成ipvs规则;而对于keepalved的核心组件vrrp stack 和checkers是由watchdog进程一直监控着,一旦vrrp stack 或者checkers宕掉,watchdog会立即启动一个新的vrrp stack或checkers,从而保证了keepalived自身的组件的高可用;

安装

# 环境说明
#- 两台linux 主机
#- 两台主机 时间同步
# iptabels selinux 关闭
# host1 host2
systemctl stop fireware # 不同linux 版本 命令不一
setenforce 0	# 不同linux 版本 命令不一 ubuntu不需要关闭

# host1 host2 执行
apt install keepliaved

配置

keepalived的配置文件主要由global configuration、vrrpdconfiguration、LVS configuration这三部分配置段组成;其中global配置段主要定义全局属性以及静态路由和地址相关配置;vrrp配置段主要定义VRRP实例或vrrp同步组
相关配置;LVS配置段主要定义IPVS集群和LVS后端各real server相关的配置;
配置文件位置 /etc/keepalived/keepalived.conf

以下配置 10.0.0.9/24 为虚拟vip 地址 使用两台机器的 eth0 网卡 虚拟出来一张网卡 eth0:1 两台机器同时启动相同服务 客户访问虚拟地址时hosts1主 接受请求 当1 挂了 被机器会抢占 虚拟IP 代替主提供服务

# 主 host1
global_defs {                           #全局配置
    router_id lb01                      #身份识别(全局唯一)
}

vrrp_instance VI_1 {                    # 配置VRRP协议
    state MASTER                        # 状态,MASTER 和 BACKUP(这里仅仅是一个标记,真正确认VIP的是权重)
    interface eth0                      # 绑定网卡
    virtual_router_id 50                # 虚拟路由标示,可以理解为分组
    priority 100                        # 优先级(数字越大,权重越大)
    advert_int 1                        # 监测心跳间隔时间
    authentication {                    # 配置认证
        auth_type PASS                  # 认证类型
        auth_pass 12345678              # 认证的密码
    }
    virtual_ipaddress {                 # 设置VIP
        10.0.0.9/24 brd 0.0.0.255 dev eth0 label eth0:1        # 虚拟的VIP地址
    }
}

# 备 host2
global_defs {
    router_id node02
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 50
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 12345678
        }
        virtual_ipaddress {
        10.0.0.9/24 brd 0.0.0.255 dev eth0 label eth0:1
        }
}

验证

主查看网卡配置

# ifconfig eth0:1
eth0:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.0.9  netmask 255.255.255.0  broadcast 10.0.0.255
        ether 52:54:00:82:d0:a1  txqueuelen 1000  (Ethernet)