草庐IT

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

GreatSQL 2023-03-28 原文
  • 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,可自定:
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
  • 2、为机子安装环境,采用yum源安装,注意设置yum源:
[root@localhost ~]# yum install -y gcc
[root@localhost ~]# yum install -y pcre pcre-devel
[root@localhost ~]# yum install -y zlib zlib-devel
[root@localhost ~]# yum install -y openssl openssl-devel

2.2.安装

  • 下载“nginx-1.8.0.tar.gz”文件并解压:
[root@localhost ~]# wget http://nginx.org/download/nginx-1.8.0.tar.gz
[root@localhost ~]# tar -zxvf nginx-1.8.0.tar.gz 
  • 进入目录:
[root@localhost ~]# cd nginx-1.8.0/
[root@localhost nginx-1.8.0]# 
  • 通过configure进行安装:
[root@localhost nginx-1.8.0]# ./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi
  • 进行编译安装:
[root@localhost nginx-1.8.0]# make
[root@localhost nginx-1.8.0]# make install
  • /var/下创建temp目录和nginx目录::
[root@localhost /]# mkdir -p /var/temp/nginx/
[root@localhost nginx]# pwd
/var/temp/nginx
[root@localhost ~]# cd /var/run/
[root@localhost run]# mkdir nginx
  • 查看nginx的安装目录并运行:
[root@localhost nginx]# pwd
/usr/local/nginx
[root@localhost nginx]# cd sbin/
[root@localhost sbin]# ./nginx 
# 64519是nginx主进程的进程id,64520是nginx工作进程的进程id
[root@localhost sbin]# ps aux|grep nginx
root      64519  0.0  0.0  24892   772 ?        Ss   09:36   0:00 nginx: master process ./nginx
nobody    64520  0.0  0.1  27404  1520 ?        S    09:36   0:00 nginx: worker process
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:
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
  • 2、安装依赖,静等安装成功出现“Complete”即可:
[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模块::
[root@localhost ~]# cat /etc/system-release
CentOS Linux release 7.9.2009 (Core)
# centos7已经没有集成modprobe的“-l”参数了
[root@localhost ~]# modprobe -l | grep ipvs
modprobe: invalid option -- 'l'
[root@localhost ~]# 
# 可以使用如下命令:
[root@localhost ~]#  find /lib/modules/$(uname -r)/ -iname "**.ko*" | cut -d/ -f5-
.........略..................
kernel/net/netfilter/ipvs/ip_vs.ko.xz
kernel/net/netfilter/ipvs/ip_vs_dh.ko.xz
kernel/net/netfilter/ipvs/ip_vs_ftp.ko.xz
kernel/net/netfilter/ipvs/ip_vs_lblc.ko.xz
kernel/net/netfilter/ipvs/ip_vs_lblcr.ko.xz
kernel/net/netfilter/ipvs/ip_vs_lc.ko.xz
kernel/net/netfilter/ipvs/ip_vs_nq.ko.xz
kernel/net/netfilter/ipvs/ip_vs_pe_sip.ko.xz
kernel/net/netfilter/ipvs/ip_vs_rr.ko.xz
kernel/net/netfilter/ipvs/ip_vs_sed.ko.xz
kernel/net/netfilter/ipvs/ip_vs_sh.ko.xz
kernel/net/netfilter/ipvs/ip_vs_wlc.ko.xz
kernel/net/netfilter/ipvs/ip_vs_wrr.ko.xz
.........略..................
  • 拉取lvs的管理工具ipvsadm,并解压:
[root@localhost ~]# cd /usr/local/
[root@localhost local]# wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz
[root@localhost local]# tar zxvf ipvsadm-1.26.tar.gz 
  • 进入目录后编译安装:
[root@localhost local]# cd ipvsadm-1.26/
[root@localhost ipvsadm-1.26]# make
[root@localhost ipvsadm-1.26]# make install
  • 验证是否安装成功:
[root@localhost ipvsadm-1.26]# ipvsadm -h
ipvsadm v1.26 2008/5/15 (compiled with popt and IPVS v1.2.1)
Usage:
  ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine]
  ipvsadm -D -t|u|f service-address
  ipvsadm -C
  ipvsadm -R
  ipvsadm -S [-n]
.........略..................

4.lvs实现四层负载DR模式与Nginx七层进行整合

  • 在lvs虚拟机的eth33(自己网卡名字)上绑定虚拟ip假设为:192.168.1.200:
[root@localhost ~]# cd /etc/sysconfig/network-scripts
[root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-ens33:0
[root@localhost network-scripts]# vi ifcfg-ens33:0
# 将以下配置拷贝进去
DEVICE="ens33:0"
BOOTPROTO="static"
ONBOOT="yes"
IPADDR=192.168.1.200
NETMASK=255.255.255.255
BROADCAST=192.168.1.200
# 刷新
[root@localhost network-scripts]# systemctl restart network
  • 添加路由规则:
[root@localhost network-scripts]# route add -host 192.168.1.200 dev ens33:0
  • 启用系统的包转发功能,参数值为1时启用ip转发,为0时禁止ip转发:
[root@localhost network-scripts]# echo "1" >/proc/sys/net/ipv4/ip_forward
  • 清除原有转发规则:
[root@localhost network-scripts]# ipvsadm --clear
  • 添加虚拟IP规则:

    • -s rr表示采用轮询策略
    • :80表示负载转发的端口是80
[root@localhost network-scripts]# ipvsadm -A -t 192.168.1.200:80 -s rr
  • 给虚拟IP中添加服务规则(1.13和1.14为两台nginx服务器):
[root@localhost network-scripts]# ipvsadm -a -t 192.168.1.200:80 -r 192.168.1.13:80 -g
[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
[root@localhost network-scripts]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  localhost.localdomain:http rr
  -> 192.168.1.13:http          Route   1      0          0         
  -> 192.168.1.14:http          Route   1      0          0   
  • 在lvs的DR和TUn模式下,用户的访问请求到达真实服务器后,是直接返回给用户的,而不再经过前端的Director Server,因此,就需要在每个Real server节点上增加虚拟的VIP地址,这样数据才能直接返回给用户
  • 回环设备(nginx)上绑定了一个虚拟IP地址:
[root@localhost sbin]# cd /etc/sysconfig/network-scripts/

[root@localhost network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@localhost network-scripts]# vi ifcfg-lo:0

DEVICE=lo:0
IPADDR=192.168.1.200
BROADCAST=192.168.1.200
NETMASK=255.255.255.255
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
ONBOOT=yes
NAME=loopback

[root@localhost network-scripts]# systemctl restart network
[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请求,就从哪个端口上回应。
[root@localhost conf]# pwd
/proc/sys/net/ipv4/conf
[root@localhost conf]# echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore 
[root@localhost conf]# echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
[root@localhost conf]# echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
[root@localhost conf]# echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
 #使用修改生效
[root@localhost conf]# sysctl -p
  • 验证,通过vip是否可以访问到两台nginx
  • 还可以通过七层部署负载几台tomcat来测试:
[root@localhost conf]# vi nginx.conf
# 配置如下
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    
  upstream tomcat_server_pool{
        server 192.168.1.20:8080 weight=10;
        server 192.168.1.21:8080 weight=10;
        }
        
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            proxy_pass http://tomcat_server_pool;
            index  index.html index.htm;
        }
      
    }
  • 验证效果,此时通过lvs即可对Tomcat进行访问了,不管哪一台Tomcat宕机,或哪一台nginx宕机,都不会影响访问。那么如果lvs所在的机器宕机了呢?入口没了就找不到nginx了,这个时候可以通过keepalived的心跳机制来实现lvs的主备操作,以此来检测主机是否还存活,如果宕机,备机就作为主机使用了,几台先讲到这,下次有机会继续说部署方案。

Enjoy GreatSQL ?

关于 GreatSQL

GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。

相关链接: GreatSQL社区 Gitee GitHub Bilibili

GreatSQL社区:

捉虫活动详情:https://greatsql.cn/thread-97-1-1.html

社区博客有奖征稿详情:https://greatsql.cn/thread-100-1-1.html

技术交流群:

微信:扫码添加GreatSQL社区助手微信好友,发送验证信息加群

有关搭建基于lvs+nginx的负载均衡服务集群的更多相关文章

  1. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  2. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  3. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  4. ruby-on-rails - 启动 Rails 服务器时 ImageMagick 的警告 - 2

    最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru

  5. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

    在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

  6. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  7. ruby-on-rails - 在 Rails 中调试生产服务器 - 2

    您如何在Rails中的实时服务器上进行有效调试,无论是在测试版/生产服务器上?我试过直接在服务器上修改文件,然后重启应用,但是修改好像没有生效,或者需要很长时间(缓存?)我也试过在本地做“脚本/服务器生产”,但是那很慢另一种选择是编码和部署,但效率很低。有人对他们如何有效地做到这一点有任何见解吗? 最佳答案 我会回答你的问题,即使我不同意这种热修补服务器代码的方式:)首先,你真的确定你已经重启了服务器吗?您可以通过跟踪日志文件来检查它。您更改的代码显示的View可能会被缓存。缓存页面位于tmp/cache文件夹下。您可以尝试手动删除

  8. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  9. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  10. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

随机推荐