# 负载均衡 Nginx 的使用
该部分从属于数据采集部分,主要作用为实现几台数采服务器的负载均衡,因涉及新的技术 ---Nginx,所以单独成为一个 part
# 1.1 Nginx 概述
Nginx 是一个高性能的 HTTP 和反向代理服务器,特点是占有内存少,并发能力强
- 与 tomcat 的关系
除了 tomcat 以外, apache,nginx,jboss,jetty 等都是 http 服务器。
nginx 和 apache 只支持静态页面和 CGI 协议的动态语言,比如 perl 、 php 等, 但是 nginx 不支持 java 。
Java 程序只能通过与 tomcat 配合完成。 nginx 与 tomcat 配合,为 tomcat 集群提供反向代理服务、负载均衡等服务
# 1.1.1 Nginx 三大功能
# 反向代理
- 正向代理
服务器代理用户的请求,从用户的角度看,没法直接获取请求,需要通过代理
特点:代理用户,用户清楚知道访问哪台服务器
- 反向代理
反向代理:服务器代理真正服务器,用户不确定去哪台真实服务器,
# 负载均衡
・轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,则自动剔除故障机器,使用户访问不受影响
・weight 指定轮询权重,weight 值越大,分配到的几率就越高,主要用于后端每台服务器性能不均衡的情况。
・备机模式 平时不工作,只有其他 down 机的时候才会开始工作
・公平模式 (第三方) 更智能的一个负载均衡算法,此算法可以根据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。如果想要使用此调度算法,需要 Nginx 的 upstream_fair 模块。
# 动静分离
# 1.2 Nginx 安装
- yum 安装依赖包
sudo yum -y install openssl openssl-devel pcre pcre-devel zlib zlib-devel gcc gcc-c++ |
- 下载 Nginx
/opt/software » wget http://nginx.org/download/nginx-1.12.2.tar.gz |
- 解压
tar -zxvf nginx-1.12.2.tar.gz -C /opt/module |
- 编译和安装
进入解压缩的目录
为了防止出现权限问题,建议切换到 root 用户
./configure --prefix=/usr/local/webserver/nginx | |
make && make install |
- 启停 Nginx
进入目录: /usr/local/webserver/nginx
启动 nginx: sbin/nginx | |
关闭 nginx: sbin/nginx -s stop | |
重新加载: sbin/nginx -s reload |
注意:
- Nginx 默认使用的是 80 端口,由于非 root 用户不能使用 1024 以内的端口,所以建议使用 root 用户启动 Nginx
- 如果使用普通用户启动 Nginx, 需要先执行下面的命令来突破上面的限制:
sudo setcap cap_net_bind_service=+eip /usr/local/webserver/nginx
- 查看 Nginx 进程
![1594748930149](https://lian-zp.oss-cn-shenzhen.aliyuncs.com/pic GO/20200719233543.png)
通过网页访问: http://hadoop109
# 1.3 配置负载均衡
# 1.3.1 Nginx 配置修改
- 修改 /usr/local/webserver/nginx/conf/nginx.conf
http { | |
..... | |
# 配置上游服务器:其实就被代理的服务器,springboot | |
upstream logserver{ | |
server hadoop109:8081 weight=1; | |
server hadoop110:8081 weight=1; | |
server hadoop111:8081 weight=1; | |
} | |
server { | |
listen 80; | |
server_name logserver; | |
location / { | |
root html; | |
index index.html index.htm; | |
# 配置代理 | |
proxy_pass http://logserver; | |
proxy_connect_timeout 10; | |
} | |
... | |
} | |
} |
Q:为什么不配置日志服务器端口为 8080
在 kafka 启动消费数据前要先打开 zookeeper 集群,在 zookeeper3.5.0 之后的版本中,集群打开后会默认占用 8080 端口
[atguigu@hadoop109 module]$ jps13317 Jps
13229 QuorumPeerMain
[atguigu@hadoop109 module]$ netstat -tunlp |grep 8080(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp6 0 0 :::8080 :::* LISTEN 13229/java通过观察日志可以发现确实启动了一个叫 adminServer 的服务
这是一个内嵌的 jetty 服务。如果想在 zookeeper 上解决这个问题,有以下三种方法
(1).删除jetty。(2)修改端口。修改方法的方法有两种,一种是在启动脚本中增加 -Dzookeeper.admin.serverPort=你的端口号.一种是在zoo.cfg中增加admin.serverPort=没有被占用的端口号(3)停用这个服务,在启动脚本中增加”-Dzookeeper.admin.enableServer=false”
netstat -tunlp|grep 端口号 查看占用端口的进程
# 1.3.2 日志采集服务器群起脚本制作
分别在 3 个节点启动 jar 比较麻烦,制作统一启动脚本.
#!/bin/bashcase $1 in "start") { for i in hadoop201 hadoop202 hadoop203 do echo "========启动日志服务: $i===============" ssh $i "source /etc/profile ; java -jar /opt/module/gmall/gmall-logger-1.0-SNAPSHOT.jar >/dev/null 2>&1 &" done };; "stop") { for i in hadoop201 hadoop202 hadoop203 do echo "========关闭日志服务: $i===============" ssh $i "ps -ef|grep gmall-logger-1.0-SNAPSHOT.jar | grep -v grep|awk '{print \$2}'|xargs kill" >/dev/null 2>&1 done };; *) { echo 启动姿势不对, 请使用参数 start 启动日志服务, 使用参数 stop 停止服务 };;esac |
# 1.3.3 其他操作
- 分发启动采集服务器 jar 包到其余设备
- 给编写好的脚本增加执行权限
- 启动 Nginx
- 启动脚本
脚本编写的注意事项:
如果在 windows 环境下编写脚本后复制到 linux 系统中出现如下报错:
bad interpreter:/bin/bash^M: no such file or directory
是因为在 window 下写的脚本回车的时候使用的是 \r\n, 而在 linux 使用 \n 就可以了,所在每行的末尾多了一个 \r.
使用下面的命令去掉行尾的 \r:
sed -i -e 's/\r$//' gmall_cluster
- 测试日志生成能否在集群中生成落盘日志与控制台打印