一.什么是负载均衡
在一个服务器集群中尽可能地的平均负载量。
基于这个思路,我们通常的做法是在服务器前端设置一个负载均衡器。负载均衡器的作用是将请求的连接路由到最空闲的可用服务器上
负载均衡搭建
Haproxy介绍
HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点, 这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
Haproxy安装:
yum install haproxy –y
配置文件:/etc/haproxy/haproxy.cfg
启动命令:/usr/sbin/haproxy –f /etc/haproxy/haproxy.cfg
查看haproxy是否正常启动:ps –ef | grep haproxy
Haproxy配置文件参数:
Global --全局配置
log 127.0.0.1 local2 # 定义全局的 syslog 服务器
chroot /var/lib/haproxy #修改 haproxy 的工作目录至指定的目录并在放弃权限之前执行,保证haproxy的安全,使用配置文件默认值即可
pidfile /var/run/haproxy.pid
maxconn 4000 # 设定每个haproxy进程所接受的最大并发连接数,其等同于命令行选项“-n”;“ulimit -n”自动计算的结果正是参照此参数设定的;
user haproxy # 以指定的 user 运行haproxy,建议使用专用于运行 haproxy 的 user, 以免因权限问题带来风险;
group haproxy # 以指定的 group 运行haproxy,建议使用专用于运行 haproxy 的 group, 以免因权限问题带来风险;
daemon # 让 haproxy 以守护进程的方式工作于后台,其等同于 “-D” 选项的功能, 当然,也可以在命令行中以 “-db” 选项将其禁用;
stats socket /var/lib/haproxy/stats
proxies:代理相关的配置可以有如下几个配置端组成
defaults:为除了 global 以外的其它配置段提供默认参数,默认配置参数可由下一个 “defaults” 重新设定。
frontend:定义一系列监听的套接字,这些套接字可接受客户端请求并与之建立连接。
backend:定义 “后端” 服务器,前端代理服务器将会把客户端的请求调度至这些服务器。
listen:定义监听的套接字和后端的服务器。类似于将 frontend 和 backend 段放在一起
所有代理的名称只能使用大写字母、小写字母、数字、-(中线)、_(下划线)、.(点号)和:(冒号)。此外,ACL 名称会区分字母大小写。
3.配置文件
global log 127.0.0.1 local0 # 定义全局的 syslog 服务器,最多可定义2个,格式:log <address> <facility> [max level [min level]] chroot /var/lib/haproxy # 修改 haproxy 的工作目录至指定的目录并在放弃权限之前执行,保证haproxy的安全,使用配置文件默认值即可 pidfile /var/run/haproxy.pid maxconn 10000 # 设定每个haproxy进程所接受的最大并发连接数,其等同于命令行选项“-n”;“ulimit -n”自动计算的结果正是参照此参数设定的; user haproxy # 以指定的 user 运行haproxy,建议使用专用于运行 haproxy 的 user, 以免因权限问题带来风险; group haproxy # 以指定的 group 运行haproxy,建议使用专用于运行 haproxy 的 group, 以免因权限问题带来风险; daemon # 让 haproxy 以守护进程的方式工作于后台,其等同于 “-D” 选项的功能, 当然,也可以在命令行中以 “-db” 选项将其禁用; ulimit-n 100000 # 设定每进程所能够打开的最大文件描述符数目,默认情况下其会自动进行计算,因此不推荐修改此选项;Linux默认单进程打开文件数为1024个 stats socket /var/lib/haproxy/stats level admin process 1 # 开启一个 socket 管理接口 nbproc 12 # 指定启动的 haproxy 进程个数,只能用于守护进程模式的 haproxy;默认只启动一个进程, cpu-map 1 0 # 绑定 cpu,和 nbproc 数量相对。进程号从1开始,cpu 核数从0开始; defaults log global option tcplog # 启用日志记录;tcplog 请求; option dontlognull # 日志中将不会记录空连接; retries 3 # 定义连接后端服务器的失败重连次数 timeout connect 2s # 定义 haproxy 将客户端请求转发至后端服务器所等待的超时时长 timeout client 3600s # 客户端非活动状态的超时时长 timeout server 3600s # 客户端与服务器端建立连接后,等待服务器端的超时时长 maxconn 10000 # 默认和前段的最大连接数,但不能超过 global 中的 maxconn 限制数 listen admin_stats # 开启一个统计报告服务 bind *:1080 # 监听1080端口 mode http # 基于http协议 maxconn 10 stats refresh 10s # 统计页面自动刷新时间间隔 stats uri /haproxy # url 地址 stats realm Haproxy # 统计页面密码框上提示文本 stats auth admin:admin # 账号:密码 stats hide-version # 隐藏统计报告版本信息 stats admin if TRUE # 在制定条件下开启admin 功能 frontend haproxy # 前端应用 bind *:40000 # 端口 mode tcp # tcp 模式 default_backend tidb # 此前端对应的后端应用 backend tidb # 后端应用 balance leastconn # balance 基于最少连接数 mode tcp # tcp 模式 # acl internal_networks src 192.168.0.0/16 172.16.0.0/12 10.0.0.0/8 127.0.0.1 定义一条ACL,ACL是根据数据包的指定属性以指定表达式计算出的true/false值。 # tcp-request content reject if ! internal_networks # option mysql-check user haproxy post-41 server tidb1 10.0.1.4:4000 check # 后端应用地址,代理将会将对应客户端的请求转发至这些服务器。 server tidb2 10.0.1.10:4000 check
二.keeplived安装与环境配置
2.1 Keepalived介绍
Keepalived的作用是检测服务器的状态,如果有一台服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其它服务器代替该服务器的工作,当服务器工作 正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
安装Keepalived需要的扩展
[root@localhost keepalived]# yum install gcc gcc-c++ openssl openssl-devel [root@localhost home]# wget -q https://www.keepalived.org/software/keepalived-1.2.18.tar.gz
解压Keepalived并安装
[root@localhost home]# tar -zxvf keepalived-1.2.18.tar.gz [root@localhost home]# cd keepalived-1.2.18 [root@localhost keepalived-1.2.18]# ./configure --prefix=/usr/local/keepalived [root@localhost keepalived-1.2.18]# make && make install
将 keepalived 安装成 Linux 系统服务
因为没有使用 keepalived 的默认路径安装(默认是/usr/local) ,安装完成之后,需要做一些工作 复制默认配置文件到默认路径
[root@localhost keepalived-1.2.18]# mkdir /etc/keepalived [root@localhost keepalived-1.2.18]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
复制 keepalived 服务脚本到默认的地址
[root@localhost keepalived-1.2.18]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ [root@localhost keepalived-1.2.18]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ [root@localhost keepalived-1.2.18]# ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/
设置 keepalived 服务开机启动
[root@localhost keepalived-1.2.18]# chkconfig keepalived on
keepalived主机配置
! Configuration File for keepalived global_defs { router_id LVS_MASTER } vrrp_script chk_haproxy { script "/etc/keepalived/haproxy_check.sh" ## 检测 haproxy 状态的脚本路径 interval 2 ## 检测时间间隔 weight 2 ## 如果条件成立,权重+2 } vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 79 priority 100 advert_int 1 nopreempt authentication { auth_type PASS auth_pass 1234 } virtual_ipaddress { 192.168.29.101 } track_script { chk_haproxy } } # 写VIP virtual_server,只配置本地机器 virtual_server 192.168.29.101 3307 {# 定义虚拟服务器,地址与上面的virtual_ipaddress相同 delay_loop 3 # 健康检查时间间隔,3秒 lb_algo rr # 负载均衡调度算法:rr|wrr|lc|wlc|sh|dh|lblc lb_kind DR # 负载均衡转发规则:NAT|DR|TUN # persistence_timeout 5 # 会话保持时间5秒,动态服务建议开启 protocol TCP # 转发协议protocol,一般有tcp和udp两种 real_server 192.168.29.106 3307 { weight 1 # 权重越大负载分越大,0表示失效 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 3306 } } }
Keepalived从机配置
! Configuration File for keepalived global_defs { router_id LVS_MASTER } vrrp_script chk_haproxy { script "/etc/keepalived/haproxy_check.sh" ## 检测 haproxy 状态的脚本路径 interval 2 ## 检测时间间隔 weight 2 ## 如果条件成立,权重+2 } vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 79 priority 90 advert_int 1 nopreempt authentication { auth_type PASS auth_pass 1234 } virtual_ipaddress { 192.168.29.101 } track_script { chk_haproxy } } # 写VIP virtual_server,只配置本地机器 virtual_server 192.168.29.101 3307 {# 定义虚拟服务器,地址与上面的virtual_ipaddress相同 delay_loop 3 # 健康检查时间间隔,3秒 lb_algo rr # 负载均衡调度算法:rr|wrr|lc|wlc|sh|dh|lblc lb_kind DR # 负载均衡转发规则:NAT|DR|TUN # persistence_timeout 5 # 会话保持时间5秒,动态服务建议开启 protocol TCP # 转发协议protocol,一般有tcp和udp两种 real_server 192.168.29.107 3307 { weight 1 # 权重越大负载分越大,0表示失效 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 3306 } } }
haproxy状态检测脚本
#!/bin/bash START_HAPROXY="/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg" #haproxy启动命令 LOG_FILE="/usr/local/keepalived/log/haproxy-check.log" # 日志文件 HAPS=`ps -C haproxy --no-header |wc -l` # 检测haproxy的状态,0代表未启动,1已经启动 date "+%Y-%m-%d %H:%M:%S" >> $LOG_FILE #在日志文件当中记录检测时间 echo "check haproxy status" >> $LOG_FILE # 记录haproxy的状态 if [ $HAPS -eq 0 ];then #执行haproxy判断 echo $START_HAPROXY >> $LOG_FILE #记录启动命令 /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg #启动haproxy sleep 3 if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then echo "start haproxy failed, killall keepalived" >> $LOG_FILE killall keepalived service keepalived stop fi fi
haproxy状态检测脚本不执行问题,如果是使用的service keeplived start 或者是 systemctl 方式启动,脚本可能会不执行,可以使用 Keepalived -f /etc/keepalived/keepalived.conf方式启动Keepalived
keepalived配置注意点 - 配置完成但是ip不生效;
查看虚拟机/机器系统时间是否一致
virtual_router_id路由id不对,不能冲突。可以通过/var/log/messages查看此错误
本文由:xiaoshu168.com 作者:xiaoshu发表,转载请注明来源!