nginx是一个HTTP和反向代理服务器,邮件代理服务器,通用的TCP/UDP代理服务器。
反向代理服务器: 作用就是负载均衡
#!/bin/bash
#新建文件夹存放nginx源码包
mkdir -p /nginx
cd /nginx
# 下载nginx压缩包
curl -O http://nginx.org/download/nginx-1.25.2.tar.gz
# 或者用wget
#wget http://nginx.org/download/nginx-1.25.2.tar.gz
# 解压
tar xf nginx-1.25.2.tar.gz
# 进入文件夹
cd nginx-1.25.2
# 新建用户,用于启动nginx进程,名字自拟
useradd -s /sbin/nologin liaobo
# 安装依赖包
# ssh相关、gcc为编译需要、pcre正则相关、make编译相关
yum install -y openssl openssl-devel gcc pcre pcre-devel automake make net-tools vim
# configure是一个配置的脚本文件,会根据指定的配置生成一个Makefile文件,这个文件会影响后面make命令的编译,相当于图纸
# configure可配置参数可以参考官方文档:http://nginx.org/en/docs/configure.html
# 常用选项:
# --with-*:开启某个功能,默认不安装 --without-*:禁用某个功能,默认安装
# --prefix=path:指定路径 --conf-path=path:指定配置文件路径,不指定会放到prefix路径下
# --user=name:指定启动nginx worker进程的用户
# --with-http_ssl_moudle 开启https的功能,下载ssl来进行公钥和私钥的认证
# --without-http——memcached_moudle 禁用http_memcached
# --with-http_realip_module 启用realip功能,让后端知道通过代理访问的用户的ip
# --with-http_v2_module:对http2.0版本的支持
# --with-threads:开启线程池功能 --with-http_stub_status_moudle:开启nginx状态统计功能,可以知道多少访问
# --with-stream 支持tcp/udp反向代理,即4层负载均衡
./configure --prefix=/usr/local/nginx --user=liaobo --with-http_ssl_module --with-http_realip_module --with-http_v2_module --with-threads --with-http_stub_status_module --with-stream
# 编译
# make是按照Makefile的配置去编译程序为二进制文件,二进制文件就是执行可以运行的程序
# -j:指定编译进程数,多点速度快些,可以使用top后按1查看虚拟机配有几个核心
make -j 2
# 将编译好的二进制文件复制到指定安装路径目录下
make install
# 启动nginx
/usr/local/nginx/sbin/nginx
# 修改PATH变量
PATH=$PATH:/usr/local/nginx/sbin
echo "PATH=$PATH" >>/root/.bashrc
# 设置nginx的开机启动,rc.local是指向rc.d/rc.local的链接,后者需要拥有执行权限才能开机自启
echo "/usr/local/nginx/sbin/nginx" >>/etc/rc.local
chmod +x /etc/rc.d/rc.local
# selinux和firewalld防火墙都关闭
# selinux临时和永久关闭
setenforce 0
sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/selinux/config
# 防火墙临时和永久关闭
service firewalld stop
systemctl disable firewalld
html 目录,存放网站的网页文件
conf 存放nginx的配置文件
logs 存放日志文件
sbin 存放nginx的可执行文件
[root@nginx nginx-1.25.2]# cd /usr/local/nginx
[root@nginx nginx]# ls
conf html logs sbin
access.log 正常的访问网站的日志
error.log 访问错误的日志
[root@sanchuang logs]# pwd
/usr/local/nginx/logs
[root@sanchuang logs]# ls
access.log error.log nginx.pid
日志的好处:
1.排除故障: 根据日志的记录
2.进行数据分析
停止nginx服务
nginx -s stop
重新启动nginx配置文件,不需要停止业务
nginx -s reload
检测配置文件是否有语法错误
nginx -t #检测配置文件是否有语法错误,然后退出
重启Nginx
nginx -s reopen #重启Nginx
nginx中master和worker的关系
master是父进程管理worker进程,worker对外提供服务,当worker进程死掉会重启一个
ngx_http_core_module 核心模块
ngx_http_access_module deny和allow
ngx_http_autoindex_module
ngx_http_rewrite_module rewrite
ngx_http_referer_module
ngx_http_limit_conn_module
ngx_http_limit_req_module
ngx_http_realip_module
ngx_http_geoip_module
ngx_http_auth_basic_module 认证
ngx_http_stub_status_module 状态统计
ngx_http_log_module 日志 access.log和error.log
ngx_http_upstream_module 7层的负载均衡
ngx_http_proxy_module 修改http头部信息
ngx_stream_core_module 4层负载均衡
基本内容
[root@sanchuang conf]# cat nginx.conf|egrep -v "^$|#"
user tiankai; #启动nginx的用户,默认nobody
worker_processes 4; #启动4个worker进程
error_log logs/error.log notice; #指定错误日志存放的路径,记录notice级别以上的日志
pid logs/nginx.pid; #记录master进程的pid号
events {
worker_connections 2048; #一个worker进程允许2048个用户访问
}
http {
include mime.types;
default_type application/octet-stream;
#访问日志的格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main; #访问日志
sendfile on;
keepalive_timeout 65; #断开连接时间
server {
listen 80; #监听80端口
server_name www.feng.com; #为www.feng.com域名提供服务
access_log logs/feng.com.access.log main; #访问日志的路径和格式
#定义的路由
location / {
root html/feng; #网站的根目录在html/feng文件夹,在nginx的安装路径下
index shouye.html index.html index.htm; #定义访问的时候,第1个被访问的页面,最左边的优先级最高
}
error_page 404 /404.html; #错误页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
访问日志的格式log_format main
$remote_add 远程服务器的ip,本质上是nginx内部调用某个变量的值
[$time_local] 时间
“$request” 请求的网址
$status 响应的状态码 200 404
$body_bytes_sent 发送的数据
$http_referer" 从哪个网址引流过来的,从哪个网址跳转过来的 reference 参考/引用
$http_user_agent" 用户使用的浏览器
打开状态统计
#nginx.conf的http中server下
location = /status {
stub_status on; #打开状态统计功能
access_log off; #访问状态统计时不记录日志中
}
状态统计的相关功能
Active connections: 2
server accepts handled requests
61 61 87
Reading: 0 Writing: 1 Waiting: 1
提供以下状态信息:
Active connections 当前活动的客户端连接数,包括Waiting连接数。
accepts 接受的客户端连接总数。
handled 已处理的连接总数->参数值与accepts相同,除非达到某些资源限制(例如, worker_connections限制)。
requests 客户端请求总数。
Reading nginx正在读取请求标头的当前连接数。
Writing nginx正在将响应写回到客户端的当前连接数。
Waiting 当前等待请求的空闲客户端连接数 --》已经连接但未发起下一次连接
认证功能
#添加状态信息统计的功能
location = /status {
auth_basic "sanchuang"; #标题名字,可以自定义
auth_basic_user_file htpasswd; #存放用户名和密码的文件
stub_status;
}
#安装httpd-tools软件得到htpasswd命令,然后去加密密码
[root@siyuxiang conf]# yum install httpd-tools -y
[root@sc-nginx conf]# htpasswd -c /usr/local/nginx8/conf/htpasswd cali
deny和allow指令
#添加状态信息统计的功能
location = /sc_status {
auth_basic "sanchuang";
auth_basic_user_file htpasswd;
allow 192.168.0.16;
allow 192.168.0.24;
deny all;
stub_status on;
}
独立访客(UV) 和 综合浏览量(PV)
独立访客(UV):指一定时间范围内相同访客多次访问网站,只计算为1个独立访客。
综合浏览量(PV):指一定时间范围内页面浏览量或点击量,用户每次刷新即被计算一次。
加在http下
server_tokens off;
限速:限制网速
server {
...
limit_rate_after 10k; #限制下载速度达到100k每秒的时候,进行限制
limit_rate 1k; #限制每秒10k的速度
}
限制并发连接数
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
server {
...
limit_conn perip 10; 限制一个ip地址同时只能发起10个连接
limit_conn perserver 100; 限制一个虚拟主机同时只能发起多少个并发连接
}
限制请求数
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;#每秒产生一个可以访问的请求
server {
...
limit_req zone=one burst=5 ;#最多同时一个ip发起次请求
}
uri和url的区别
url是统一资源定位符号: 不同的资源有不同的路径,我们可以通过这个路径找到 --》绝对路径
uri是统一资源标识符: 是一个概念,不同的资源有不同的标识 --》相对路径
解析过程
匹配顺序
首先匹配 =,其次匹配^~,其次是按文件中顺序的正则匹配,最后是交给 /通用匹配
中台转发
根据不同的url做转发:
location /login{
proxy_pass http://192.168.0.161;
}
location /pic{
proxy_pass http://192.168.0.162;
}
location /music{
proxy_pass http://192.168.0.163;
}
IO 多路复用是一种同步 IO 模型,实现一个线程可以监视多个文件句柄。一旦某个文件句柄就绪,就能够通知应用程序进行相应的读写操作;没有文件句柄就绪时会阻塞应用程序,交出 cpu。IO 是指网络 IO,多路指多个TCP连接(即 socket 或者 channel),复用指复用一个或几个线程,多路复用就是多个请求复用了一个进程/线程。
IO 多路复用就是在一个进程里面监视多个 socket 连接(文件描述符),在获取事件时,先把所有连接传给内核,再由内核返回产生了事件的连接,然后在用户态中再处理这些连接对应的请求,select / poll / epoll 就是三个内核提供给用户态的多路复用调用接口。
select 实现多路复用的方式是,将已连接的 Socket 都放到一个文件描述符集合里,然后调用 select 函数将文件描述符集合拷贝到内核里,内核通过遍历文件描述符集合的方式,来检查是否有网络事件产生,如果有,就将此 socket 标记为可读或可写,然后再把整个文件描述符集合拷贝回用户态里,用户态还需要再次通过遍历的方式找到可读或可写的Socket,然后再对其进行处理。
所以使用 select 这种方式,需要拷贝和遍历文件描述符集合 2 次,且 select 使用固定长度的 BitsMap 表示文件描述符集合,所以它支持的文件描述符个数也有限制。
poll 使用链表结构来存储所有的文件描述符集合,它突破了 select 文件描述符的个数限制,但是它和 select 并没有本质的区别,同样需要两次拷贝和两次遍历文件描述符集合,来找到可读或可写的 socket,时间复杂度为 O(n)。
所以当 socket 集合越大,select 和 poll 在遍历和拷贝的时候带来的开销也很大。
epoll 在内核里维护了红黑树的数据结构,用于保存所有待检测的 socket,红黑树是一种高效的数据结构,增删改的复杂度一般为 O(logn),所以它不需要像 select / poll 那样每次都传入整个 socket 集合,从而减少了内核和用户空间大量的数据拷贝操作。
epoll 还使用了事件驱动机制,它在内核里维护了一个链表专门用来记录就绪事件,当某个 socket 有事件发生时,便可通过回调函数加入到该链表中,所以内核态只会给用户态返回有事件发生的文件描述符集合,而不需要像 select / poll 那样拷贝整个文件描述符集合再遍历,从而大大提高了检测效率。
另外,epoll 支持边缘触发和水平触发两种方式,而 select / poll 只支持水平触发,一般而言边缘触发的效率更高。
轮询 -->默认
对应用服务器的请求以循环方式分发
最小连接数
将下一个请求分配给具有最少活动连接数的服务器
负载均衡的配置
http {
#....省略的配置
upstream scapp1{
least_conn;
server 192.168.2.120;
}
#....省略的配置
}
ip-hash
哈希函数基于客户端的IP地址来确定下一个请求选择哪个服务器。
可以保持会话的一致性,总是让客户机访问到相同的后端服务器,因为它是根据客户机的ip地址进行选择的,相同的ip地址总是访问第一次的哪个后端服务器
负载均衡的配置
http {
...
upstream scapp1{
ip_hash;
server 192.168.2.120;
}
...
}
7层负载均衡:在应用层完成所有的工作,根据http协议来做负载均衡
4层负载均衡:在传输层完成所有的工作,是根据端口号来区分不同的业务的区别:
- 服务数量:4层负载均衡支持的服务数量多,可以支持非http服务;而7层负载均衡只能对http协议做负载均衡
常用服务对应的端口:mysql 3306 sshd 22 http 80 https 443 dns 53- 效率:4层负载均衡的效率要比7层要高,因为做得事情要少
七层负载均衡的配置
http {
...
upstream app{
server 192.168.98.135;
server 192.168.98.140;
server 192.168.98.142;
}
server {
listen 80;
location / {
proxy_pass http://app;
}
}
}
stream {
upstream dns_servers {
least_conn;
server 192.168.136.130:53;
server 192.168.136.131:53;
server 192.168.136.132:53;
}
upstream web_servers {
server 192.168.227.147:80;
server 192.168.227.146:80;
server 192.168.227.129:80;
}
server {
listen 53 udp;
proxy_pass dns_servers;
}
server {
listen 80 ;
proxy_pass web_servers;
}
}
events {
worker_connections 1024;
}
worker_processes 2;
Active Health Checks 主动的健康检查,LB每隔一段时间就去检查下后端的real server的状态,不管是否有client发请求过来,都会去检查。
需要安装nginx plus
Passive Health Checks 被动的健康检查: 当client发请求给LB,然后LB再去转发请求给后端的real server ,这个时候如果后端的服务器出现问题,LB就发现了。被客户机逼着去检查后端的real server
...
upstream backend {
server backend1.com slow_start=30s;
server backend2.com max_fails=3 fail_timeout=30s;
server backend3.com backup;
}
...
backend server是如何知道前端的client的ip地址的?
应用层http协议添加新的ip存储字段 x_real_ip -->负载均衡器
步骤1:在负载均衡器上修改http请求报文头部字段,添加一个X_REAL_IP字段
server {
listen 80;
server_name www.sc.com;
location / {
proxy_pass http://myweb1;
proxy_set_header X-Real-IP $remote_addr;
}
}
将nginx内部的remote_addr这个变量的值,赋值给X-Real-IP这个变量,X-Real-IP这个变量会在http协议的请求报文里添加一个X-Real-IP的字段,后端的real server 服务器上的nginx就可以读取这个字段的值
X-Real-IP 这个变量名可以自己定义,随便取名,后面引用的时候,不区分大小写
步骤2
不使用realip模块:在后端real server上使用这个x_real_ip这个字段
http {
include mime.types;
default_type application/octet-stream;
#增加$HTTP_X_REAL_IP字段
log_format main '$remote_addr - $HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#使用
access_log logs/access.log main;
...
}
在主配置文件nginx.conf里的日志部分调用这个变量,获取x_real_ip的值
使用realip模块:在后端real server上使用set_real_ip_from 192.168.0.160
server{
listen 80;
set_real_ip_from 192.168.0.160;
}
set_real_ip_from 192.168.0.160; 告诉本机的nginx 192.168.0.160 是负载均衡器,不是真正的client
安装
[root@scmaster ~]# yum install httpd-tools -y
命令
ab -n 100 -c 10 http://test.com/
其中-n表示请求数,-c表示并发数
[root@scmaster ~]# ab -c 1000 -n 20000 http://192.168.227.144/
...
Requests per second: 2484.72 [#/sec] (mean) 目前测试的最大并发数(吞吐量)
Time per request: 402.460 [ms] (mean) #用户平均请求等待时间
Time per request: 0.402 [ms] (mean, across all concurrent requests) #服务器平均请求处理时间
...
Requests per second: 2484.72 [#/sec] (mean)
//吞吐率,相当于 LR 中的每秒事务数,后面括号中的 mean 表示这是一个平均值
Time per request: 402.460 [ms] (mean)
//用户平均请求等待时间,相当于 LR 中的平均事务响应时间,后面括号中的 mean 表示这是一个平均值
Time per request: 0.402 [ms] (mean, across all concurrent requests)
//服务器平均请求处理时间
如何提升负载均衡的并发数量
1.增加负载均衡的集群数量和后端服务器的数量
2.软件层面的优化: linux 内核参数调优,nginx的参数调优等优化
worker_connections 2048;
worker_processes 2; [root@lb-1 conf]# ulimit -a
[root@lb-1 conf]# ulimit -n 1000000 允许一个进程可以打开的文件数量
NFS:网络文件系统
NFS(Network File System)即网络文件系统,又称为网络文件共享服务;能通过网络让服务器之间共享目录或文件,必须和RPC共同使用。
NFS分为服务端和客户端。服务端提供共享目录或文件,客户端对服务端共享的目录或文件挂载后,就可以读取到服务端提供的文件或目录.
可以保障网站数据的一致性–》不管负载均衡器将请求分配到哪台后端的服务器,客户机看到的内容是一样。
RPC(远程过程调用协议) 最主要的功能就是在指定每个 NFS 功能所对应的端口号 ,并且回报给客户端,让客户端可以连结到正确的端口上去。 当服务器在启动 NFS 时会随机取用数个端口,并主动的向 RPC 注册,因此 RPC 可以知道每个端口对应的 NFS 功能。
nfs自己并没有去对外监听某个端口号,而是外包给了rpc服务,rpc帮助nfs去监听端口,然后告诉客户机和本机的那个进程对应的端口连续
NFS的优点和缺点
优点:随便一台linux服务器都可以搭建,成本非常低,构建非常容易
缺点:读取速度有限,跟网络质量,磁盘IO,cpu,内存等因素有关,在传统的tcp/ip网络上传输的
SAN:区域存储网络
存储区域网络(Storage Area Network,简称SAN)采用网状通道(Fibre Channel ,简称FC,区别与Fiber Channel光纤通道)技术,通过FC交换机连接存储阵列和服务器主机,建立专用于数据存储的区域网络。
步骤
1.安装nfs的相关软件
[root@nfs-server ~]# yum install nfs-utils -y
2.启动nfs-server服务
[root@nfs-server ~]# service nfs restart
3.编辑共享文件的配置文件/etc/exports,写好具体的共享的目录和权限
[root@nfs-server ~]# vim /etc/exports
/web 192.168.98.0/24(rw,all_squash,sync)
[root@nfs-server ~]# mkdir /web
[root@nfs-server ~]# cd /web
[root@nfs-server web]#vim index.html 创建首页文件
welcome to sanchuang
/web 是我们共享的文件夹的路径–》使用绝对路径 --》需要自己新建
192.168.0.0/24 允许过来访问的客户机的ip地址网段
(rw,all_squash,sync) 表示权限的限制
rw 表示可读可写 read and write
ro 表示只能读 read-only
all_squash :任何客户机上的用户过来访问的时候,都把它认为是普通的用户
root_squash 当NFS客户端以root管理员访问时,映射为NFS服务器匿名用户
no_root_squash 当NFS客户端以root管理员访问时,映射为NFS服务器的root管理员
sync 同时将数据写入到内存与硬盘中,保证不丢失数据
async 优先将数据保存到内存,然后再写入硬盘,效率更高,但可能丢失数据
4.刷新输出文件的列表
#两种刷新方式都可以
[root@nfs-server web]# exportfs -rv
[root@nfs-server web]# service nfs restast
5.关闭防火墙和selinux
[root@nfs-server download]# service firewalld stop
Redirecting to /bin/systemctl stop firewalld.service
[root@nfs-server download]# systemctl disable firewalld
[root@nfs-server download]# getenforce
Disabled
6.挂载nfs服务器上共享的/web目录到客户机上
#安装nfs-utils软件,具有了挂载相关命令
[root@web-server2 ~]# yum install nfs-utils -y
[root@web-server2 ~]# mount 192.168.0.139:/web /usr/local/nginx/html/ 将nfs服务器上的/web目录挂载到客户机的/usr/local/nginx/html/目录上
mount 是挂载的命令,可以理解为一种映射
语法: mount nfs服务器的目录 本地的目录
介绍
高可用(High Availability)通常来描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性->一个服务器坏了,另外一个可以顶替,核心业务基本上不受到影响。
单点故障:某个重要的功能只有一份,没有其他的备份,这个点出现问题,导致全局不能使用->本质上就是一个服务器坏掉了,没有其他的服务器可以顶替
HA软件:keepalived 、HA Proxy、heartbeat
Keepalived 是一个用 C 语言编写的路由软件。这个项目的主要目标是为 Linux 系统和基于 Linux 的基础设施提供简单而强大的负载均衡和高可用性功能。
Keepalived 的2大核心功能
- 负载均衡(loadbalance) :基于ipvs实现的负载均衡–》lvs软件在linux内核里已经安装,不需要单独安装
- 高可用(High Availability):vrrp协议
(虚拟IP地址)vip漂移
master 挂了,vip会漂到backup服务器上
脑裂现象:多台机器出现vip
脑裂的原因
1.vrid(虚拟路由id)不一样->帮派不一样了
2.网络通信有问题:中间有防火墙阻止了网络之间的选举的过程,vrrp报文的通信
3.认证密码不一样也会出现脑裂
脑裂的危害
没有危害,能正常访问,反而还有负载均衡的作用
脑裂恢复的时候,还是有影响的,会短暂的中断,影响业务的
VRRP(Virtual Router Redundancy Protocol,虚拟路由器冗余协议)是一种网络协议,旨在提高网络可用性和冗余。它允许多台路由器共同工作,创建一个虚拟路由器,以确保在某一台路由器发生故障时,网络流量可以无缝切换到另一台路由器,从而保持网络的连通性。
一组路由器协同工作,担任不同的角色,有master角色,也有backup角色
master角色的路由器(的接口)承担实际的数据流量转发任务
Backup路由器侦听Master路由器的状态,并在Master路由器发生故障时,接替其工作,从而保证业务流量的平滑切换。 随时候命,是备胎
选举的过程:
配置keepalived的步骤
1.安装keepalived软件,在2台负载均衡上都安装
[root@lb-1 conf]# yum install keepalived -y
[root@lb2 conf]# yum install keepalived -y
2.修改配置文件
#配置介绍
vrrp_instance VI_1 { #定义一个vrrp协议的实例 名字叫VI_1 第一个vrrp实例
state MASTER #做master角色
interface ens33 #指定监听网络的接口,其实就是vip绑定到
那个网络接口上
virtual_router_id 151 #虚拟路由器id --》帮派 51是帮派的
编号 0~255之间
priority 120 #优先级 0~255
advert_int 1 #宣告消息的时间间隔 1秒 interval 间隔
authentication {
auth_type PASS #密码认证 password
auth_pass 1111 #具体密码
}
virtual_ipaddress { #vip 虚拟ip地址
192.168.0.188
}
[root@lb-1 conf]# cd /etc/keepalived/
[root@lb-1 keepalived]# vim keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 58
priority 120
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.227.188
}
}
#第二个vip
vrrp_instance VI_2 {
state BACKUP
interface ens33
virtual_router_id 60
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.227.199
}
}
[root@lb2 keepalived]# vim keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 58
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.227.188
}
}
#第二个vip
vrrp_instance VI_2 {
state MASTER
interface ens33
virtual_router_id 60
priority 120
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.227.199
}
}
3.启动服务
[root@lb-1 keepalived]# service keepalived restart
[root@lb2 keepalived]# service keepalived restart
4.可以验证vip漂移
关闭master上的keepalived服务
service keepalived stop
在backup服务器上看是否有vip
监控本机的nginx进程是否运行,如果nginx进程不运行就立马将优先级降低30
判断nginx是否运行的方法
1.pidof nginx
2.killall -0 nginx
步骤
1.编写监控nginx的脚本
[root@lb-1 nginx]# cat check_nginx.sh
#!/bin/bash
#检测nginx是否正常运行
if /usr/sbin/pidof nginx ;then
exit 0
else
exit 1
fi
[root@lb-1 nginx]# chmod +x check_nginx.sh
2.在keepalived里定义监控脚本
#定义监控脚本chk_nginx
vrrp_script chk_nginx {
#当脚本/nginx/check_nginx.sh脚本执行返回值为0的时候,不执行下面的weight -30的操作,只有脚本执行失败,返回值非0的时候,就执行执行权重值减30的操作
script "/nginx/check_nginx.sh"
interval 1
weight -30
}
3.在keepalived里调用监控脚本
[root@lb-1 keepalived]# cat keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
#定义监控脚本chk_nginx
vrrp_script chk_nginx {
#当脚本/nginx/check_nginx.sh脚本执行返回值为0的时候,不执行下面的weight -30的操作,只有脚本执行失败,返回值非0的时候,就执行执行权重值减30的操作
script "/nginx/check_nginx.sh"
interval 1
weight -30
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 59
priority 120
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.227.188
}
#调用监控脚本
track_script {
chk_nginx
}
}
vrrp_instance VI_2 {
state BACKUP
interface ens33
virtual_router_id 60
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.227.199
}
}
LVS介绍
内核实现功能lvs的功能,通过ipvsadm管理
(1)LVS 是Linux Virtual Server的简称,也就是 Linux 虚拟服务器,是一个由章文嵩博士发起的自由软件项目,官方站点是www.linuxvirtualserver.orq。现在LVS已经是 Linux标准内核的一部分,因此性能较高。
(2)LVS软件作用:通过LVS提供的负载均衡技术和Linux操作系统实现一个高性能、高可用的服务器群集,它具有良好可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的服务性能。
LVS 优势与不足
优势
高并发连接: LVS基于内核网络层面工作,有超强的承载能力和并发处理能力。单台LVS负载均衡器,可支持上万并发连接。
稳定性强:是工作在网络4层之上仅作分发之用,这个特点也决定了它在负载均衡软件里的性能最强,稳定性最好,对内存和cpu资源消耗极低。
成本低廉: 硬件负载均衡器少则十几万,多则几十万上百万,LVS只需一台服务器和就能免费部署使用,性价比极高。
配置简单:LVS配置非常简单,仅需几行命令即可完成配置,也可写成脚本进行管理。
支持多种算法:支持多种论调算法,可根据业务场景灵活调配进行使用
支持多种工作模型:可根据业务场景,使用不同的工作模式来解决生产环境请求处理问题。
应用范围广:因为LVS工作在4层,所以它几乎可以对所有应用做负载均衡,包括http、数据库、DNS、ftp服务等等
不足
只能实现四层负载均衡,不能实现七层负载均衡
核心组件
LVS的管理工具和内核模块 ipvsadm/ipvs
ipvsadm: 用户空间的命令行工具,用于管理集群服务及集群服务上的RS等
ipvs:工作于内核上的程序,可根据用户定义的集群实现请求转发;
专业术语
VS: Virtual Server 虚拟服务
DR: Director, Balancer 负载均衡器、分发器
RS: Real Server #后端请求处理服务器CIP: Client IP 用户端IP
VIP: Director Virtual IP 负载均衡器虚拟IP
DIP: Director IP 负载均衡器IP
RIP: Real Server IP 后端请求处理服务器IP
LVS负载均衡四种工作模式
NAT模式
网络地址转换模式,进站/出站的数据流量经过分发器(IP负载均衡,它修改的是IP地址) --利用三层功能
DR模式:
直接路由模式,只有进站的数据流量经过分发器(数据链路层负载均衡,因为他修改的是目的mac地址),出站直接从RS到client,LVS和RS共用一个vip–利用二层功能mac地址
TUN模式
隧道模式,只有进站的数据流量经过分发器(必须使用公网ip)
full-nat模式
双向转换:通过请求报文的源地址为DIP,目标为RIP来实现转发: 对于响应报文而言,修改源地址为VIP,目标地址为CIP来实现转发
区别
nat与fullnat的区别:请求和响应报文都经由Director
nat: RIP的网关要指向DIP
fullnat: RIP和DIP未必在同一IP网络,但要能通信
dr与tun的区别: 请求报文要经由Director,但响应报文由RS直接发往Client
dr:通过封装新的MAC首部实现,通过MAC网络转发
tun:通过在原IP报文外封装新IP头实现转发,支持远距离通信
DR模式的lvs实验
在lvs服务器上安装并添加vip
1.cacti 仙人掌: 出图比较好
2.nagios 监控脚本特别多
3.zabbix 集合cacti+nagios的优点: --》企业里使用非常多
4.openfalcon 小米公司开源的监控软件: 京东,滴滴,小米,字节等
5.prometheus :开源的监控软件
作业帮: 唐浩伦 师傅 监控软件 c–》python,go 腾讯
1.tsdb time series database 时序数据库 --》hdd/ssd hdd机械磁盘 hard disk drive ssd固态磁盘 -->solid state drive
promQL : select ,insert等
2.http server web服务
3.pushgateway 中间件(代理)
4.alertmanager 告警的软件
5.exporter 收集数据,采集数据 木马程序 : 安装到被监控的机器上
采集数据:exporter pushgateway 中间件(代理)
存储数据:tsdb
提供数据:http server
显示数据: grafana
告警、报警:alertmanager
第1步:安装prometheus server
源码下载:https://github.com/prometheus/prometheus/releases/download/v2.46.0/prometheus-2.46.0.linux-amd64.tar.gz
1.一键源码安装prometheus
[root@localhost ~]# vim onekey_install_prometheus.sh
#!/bin/bash
#创建存放prometheus的目录
mkdir /prom
#下载prometheus源码(由于github无法访问,故省略该步,手动下载)
#curl -O https://github.com/prometheus/prometheus/releases/download/v2.47.0/prometheus-2.47.0.linux-amd64.tar.gz
#解压并改名
tar xf ./prometheus-2.47.0.linux-amd64.tar.gz -C /prom
mv /prom/prometheus-2.47.0.linux-amd64 /prom/prometheus
#添加到PATH变量
PATH=/prom/prometheus:$PATH
echo "PATH=/prom/prometheus:$PATH " >>/root/.bashrc
#nohub后台执行启动
nohup prometheus --config.file=/prom/prometheus/prometheus.yml &
#关闭防火墙
service firewalld stop
systemctl disable firewalld
2.把prometheus做成一个服务来进行管理
[root@prometheus prometheus]# vim /usr/lib/systemd/system/prometheus.service
[Unit]
Description=prometheus
[Service]
ExecStart=/prom/prometheus/prometheus --config.file=/prom/prometheus/prometheus.yml
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
#重新加载systemd相关的服务
[root@prometheus prometheus]# systemctl daemon-reload
第一次因为是使用nohup 方式启动的prometheus,还是需要使用后kill 的方式杀死第一次启动的进程;后面可以使用service方式管理prometheus了
[root@prometheus prometheus]# ps aux|grep prometheus
root 8431 0.2 3.2 782340 61472 pts/0 Sl 11:21 0:01 prometheus --config.file=/prom/prometheus/prometheus.yml
root 8650 0.0 0.0 112824 980 pts/0 S+ 11:35 0:00 grep --color=auto prome
[root@prometheus prometheus]# kill -9 8431
[root@prometheus prometheus]# service prometheus start
[root@prometheus prometheus]# service prometheus stop
第2步:在node节点服务器上安装exporter程序
1.下载node_exporter源码,上传到节点服务器上
源码下载:https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz
[root@ansible ~]# vim node_exporter.sh
#!/bin/bash
#进入root家目录
cd ~
#下载node_exporter源码(由于github无法访问,故省略该步,手动下载)
#curl -O https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz
#解压node_exporters源码包
tar xf node_exporter-1.6.1.linux-amd64.tar.gz
#改名
mv node_exporter-1.6.1.linux-amd64 /node_exporter
cd /node_exporter
#修改PATH环境变量
PATH=/node_exporter:$PATH
echo "PATH=/node_exporter:$PATH" >>/root/.bashrc
#后台运行,监听8090端口(具体的端口号,可以自己定义,只要不和其他的服务冲突就可以)
nohup node_exporter --web.listen-address 0.0.0.0:8090 &
访问node节点上的metrics
http://192.168.1.194:8090/metrics
第3步: 在prometheus server里添加安装了exporter程序的机器
[root@sc-prom prometheus]# vim prometheus.yml
scrape_configs:
The job name is added as a label `job=` to any timeseries scraped from this config.
- job_name: "prometheus"
static_configs:
- targets: ["localhost:9090"]
#添加下面的配置采集node-liangrui服务器的metrics
- job_name: "node-master"
static_configs:
- targets: ["192.168.98.131:8090"]
重启prometheus服务
[root@prometheus prometheus]# service prometheus restart
安装部署
1.先去官方网站下载
wget https://dl.grafana.com/enterprise/release/grafana-enterprise-10.1.1-1.x86_64.rpm
2.安装
[root@sc-prom grafana]# ls
grafana-enterprise-8.4.5-1.x86_64.rpm
[root@sc-prom grafana]# yum install grafana-enterprise-10.1.1-1.x86_64.rpm -y
3.启动grafana
[root@sc-prom grafana]# service grafana-server start
设置grafana开机启动
[root@prometheus grafana]# systemctl enable grafana-server
监听的端口号是3000
4.登录,在浏览器里登录
http://192.168.98.135:3000/
默认的用户名和密码是
用户名admin
密码admin
导入模板
1.先配置prometheus的数据源
2.导入grafana的模板
模板官网:https://grafana.com/grafana/dashboards
推荐使用的模板编号:1860和8919