负载均衡
多台服务器以对称方式组成一个服务器集合,每台服务器具有等价地位,单独对外服务。通过分担技术,将外部发送来请求均匀分配到对称结构中某一台服务器,接受到请求服务器独立回应客户。可以快速获取重要数据,解决大量并发访问。
web负载均衡办法
1)用户手动选择
2)DNS轮询方式(同一域名多个IP,随机解析到其中一个IP)
缺点:可靠性低 负载分配不均衡(服务器不能充分利用)
3)四/七层负载均衡设备
1)物理层(物理联网媒介)
2)数据链路层(控制网络层和物理层之间通信。协议:DSLC,HDLC,PPP,STP,帧中继)
3)网络层(路由选择。协议:IP,IPX,RIP,OSPF)
4)传输层(缓冲作用,提供可靠,无误传输。TCP,UDP,SPX)
5)会话层
6)表示层
7)应用层(Telnet,FTP,HTTP,SNMP)
第四层负载均衡将一个internet上合法IP映射多个内部服务器IP(虚拟IP)地址,对每次TCP请求动态使用其中一个IP(主要用第四层交换机)
第七层负载均衡对访问流量高层控制,适合HTTP服务器集群。
设备:1)硬件四/七层负载均衡交换机
2)软件四层负载均衡(LVS)
3)软件七层负载均衡(基于HTTP反向服务器,nginx)
4)多线多地区智能DNS解析与混合负载均衡方式
Nginx作为负载均衡
nginx负载均衡模块为upstream,主要分配方式: 1)轮询(默认方式) 每个请求按时间顺序逐一分配到不同的后端服务器
2)weight 指定轮询几率,也就是访问率
3)ip_hash 请求结果按照ip的hash结果分配后端服务器,保证同一个ip总是访问同一个服务器
实例:
upstream tomcat_server {
server 127.0.0.1:8080 down; #标记服务器不参与负载,通常和ip_hash一起使用
server 127.0.0.1:8081 weight = 5; #服务器负载的权重
server 127.0.0.1:8082 ;
server 127.0.0.1:8083 backup; #如果所有的非备份服务器都宕机或繁忙,则使用本服务器(无法和ip_hash指令搭配使用)
server 127.0.0.1:8084 max_fails=3 fail_timeout=30s; #允许请求失败次数 失败后,暂停的时间 (只有一台服务器时候,max_fails和fail_timeout参数不会被处理)
}
upstream tomcat_server {
ip_hash;
server 127.0.0.1:8080;
server 127.0.0.1:8081 down;
server 127.0.0.1:8083;
}
可以使用nginx+keepalived实现双机的高可用,但还没有实验过。
定时切割nginx日志的脚本
创建脚本: vi vi /usr/local/nginx/sbin/cut_nginx_log.sh
输入内容:
#!/bin/bash
# This script run at 00:00# The Nginx logs path
logs_path="/usr/local/nginx/logs/"
mkdir -p ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/
mv ${logs_path}access.log ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/access_$(date -d "yesterday" +"%Y%m%d").log
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
设置crontab,每天凌晨00:00切割nginx访问日志
crontab -e
输入以下内容:
00 00 * * * /bin/bash /usr/local/nginx/sbin/cut_nginx_log.sh
内核参数优化
vi /etc/sysctl.conf
net.ipv4.tcp_max_tw_buckets = 6000 //timewait的数量,默认是180000。
net.ipv4.ip_local_port_range = 1024 65000 //允许系统打开的端口范围。
net.ipv4.tcp_tw_recycle = 1 //启用timewait快速回收。
net.ipv4.tcp_tw_reuse = 1 //开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接。
net.ipv4.tcp_syncookies = 1 //开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理。
net.core.somaxconn = 262144 //web应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,而nginx定义的NGX_LISTEN_BACKLOG默认为511。
net.core.netdev_max_backlog = 262144 //每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。
net.ipv4.tcp_max_orphans = 262144 //系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤儿连接将即刻被复位并打印出警告信息。这个限制仅仅是为了防止简单的DoS攻击,不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后)。
net.ipv4.tcp_max_syn_backlog = 262144 //记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M内存的系统而言,缺省值是1024,小内存的系统则是128。
net.ipv4.tcp_timestamps = 0 //时间戳可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉。
net.ipv4.tcp_synack_retries = 1 //为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量。
net.ipv4.tcp_syn_retries = 1 //在内核放弃建立连接之前发送SYN包的数量。
net.ipv4.tcp_fin_timeout = 1 //如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60秒。2.2 内核的通常值是180秒,你可以按这个设置,但要记住的是,即使你的机器是一个轻载的WEB服务器,也有因为大量的死套接字而内存溢出的风险,FIN- WAIT-2的危险性比FIN-WAIT-1要小,因为它最多只能吃掉1.5K内存,但是它们的生存期长些。
net.ipv4.tcp_keepalive_time = 30 //当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时。
/sbin/sysctl -p (使设置生效)
PS:感谢网络,感谢搜索,感谢富有分享精神的人。