18.6 负载均衡集群介绍html
18.7 LVS介绍mysql
18.8 LVS调度算法(面试会被问到)linux
18.9/18.10 LVS NAT模式搭建nginx
扩展web
lvs 三种模式详解 http://www.it165.net/admin/html/201401/2248.html面试
lvs几种算法 http://www.aminglinux.com/bbs/thread-7407-1-1.html算法
关于arp_ignore和 arp_announce http://www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.htmlsql
lvs原理相关的 http://blog.csdn.net/pi9nc/article/details/23380589shell
18.6 负载均衡集群介绍:apache
~1.主流开源软件LVS、keepalived、haproxy、nginx等
~2.其中LVS属于4层(网络OSI 7层模型),nginx属于7层,haproxy既能够认为是4层,也能够当作7层使用
因此LVS与nginx之间有本质的区别。haproxy比较特殊
~3.keepalived的负载均衡功能其实就是lvs
lvs是keepalived内置的
~4.lvs这种4层的负载均衡是能够分发除80外的其余端口通讯的(tcp),好比MySQL的,而nginx仅仅支持http,https,mail,haproxy也支持MySQL这种
四层和七层有一个本质的区别。好比LVS这种四层能够分发tcp/ip的协议,好比web服务是80端口,他除了分发80端口以外,还能够分发其余的端口。好比作一个mysql的负载均衡,也是能够用LVS实现的。而nginx就不支持,他仅仅支持http,https,mail。而haproxy也是支持mysql负载均衡的
~5.相比较来讲,LVS这种4层的更稳定,能承受更多的请求,承载的并发量会很高。而nginx这种7层的更加灵活,能实现更多的个性化需求
七层的话仍是有限制的,可是有更高级的功能。好比nginx能够根据目录,一个网站咱们能够去访问下面的二级目录或三级目录,能够根据目录的名字,去区分后端的真正的服务器,固然nginx能够作到,LVS作不到。LVS没这么智能,他仅仅是一个四层,四层其实也就是一个tcp/ip数据包的转发。可是对于包里面有什么样的域名,什么样的主机头之类的,他不关心
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
18.7 LVS介绍:
~1.LVS是由国人章文嵩开发
~2.流行度不亚于apache的httpd,基于TCP/IP作的路由和转发,稳定性和效率很高
~3.LVS最新版本基于Linux内核2.6,有好多年不更新了
~4.LVS有三种常见的模式:NAT、DR、IP Tunnel
~5.LVS架构中有一个核心角色叫作分发器(Load balance),它用来分发用户的请求,还有诸多处理用户请求的服务器(Real Server,简称rs)
~~LVS NAT模式(就是iptables转发):
~1.这种模式借助iptables的nat表来实现
~2.用户的请求到分发器后(load balancer),经过预设的iptables规则,把请求的数据包转发到后端的rs上去
~3.rs须要设定网关为分发器的内网ip
~4.用户请求的数据包和返回给用户的数据包所有通过分发器,因此分发器成为瓶颈
因此使用NAT模式,规模不能太大,通常十几台。
~5.在nat模式中,只须要分发器有公网ip便可,因此比较节省公网ip资源
NAT模式,用户过来,分发器分发出去以后,这些请求还要回来。那也就意味着load balancer与real server他们只须要用内网通讯就能够了。那么咱们只须要有一个公网IP配置在load balancer上就能够了。这是NAT模式的一个优点
~~LVS IP Tunnel模式(就是把目标IP作了更改:
~1.这种模式,须要有一个公共的IP(VIP)配置在分发器和全部rs上,咱们把它叫作vip
~2.客户端请求的目标IP为vip,分发器接收到请求数据包后,会对数据包作一个加工,会把目标IP改成rs的IP,这样数据包就到了rs上
每次把目标IP改成rs的IP都不同,会传到不一样的rs上
~2.rs接收数据包后,会还原原始数据包,这样目标IP为vip,由于全部rs上配置了这个vip,因此它会认为是它本身
再有rs将数据直接返还给用户,因此load balancer不存在瓶颈
~~LVS DR模式:
~1.这种模式,也须要有一个公共的IP配置在分发器和全部rs上,也就是vip
~2.和IP Tunnel不一样的是,它会把数据包的MAC地址修改成rs的MAC地址
可理解为,内网在通讯是须要MAC地址
~3.rs接收数据包后,会还原原始数据包,这样目标IP为vip,由于全部rs上配置了这个vip,因此它会认为是它本身
由于全部的机器都配备了VIP,rs直接返还给用户。这样load salancer也没有瓶颈
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
18.8 LVS调度算法:
~1.轮询 Round-Robin 简称rr
用户的请求过来,他均衡的把这些请求分发到rs上,没有任何的优劣之分,谁也不容许多分和少分
~2.加权轮询 Weight Round-Robin 简称wrr
好比,其中一个rs想多分点(由于配置高),能够给他设置很高的权重。好比他的是80,其余的60。这样80的机器分配的请求数会多一些
~3.最小链接 Least-Connection 简称lc
好比这个服务器链接数少。那么就会把新的请求分发到这个请求数少的上去。请求数少说明他比较闲、可能他处理速度快
~4.加权最小链接 Weight Least-Connection 简称wlc
一样的,与~3.相比就是加了权重
后面四种用的很少,简单了解:
~5.基于局部性的最小链接 Locality-Based Least Connections lblc
~6.带复制的基于局部性最小链接 Locality-Based Least Connections with Replication lblcr
~7.目标地址散列调度 Destination Hashing dh
~8.源地址散列调度 Source Hashing sh
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
18.9/18.10 LVS NAT模式搭建:
NAT模式搭建 – 准备工做
NAT是经过iptables实现的,那因此这个上面必需要配置iptables规则。在这以前先准备三台机器:
~1.三台机器
~2.分发器,也叫调度器(简写为dir)
三台机器的其中一台做为分发器
内网:208.128,外网:44.0(vmware仅主机模式)
~3.rs1
另外两台做为用户请求的机器
内网:208.130 设置网关为208.128
~4.rs2
内网:208.133 设置网关为208.128
~5.三台机器上都执行执行
systemctl stop firewalld; systemc disable firewalld
systemctl start iptables-services; iptables -F; service iptables save
NAT模式搭建
~1.在dir上安装ipvsadm
分发器上安装ipvsadm,这是实现LVS的重要工具。这个工具很iptables有点像
yum install -y ipvsdam
~2.在dir上编写脚本,vim /usr/local/sbin/lvs_nat.sh//内容以下
#! /bin/bash
# director 服务器上开启路由转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward #意思是把1写入到了内核参数里。就是把内核作了一个调整,实现路由转发。你不开启路由转发,这个数据包没有办法转发到后面的rs上去
# 关闭icmp的重定向
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects #实际上作了一个假装。要不没办法把数据包转发到rs上去。rs还要把数据转发回来
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
# 注意区分网卡名字,阿铭的两个网卡分别为ens33和ens37
echo 0 > /proc/sys/net/ipv4/conf/ens33/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/ens37/send_redirects
# director 设置nat防火墙
iptables -t nat -F #首先清空规则
iptables -t nat -X #链也清空
iptables -t nat -A POSTROUTING -s 192.168.208.0/24 -j MASQUERADE
#作了规则。能够实现将同网段的内网上网。像咱们的路由器就是这个功能
# director设置ipvsadm(lvs的规则)
IPVSADM='/usr/sbin/ipvsadm' #设置了变量,下面要引用他
$IPVSADM -C #清空规则
$IPVSADM -A -t 192.168.44.147:80 -s wlc -p 3 #公网ip要注意为比配置的ip 。wlc为算法,能够改为其余的算法。下面实例中咱们即改为了rr,由于比较均衡,以便测试
#增长一个规则。是NAt模式仍是DR模式或者iptunnel。这里写的是分发器的ip(公网ip)。就是数据包到了公网ip的80端口,而后作一些操做,首先是算法,-p为超时时间(好比3秒以内登陆一致分发到一台机器上去)。下面实例中咱们删掉了,以便测试
$IPVSADM -a -t 192.168.44.147:80 -r 192.168.208.130:80 -m -w 1
#-r指定rs是谁.-m是NAT的模式。-w权重
$IPVSADM -a -t 192.168.44.147:80 -r 192.168.208.133:80 -m -w 1
NAT模式效果测试:
~1.两台rs上都安装nginx
~2.设置两台rs的主页,作一个区分,也就是说直接curl两台rs的ip时,获得不一样的结果
~3.浏览器里访问192.168.44.147,多访问几回看结果差别
1 网络架构搞清楚: dir一个内网,一个外网, rs只有一个内网, rs须要配置网关为dir的内网ip。
2 仔细检查脚本内容,是否和个人一致。注意,并非连IP都照搬,须要和你的网络匹配。
3 你的windows电脑是否能够ping通这个“外网”地址?
实例:
NAT模式搭建 – 准备工做:
须要克隆一台出来,并修改他的IP。远程链接他
[root@axinlinux-01 ~]# hostnamectl set-hostname axinlinux-03 #由于是克隆的01,要改一下主机名
小插曲:由于克隆的01,那么01机器要先关闭,再vi03,否则重启不了网络服务
[root@axinlinux-01 ~]# bash #进入一个子shell就变了
[root@axinlinux-03 ~]#
在01 上改成仅主机:
而后看一下01 的网段是什么:
[root@axinlinux-01 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens37 #修改ens37的网段为44
[root@axinlinux-01 ~]# ifup ens37 #开启ens 37这个网卡
[root@axinlinux-01 ~]# ifconfig #看一下有没设置成功
ens37: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.44.147 netmask 255.255.255.0 broadcast 192.168.44.255
inet6 fe80::20c:29ff:fe87:422e prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:87:42:2e txqueuelen 1000 (Ethernet)
RX packets 51 bytes 6662 (6.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 77 bytes 10594 (10.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
而后在cmd,ping一下是否通讯
这样三台机器就都设置好了
而后三台机器都关闭防火墙
[root@axinlinux-02 ~]# systemctl disable firewalld #开机不启动防火墙
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@axinlinux-02 ~]# yum install -y iptables-services #让他使用centos6 的iptabls
小知识点:若是yum的时候,epel很慢的时候,/etc/yum.repos.d/epel.repo这个文件先关掉。改个名字就好
[root@axinlinux-02 ~]# systemctl enable iptables #开启启动
Created symlink from /etc/systemd/system/basic.target.wants/iptables.service to /usr/lib/systemd/system/iptables.service.
[root@axinlinux-02 ~]# systemctl start iptables #开启iptables
[root@axinlinux-02 ~]# iptables -F #清空规则
[root@axinlinux-02 ~]# service iptables save #保存这个空规则。是为了让他保存一个空规则。不会让他默认的规则影响到咱们的实验
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ 肯定 ]
三台机器上都要清空规则和保存空规则
最后三台机器还要关闭selinux
两台rs机器网关设置成208.130
root@axinlinux-03 ~]# systemctl restart network #重启网络服务
[root@axinlinux-03 ~]# route -n #这个命令检查网关
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.208.130 0.0.0.0 UG 100 0 0 ens33
以上准备工做已所有完成
NAT模式搭建:
[root@axinlinux-01 ~]# yum install -y ipvsadm 分发器上安装ipvsadm
[root@axinlinux-01 ~]# vim /usr/local/sbin/lvs_nat.sh
输入-2.的内容
[root@axinlinux-01 ~]# sh /usr/local/sbin/lvs_nat.sh #执行一下。没有输出就表明没有错误
NAT模式效果测试:
由于已经安装了nginx,就不须要了,开启就能够了。而后来设置两台rs主页
[root@axinlinux-02 ~]# curl localhost #先看一下
[root@axinlinux-02 ~]# vi /usr/share/nginx/html/index.html
#由于以前是yum安装的。因此主页路径在这个下。设置成axinlinux-02
[root@axinlinux-03 ~]# vim /usr/local/nginx/conf/vhost/aaa.com.conf #能够看一下默认主机root路径在哪。
[root@axinlinux-03 ~]# vim /data/wwwroot/default/index.html #由于是编译的,因此在这
#设置成axinlinux-03
接下来能够作测试了。直接在浏览器上,访问公网IP192.168.44.147:
结果是分发到了03上。咱们把以前设置的-p 3改成0,以便咱们测试
[root@axinlinux-01 ~]# vim /usr/local/sbin/lvs_nat.sh
[root@axinlinux-01 ~]# sh !$ #结果有报错。是由于咱们有些操做有重复
sh /usr/local/sbin/lvs_nat.sh
invalid timeout value `0' specified
Memory allocation problem
Memory allocation problem
[root@axinlinux-01 ~]# iptables -t nat -nvL #首先检查一下nat表的规则,是有规则的,没问题
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
2 174 MASQUERADE all -- * * 192.168.208.0/24 0.0.0.0/0
[root@axinlinux-01 ~]# ipvsadm -ln #看一下ipvsadm的规则,结果有问题
IP Virtual Server version 1.2.1 (size=4096) #正常是有数据的,如今看来是没有,是有问题的
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@axinlinux-01 ~]# !sh #再来执行。结果是-p 后面不能跟0。那么直接去掉-p把
sh /usr/local/sbin/lvs_nat.sh
invalid timeout value `0' specified
Memory allocation problem
Memory allocation problem
[root@axinlinux-01 ~]# vim /usr/local/sbin/lvs_nat.sh #删掉-p
[root@axinlinux-01 ~]# !sh #再来执行。能够了
sh /usr/local/sbin/lvs_nat.sh
[root@axinlinux-01 ~]# ipvsadm -ln #咱们再来看ipvsadm,一如下是正常的,是有数据的
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.44.147:80 wlc
-> 192.168.208.130:80 Masq 1 0 0 #这就是具体的规则
-> 192.168.208.133:80 Masq 1 0 0
那么修改好了-p的问题。咱们再回到浏览器上,刷新看看
仍是一直是03。咱们把算法改成rr吧,由于比较均衡,以便测试。
艹,仍是03(估计跟浏览器的缓存有关系)。咱们回到linux上,用curl测试吧,记住必定要测试外网
[root@axinlinux-01 ~]# curl 192.168.44.147 #结果正常,可看出比较均衡
axinlinux-02
[root@axinlinux-01 ~]# curl 192.168.44.147
axinlinux-03
[root@axinlinux-01 ~]# curl 192.168.44.147
axinlinux-02
[root@axinlinux-01 ~]# curl 192.168.44.147
axinlinux-03
[root@axinlinux-01 ~]# curl 192.168.44.147
axinlinux-02
[root@axinlinux-01 ~]# curl 192.168.44.147
axinlinux-03