端口监测
nmap 命令进行测试
需要装包 nmap
可以进行检测具体的IP的某个端口
nmap -sS -n -p 端口 检测的主机IP | grep open
[ $? -eq 0 ] && echo 端口开放 || echo 端口未开放
HA 高可用集群
软件名:keepalived
服务: keepalived
主配置文件:/etc/keepalived/keepalived.conf(可以在进行配置修改前做个备份)
keepalived可以做两种高可用集群,一个是就单个服务解决单点故障问题的高可用,另一个是结合LVS实现分发器的高可用(起初设计keepalived的目的)
1. 对于普通服务的高可用,也就是在已经搭建了具体服务的服务器上进行操作
先是装包、再配置、最后启服务
对于配置就是修改配置文件,主要修改里面的:
global_defs 全局配置(主要是注销一个设置)
vrrp_instance 具体服务配置
-- 修改HA服务器名
-- 修改是 主、辅 服务器
-- 修改优先级
-- 修改密码
-- 修改VIP
删除后面所有无用的配置
2. 对于 Keepalived + LVS 服务的配置
首先要安装包两个服务的包都要安装 Keepalived 和 ipvsadm ,如果之前有做过LVS服务需要清除其中的所有配置和策略。
然后进行配置,还是要先进行和为普通服务配置高可用一样的操作,再在进行一些特殊配置代替ipvsadm命令的操作,实现让 keepalived 根据具体情况具体配置
最后启动服务(如果设置开机自启动需要把ipvsadm也开启,不过启动服务的时候只需要启动keepalived)
virtual_server 具体的ipvsadm的规则
-- 修改调度算法
-- 修改工作模式
-- 修改各个真实服务器的RIP、权重
-- 开启健康性检查,如果真实服务器出现问题就自动将其移除,如果恢复了自动加回
对于配置文件详细解释(有!结尾的是必须修改的部分内容)
! Configuration File for keepalived
global_defs {
notification_email {
luyu151111@163.com //设置报警收件人邮箱
}
notification_email_from root@localhost //设置发件人的具体信息
smtp_server 127.0.0.1 //定义邮件服务器
smtp_connect_timeout 30
router_id LVS_DEVEL //设置路由ID号
vrrp_skip_check_adv_addr
# vrrp_strict //必须将其注释 !
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance HA服务器名字 { //名字
state MASTER //主服务器为MASTER、辅服务器为BACKUP !
interface eth0 //定义网络接口
virtual_router_id 50 //主辅VRID号必须一致
priority 100 //服务器优先级,优先级高优先获取VIP !
advert_int 1 //每多少秒查看一次
authentication {
auth_type pass
auth_pass 密码 //主辅服务器密码必须一致 !
}
virtual_ipaddress { 预备定义的VIP } //谁是主服务器谁获得该VIP !
}
virtual_server 预备定义的VIP 端口 { //设置ipvsadm的VIP规则 !
delay_loop 6
lb_algo wrr //设置LVS调度算法为WRR !
lb_kind DR //设置LVS的模式为DR !
persistence_timeout 50 //多长时间内同一个客户的访问,将分发给同一个服务器,可以注释掉关闭该功能
protocol TCP
real_server 真实服务器的RIP1 端口 { //设置后端web1服务器真实IP !
weight 权重值 //设置权重 !
TCP_CHECK { //对后端web2服务器的TCP协议进行检查,如果其相关服务如HTTP出问题了,就会自动删除相关的ipvs的配置,如果服务器重新可用了就会再添加到ipvs配置中
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 真实服务器的RIP2 端口 { //设置后端web2服务器真实IP !
weight 权重值 //设置权重 !
TCP_CHECK { //对后端web2服务器的TCP协议进行检查,如果其相关服务如HTTP出问题了,就会自动删除相关的ipvs的配置,如果服务器重新可用了就会再添加到ipvs配置中
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
注:
1. 如果先开启的是辅服务器,那时候还没开主服务器,辅服务器并不会立刻获得vip 进行工作,需要等待一段时间,原因是他要反复确认主服务器不可用,不过也有可能。
2. 每个关键字间,与大括号间都是有空格的
3. 做 Keepalived + LVS 服务的时候需要安装ipvsadm,设置开机自启动的时候,ipvsadm也需要开启
4. 做一些服务的HA高可用的时候,比如HTTP等,如果整个主服务器down机了,那么辅服务器的keepalived就会起作用,抢夺服务,这样保证服务的稳定,可是如果主服务器的核心服务突然出现出问题挂了的时候,keepalived就不会转移服务,这时候需要写脚本,结合nmap检测来实现,基本算法就算nmap发现某个服务挂了就把自己的keepalived关闭,这样服务就会被辅服务器取走从而继续提供服务
但是对于lvs服务的高可用的时候不需要,因为只需要配置中开启检测 keepalived 就会自动完成该功能
HTTP的协议模型
1. HTTP close 一次连接一个请求,依次访问
客户端发送请求建立连接,然后服务端回应请求后断开连接
适用于: 网页信息完整性高,安全性高的网页,每个数据都要认真传递,丢包率低
缺点: 每次服务端只会响应一次请求,每次请求都要消耗资源建立TCP三次握手,导致延迟较大
2. Keep-alive 一次连接多个请求,依次回应
客户端发送请求建立连接,然后服务端回应请求,然后客户端可以继续发送请求,服务端继续回应,直到客户端请求断开
适用于: 一般网页数据的传递
缺点: 服务端必须让客户端知道传输数据的长度以避免无限期的等待,一个一个请求处理,效率不高
3. Pipelining 一次连接多次请求,同步回应
客户端发送请求建立连接,然后客户端可以发送多个请求,服务端多线程同步回复数据
适用于: 大量图片视频的网页,效率极高,延迟低
缺点: 安全性不如前面,丢包率也相对略高
HAProxy
LVS是基于端口的LB负载均衡服务,如果像HTTP他具体域名想给不同的服务器负责,那LVS是不能实现的,这时候就要用HAProxy来实现基于uri的负载均衡
url 是网络地址,也就是从协议http开始,里面有域名,还有具体访问的文件所在网络位置,
uri 是资源位置,一般在web网页名中指的就是域名后面添加的网页文件所在的位置,不过和url关系比较复杂,就不细说了。
搭建HAProxy的步骤:装包配置起服务
装包 yum install haproxy
修改配置文件:/etc/haproxy/haproxy.cfg
启动服务:systemctl restart haproxy
有三个工作模式
mode http 客户端被深度分析后发给服务器
mode tcp 客户端和服务器建立对话,不检查第七层协议
mode health 只做健康状态检查
配置文件组成
default 后面所有部分没有设置的参数就用这个缺省的参数
frontend 根据接受客户端的数据包进行分类处理
backed 根据连接的后端服务器,进行分类部署
listen 吧fronted的基本配置和backed结合起来配置
配置文件内容的详细解释:
global # 采用全局配置
log 127.0.0.1 local2
chroot /usr/local/haproxy
pidfile /var/run/haproxy.pid # 记录haproxy进程的pid信息的文件存放路径
maxconn 4000 # 最大连接数,默认4000
user haproxy
group haproxy
daemon # 创建1个进程进入deamon模式运行
defaults # 默认配置参数,当下面没有具体配置的时候所有配置参数的默认参数
mode http # 默认的模式mode { tcp|http|health }
log global # 采用全局定义的日志
option dontlognull # 不记录健康检查的日志信息
option httpclose # 每次请求完毕后主动关闭http通道
option httplog # 日志类别http日志格式
option forwardfor # 后端服务器可以从Http Header中获得客户端ip
option redispatch # serverid服务器挂掉后强制定向到其他健康服务器
timeout connect 10000 # 如果backend没有指定,默认为10s
timeout client 300000 # 客户端连接超时时间
timeout server 300000 # 服务器连接超时
maxconn 60000 # 最大连接数
retries 3 # 3次连接失败就认为服务不可用,也可以通过后面设置
stats refresh 5s # 统计页面自动刷新时间
stats uri /网络路径 # 自定义统计页面的uri
# 例如: stats uri /status 客户端访问 http://域名/status 就可以查看集群状态
# 创建负载均衡服务
listen weblb 172.25.10.100:80 # 分发服务,创建一个叫weblb的集群,对客户端开放访问的VIP是172.25.10.100,端口是80
cookie SERVERID rewrite # 设置cookie-session服务
balance roundrobin # 指定负载均衡算法
server web1 172.25.10.110:80 cookie cook1 check inter 2000 rise 2 fall 5
server web2 172.25.10.120:80 cookie cook2 check inter 2000 rise 2 fall 5
# 上面是配置server的真实服务器,配置了两个真实web服务器名字分别为web1,web2,后面就是真实服务器的RIP,设置了cookie名,然后每2000ms连接一次,如果出现失败后,就每2ms连接一次,连续连接5次失败就默认该设备有问题,就不发送请求给他了,然后还是每2000ms连接一次,如果某个时候连上了,就再恢复其服务。
# 基于uri进行负载均衡配置的接受数据端配置,创建网络地址分组
frontend netlb 192.168.10.100:80 # 创建一个叫netlb的集群,对客户端开放访问的VIP是192.168.10.100,端口是80
acl url_boy path_beg -i /boy # 客户输入的网络地址是/boy开头的所有请求放入自定义名为url_boy组中
acl url_girl path_beg -i /girl
acl url_html path_end -i .html # 客户输入的网络地址是.html开头的所有请求放入自定义名为url_html组中
acl url_php path_end -i .php
use_backend htmlgrp if url_html # url_html组的请求转发给 htmlgrp的真实服务器组中的服务器
use_backend phpgrp if url_php
use_backend boygrp if url_boy
use_backend girlgrp if url_girl
default_backend htmlgrp # 当用户输入的uri特点不满足上面任意一个uri组,就默认发给htmlgrp服务器组内所有的服务器,然后把完整的uri发给这些服务器,如果服务器中没有网页就不会返回,HAProxy只是做一个转发
# 基于uri进行负载均衡配置的发送数据端配置,创建真实服务器组
backend htmlgrp # 创建一个名为htmlgrp的真实服务器组,上面声明的每个真实服务器组都要创建
balance roundrobin # 分布算法
server weba 192.168.10.110:80 check # 把真实服务器的RIP为192.168.10.110的80端口加入htmlgrp真实服务器组
server webb 192.168.10.111:80 check
总结:
1. 调度服务器只是把请求进行分发,不过也没有数据返回取决于后端真实服务器,他有相应的数据就有返回,如果没有,那就没有,如果客户端访问的时候不是一个具体的文件,那请求转发后,网站服务器能响应就可以返回,不能就不会响应
2. 如果想做个简单的负载均衡,就直接写一个listen即可,如果想做基于uri等按照职能需求区分的负载均衡就需要分别编辑frontend(把接受的数据包分类)、backend(把后端服务器进行分类)
用HAProxy做基于uri的LB负载均衡服务
0.准备网站服务器(web主机,不过负载均衡集群中会有很多web主机,每个主机都要做一样的部署),LB调度器(haproxy)
0.1 装包(apache软件包、数据库软件包、php解析软件包、php连接数据库软件包)
[root@web ~]# yum install httpd mariadb-server php php-mysql
0.2 启动服务
[root@web ~]# for i in httpd mariadb
do
systemctl restart $i
systemctl enable $i
done
0.3. 测试web服务的html和php解析情况(编写一个html文件和php文件,让客户端访问一下即可)
[root@web ~]# echo "$HOSTNAME" > /var/www/html/test.html
[root@web ~]# echo '<?php
$x=mysql_connect("localhost","root","数据库root密码(刚刚创建的数据库root密码是空,这引号内什么都不写即可)");
if ($x) {echo "'$HOSTNAME' mariab OK";} else {echo "'$HOSTNAME' mariab error";}
' > /var/www/html/test.php
1. 搭建haproxy服务器
1.1 安装软件包haproxy
[root@haproxy ~]# yum install -y haproxy
1.2 修改配置文件/etc/haproxy/haproxy.cfg(配置如上,如果要动静分离就根据uri的结尾来分,如果做基于功能模块的负载均衡就按照uri开头分)
1.3 启动服务
[root@haproxy ~]# systemctl restart haproxy
2. 客户端访问测试
对比Nginx、LVS、HAProxy的负载均衡作用的区别
Nginx
用来做HTPP的web服务的情况最多
优点:
1. 不单单可以做LB,还可以HA高可用集群,也可以做web服务
2. 支持拓展正则,可以根据业务需求做调整,可以做动静结合
3. 可以支持极高的并发量
缺点:
1. 只支持http协议
2. 监控检查只能通过端口
3. 效率和负载最低
LVS
LVS/DR 作为LB负载均衡中,用的最多的集群结构
优点:
1. 负载能力强,效率最高
2. 应用面广,几乎可以用在所有应用提供负载均衡
缺点:
1. 本身不能做健康检查,但是可以配合keepalived
2. 只能记录端口的,不能做动静分离等
3. 如果架构庞大,LVS/DR配置会很繁琐
HAProxy
通常作为web网站的负载均衡服务
优点:
1. 支持cookie、session功能
2. 有友好的检查服务器健康性的功能
3. 可以根据业务需求做区分,效率和负载中等
4. 支持TCP,可以对数据库做负载
缺点:
1. 不支持拓展正则,匹配能力不强,只能勉强做点区分
2. 不支持apache日志
配置中的对比记忆 | ||
服务 | 对输入数据分类 | 对数据发送进行分类 |
Nginx | upsteam | local |
HAProxy | frontend | backend |