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

news2024/12/29 7:47:50
  • 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

6440

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/86893.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用C#写一个Windows服务

创建服务程序 可能你的VS里面没有【Windows服务】这个模板,那么你就需要通过“打开Visual Studio安装程序“,通过VisualStudio Installer来通过“修改”来安装【.NET桌面开发】 通过上面两个地方均可以进入对应的代码文件 public partial class …

4年功能测试月薪9.5K,4个月时间进阶自动化,跳槽涨薪4k后我的路还很长...

前言 最开始我并不是互联网从业者,是经历了一场六个月的培训才入的行,这个经历仿佛就是一个遮羞布,不能让任何人知道,就算有面试的时候被问到你是不是被培训的,我还是不能承认这段历史。我是为了生存,才选…

使用遗传算法计算神经网络的超参数

遗传算法是基于种群的思想,将问题的解通过编码的方式转化为种群中的个体,并让这些个体不断地通过选择、交叉和变异算子模拟生物的进化过程,然后利用“优胜劣汰”法则选择种群中适应性较强的个体构成子种群,然后让子种群重复类似的…

nginx配置websocket支持wss

和前端联调完项目之后,将项目部署到了开发环境上面。结果这时候发现ws连接报错了,怎么回事,明明和前端在本地都联调好了的! 观察报错发现,提示我们需要使用wss连接,而我和前端在对接联调时使用的是ws连接。…

mysql 学习---窗口函数

文章目录Mysql 8.0新特性窗口函数常见窗口函数Mysql 8.0新特性 窗口函数 理解: 窗口函数的作用类似于在查询中对数据进行分组,类似于聚合函数,但不同的是把聚合函数是分组的记录合成一条,也就是一组一条数据,窗口函数…

缓存击穿、缓存穿透、缓存雪崩

初学者总是喜欢自己吓自己,在听到缓存击穿、缓存穿透、缓存雪崩等问题后,就觉得这根本不是自己这个级别所能接触的知识点,甚至不敢下定决心去了解。 然而,缓存击穿、缓存穿透、缓存雪崩等概念只是听着高大上罢了,实则并…

RabbitMq应用

1.RabbitMQ介绍 1.1现存问题 服务调用:两个服务调用时,我们可以通过传统的HTTP方式,让服务A直接去调用服务B的接口,但是这种方式是同步的方式,虽然可以采用SpringBoot提供的Async注解实现异步调用,但是这…

Spring之AOP

谈起AOP就不得不说起代理,Java 源代码经过编译生成字节码,然后再由 JVM 经过类加载,连接,初始化成 Java 类型,可以看到字节码是关键,静态和动态的区别就在于字节码生成的时机 静态代理:由程序员…

BLE MESH中的Secure Network beacon包

作用:节点使用安全网络信标来识别子网及其安全状态。可以用来更新Key和Iv Index。 数据包结构: 数据包格式: 大小含义 Beacon Type 1安全网络信标(0x01) Flags1包含密钥刷新标志和IV更新标志 Network ID8包含网络ID的值…

代码随想录算法训练营第四天 | 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II

今天是链表章节最后一天,加油💪 24. 两两交换链表中的节点 题目:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节…

html练习11:案例仿制

1.目标效果 2.布局效果 3.顶端部分制作效果 问题:img和p无法同时垂直居中显示,img会顶端对齐,p会底部对齐 解决方法:把img作为背景加入;用两个div分别做img和p的容器再进行格式调整 4.导航栏部分制作效果 要点&#…

保证项目如期上线,测试人能做些什么?

要保证项目按照正常进度发布,需要整个研发团队齐心协力。 有很多原因都可能会造成项目延期。 1、产品经理频繁修改需求 2、开发团队存在技术难题 3、测试团队测不完 今天我想跟大家聊一下,测试团队如何保证项目按期上线,以及在这个过程中可能…

词法分析程序

一、实验原理 1.1实验内容 通过本实验,应达到以下目标: 1.掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。 2.掌握词法分析的实现方法。 3.上机调试编出的词法分析程序。 1.2实验内容 词法分析是作为相对独立的阶段来完成的…

C# 事件

一 C#中的事件 大致上:事件-----回调函数; 二 用户界面中的事件 ① 按钮点击事件 ② 基本的写法 this.button1.Clicknew System.EventHandler(this.button1_Click); private void button1_Click(object sender,EventHandler e) {this.label1.TextDat…

C++智能指针weak_ptr

C智能指针weak_ptr 学习路线:C智能指针shared_ptr->C智能指针unique_ptr->C智能指针weak_ptr 简介:本文讲解常用的智能指针的用法和原理,包括shared_ptr,unique_ptr,weak_ptr。 概述 weak_ptr设计的目的是为配合 shared_ptr 而引入…

静电场方程与边界面上的衔接条件 工程电磁学 P6

我们现在已经知道两个公式 我们可以得到微分形式 对于体密度,面密度,线密度,点电荷的理解 很多同学会问空间中为什么要有面密度,线密度的存在呢? 其实这个是模型的需要,因为介质不一定是连续的&#xff0…

如何设计一个高性能的图 Schema

本文整理自青藤云安全工程师——文洲在青藤云技术团队内部分享,分享视频参考:https://www.bilibili.com/video/BV1r64y1R72i 图数据库的性能和 schema 的设计息息相关,但是 NebulaGraph 官方本身对图 schema 的设计其实没有一个定论&#xff…

Codeforces Round #837 (Div. 2) C. Hossam and Trainees

Problem - C - Codeforces 翻译: 胡萨姆有𝑛名学员。他给𝑖-th的学员分配了一个号码𝑎𝑖。 一双𝑖-th和𝑗-th(𝑖≠𝑗)学员被称为成功的如果有一个整数𝑥(&…

基于springboot的企业员工工资管理系统(财务系统)

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…

Vue渲染器(二):挂载与更新

渲染器(二):挂载与更新 前面介绍了渲染器的基本概念和整体框架,接下来就可以介绍渲染器的核心功能:挂载与更新。 1.挂载子节点和元素的属性: vnode.children的值为字符串类型时,会把它设置为…