涉及内容比较杂乱,请耐心阅读,为自己阅读实践过程中摘要
设备:
服务器IBM x3850 x6
戴尔 R720
防火墙,华为 USG5120
交换机 (机房) 华为5700 二层,48GE电口
路由器 H3c ER3180G
交换机 s1048(办公司网络)
报错集合:
一、程序僵死:获取url或者是业务记忆,找出nginx的出口和location。看nginx.comf和upstream,获取真实的real server。原来是server问题(1、数据库用户改密码报错。2、)
二、nginx:nginx前期要main属性和location访问参数配置。
main: worker_processes 工作内核占用
access.log 访问日志
error_log 错误日志
limit_rate 限速模块
gzip 数据压缩
location :expires 客户端浏览器缓存时间
proxy_set_header 完整获取客户端ip与服务端realserver ip
还有if判断嵌套 ----因为涉及到dcn的ip,只有dcn的ip而且端口为80才,,,,if host=10.**.**.***
client_max_body_size 配置上传文件大小
测试环境,nginx服务器10次链接中有一次404
在web服务器log中未找到报错,信息,排除tomcat,重点在nginx
在nginx服务器上curl我的tomcat链接,无错
原来是在nginx.conf中设置了limit,limit_conn
linux系统优化
基本的,如果不设计端口转发,我会关了【防火墙】,【selinux】
关闭【sendmail】等一些工具,关闭【图形化界面】,【字符集】
应用服务器优化:
基本的+
【处理器子系统调优】:开启超线程,处理器,重要性不言而喻,cpu性能经常是瓶颈,Hyper-Threading(超线程功能,基于SMP 内核),
Hyper-Threading 在操作系统里将一颗处理器虚拟化为两颗使用,使得处理器,同一时刻,可以执行两个线程或进程,
配置Linux 内核如何更新dirty buffers 到磁盘,磁盘缓冲区用于暂存磁盘的数据,磁盘缓冲区速度
内核优化中的opnefile(65535)
web服务器优化:
linux内核参数调优/etc/sysctl.conf
关闭如下参数可以防止黑客对服务器IP 地址的攻击(器忽略来自被列入网关的服务器的重定向,只接受可靠的重定向)
sysctl -w net.ipv4.eth0.secure_redirects=0
sysctl -w net.ipv4.lo.secure_redirects=0
sysctl -w net.ipv4.default.secure_redirects=0
sysctl -w net.ipv4.all.secure_redirects=0
拒绝接受广播风暴或者smurf攻击
sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1
忽略所有的ucmp包或者ping
sysctl -w net.ipv4.icmp_ignore_bogus_error_responses=1
针对tcp与UDP的调优,支持time-wait套接字, 每个TCP 传输都包含远程客户端的协议信息缓存,所以有利于提高性能
忽略所有icmp与ping
sysctl -w net.ipv4.tcp_tw_reuse=1
避免因为死套接字造成内存溢出 (套接字:Socket通信协议 ,目标ip和端口,tcp套接字通信必须保持一直链接)
sysctl -w net.ipv4.tcp_fin_timeout=1
keepalive检测tcp链接,链接缺省时候,丢掉,防止内存过度使用
tcp_keepalive_time 启用keepalive,建立连接而未发送数据,防止空连接攻击,(可写20分钟)+
sysctl -w net.ipv4.tcp_keepalive_time=1800
对于所有协议的队列,设置系统最大发送缓存,接受缓存到8m
sysctl -w net.core.wmem_max=8388608
sysctl -w net.core.rmem_max==8388608
忽略所有icmp与ping
sysctl -w net.ipv4.tcp_tw_reuse=1
linux内核参数调优/etc/sysctl.conf
echo 1 > /proc/sys/net/ipv4/ip_forward 开启路由转发
/proc/sys/net/ipv4/tcp_wmem 最大tcp数据接收-发送缓存
shmmax 共享内存段的最大尺寸,oracle应该为2G
open_files
net.ipv4.ip_local_port_range = 1024 65000 向外连接端口的范围
tcp_keepalive_time 启用keepalive,建立连接而未发送数据,防止空连接攻击,(可写20分钟)
关于perl puppet
echo 1 > /proc/sys/net/ipv4/ip_forward 开启路由转发
/proc/sys/net/ipv4/tcp_wmem 最大tcp数据接收-发送缓存
shmmax 共享内存段的最大尺寸,oracle应该为2G
TCP SYN cookies 保护服务器避免受syn-flood 攻击 (我对这些乱七八糟的攻击没有研究,反正对于web服务器我会注意到这些系统自带的防攻击)
【tomcat】启动一般会所在用户的环境变量
如果tomcat本身指定的话:vi bin/setclasspath.sh
JAVA_HOME=/mall/jdk/jdk1.7.0_80
JRE_HOME=/mall/jdk/jdk1.7.0_80/jre
为httpsession安全性考虑,防止客户端脚本读取session cookie内容诸如进行CSRF/XSS恶意http攻击,可在tomcat6的
conf/context.xml配置文件中配置 <Context useHttpOnly="true"> 为自定义cookie及属性添加HttpOnly属性,在set-Cookie头部信息设置时可以添加"httponly"
tomcat访问url不需要加项目名,直接IP+port
<context path="" docBase="/home/tomcat/tomcat8080/webapps/jsjp" reloadable=“true”>
【raid】
raid0 :两块硬盘以上,合成一块,提高读写速度
raid1:两块硬盘,又称为镜像方式,数据冗余,只有一半磁盘空间有效,另一半用来冗余,相比raid0,容量减半,速度不变,
raid5:raid0月raid1的折中方案,主流,至少三块硬盘,读取速度≈raid0 写入速度<单个磁盘,但是raid5的磁盘利用率大于raid1,数据写入时,按照一块硬盘的方式直接写入这块硬盘,
同时写入校验信息,读取写入的时候,分别从三块硬盘上读取数据,再通过校验信息进行校验,一块硬盘顺坏,其他两块会计算出那一块的硬盘内容,raid5:只允许一块硬盘损坏
当顺坏时候,替换上去新硬盘,raid自动利用奇偶校验信息重建此硬盘上的数据,保持raid5的高可靠性
存储:只占用一个磁盘容量,应该三块硬盘一样大,否则以最小为准。
raid0+1:又称raid10,至少4块硬盘,简单的理解,多个磁盘组成raid0阵列,再进行冗余
boot:linux text 字符型安装界面
boot:linux rescue 系统修复
touch -a 1.sh 将文件的访问时间改为当前时间
touch -m 1.sh 将文件的修改时间改为当前时间
cat /proc/cpuinfo |grep "physical" 物理cpu个数
cat /proc/cpuinfo |grep "process" 逻辑cpu个数
cat /proc/cpuinfo |grep "cpu.cores" |uniq 每个物理cpu中core的个数(核数)
配置服务器应用时,应以逻辑cpu的个数为准,物理cpu*核数=逻辑cpu个数 ,不等的话,则服务器支持超线程技术
dd if = /dev/cdrom of = /root/cdrom_bak.iso
备份整个分区:dd if=/dev/sda2 of=/opt/bak/sda2.bak
恢复 dd if=/opt/bak/sda2.bak of=/dev/sda2
查询软件包 rpm -qf /bin/bash
抓包 从本地eth0到172
crontab
* * * * * /mall/web/tomcat/bin/start.sh
分 时 日 月 周
1 8-23 * * * 每天8点到23点的每小时一分钟执行(相当于每小时执行) 或者 * 8-23/1 * * *
icmp 是tcp/UDP协议的子协议,是internet控制报文协议,用于传输出错报告控制信息
内存分配及使用情况可以通过jmap、jstat命令查看
rsync+inotify(同步+立即同步)
0000 0001 - 0111 1111: A类,1-127
1000 0000 - 1011 1111:B类, 128-191
1100 0000 - 1101 1111: C类,192-223
1110 0000 - 1110 1111:D类, 224-239
1111 0000 - 1111 1111: E类, 240 -255
A: 126个
每个网络中可以容纳的主机数:2^24-2
B: 2^14
每个网络中可以容纳的主机数:2^16-2
C: 2^21
每个网络中可以容纳的主机数:2^8-2
[[email protected] ~]$
[[email protected] ~]$
[[email protected] ~]$
[[email protected] ~]$ shutdown -h now
Error: Too many open files
task_`date +%Y%m%d`.log
netstat -nat |grep -i "80"
查看80端口的链接状态
netstat -nat|grep ‘:80\>‘
PS1=[\[email protected]\h \W]\$
【redis】
tomcat之间session的共享
redis是一个高可用的key-value存储系统,能够作为缓存框架和队列
redis可以缓存在disk与mem上,memcache只能缓存在mem
app sever与数据库都是cpu密集型:cpu bond 占用cpu资源比较大
memcache
http请求数据,检查数据存在memcache中,不是的话,查询数据库and返回给客户端,再缓存到memcache中每当变下次查询
更新数据时候,同事更新memcache中数据,保持一致
1.只查看该进程:ps -ef | grep 11345
2.查看该进程打开的文件:lsof -p 11345
3.查看内存分配:lcat /proc/11345/maps
4.查看堆栈:pstack 11345
5.查看发出的系统调用:strace -p 11345
6.查看调用库函数:ltrace -p 11345
用top -H -p pid命令查看进程内各个线程占用的CPU百分比
top -H -p 14094
top中可以看到有107个线程,但是下面9个线程占用CPU很高,下面以线程14086为主,分析其为何high CPU
使用gstack命令查看进程中各线程的函数调用栈
#gstack 14094 > gstack.log
僵死进程 ps -elf|grep Z
cd /proc/9301/
11 查看pid进程的程序在哪 cwd -> /mall/web/tomcat-client-life-circle/bin
挂载U盘 mount -t vfat(ext4) /dev/sda1 /mnt/usb
挂载光盘 mount -t iso9660 /dev/hda /mnt/cdrom
挂载软盘 mount -t msdos /dev/fdo /mnt/floppy
nas 挂载
mount 172.18.41.200:/vx/sm02 /data -o nolock
mount 172.18.41.201:/vx/bak /backup -o nolock
more /etc/login.defs 创建用户UID范围与口令
more /etc/default/useradd 创建用户默认设置
groupadd -g 10086 mygroup
useradd -g chen -G mygroup -d /opt/myhome
-s /bin/bash -u 10086
usermod -L newchen oldchen
usermod -d /home/chen chen 修改
:set termencoding=gbk 中文乱码
tar -zcvf --exclude
LVM是建立在磁盘分区和文件系统之间的一个逻辑层,管理员利用LVM可以在磁盘不用重新分区的情况下动态的调整分区的大小,
如果系统新增了一块硬盘,通过LVM就可以将新增的硬盘空间直接扩展在原来的磁盘分区上
把/home的分区大小改为100M,不能损坏原有的数据。
df -h
umount /home/
e2fsch -f /dev/sda2
sizezfs /dev/sda2 100m
lvreduce -L 100m /dev/sda2
mount -a
【/etc/logrotate.d/nginx】
/mall/web/nginx/logs/8080_port.access.log {
daily
copytruncate
create
olddir /mall/web/nginx/logs/logrotate/8080
dateext
extension -%Y%m%d
rotate 90
compress
missingok
}
chkconfig --add nginx
chkconfig nginx on
chkconfig --list nginx
chkconfig ip6tables off
chkconfig --level 345 mysqld on
【时间同步】
时间同步(依靠另一个服务器)
/etc/xinetd.d/time-stream NO->YES
/etc/init.d/xine stop/start restart
rdata -s IP(另一个) 同步时间,以另一个IP时间为准
service xinetd restart 以此同步到另一台服务器时间
/dev/hda2 hd:IDE硬盘 a表示第一块硬盘
/dev/sda2 sd:scsi硬盘
1-4(主分区或扩展分区) 5----逻辑分区
硬盘的容量 = 主分区的容量 + 扩展分区的容量
扩展分区的容量 = 各个逻辑分区的容量之和
etc/fstab 开机自动挂载分区列表,需要开机自动挂载的分区,都可以
etc/sysctl.conf 系统内核参数配置文件
etc/service 定义系统服务与端口的对应关系
etc/syslog.conf 系统日志输入文件
/usr/lib 或者 /local/lib 系统使用的函数库目录
fsck -rv -t exts /dev/sda1 修复磁盘分区
netstat -rn :显示当前系统路由信息
netstat -tlnpu :显示当前已经启动网络连接和对应的端口信息
netstat -atunp:当前系统上处于网络连接状态的资源信息
netstat -nat :当前所有端口的网络连接的状态
traceroute -i eth0 -s 192.168.60.251 -w 10 www.baidu.com 100
跟踪从本机到网络www.baidu。com的数据包过程,指定eth0网络接口发送数据包,同时指定本地发送数据包的ip为192.168.60.251 设置超时时间为10秒,发送的数据包大小为100bytes
可以看出,本机到百度对应的ip地址经过了18个路由。
route add -net 10.35.40.0 netmask 255.255.255.0 gw 10.35.40.254 gw只能是本网段的gw
写进/etc/rc.local,开机自启动
iptables -t nat -I POSTROUTING -s 10.35.40.0/24 -j SNAT --to-source 10.35.40.222 添加一条iptables策略
iptables -t mangle -I PREROUTING -d 192.168.1.193 -p tcp -m tcp --dport 80 -m mac \! --mac-source 00:0C:29:20:D7:3F -j MARK --set-mark 0x6 开通对方ip与端口,允许对方80端口通信
iptables -A INPUT -i eth0 -p tcp --drop 80 -j accept
iptables -A OUTPUT -p tcp --sport 80 -m%d stat --stat ESTABLISHED -j ACCEPT
/etc/init.d/iptables save
/etc/sysconfig/iptables中可以看到防火墙策略
https:openssl加密 用户和服务器进行web请求时,数据就会加密
验证域名完整性和可靠性
LAN: local area network,局域网
WAN:wide area network,广域网
WLAN: wireless LAN,无线局域网
VLAN: virtual LAN,虚拟局域网
VPN: Virtual Private Network,虚拟私人网络
wan接口是外网接口,是用来连接互联网或局域网等外部网络的。
lan接口是内网接口,是用来连接计算机终端或其他路由器等终端设备的。
正在使用文件清空cat /dev/null > 文件名
网络:
TCP 和UDP协议属于传输层协议,提供端对端的接口,TCP提供IP环境下的数据可靠传输,
它提供的服务包括数据流传送、可靠性,TCP支持的应用协议主要 有:Telnet、FTP、SMTP等;
UDP支持的应用层协议主要有:NFS、SNMP(简单网络管理协议)、DNS、TFTP等.
【服务器运维】
1、某一台服务器部署多个web站点,其中一个cpu占用达到100%,如何找出有问题的web站点?
通过你的站点,推断出外网IP、端口与内网web集群,找到这组real server,这时候确定是哪个java进程,可以jmap一下看内存使用情况,这时候开始检查系统的资源,cpu使用情况
top -H -p pid 返回开发商量一下
2、了解哪些主流web服务器,各自特点?
tomcat jboss weblogic webshpere
tomcat 与jboss类型相似,没有b/s结构
属于轻量级服务器,简单实用,需要做集群服务,只能依靠负载
weblogic与webshpere,适合单个消耗大的程序,可以使用其做集群服务,有b/s架构,略微复杂,集群服务可以调优使用。
3、如何查找某一文件被哪个进程打开?
ps -fe|grep filename
4、找出access.log中访问top 10的ip地址?
awk -F ‘{print $1}‘ access.log |sort |uniq -c |sort -n -r |head -n 10
5、cacti与nagios的区别,cacti如何监控mysql?
nagios特点:监控最基本的资源信息,
bin:可执行程序所在
etc:配置文件
libexec:插件,监控项的脚本,check——mem
var:日志
etc:nagios.cfg:主配置文件,可定义所有待监控项,已经定义配置文件,user、group、超时时间
nrpe.cfg :定义主机ip,被监控机ip,监控项,监控等级
command.cfg :定义配置文件被使用,web页面上的监控项
localhost.cfg:监控主机,可以写上其他被监控机器
contacts.cfg:邮件接受者
6、不小心在系统下执行了 chmod -x/sbin/chmod 怎么办?
sbin下面文件较少,可以对比其他系统来
7、linux下,指定DNS服务器的配置文件是?
/etc/resolv.conf nameserver 8.8.8.8
网卡配置/etc/sysconfig/network-script/eth0 DNS1=8.8.8.8
8、在某行crontab配置中 执行时间配置段为 */30 * 3 * *,表示什么意思
每月3号 的 每半小时
9、说明TCP建立连接过程?
(1)客户端发送一个SYN包给服务器,然后等待应答。
(2)服务器端回应给客户端一个ACK=1、SYN=1的TCP数据段。
(3)客户必须再次回应服务器端一个ACK确认数据段。
10、如何将本地80端口请求转发到8080端口,当前主机IP为192.168.2.1
1、可以使用nginx转发
server ---listen 80
localtion {
proxy_pass http://192.168.2.1:8080
}
2、使用ip隧道
ssh -L *:80::8080 192.168.2.1
11、编写个shell脚本,将/usr/local/test 目录下大雨100K的文件转移到/tmp 目录下大雨100K的文件转移到/tmp下
shpwd=`pwd`
file_list=`find /usr/local/test/ -size +100K --print`
for i in $file_list
do
mv $i /tmp
cd $shpwd
done
12、如何查看占用端口8080的进程
netstat -lntp|grep 8080 pid/java or ....
lsof -i:8080
13、如何用mysql命令进行备份和恢复
备份 mysqldump -uroot -p mydb > mydb_20161110.sql
导入:mysql -uroot -p use mydb (一定选定数据库) source /home/mysql/back/mydbbak.sql (导入库)
14、apache有几种工作模式,分别介绍下其特点,并说明什么情况下采用不同的工作模式。
prefork,worker和event
15、用iptables添加一个规则允许192.168.0.123访问本机3306端口。
iptables -I INPUT 1 -p tcp -m tcp --dport 3306 -s 192.168.0.123 -j ACCEPT
16、nginx如何防止DDOS攻击?
主要使用nginx的http_limit_conn和http_limit_req模块来防御。
ngx_http_limit_conn_module 可以限制单个IP的连接数,
ngx_http_limit_req_module 可以限制单个IP每秒请求数
http{}
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s; 所有访问ip 限制每秒10个请求
limit_conn_zone $binary_remote_addr zone=addr:10m;
location {}
limit_req zone=one burst=5 nodelay; 允许超过频率限制的请求数不多于5个,假设1、2、3、4秒请求为每秒9个,那么第5秒内请求15个是允许的 反之,如果第一秒内请求15个,会将5个请求放到第二秒,第二秒内超过10的请求直接503,类似多秒内平均速率限制。
limit_conn addr 1; // 限制同一时间内1个连接,超出的连接返回503
17、web访问慢的,如何定位问题解决?
1、是否普遍较慢?先环节:电信运行商、自己pc机、浏览器
2、本网站丢包情况 cmd - tracert www.***.com 再排除一下DNS劫持是否
3、看一下web服务器与应用服务器的资源问题,负载与异常日志
1、其他web集群访问情况,是否只有这个web站点问题,只有这个web站点问题
查负载压力是否很大,错误日志,web服务器资源问题
应用服务器的中间件错误日志,进程cpu、内存占用以及web服务器资源
4、缓存的命中与磁盘读写速率
18、简述linux启动过程?
1、加载BIOS
2、读取MBR-预启动信息,分区表
3、启动boot, 初始化硬件、内存
4、加载内核
5、根据init运行级别
6、启动配置项
7、登录用户
19、free命令各行意义
total used free shared buffers cached
Mem: 29261 28798 463 0 267 18331
-/+ buffers/cache: 10199 19062
Swap: 16383 545 15838
buffer/cache
20、使用sed替换a.tmp文件内admin为administrator
sed -i ‘s/admin/administrator/g‘
21、以#和:为分隔符,使用awk打印a.tmp第三列内容
awk -F‘[#:]‘ ‘{print $3}‘ a.tmp -F/ -F"/"
22、列举测试硬盘读写速度方法
hdparm -tT /dev/sda
23、使用shell编写脚本,备份mysql的test库,并通过rsync同步到10.1.2.3(备份目录名:DBBACK)
#!/bin/bash
file_data=`date +%Y%m%d.sql`
cd /home/mysql_db/
mysqldump -uroot -pmysqlpasswd mydb > "$file_date".sql
rsync -azv --delete /home/mysql_db/ [email protected]:/DBBACK/
24、用一行命令实现,统计80端口所有连接状态,并按照连接状态由大到小排列显示
netstat -nat|grep ‘:80\b‘ |grep established |sort -n -k 3
25、写一个脚本,实现批量增加30个用户,用户名为user01-30,密码为随机的大小写
#!/bin/bash
for ((i=1;i<6;i++))
do
useradd user"$i"
done
26、select count(*) from t_hosts a where a.Cpu_num=24;
27、mysql中查看一个表的结构,使用什么命令
desc t_tables_name
【虚拟IP】
一、可以使用keepalived做双机搞可用
运用场景:(1)keepalived做高可用,前端负载使用LVS,nginx作为中层代理,这是两台服务器:一台tomcat+nginx+LVS+keepalived。另一台一样。可以加N台应用服务器(tomcat),nginx的80端口代理所有的tomcat即可
(2)对于高负载,数万转发,haproxy也不错,两台haproxy N太nginx N台tomcat haproxy负载nginx,每个sever就是一个nginx,一个nginx就是一组服务
1:keepalived.conf配置文件略过
2:关于双机的VIP做iptables策略,也就是双机80端口通信
[[email protected] ~]#iptables -t mangle -I PREROUTING -d 192.168.1.193 -p tcp -m tcp --dport 80 -m mac \! --mac-source 00:0C:29:20:D7:3F -j MARK --set-mark 0x6
[[email protected] ~]# /etc/init.d/iptables save
192.168.1.193为虚拟IP,80为端口,00:0C:29:20:D7:3F为cas2机器上网卡的mac
[[email protected] ~]#iptables -t mangle -I PREROUTING -d 192.168.1.193 -p tcp -m tcp --dport 80 -m mac \! --mac-source 00:0C:29:40:95:93 -j MARK --set-mark 0x7
[[email protected] ~]# /etc/init.d/iptables save
192.168.1.193为虚拟IP,80为端口,00:0C:29:40:95:93为cas1机器上网卡的mac,
在/etc/sysconfig/iptables中可以看到防火墙策略
二、简易做VIP,没有办法像keepalived做timeout ,conn_limt,file_time等调优
运用场景:对nginx做负载,nginx作为负载与前端,VIP即为调度器。2台nginx+N台tomcat
说明(来自《实战Nginx:取代Apache的高性能web服务器》 116页):
如果只有一台nginx负载均衡服务器,当然服务器发生故障时,则会导致整个网站无法访问,因此,我们需要两台以上的nginx负载均衡服务器,实线故障转移与高可用,
双机高可用一般通过虚拟IP(也成飘逸IP)方式来实现,基于linux/unix的IP别名技术,双机高可用方式目前分为两种
第一种为一台主服务器+一台热备服务器,正常情况下,主服务器绑定一个公网虚拟IP,提供负载均衡服务,热备机处于空闲,当住服务器发生故障,热备接管主服务器IP,提供负载均衡服务。
第二种:为两台负载均衡服务器都处于活动状态,各自绑定一个公网IP。提供负载均衡服务,当其中一台服务器发生故障时,另一台服务器接管发生故障的虚拟ip,第一种方式较为常见,第二种需要多一个公网ip
第一种:
realip1 61.1.1.4
realip2 61.1.1.5
VIP 61.1.1.2
主机61.1.1.4:
[[email protected] ~]# /sbin/ifconfig eth0 61.1.1.2 broadcast 61.1.1.255 netmask 255.255.255.0 up
[[email protected] ~]# /sbin/route add -host 61.1.1.2 dev eth0:1
[[email protected] ~]# /sbin/arping -I eth0 -c 3 -s 61.1.1.2 61.1.1.1
用户访问www.***.com(虚拟ip 61.1.1.2)实际访问的是主机61.1.1.4,而备机61.1.1.5处于空闲状态
如果主机61.1.1.4发生故障,备机61.1.15将几秒内接管虚拟IP61.1.1.2 与自己绑定,并发送ARPing包给IDC的公网网关刷新MAC地址
主机61.1.1.5:
[[email protected] ~]# /sbin/ifconfig eth0 61.1.1.2 broadcast 61.1.1.255 netmask 255.255.255.0 up
[[email protected] ~]# /sbin/route add -host 61.1.1.2 dev eth0:1
[[email protected] ~]# /sbin/arping -I eth0 -c 3 -s 61.1.1.2 61.1.1.1
这时,用户访问www.****.com(虚拟ip 61.1.1.2)实际访问的是备机61.1.1.5 从而实现故障转移与高可用,避免了单点故障
第二种,
realip1 61.1.1.4 VIP 61.1.1.2
realip2 61.1.1.5 VIP 61.1.1.3
在服务器61.1.1.4上执行
[[email protected] ~]# /sbin/ifconfig eth0 61.1.1.2 broadcast 61.1.1.255 netmask 255.255.255.0 up
[[email protected] ~]# /sbin/route add -host 61.1.1.2 dev eth0:1
[[email protected] ~]# /sbin/arping -I eth0 -c 3 -s 61.1.1.2 61.1.1.1
在服务器61.1.1.5上执行
[[email protected] ~]# /sbin/ifconfig eth0 61.1.1.3 broadcast 61.1.1.255 netmask 255.255.255.0 up
[[email protected] ~]# /sbin/route add -host 61.1.1.3 dev eth0:1
[[email protected] ~]# /sbin/arping -I eth0 -c 3 -s 61.1.1.3 61.1.1.1
用户访问www.****.com(虚拟IP61.1.1.2和61.1.1.3)实际上是根据DNS轮询访问两台负载均衡服务器,两台均处于活动状态。
我们也可以写脚本
LVS 与 haproxy nginx比较
lvs配置比较复杂,但是转发能力较强,可以转发 数百万个请求 ,提高缓存命中率,做持久链接但会破坏负载均衡效果 转发能力haproxy》nginx
做持久链接,长链接 ,确保一个访问只和一台服务器通信,
nginx:sticky:确保长连接时候,还保证与服务器压力均衡
转发性能上 lvs>haproxy>nginx
功能上的:lvs简陋 健康检查功能:lvs与haproxy
nginx强大
负载均衡器的性能:
会话率:单位时间的完成的会话数
会话并发能力:同时持有的会话数
数据率:单位时间内所完成数据交互的能力
LB:负载均衡集群,并发,分流压力
HA:高可用集群,容灾
四层负载:在传输层(tcp udp)上工作,基于IP+port负载,虚拟IP+port接受请求,再分配到真实的服务器上
lvs
工作性能很好,但是不处理应用层,不支持高级特性
七层负载:在应用层(http,smtp,pops,imap)上工作,基于URL等应用层信息的负载,虚拟URL或主机名接受请求,再分配到真实的服务器上。
nginx
haproxy
keepalived
精密解析特定协议,向后做负载均衡
LVS
LVS主要组成部分为:
负载调度器(load balancer/ Director),它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的。
服务器池(server pool/ Realserver),是一组真正执行客户请求的服务器,执行的服务一般有WEB、MAIL、FTP和DNS等。
共享存储(shared storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。
keepalived + haproxy + nginx
keepalived:实线对haproxy服务高可用,采用双主模型配置
haproxy:实线对nginx的负载均衡和读写分离
nginx:实线对http请求的高速处理
两个director实现HA(高可用性)群集
两个web服务器实现LB(负载均衡)群集
[[email protected] ~]# ipvsadm –C <==手工清空原来表内容
[[email protected] ~]# ipvsadm --set30 5 60 <== 设置连接超时值
[[email protected] ~]# ipvsadm -A -t10.0.0.30:80 -s wrr -p 20 <== -A添加地址,-t指定VIP TCP端口,-s指定调度算法–p会话保持时间
[[email protected] ~]# ipvsadm -L –n <== 查看表内容,添加了一组VIP地址和端口
IP Virtual Server version 1.2.1(size=4096)
Prot LocalAddress:PortScheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.30:80 wrr persistent 20
[[email protected] ~]# ipvsadm -a -t10.0.0.30:80 -r 192.168.1.2:80 -g -w 1 <== -a指定真实服务器, -t lvs上VIP,-r真实服务器ip及端口,-w权重值,-g先择DR模式(-m为NAT模式)
[[email protected] ~]# ipvsadm -a -t10.0.0.30:80 -r 192.168.1.3:80 -g -w 1
[[email protected] ~]# ipvsadm -L –n <== 查看表内容,添加了两台负载转发的真实服务器
IP Virtual Server version 1.2.1(size=4096)
Prot LocalAddress:PortScheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.30:80 wrr persistent 20
-> 192.168.1.2:80 Route 1 0 0
-> 192.168.1.3:80 Route 1 0 0
(1) director 脚本:
针对LVS规则
自动设定lvs规则,自动启动vip地址与路由,这就不用每次去启动ipvsadm规则。
打开内核转发 echo 1 > ip_forward
清空iptables 规则,iptables与ipvsadm不能同时iptables -F,ipvsadm –C
开始添加规则 add-server 并且制定权重
删除文件 /var/lock/subsys/ipvsadm
(2) LVS的 realserver脚本
设定四个内核参数 ARP问题
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
VIP写在lo:0上 数据报文从这接口上出去
(3)检查后台realserver健康问题
可以在realsever上写一个html ok
curl --connect-timeout 1 http://192.168.10.9/chen/healthy_check.html |grep "ok" &> /dev/null && echo $?请求设定超时时间为1秒
curl -I http.... 不获取页面内容,只获取页面相应首部
curl 正确的话,返回值为0 错误则不为0
附带health_check.sh
lvs的服务
如果一个节点故障,应该在ipvsadm删点这个节点,集群服务继续运行
每五秒中检查一下,如果这个节点服务正常了,再加进来
linux 检测jvm使用,检测内存溢出情况 Jmap
ps aux
VSZ 該进程使用的虚拟內存量(KB)
RSS 該進程占用的固定內存量(KB)(驻留中页的数量);
tomcat调优
JAVA_OPTS="-server -Xms2048m -Xmx4086m -XX:PermSize=256M -XX:MaxNewSize=512m -XX:MaxPermSize=512m -Djava.awt.headless=true"
正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径。正向代理还可以使用缓冲特性减少网络使用率。
反向代理的典型用途是将 防火墙后面的服务器提供给Internet用户访问。反向代理还可以为后端的多台服务器提供负载平衡,或为后端较慢的服务器提供缓冲服务。
正向代理允许客户端通过它访问任意网站并且隐藏客户端自身,因此你必须采取安全措施以确保仅为经过授权的客户端提供服务。
反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。
开放的反向代理应用:nginx和nat123。nginx是单纯的反向代理,需要自行搭建反向代理服务才能使用,效率高。nat123是结合了NAT和反向代理的应用,可以直接使用,解决80端口问题等,速度快。
keepalived可提供vrrp以及health-check功能,可以只用它提供双机浮动的vip(vrrp虚拟路由功能),这样可以简单实现一个双机热备高可用功能。
定义检测脚本,用于检测Haproxy状态,从而进行vip的切换----
keepalived发生切换,原因是,一台服务器虚拟机升级时候,重启了。
lvs+keepalived : Keepalived在这里主要用作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间failover的实现
keepalived.conf: tcp check {connect-timeout}
advert_int 1:MASTER和SLAVE负载均衡器之间同步检查的时间间隔
authentication { MASTER和SLAVE的认证方式
auth_type PASS
auth_pass 1111
}
负载均衡的调度算法 lb_algo
lb_algo rr 静态 负载均衡的调度算法:轮循调度rr “轮循”调度算法将外部请求按顺序轮流分配到集群中的Real Server
wrr 静态 加权轮循(Weighted Round Robin)wrr 加权轮循”调度算法根据真实服务器的不同处理能力来调访问请求 根据权重。
dh 静态 目标地址散列(Destination Hashing)(DH) 从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,则将请求发送到该服务器
lb_algo lc 调度器通过”最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上
lc = 活动连接数*256 + 非活动连接数
1、网站建设初期,可以选用Nigix/HAproxy作为反向代理负载均衡(或者流量不大都可以不选用负载均衡),因为其配置简单,性能也能满足一般的业务场景。如果考虑到负载均衡器是有单点问题,可以采用Nginx+Keepalived/HAproxy+Keepalived避免负载均衡器自身的单点问题。
2、网站并发达到一定程度之后,为了提高稳定性和转发效率,可以使用LVS、毕竟LVS比Nginx/HAproxy要更稳定,转发效率也更高。不过维护LVS对维护人员的要求也会更高,投入成本也更大。
注:Niginx与Haproxy比较:Niginx支持七层、用户量最大,稳定性比较可靠。Haproxy支持四层和七层,支持更多的负载均衡算法,支持session保存等。具体选型看使用场景,目前来说Haproxy由于弥补了一些Niginx的缺点用户量也不断在提升。
【haproxy】
HAProxy是免费、极速且可靠的用于为TCP和基于HTTP应用程序提供高可用、负载均衡和代理服务的解决方案,尤其适用于高负载且需要持久连接或7层处理机制的web站点。
特别适用于那些负载特大的web站点,
haproxy 1.4 高扩展性,基于url调度,提高缓存命中,
1.3 高负载 并发
【haproxy配置】相当于lvs的keepalived中的real server.........
listen Outer-Nginx-8084-Outgoing
bind *:8084
balance leastconn
server 172.18.11.29 172.18.11.29:8084 weight 5 check inter 2000 rise 3 fall 3
server 172.18.11.30 172.18.11.30:8084 weight 5 check inter 2000 rise 3 fall 3
【haproxy优点】
HAProxy 支持连接拒绝 : 因为维护一个连接的打开的开销是很低的,有时我们很需要限制攻击蠕虫(attack bots),也就是说限制它们的连接打开从而限制它们的危害。
这个已经为一个陷于小型DDoS攻击的网站开发了而且已经拯救了很多站点,这个优点也是其它负载均衡器没有的。
HAProxy可以跑满10Gbps-New benchmark of HAProxy at 10 Gbps using Myricom‘s 10GbE NICs (Myri-10G PCI-Express),这个数值作为软件级负载均衡器是相当惊人的
HAProxy 支持全透明代理(已具备硬件防火墙的典型特点): 可以用客户端IP地址或者任何其他地址来连接后端服务器
HAProxy支持虚拟主机,许多朋友说它不支持虚拟主机是错误的,通过测试我们知道,HAProxy是支持虚拟主机的。
另外,提到Nginx作负载均衡器,这个由于我自己也比较喜欢它的强大的正则处理功能和其强悍的抗并发能力,
所以我在自己的博客及51cto.com上推行它的Nginx+Keepalived,并成功用此架构帮许多客户实施他们的网站,Nginx对网络的依赖性非常小,理论上只要ping得通它就就能实现它的负载均衡能力,这一点跟LVS不一样。
我去年在一家公司准备实施LVS+Keepalived时,发现它的网络环境太复杂了,每台机器都是7、8静态路由,网络中还有二个网关,LVS实现不了转发功能;最后还是换成了Nginx+Keepalived。
现在我觉得Nginx作为最前端的负载均衡并不是一个非常理想的选择,一个大型的网站或系统的话,可以存在多级代理,比如我们最前端可以用F5或LVS来作为网站或系统的入口,让它们来顶外部的高并发流量,
而Nginx由于其强大的正则处理能力,可以作为中层代理,一来可以作为F5/LVS的补充,节约大量成本,拓朴如下图:
【四层负载均衡】
/ | \
【nginx proxy】 【nginx proxy】 【nginx proxy】
/
【web集群A】【web集群B】【web集群C】
大家可以看一下基于架构的好处有:
一、不需要担心单Nginx负载均衡器crash的问题,随便怎么挂都可以;
二、Nginx作为F5的补充,利用其强大的upstream模块和正则,可以轻松实现动静分离;
三、压缩可以通过nginx做,这样,后台应用服务器不管是apache、resin、lighttpd甚至iis或其他古怪服务器,都不用考虑压缩的功能问题。
四、方便的运维管理,在各种情况下可以灵活制订方案;
五、即使没有squid群组,Nginx现在可以做为优秀的反向代理加速软件了。
#######################################################################
/ keepalived 主 172.18.10.104
keepalived + haproxy VIP 172.18.10.61-
\ keepalived 备 172.18.10.105
#######################################################################
/ keepalived 主 172.18.10.107
keepalived + haproxy VIP 172.18.10.63-
\ keepalived 备 172.18.10.108
#######################################################################
现在网站发展的趋势对网络负载均衡的使用是随着网站规模的提升根据不同的阶段来使用不同的技术:
一种是通过硬件来进行进行,常见的硬件有比较昂贵的NetScaler、F5、Radware和Array等商用的负载均衡器,它的优点就是有专业的维护团队来对这些服务进行维护、缺点就是花销太大,所以对于规模较小的网络服务来说暂时还没有需要使用;另外一种就是类似于LVS/HAProxy、Nginx的基于Linux的开源免费的负载均衡软件策略,这些都是通过软件级别来实现,所以费用非常低廉,所以我个也比较推荐大家采用第二种方案来实施自己网站的负载均衡需求。
近期朋友刘鑫(紫雨荷雪)的项目成功上线了,PV达到了亿级/日的访问量,最前端用的是HAProxy+Keepalived双机作的负载均衡器/反向代理,整个网站非常稳定;这让我更坚定了以前跟老男孩前辈聊的关于网站架构比较合理设计的架构方案:即Nginx/HAProxy+Keepalived作Web最前端的负载均衡器,后端的MySQL数据库架构采用一主多从,读写分离的方式,采用LVS+Keepalived的方式。
在这里我也有一点要跟大家申明下:很多朋友担心软件级别的负载均衡在高并发流量冲击下的稳定情况,事实是我们通过成功上线的许多网站发现,它们的稳定性也是非常好的,宕机的可能性微乎其微,所以我现在做的项目,基本上没考虑服务级别的高可用了。相信大家对这些软件级别的负载均衡软件都已经有了很深的的认识,下面我就它们的特点和适用场合分别说明下。
LVS:使用集群技术和Linux操作系统实现一个高性能、高可用的服务器,它具有很好的可伸缩性(Scalability)、可靠性(Reliability)和可管理性(Manageability),感谢章文嵩博士为我们提供如此强大实用的开源软件。
LVS的特点是:
1、抗负载能力强、是工作在网络4层之上仅作分发之用,没有流量的产生,这个特点也决定了它在负载均衡软件里的性能最强的;
2、配置性比较低,这是一个缺点也是一个优点,因为没有可太多配置的东西,所以并不需要太多接触,大大减少了人为出错的几率;
3、工作稳定,自身有完整的双机热备方案,如LVS+Keepalived和LVS+Heartbeat,不过我们在项目实施中用得最多的还是LVS/DR+Keepalived;
4、无流量,保证了均衡器IO的性能不会收到大流量的影响;
5、应用范围比较广,可以对所有应用做负载均衡;
6、软件本身不支持正则处理,不能做动静分离,这个就比较遗憾了;其实现在许多网站在这方面都有较强的需求,这个是Nginx/HAProxy+Keepalived的优势所在。
7、如果是网站应用比较庞大的话,实施LVS/DR+Keepalived起来就比较复杂了,特别后面有Windows Server应用的机器的话,如果实施及配置还有维护过程就比较复杂了,相对而言,Nginx/HAProxy+Keepalived就简单多了。
Nginx的特点是:
1、工作在网络的7层之上,可以针对http应用做一些分流的策略,比如针对域名、目录结构,它的正则规则比HAProxy更为强大和灵活,这也是许多朋友喜欢它的原因之一;
2、Nginx对网络的依赖非常小,理论上能ping通就就能进行负载功能,这个也是它的优势所在;
3、Nginx安装和配置比较简单,测试起来比较方便;
4、也可以承担高的负载压力且稳定,一般能支撑超过几万次的并发量;
5、Nginx可以通过端口检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点,不过其中缺点就是不支持url来检测;
6、Nginx仅能支持http和Email,这样就在适用范围上面小很多,这个它的弱势;
7、Nginx不仅仅是一款优秀的负载均衡器/反向代理软件,它同时也是功能强大的Web应用服务器。LNMP现在也是非常流行的web架构,大有和以前最流行的LAMP架构分庭抗争之势,在高流量的环境中也有很好的效果。
8、Nginx现在作为Web反向加速缓存越来越成熟了,很多朋友都已在生产环境下投入生产了,而且反映效果不错,速度比传统的Squid服务器更快,有兴趣的朋友可以考虑用其作为反向代理加速器。
HAProxy的特点是:
1、HAProxy是支持虚拟主机的,以前有朋友说这个不支持虚拟主机,我这里特此更正一下。
2、能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作
3、支持url检测后端的服务器出问题的检测会有很好的帮助。
4、它跟LVS一样,本身仅仅就只是一款负载均衡软件;单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的。
5、HAProxy可以对Mysql读进行负载均衡,对后端的MySQL节点进行检测和负载均衡,不过在后端的MySQL slaves数量超过10台时性能不如LVS,所以我向大家推荐LVS+Keepalived。
6、HAProxy的算法现在也越来越多了,具体有如下8种:
①roundrobin,表示简单的轮询,这个不多说,这个是负载均衡基本都具备的;
②static-rr,表示根据权重,建议关注;
③leastconn,表示最少连接者先处理,建议关注;
④source,表示根据请求源IP,这个跟Nginx的IP_hash机制类似,我们用其作为解决session问题的一种方法,建议关注;
⑤ri,表示根据请求的URI;
⑥rl_param,表示根据请求的URl参数‘balance url_param‘ requires an URL parameter name;
⑦hdr(name),表示根据HTTP请求头来锁定每一次HTTP请求;
⑧rdp-cookie(name),表示根据据cookie(name)来锁定并哈希每一次TCP请求。
keepalived理论工作原理
keepalived可提供vrrp以及health-check功能,可以只用它提供双机浮动的vip(vrrp虚拟路由功能),这样可以简单实现一个双机热备高可用功能。
LVS+Keepalived 介绍