1、客户端发送请求到 Director Server (负载均衡器 DS),请求的数据报文(源IP是CIP,目标IP是VIP)到达内核空间,Director Server 和 Real Server 在同一个网络中,数据通过二层数据链路层来传输
2、内核空间判断数据包的目标IP是本机IP,此时LVS比对数据包请求的服务是否是集群服务,是集群服务就重新封装数据包。修改源 MAC 地址为 Director Server 的 MAC 地址,修改目标 MAC 地址为 Real Server 的 MAC 地址,源IP地址与目标IP地址没有改变,然后将数据包发送给 Real Server 1
3、到达 Real Server 的请求报文的 MAC 地址是自身的 MAC 地址,就接收此报文。数据包重新封装报文(源IP地址为VIP,目标IP 为CIP),将响应报文通过IO接口传送给物理网卡然后向外发出,Real server 1 直接将响应报文传送到客户端
lvs四层–代理应用:real server是应用服务器
| setenforce 0 |
| |
| systemctl stop firewalld |
| |
| 配置静态ip |
| |
| 配置时间同步 |
| VIP:192.168.71.200 |
| |
| DIP:192.168.71.115 |
| |
| web01(nginx+静态页面): 192.168.71.112:8080 |
| web02(nginx+静态页面): 192.168.71.113:8080 |
| web03(nginx+静态页面): 192.168.71.114:8080 |
3.1 安装ipvs
| |
| yum -y install ipvsadm ipset sysstat conntrack libseccomp |
| |
| |
| cat > /etc/sysconfig/modules/ipvs.modules <<"EOF" |
| |
| ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_fo ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack" |
| |
| for kernel_module in ${ipvs_modules}; |
| do |
| /sbin/modinfo -F filename ${kernel_module} > /dev/null 2>&1 |
| if [ $? -eq 0 ]; then |
| /sbin/modprobe ${kernel_module} |
| fi |
| done |
| EOF |
| |
| chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep ip_vs |
3.2 为四层负载均衡机器添加一个vip
| |
| ifconfig ens36:0 192.168.71.200 broadcast 192.168.71.200 netmask 255.255.255.255 up |
| |
| |
| route add -host 192.168.71.200 dev ens36:0 |
| |
| |
| echo "1" >/proc/sys/net/ipv4/ip_forward |
3.3 添加负载均衡规则
| |
| |
| |
| ipvsadm -C |
| ipvsadm -A -t 192.168.71.200:8080 -s rr |
| ipvsadm -a -t 192.168.71.200:8080 -r 192.168.71.112:8080 -g |
| ipvsadm -a -t 192.168.71.200:8080 -r 192.168.71.113:8080 -g |
| ipvsadm -a -t 192.168.71.200:8080 -r 192.168.71.114:8080 -g |
| ipvsadm -Ln |
4.1 在本地lo网卡上配置上vip地址
| ifconfig lo:0 192.168.71.200 broadcast 192.168.71.200 netmask 255.255.255.255 up |
| route add -host 192.168.71.200 dev lo:0 |
4.2 关闭arp解析
| echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore |
| echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore |
| |
| echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce |
| echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce |
| |
| |
| cat >> /etc/sysctl.conf << EOF |
| net.ipv4.ip_forward=1 |
| net.ipv4.conf.lo.arp_ignore=1 |
| net.ipv4.conf.all.arp_ignore=1 |
| net.ipv4.conf.lo.arp_announce=2 |
| net.ipv4.conf.all.arp_announce=2 |
| EOF |
| |
| sysctl -p #使用修改生效 |
配置注解:
arp_announce :定义不同级别:当ARP请求通过某个端口进来是否利用这个接口来回应。
0 -利用本地的任何地址,不管配置在哪个接口上去响应ARP请求;
1 – 避免使用另外一个接口上的mac地址去响应ARP请求;
2 – 尽可能使用能够匹配到ARP请求的最佳地址。
arp_ignore:当ARP请求发过来后发现自己正是请求的地址是否响应;
0 – 利用本地的任何地址,不管配置在哪个接口上去响应ARP请求;
1 – 哪个接口上接受ARP请求,就从哪个端口上回应。
4.3 三个web上部署
| 部署nginx |
| |
| 然后放置文件:/usr/share/nginx/html/1.txt |
方式一:浏览器访问测试
先把所有web上的nginx配置里的keepalive_timeout都设置为0,否则会因为长连接而经常访问到一个
| http { |
| keepalive_timeout 0; |
| 。。。。。。 |
| } |
方式二:在四层负载均衡以外的任一台机器上
| [root@db ~]# curl http://192.168.71.200:8080/1.txt |
| ---------------------web033333333333333333333333333333333333 |
| [root@db ~]# curl http://192.168.71.200:8080/1.txt |
| -------------web02222222222222222222 |
| [root@db ~]# curl http://192.168.71.200:8080/1.txt |
| --------------------web01111111111111111 |
lvs四层–代理七层负载均衡nginx—代理web服务器:real server是七层负载均衡nginx,需要在它的lo上配置vip
同上
| # 1、四层 |
| VIP:192.168.71.200 |
| |
| DIP:192.168.71.115 |
| |
| |
| # 2、两台七层 |
| 七层01(用nginx做七层负载):192.168.71.116:8081 |
| 七层02(用nginx做七层负载):192.168.71.111:8081 |
| |
| # 3、三台web |
| web01(nginx+静态页面): 192.168.71.112:8080 |
| web02(nginx+静态页面): 192.168.71.113:8080 |
| web03(nginx+静态页面): 192.168.71.114:8080 |
两台七层一样的配置,代理三台web
| [root@lb01 ~] |
| events { |
| worker_connections 1024; |
| } |
| http { |
| upstream web_app_servers { |
| server 192.168.71.112:8080 weight=1; |
| server 192.168.71.113:8080 weight=1; |
| server 192.168.71.114:8080 weight=1; |
| } |
| server { |
| listen 8081; |
| location / { |
| proxy_pass http://web_app_servers; |
| } |
| } |
| } |
3.1 安装ipvs(与第二章节的配置一模一样)
| |
| yum -y install ipvsadm ipset sysstat conntrack libseccomp |
| |
| |
| cat > /etc/sysconfig/modules/ipvs.modules <<"EOF" |
| |
| ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_fo ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack" |
| |
| for kernel_module in ${ipvs_modules}; |
| do |
| /sbin/modinfo -F filename ${kernel_module} > /dev/null 2>&1 |
| if [ $? -eq 0 ]; then |
| /sbin/modprobe ${kernel_module} |
| fi |
| done |
| EOF |
| |
| chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep ip_vs |
3.2 为四层负载均衡机器添加一个vip(与第二章节的配置一模一样)
| |
| ifconfig ens36:0 192.168.71.200 broadcast 192.168.71.200 netmask 255.255.255.255 up |
| |
| |
| route add -host 192.168.71.200 dev ens36:0 |
| |
| |
| echo "1" >/proc/sys/net/ipv4/ip_forward |
3.3 添加负载均衡规则(与第二章节配置的规则不同,此处应该添加的是代理到两台七层负载均衡的ip+port)
| ipvsadm -C |
| ipvsadm -A -t 192.168.71.200:8081 -s rr |
| ipvsadm -a -t 192.168.71.200:8081 -r 192.168.71.116:8081 -g |
| ipvsadm -a -t 192.168.71.200:8081 -r 192.168.71.111:8081 -g |
| ipvsadm -Ln |
4.1 在本地lo网卡上配置上vip地址
| ifconfig lo:0 192.168.71.200 broadcast 192.168.71.200 netmask 255.255.255.255 up |
| route add -host 192.168.71.200 dev lo:0 |
4.2 关闭arp解析
| echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore |
| echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore |
| |
| echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce |
| echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce |
| |
| |
| cat >> /etc/sysctl.conf << EOF |
| net.ipv4.ip_forward=1 |
| net.ipv4.conf.lo.arp_ignore=1 |
| net.ipv4.conf.all.arp_ignore=1 |
| net.ipv4.conf.lo.arp_announce=2 |
| net.ipv4.conf.all.arp_announce=2 |
| EOF |
| |
| sysctl -p #使用修改生效 |
配置注解:
arp_announce :定义不同级别:当ARP请求通过某个端口进来是否利用这个接口来回应。
0 -利用本地的任何地址,不管配置在哪个接口上去响应ARP请求;
1 – 避免使用另外一个接口上的mac地址去响应ARP请求;
2 – 尽可能使用能够匹配到ARP请求的最佳地址。
arp_ignore:当ARP请求发过来后发现自己正是请求的地址是否响应;
0 – 利用本地的任何地址,不管配置在哪个接口上去响应ARP请求;
1 – 哪个接口上接受ARP请求,就从哪个端口上回应。
4.3 三个web上部署
| 部署nginx |
| |
| 然后放置文件:/usr/share/nginx/html/1.txt |
方式一:浏览器访问测试
先把所有web上的nginx配置里的keepalive_timeout都设置为0,否则会因为长连接而经常访问到一个
| http { |
| keepalive_timeout 0; |
| 。。。。。。 |
| } |
方式二:
| [root@web01 ~]# curl http://192.168.71.200:8081/1.txt |
| --------------------web01111111111111111 |
| [root@web01 ~]# curl http://192.168.71.200:8081/1.txt |
| --------------------web01111111111111111 |
| [root@web01 ~]# curl http://192.168.71.200:8081/1.txt |
| -------------web02222222222222222222 |
| [root@web01 ~]# curl http://192.168.71.200:8081/1.txt |
| -------------web02222222222222222222 |
| [root@web01 ~]# curl http://192.168.71.200:8081/1.txt |
| ---------------------web033333333333333333333333333333333333 |
| [root@web01 ~]# curl http://192.168.71.200:8081/1.txt |
| ---------------------web03333333333333333333333333333333333 |
1、LVS-DR模式改变的是底层的mac地址,客户端ip地址本身就是透传的
2、所以我们只需要在七层负载均衡里用proxy_set_header指令来转发客户端真实ip即可
| [root@db ~] |
| events { |
| worker_connections 1024; |
| } |
| http { |
| |
| upstream web_app_servers { |
| server 192.168.71.112:8080 weight=1; |
| server 192.168.71.113:8080 weight=1; |
| server 192.168.71.114:8080 weight=1; |
| } |
| server { |
| listen 8081; |
| location / { |
| proxy_pass http://web_app_servers; |
| |
| |
| proxy_set_header X-Real-IP $remote_addr; |
| proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; |
| proxy_set_header Host $http_host; |
| proxy_set_header X-Forwarded-Proto $scheme; |
| |
| } |
| } |
| } |
3、后端的web里只需要从配置日志即可,其他地方都不需要配置
| http { |
| log_format main '$remote_addr - $remote_user [$time_local] "$request" ' |
| '$status $body_bytes_sent "$http_referer" ' |
| '"$http_user_agent" "$http_x_forwarded_for"'; |
| |
测试:客户端(192.168.71.7 windows打开浏览器)访问