搭建基于lvs+nginx的负载均衡服务集群

王柳  论坛元老 | 2022-12-23 15:22:12 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1021|帖子 1021|积分 3063

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x

  • GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。
  • GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。
  • 作者:蟹黄瓜子
  • 文章来源:社区投稿
1.基于四层+七层的负载均衡

实现负载均衡的方式有很多,例如基于DNS的负载均衡、基于四层交换技术的负载均衡、基于七层交换技术的负载均衡,其中nginx大家不陌生,我们可以通过配置实现负载均衡,可是问题也很明显,如果nginx宕机了,那么如何进行负载?这个时候会想多来几台nginx,综合考虑,今天介绍一种基于四层+七层交换技术的负载均衡,以虚拟ip来负载给我们多台nginx,再由nginx来实现负载均衡过程。本文采用CentOS 7.6作为操作系统示例。
2.nginx部署安装

2.1.环境准备

VMware创建2台虚拟机,XShell工具连接虚拟机进行操作,以下操作集群2台设备都需要完成:

  • 1、静态分配ip,可自定:
  1. [root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
复制代码

  • 2、为机子安装环境,采用yum源安装,注意设置yum源:
  1. [root@localhost ~]# yum install -y gcc
  2. [root@localhost ~]# yum install -y pcre pcre-devel
  3. [root@localhost ~]# yum install -y zlib zlib-devel
  4. [root@localhost ~]# yum install -y openssl openssl-devel
复制代码
2.2.安装


  • 下载“nginx-1.8.0.tar.gz”文件并解压:
  1. [root@localhost ~]# wget http://nginx.org/download/nginx-1.8.0.tar.gz
  2. [root@localhost ~]# tar -zxvf nginx-1.8.0.tar.gz
复制代码

  • 进入目录:
  1. [root@localhost ~]# cd nginx-1.8.0/
  2. [root@localhost nginx-1.8.0]#
复制代码

  • 通过configure进行安装:
  1. [root@localhost nginx-1.8.0]# ./configure \
  2. --prefix=/usr/local/nginx \
  3. --pid-path=/var/run/nginx/nginx.pid \
  4. --lock-path=/var/lock/nginx.lock \
  5. --error-log-path=/var/log/nginx/error.log \
  6. --http-log-path=/var/log/nginx/access.log \
  7. --with-http_gzip_static_module \
  8. --http-client-body-temp-path=/var/temp/nginx/client \
  9. --http-proxy-temp-path=/var/temp/nginx/proxy \
  10. --http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
  11. --http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
  12. --http-scgi-temp-path=/var/temp/nginx/scgi
复制代码

  • 进行编译安装:
  1. [root@localhost nginx-1.8.0]# make
  2. [root@localhost nginx-1.8.0]# make install
复制代码

  • 在/var/下创建temp目录和nginx目录::
  1. [root@localhost /]# mkdir -p /var/temp/nginx/
  2. [root@localhost nginx]# pwd
  3. /var/temp/nginx
  4. [root@localhost ~]# cd /var/run/
  5. [root@localhost run]# mkdir nginx
复制代码

  • 查看nginx的安装目录并运行:
  1. [root@localhost nginx]# pwd
  2. /usr/local/nginx
  3. [root@localhost nginx]# cd sbin/
  4. [root@localhost sbin]# ./nginx
  5. # 64519是nginx主进程的进程id,64520是nginx工作进程的进程id
  6. [root@localhost sbin]# ps aux|grep nginx
  7. root      64519  0.0  0.0  24892   772 ?        Ss   09:36   0:00 nginx: master process ./nginx
  8. nobody    64520  0.0  0.1  27404  1520 ?        S    09:36   0:00 nginx: worker process
  9. root      64531  0.0  0.0 112808   964 pts/1    R+   09:36   0:00 grep --color=auto nginx
复制代码

  • 注意:执行./nginx启动nginx,这里可以-c指定加载的nginx配置文件,如下:
    ./nginx -c /usr/local/nginx/conf/nginx.conf
    如果不指定-c,nginx在启动时默认加载conf/nginx.conf文件,此文件的地址也可以在编译安装nginx时指定./configure的参数(--conf-path= 指向配置文件(nginx.conf))
3.lvs部署安装

3.1.环境准备

VMware创建1台虚拟机,XShell工具连接虚拟机进行操作:

  • 1、配置ip:
  1. [root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
复制代码

  • 2、安装依赖,静等安装成功出现“Complete”即可:
  1. [root@localhost ~]# yum install -y gcc gcc-c++ makepcre pcre-devel kernel-devel openssl-devel libnl-devel popt*
复制代码
3.2.安装


  • LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。
  • centos6.5自带lvs,本系统采用centos7.6,检查linux内核是否集成lvs模块::
  1. [root@localhost ~]# cat /etc/system-release
  2. CentOS Linux release 7.9.2009 (Core)
  3. # centos7已经没有集成modprobe的“-l”参数了
  4. [root@localhost ~]# modprobe -l | grep ipvs
  5. modprobe: invalid option -- 'l'
  6. [root@localhost ~]#
  7. # 可以使用如下命令:
  8. [root@localhost ~]#  find /lib/modules/$(uname -r)/ -iname "**.ko*" | cut -d/ -f5-
  9. .........略..................
  10. kernel/net/netfilter/ipvs/ip_vs.ko.xz
  11. kernel/net/netfilter/ipvs/ip_vs_dh.ko.xz
  12. kernel/net/netfilter/ipvs/ip_vs_ftp.ko.xz
  13. kernel/net/netfilter/ipvs/ip_vs_lblc.ko.xz
  14. kernel/net/netfilter/ipvs/ip_vs_lblcr.ko.xz
  15. kernel/net/netfilter/ipvs/ip_vs_lc.ko.xz
  16. kernel/net/netfilter/ipvs/ip_vs_nq.ko.xz
  17. kernel/net/netfilter/ipvs/ip_vs_pe_sip.ko.xz
  18. kernel/net/netfilter/ipvs/ip_vs_rr.ko.xz
  19. kernel/net/netfilter/ipvs/ip_vs_sed.ko.xz
  20. kernel/net/netfilter/ipvs/ip_vs_sh.ko.xz
  21. kernel/net/netfilter/ipvs/ip_vs_wlc.ko.xz
  22. kernel/net/netfilter/ipvs/ip_vs_wrr.ko.xz
  23. .........略..................
复制代码

  • 拉取lvs的管理工具ipvsadm,并解压:
  1. [root@localhost ~]# cd /usr/local/
  2. [root@localhost local]# wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz
  3. [root@localhost local]# tar zxvf ipvsadm-1.26.tar.gz
复制代码

  • 进入目录后编译安装:
  1. [root@localhost local]# cd ipvsadm-1.26/
  2. [root@localhost ipvsadm-1.26]# make
  3. [root@localhost ipvsadm-1.26]# make install
复制代码

  • 验证是否安装成功:
  1. [root@localhost ipvsadm-1.26]# ipvsadm -h
  2. ipvsadm v1.26 2008/5/15 (compiled with popt and IPVS v1.2.1)
  3. Usage:
  4.   ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine]
  5.   ipvsadm -D -t|u|f service-address
  6.   ipvsadm -C
  7.   ipvsadm -R
  8.   ipvsadm -S [-n]
  9. .........略..................
复制代码
4.lvs实现四层负载DR模式与Nginx七层进行整合


  • 在lvs虚拟机的eth33(自己网卡名字)上绑定虚拟ip假设为:192.168.1.200:
  1. [root@localhost ~]# cd /etc/sysconfig/network-scripts
  2. [root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-ens33:0
  3. [root@localhost network-scripts]# vi ifcfg-ens33:0
  4. # 将以下配置拷贝进去
  5. DEVICE="ens33:0"
  6. BOOTPROTO="static"
  7. ONBOOT="yes"
  8. IPADDR=192.168.1.200
  9. NETMASK=255.255.255.255
  10. BROADCAST=192.168.1.200
  11. # 刷新
  12. [root@localhost network-scripts]# systemctl restart network
复制代码

  • 添加路由规则:
  1. [root@localhost network-scripts]# route add -host 192.168.1.200 dev ens33:0
复制代码

  • 启用系统的包转发功能,参数值为1时启用ip转发,为0时禁止ip转发:
  1. [root@localhost network-scripts]# echo "1" >/proc/sys/net/ipv4/ip_forward
复制代码

  • 清除原有转发规则:
  1. [root@localhost network-scripts]# ipvsadm --clear
复制代码

  • 添加虚拟IP规则:


    • -s rr表示采用轮询策略
    • :80表示负载转发的端口是80

  1. [root@localhost network-scripts]# ipvsadm -A -t 192.168.1.200:80 -s rr
复制代码

  • 给虚拟IP中添加服务规则(1.13和1.14为两台nginx服务器):
  1. [root@localhost network-scripts]# ipvsadm -a -t 192.168.1.200:80 -r 192.168.1.13:80 -g
  2. [root@localhost network-scripts]# ipvsadm -a -t 192.168.1.200:80 -r 192.168.1.14:80 -g
复制代码

  • 在新加虚拟IP记录中添加两条新的Real Server记录,-g表示指定LVS 的工作模式为直接路由模式。lvs进行负载转发需要保证lvs负载的端口要和nginx服务的端口的一致,这里都为80
  • 重启lvs
  1. [root@localhost network-scripts]# ipvsadm
  2. IP Virtual Server version 1.2.1 (size=4096)
  3. Prot LocalAddress:Port Scheduler Flags
  4.   -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
  5. TCP  localhost.localdomain:http rr
  6.   -> 192.168.1.13:http          Route   1      0          0         
  7.   -> 192.168.1.14:http          Route   1      0          0   
复制代码

  • 在lvs的DR和TUn模式下,用户的访问请求到达真实服务器后,是直接返回给用户的,而不再经过前端的Director Server,因此,就需要在每个Real server节点上增加虚拟的VIP地址,这样数据才能直接返回给用户
  • 回环设备(nginx)上绑定了一个虚拟IP地址:
  1. [root@localhost sbin]# cd /etc/sysconfig/network-scripts/
  2. [root@localhost network-scripts]# cp ifcfg-lo ifcfg-lo:0
  3. [root@localhost network-scripts]# vi ifcfg-lo:0
  4. DEVICE=lo:0
  5. IPADDR=192.168.1.200
  6. BROADCAST=192.168.1.200
  7. NETMASK=255.255.255.255
  8. # If you're having problems with gated making 127.0.0.0/8 a martian,
  9. # you can change this to something else (255.255.255.255, for example)
  10. ONBOOT=yes
  11. NAME=loopback
  12. [root@localhost network-scripts]# systemctl restart network
  13. [root@localhost sbin]# /sbin/route add -host 192.168.1.200 dev lo:0
复制代码

  • 关闭arp解析:


    • arp_announce :定义不同级别:当ARP请求通过某个端口进来是否利用这个接口来回应。 0 -利用本地的任何地址,不管配置在哪个接口上去响应ARP请求; 1 - 避免使用另外一个接口上的mac地址去响应ARP请求; 2 - 尽可能使用能够匹配到ARP请求的最佳地址。
    • arp_ignore:当ARP请求发过来后发现自己正是请求的地址是否响应; 0 - 利用本地的任何地址,不管配置在哪个接口上去响应ARP请求; 1 - 哪个接口上接受ARP请求,就从哪个端口上回应。

  1. [root@localhost conf]# pwd
  2. /proc/sys/net/ipv4/conf
  3. [root@localhost conf]# echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
  4. [root@localhost conf]# echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
  5. [root@localhost conf]# echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
  6. [root@localhost conf]# echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
  7. #使用修改生效
  8. [root@localhost conf]# sysctl -p
复制代码

  • 验证,通过vip是否可以访问到两台nginx
  • 还可以通过七层部署负载几台tomcat来测试:
  1. [root@localhost conf]# vi nginx.conf
  2. # 配置如下
  3. http {
  4.     include       mime.types;
  5.     default_type  application/octet-stream;
  6.     sendfile        on;
  7.    
  8.   upstream tomcat_server_pool{
  9.         server 192.168.1.20:8080 weight=10;
  10.         server 192.168.1.21:8080 weight=10;
  11.         }
  12.         
  13.     server {
  14.         listen       80;
  15.         server_name  localhost;
  16.         location / {
  17.             root   html;
  18.             proxy_pass http://tomcat_server_pool;
  19.             index  index.html index.htm;
  20.         }
  21.       
  22.     }
复制代码

  • 验证效果,此时通过lvs即可对Tomcat进行访问了,不管哪一台Tomcat宕机,或哪一台nginx宕机,都不会影响访问。那么如果lvs所在的机器宕机了呢?入口没了就找不到nginx了,这个时候可以通过keepalived的心跳机制来实现lvs的主备操作,以此来检测主机是否还存活,如果宕机,备机就作为主机使用了,几台先讲到这,下次有机会继续说部署方案。

Enjoy GreatSQL
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王柳

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表