目录
一、七层负载均衡的项目实战
1、Tomcat多实例部署
(1)复制程序文件
(2)修改端口,以启动实例。多实例之间端口不能一致。
(3)启动配置文件:
(4)将配置好的tomcat程序打包,以方便之后使用
(5)检查端口是否启动
(6)将每个实例的网页进行区分
(7)在浏览器访问,进行测试
编辑2、配置负载均衡器
(1)先准备环境和下载nginx源码包
(2)配置文件
(3)启动nginx服务
(4)使用命令行测试
(5)在浏览器上访问测试
二、专业负载均衡器Haproxy
1、haproxy简介
(1)haproxy的特点和优点
(2)haproxy保持会话
(3)haproxy负载均衡算法
(4)haproxy的主要工作模式
2、haproxy安装及配置文件参数
(1)haproxy安装
(2)haproxy环境
3、haproxy 实现七层负载均衡
4、haproxy实现四层负载均衡
项目说明:实现tomcat多实例的负载均衡
多虚拟主机:nginx多个server标签(域名,ip,端口)进程数量固定master+worker
多实例(多进程):同一程序启动多次,分两种情况;
第一种:一台机器跑多个站点;
第二种:一个机器跑一个站点多个实例,配合负载均衡
[root@localhost ~]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.81/bin/apache-tomcat-8.5.81.tar.gz --no-check-certificate
如果报404错误,not found。可以在浏览器输入Index of /apache/tomcat/tomcat-8查询最新版本的tomcat,再次下载
随后需要配置jdk,由于下载比较慢。所以用本地源,在真机上上传软件包。
首先先安装lrzsz:yum -y install lrzsz
安装完后,用rz软件上传软件包。
[root@localhost ~]# rz
�CCB0100000023be50e.**B0100000023be50
出现这种情况百度后发现是因为使用rz需要连接远程服务器的客户端支持,例如:finalshell、XShell等;改用finalshell连接Linux服务器后,tz命令即可正常使用
解压这两个软件包apache-tomcat-8.5.81.tar.gz和jdk-8u144-windows-X64.exe
[root@localhost ~]# tar xf jdk-8u161-linux-x64.tar.gz
[root@localhost ~]# tar xf apache-tomcat-8.5.81.tar.gz
移动这两个软件到对应的文件里
[root@localhost ~]# mv apache-tomcat-8.5.81 /usr/local/tomcat
[root@localhost ~]# mv jdk1.8.0_161/ /usr/local/java
配置Jdk的环境变量: vim /etc/profile.d/java.sh
在这个文件里写下下面两行配置即可。
export JAVA_HOME=/usr/local/java
export PATH=$JAVA_HOME/bin:$PATH
然后更新一下,就可以了,可以再检查一下:像下面这样就没什么问题了
[root@localhost ~]# source /etc/profile.d/java.sh
[root@localhost ~]# java -version
openjdk version "1.8.0_242"
OpenJDK Runtime Environment (build 1.8.0_242-b08)
OpenJDK 64-Bit Server VM (build 25.242-b08, mixed mode)
最后一步:我们需要复制两个tomcat,也就是在我们的虚拟机上需要有多个tomcat实例
[root@localhost ~]# cd /usr/local/
[root@localhost local]# ls
bin etc games include java lib lib64 libexec sbin share src tomcat
[root@localhost local]# cp -a tomcat/ ./tomcat8_1
[root@localhost local]# mv tomcat ./tomcat8_2
[root@localhost local]# ls
bin games java lib64 sbin src tomcat8_2
etc include lib libexec share tomcat8_1
首先修改端口:
[root@localhost local]# sed -i 's#8005#8011#;s#8080#8081#' tomcat8_1/conf/server.xml
[root@localhost local]# sed -i 's#8005#8012#;s#8080#8082#' tomcat8_2/conf/server.xml
[root@localhost local]# ./tomcat8_1/bin/startup.sh
同时用diff命令来查看上面两个文件的不同:
diff tomcat8_1/conf/server.xml tomcat8_2/conf/server.xml
22c22
[root@localhost local]# tar zcf muti_tomcat8.tar.gz ./tomcat8_1 ./tomcat8_2
用echo重定向一下页面,便于分辨,查看负载均衡的效果。
[root@localhost local]# echo tomcat8081 >> ./tomcat8_1/webapps/ROOT/index.jsp
[root@localhost local]# echo tomcat8082 >> ./tomcat8_2/webapps/ROOT/index.jsp
在浏览器分别输入192.168.40.131:8081和192.168.40.131:8082
准备环境:yum -y install gcc-c++ pcre pcre-devel zlib-devel zlib openssl openssl-devel
安装nginx源码包:
安装完解压nginx:
编译一下:
然后查看编译后的nginx文件,并备份
[root@localhost nginx-1.9.9]# cd /usr/local/
[root@localhost local]# ls
bin etc games include lib lib64 libexec nginx sbin share src
[root@localhost local]# cd nginx
[root@localhost nginx]# ls
conf html logs sbin
[root@localhost nginx]# cd conf/
[root@localhost conf]# ls
fastcgi.conf fastcgi_params koi-utf mime.types nginx.conf scgi_params uwsgi_params win-utf
fastcgi.conf.default fastcgi_params.default koi-win mime.types.default nginx.conf.default scgi_params.default uwsgi_params.default
[root@localhost conf]# mv nginx.conf nginx.conf.bak
过滤空格:
[root@localhost conf]# egrep '#|^$' nginx.conf.default
过滤注释:
[root@localhost conf]# egrep -v '#|^$' nginx.conf.default
重定向到nginx.conf
[root@localhost conf]# egrep -v '#|^$' nginx.conf.default >> nginx.conf
打开配置文件,修改配置文件内容:
[root@localhost conf]# vim nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream web{
server 192.168.40.128:8081;
server 192.168.40.128:8082;
}
server {
listen 80;
server_name localhost;
location / {
root html;
index index.jsp index.htm;
proxy_pass http://web;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
先返回上一层:cd ..
启动服务:
[root@localhost nginx]# ./sbin/nginx
查看端口信息:
使用curl命令进行测试,tail进行关键字提取
[root@localhost nginx]# curl -s 192.168.40.128|tail -1
tomcat8081
[root@localhost nginx]# curl -s 192.168.40.128|tail -1
tomcat8082
最终实现的效果是:在浏览器输入192.168.40.128时,浏览器会出现tomcat8081页面,刷新一次会出现tomcat8082页面。
官网:http://www.haproxy.com
haproxy提供高可用、负载均衡以及基于TCP和Http的应用代理,支持虚拟主机,是免费、快速、并且可靠的一种负载均衡解决方案。适合处理高负载站点的七层数据请求。列斯的代理服务可以屏蔽内部真实服务器,防止内部服务器遭受攻击。
支持原生ssl,同时支持客户端和服务器的ssl
支持IPv6和unix套字节
支持HTTP keep-alive
支持HTTP/1.1压缩,节省宽带
支持优化健康检测机制(SSL、scripted TCP、check agent……)
支持7层负载均衡
可靠性和稳定性非常好
并发连接40000-50000个,单位时间处理最大请求20000个,最大数据处理10Gbps
支持8种负载均衡算法,同时session保持
支持虚拟主机
支持连接拒绝,全透明代理
拥有服务器状态监控页面
支持ACL
haproxy为让同一客户端访问服务器可以保持会话,有三种解决方法:
客户端IP:haproxy通过客户端IP进行hash计算并保存,以此确保当相同ip访问代理服务器可以转发给固定的真实服务器
haproxy依靠真实服务器发送客户端的cookie信息进行会话保持
haproxy将保存真实服务器的session以及服务器标识,实现会话保持
haproxy的负载均衡算法
roundrobin:基于权重轮询
static-rr:基于权重轮询。静态算法,运行时无法生效。
source:基于源IP的算法。对请求的源ip进行hash运算,将结果与后端服务器的权重总数相除后转发至某台服务器。
leastconn:最小连接。(适合数据库负载均衡,不适合会话短的环境)
url:对部分或整体url进行hash运算,再与服务器的总权重相除,最后转发到匹配端。
url_param:根据url路径中参数进行转发,保证在后端服务器数量不变的情况下,同一用户请求分发到同一机器。
hdr:根据http头转发,如果存在http头,则使用简单轮询。
tcp模式:在该客户端和服务器之间将建立一个全双工的连接,且不会对7层的报文做任何处理的简单模式。
http模式:该模式下,客户端请求在转发给后端服务器之前会被深度分析,所有不与RFC格式兼容的请求都会被拒绝。
[root@localhost nginx]# yum -y install haproxy
haproxy的配置文件通常分为三部分:
global(全局配置部分)
defaults(默认配置部分)
listen(应用组件部分)
haproxy配置文件详解
[root@localhost nginx]# vim /etc/haproxy/haproxy.cfg全局配置 参数是进程级的,通常和操作系统(os)相关 global log 127.0.0.1 local2 //日志输出配置,所有日志记录在本机系统日志,通过loca10输出 log 127.0.0.1 local2 notice //notice为日志级别,通常有24个级别。
chroot /var/lib/haproxy //chroot运行的路径 uid 99 //所属运行的uid gid 99 //所属运行的用户组 pidfile /var/run/haproxy.pid //haproxy的pid存放路径,启动进程的用户必须有权限访问此文件 maxconn 4000 //默认最大连接数 user haproxy // group haproxy // daemon //以后台形式运行haproxy naproc 1 //进程数量,可以设置多个进程提高性能
keepalived + haproxy
=================================================
(1)准备工作
web:192.168.40.135
dr:192.168.40.128
安装haproxy:
[root@localhost ~]# yum -y install haproxy
把原有的配置文件给拷贝一份,去掉配置文件里的空格和注释:
[root@localhost ~]# cp -cf /etc/haproxxy/haproxy.cfg{,.bak} [root@localhost ~]# sed -i -r '/^[ ]*#/d' /etc/haproxy/haproxy.cfg
打开配置文件;
[root@localhost ~]# vim /etc/haproxy/haproxy.cfg
配置文件如下:
global //关于进程的全局参数 log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon stats socket /var/lib/haproxy/stats defaults mode http log global option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.0/8 option redispatch retries 3 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 listen stats bind *:1314 stats enable stats refresh 30s stats hide-version stats uri /haproxystats stats realm Haproxy\ stats stats auth qfedu:123 stats admin if TRUE frontend web mode http bind *:80 default_backend httpservers backend httpservers balance roundrobin server http1 192.168.40.135:8081 maxconn 2000 weight 1 check inter 1s rise 2 fall 2 server http2 192.168.40.135:8082 maxconn 2000 weight 1 check inter 1s rise 2 fall 2
重启haproxy服务,并检测一下端口信息:
[root@localhost ~]# systemctl start haproxy [root@localhost ~]# ss -ltnp
(2)测试:然后在浏览器上输入192.168.40.128,会在两个页面轮询,也可以打开隐私窗口,会出现如下页面
登录后,就可以看到监控页面,查看一些信息
这个时候我们可以准备另一台机器,安装web服务器的检测压测工具ab.指定一共访问100000次,每次并发数量300,访问的是http://。这样返回监控页面,刷新后就会有明显的变化。
[root@localhost ~]# ab -n 100000 -c 300 http://192.168.40.128
web1:192.168.40.133
web2:192.168.40.135
dr:192.168.40.136
(1)配置环境:
在后台的web1和web2上安装mariadb
[root@localhost ~]# yum -y install mariadb mariadb-server
在dr上进行haproxy的配置
配置内容如下:(相较于七层负载均衡的配置,四层的配置多加了数据库,绑定了一个mysql)
global //关于进程的全局参数 log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon stats socket /var/lib/haproxy/stats defaults mode http log global option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.0/8 option redispatch retries 3 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 listen stats bind *:1314 stats enable stats refresh 30s stats hide-version stats uri /haproxystats stats realm Haproxy\ stats stats auth qfedu:123 stats admin if TRUE frontend web mode http bind *:80 default_backend httpservers backend httpservers balance roundrobin server http1 192.168.40.135:8081 maxconn 2000 weight 1 check inter 1s rise 2 fall 2 server http2 192.168.40.135:8082 maxconn 2000 weight 1 check inter 1s rise 2 fall 2 listen mysql bind *:3306 mode tcp balance roundrobin server mysql1 192.168.40.133:3306 weight 1 check inter 1s rise 2 fall 2 server mysql2 192.168.40.135:3306 weight 1 check inter 1s rise 2 fall 2
然后保存退出,重新启动haproxy,用ss -tnlp查看端口是否成功开启。
(2)在web1和web2上启动mariadb
[root@localhost ~]# systemctl start mariadb
打开mysql:
[root@localhost ~]# mysql Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 2 Server version: 5.5.68-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
创建一个可以由远程连接的用户:
MariaDB [(none)]> grant all on *.* to 'ha'@'%' identified by '123456'; Query OK, 0 rows affected (0.04 sec) MariaDB [(none)]> flush privileges; Query OK, 0 rows affected (0.02 sec) MariaDB [(none)]> exit Bye
上述(2)操作,在web1和web2均作一遍
(3)在dr上远程连接mysql
首先安装mariaddb:
[root@localhost ~]# yum -y install mariadb mariadb-server
注意:这里一定要注意这里的mariadb不用启动,直接可以进行下一步的远程连接即可。
远程连接数据库
[root@localhost ~]# mysql -uhaproxy -p'123456' -h192.168.40.136
查看库:
MariaDB [(none)]> show databases;
创建一个数据库用于测试
MariaDB [(none)]> create database haproxy; Query OK, 1 row affected (0.00 sec)
然后退出数据库
MariaDB [(none)]> exit Bye
再一次登进数据库
[root@localhost ~]# mysql -uhaproxy -p'123456' -h192.168.40.136
查看数据库
[root@localhost ~]# mysql -uhaproxy -p'123456' -h192.168.40.136
通过上图可以看出,数据库里的haproxy1并没有出现,随后创建haproxy2,退出,再次登录,查看数据库可以看到haproxy1,退出,再次登录,可以看到haproxy2。
同时可以在web1和web2分别查看到数据库haproxy1和haproxy2