LVS介绍+LVS配置轮询/加权轮询

目录

集群

集群的目的

LVS介绍

LVS集群组成

LVS工作模式

负载均衡调度算法

环境准备

安装ansible

配置LVS NAT模式

配置2台web服务器

设置打开ip路由转发功能

安装lvs

ipvsadm使用说明

配置LVS


集群

  • 通过高速网络将很多服务器集中起来一起
    • 提供同一种服务,在客户端看起来就像是只有一个服务器(即多台服务器提供同一种服务)
  • 可以在付出较低成本的情况下获得在性能、可靠性、灵活性方面的相对较高的收益
  • 任务调度是集群系统中的核心技术

集群的目的

提高性能:计算密集型应用,如:天气预报、核模拟实验

降低成本:相对百万美元级的超级计算机,价格便宜

提高可扩展性:只需要增加新的集群节点即可

增强可靠性:多个节点功能相同,避免单点失败

集群的分类

高性能计算集群HPC

        - 通过以集群的方式并行应用程序,解决复杂的科学问题

负载均衡集群LB

        - 客户端负载在计算机集群中尽可能的平均分摊

高可用集群HA

        - 避免单点故障,当一个系统发生故障时,可以快速迁移

LVS介绍

LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士在1998年创建的一个开源项目,旨在实现高性能、高可用性的服务器集群系统。LVS主要用于构建高可伸缩和高可用的网络服务,如Web服务、邮件服务、FTP服务等,是实现负载均衡的一种技术解决方案。

LVS工作在操作系统网络层,主要通过IP负载均衡技术和基于内容请求分发技术,将来自客户端的访问请求动态地分配给后端的真实服务器集群,从而达到分散单台服务器压力、提升整体系统处理能力的目的。LVS主要包含以下三种工作模式:

  1. VS/NAT(Network Address Translation,网络地址转换): 在这种模式下,LVS作为所有客户端和服务集群之间的网关,客户端发送的请求首先到达LVS,然后LVS将请求的源IP地址改写为自身的IP地址,再将请求转发给真实服务器。真实服务器处理完请求后,将响应返回给LVS,LVS再将响应的源地址改回客户端的IP地址,最后将响应发送给客户端。这种方式需要LVS有足够的处理能力和带宽,因为它需要处理所有的进出流量。

  2. VS/TUN(Tunneling,隧道): 使用IP隧道技术,LVS只需要将客户端的请求封装在一个新的IP包中,然后根据调度算法选择一台真实服务器,并将这个封装的IP包发送给它。真实服务器处理完请求后,直接将响应返回给客户端,无需经过LVS。这种方式减少了LVS的网络负担,但是增加了网络的复杂度,因为需要在真实服务器和LVS之间建立隧道。

  3. VS/DR(Direct Routing,直接路由): 在直接路由模式下,LVS直接根据调度算法修改请求的数据包的目标MAC地址,使其指向某台真实服务器,然后将数据包直接发送到局域网内的真实服务器。真实服务器处理完请求后,直接将响应发送给客户端,无需经过LVS。这种方式效率最高,但是要求LVS和真实服务器必须在同一物理网络段内。

LVS集群组成

前端:负载均衡层

        - 由一台或多台负载调度器组成

中间:服务器群组层

        - 由一组实际运行应用服务的服务器组成

底端:数据共享存储层

        - 提供共享存储空间的存储区域

Director Server:调度服务器
        - 将负载分发到RealServer的服务器
Real Server:真实服务器
        - 真正提供应用服务的服务器
VIP:虚拟IP地址
        - 公布给用户访问的虚拟IP地址
DIP:调度器连接后端节点服务器的IP地址
RIP:真实IP地址
        - 集群节点上使用的IP地址

LVS工作模式

VS/NAT
        - 通过网络地址转换实现的虚拟服务器
        - 大并发访问时,调度器的性能成为瓶颈
VS/DR
        - 直接使用路由技术实现虚拟服务器
        - 节点服务器需要配置VIP,注意MAC地址广播
VS/TUN
        - 通过隧道方式实现虚拟服务器

负载均衡调度算法

LVS目前实现了10种调度算法
常用调度算法有4种
        - 轮询(Round Robin)
        - 加权轮询(Weighted Round Robin)
        - 最少连接(Least Connections
        - 加权最少连接(Weighted Least Connections

 其他调度算法
        - 源地址散列(Source Hashing)
        - 目标地址散列(Destination Hashing)
        - 基于局部性的最少链接
        - 带复制的基于局部性最少链接
        - 最短的期望的延迟
        - 最少队列调度

环境准备

  • pubserver:eth0->192.168.88.240,eth1->192.168.99.240
  • client1:eth0->192.168.88.10,网关192.168.88.5
  • lvs1: eth0 -> 192.168.88.5;eth1->192.168.99.5
  • web1:eth1->192.168.99.100;网关192.168.99.5
  • web2:eth1->192.168.99.200;网关192.168.99.5

安装ansible

将pubserver当做控制端,其他机器作为被控端

[root@pubserver ~]# dnf -y install ansible-core
[root@pubserver ~]# mkdir cluster;cd cluster

#创建主配置文件
[root@pubserver cluster]# vim ansible.cfg
[defaults]
inventory = inventory
host_key_checking = false  # 不检查主机密钥

# 创建主机清单文件及相关变量
[root@pubserver cluster]# vim inventory
[clients]
client ansible_host=192.168.88.10

[lb]
lvs ansible_host=192.168.88.5

[webservers]
web1 ansible_host=192.168.99.100
web2 ansible_host=192.168.99.200

[all:vars] # all是ansible自带的组,表示全部主机
ansible_ssh_user=root
ansible_ssh_pass=a

创建文件夹用于存放将要拷贝到远程主机的文件

# 创建文件目录,用于保存将要拷贝到远程主机的文件
[root@pubserver cluster]# mkdir files

编写yum文件

# 编写yum配置文件
[root@pubserver cluster]# vim files/local88.repo
[BaseOS]
name = BaseOS
baseurl = ftp://192.168.88.240/dvd/BaseOS
enabled = 1
gpgcheck = 0

[AppStream]
name = AppStream
baseurl = ftp://192.168.88.240/dvd/AppStream
enabled = 1
gpgcheck = 0


[root@pubserver cluster]# vim files/local99.repo
[BaseOS]
name = BaseOS
baseurl = ftp://192.168.99.240/dvd/BaseOS
enabled = 1
gpgcheck = 0

[AppStream]
name = AppStream
baseurl = ftp://192.168.99.240/dvd/AppStream
enabled = 1
gpgcheck = 0

编写用于上传yum配置文件的playbook,为了方便编写yml文件,修改一下vim的配置

该配置文件,使得vim编写yml文件时按tab会缩进两个空格,编写其他格式文件时正常缩进,同时为了方便使用按下空格换到下一行时,光标和上一行内容对齐

[root@pubserver cluster]# vim ~/.vimrc

内容如下:
" 设置通用的tabstop为4空格,softtabstop也为4空格(用于自动转换tab为space)
set tabstop=4
set softtabstop=4

" 设置默认的shiftwidth为2空格,用于普通情况下的缩进
set shiftwidth=2

" 开启自动缩进
set autoindent

" 文件类型检测相关的设置
filetype plugin indent on

" 为.yml和.yaml文件专门设置
autocmd FileType yaml setlocal shiftwidth=2 tabstop=2 softtabstop=2

" 保持回车后光标与上一行对齐
function! SmartEnter()
    let save_cursor = getpos(".")
    normal! o
    call setpos(".", [0, save_cursor[1]+1, save_cursor[2], save_cursor[3]])
    if &filetype == 'yaml'
        normal! 2i 
    endif
endfunction
map <CR> :call SmartEnter()<CR>

编写用于上传yum配置的playbook

# 编写用于上传yum配置文件的playbook
[root@pubserver cluster]# vim 01-upload-repo.yml
---
- name: config repos.d
  hosts: all
  tasks:
    - name: delete repos.d  # 删除repos.d目录
      file:
        path: /etc/yum.repos.d
        state: absent

    - name: create repos.d  # 创建repos.d目录
      file:
        path: /etc/yum.repos.d
        state: directory
        mode: '0755'

- name: config local88      # 上传repo文件到88网段
  hosts: clients,lb
  tasks:
    - name: upload local88
      copy:
        src: files/local88.repo
        dest: /etc/yum.repos.d/

- name: config local99      # 上传repo文件到99网段
  hosts: webservers
  tasks:
    - name: upload local99
      copy:
        src: files/local99.repo
        dest: /etc/yum.repos.d/
        
#执行剧本
[root@pubserver cluster]# ansible-playbook 01-upload-repo.yml

配置LVS NAT模式

配置2台web服务器

创建首页文件,文件中包含ansible facsts变量

[root@pubserver cluster]# vim files/index.html
Welcome from {{ansible_hostname}}

配置web服务器,编写剧本2

[root@pubserver cluster]# vim 02-config-webservers.yml
---
- name: config webservers
  hosts: webservers
  tasks:
    - name: install nginx  # 安装nginx
      yum:
        name: nginx
        state: present

    - name: upload index   # 上传首页文件到web服务器
      template:
        src: files/index.html
        dest: /usr/share/nginx/html/index.html

    - name: start nginx    # 启动服务
      service:
        name: nginx
        state: started
        enabled: yes

[root@pubserver cluster]# ansible-playbook 02-config-webservers.yml

据说现在红帽在推行新的ansible-navigator,说实话两个差不多,不过navigator看错误消息还是挺方便的

执行完毕,在lvs上测试web服务器

[root@lvs ~]# curl http://192.168.99.100
Welcome from web1
[root@lvs ~]# curl http://192.168.99.200
Welcome from web2

确保lvs1的ip转发功能已经打开。该功能需要改变内核参数

[root@lvs1 ~]# sysctl -a    # 查看所有的内核参数
[root@lvs1 ~]# sysctl -a | grep ip_forward  # 查看ip_foward参数
net.ipv4.ip_forward = 0   # 1表示打开转发,0表示关闭转发

设置打开ip路由转发功能

[root@pubserver cluster]# vim 03-sysctl.yml
---
- name: config sysctl
  hosts: lb
  tasks:
    - name: set ip_forward
      sysctl:   # 用于修改内核参数的模块
        name: net.ipv4.ip_forward       # 内核模块名
        value: '1'        # 内核模块的值
        sysctl_set: yes   # 立即设置生效
        sysctl_file: /etc/sysctl.conf   # 配置写入文件

执行剧本
[root@pubserver cluster]# ansible-playbook 03-sysctl.yml

执行脚本时,出现了问题

这个问题是ansible找不到这个叫sysctl的模块,我们尝试搜索一下看看

[root@pubserver cluster]# ansible-doc -l | grep sysctl
[root@pubserver cluster]# 

过滤出来时空白的,说明没有这个模块,我们去新添加一下,因为连接不到外网,所以准备了两个rpm文件放到/var/ftp/rpms中

[root@pubserver cluster]# mkdir /var/ftp/rpms

下载createrepo软件包

[root@pubserver cluster]# dnf -y install createrepo
创建软件包清单
[root@pubserver cluster]# createrepo /var/ftp/rpms/
[root@pubserver cluster]# ls /var/ftp/rpms/
ansible-6.3.0-1.el8.noarch.rpm        repodata
ansible-core-2.13.3-1.el8.x86_64.rpm

修改pubserver主机yum配置文件

[root@pubserver cluster]# vim /etc/yum.repos.d/local.repo 
[AppStream]
name=AppStream
baseurl=ftp://192.168.88.240/dvd/AppStream
enabled=1
gpgcheck=0
[BaseOS]
name=BaseOS
baseurl=ftp://192.168.88.240/dvd/BaseOS
enabled=1
gpgcheck=0
[rpms]
name=rpms
baseurl=ftp://192.168.88.240/rpms
enabled=1
gpgcheck=0 

关于ftp的配置后面再说

下载新的ansible,卸载原有的ansible-core,镜像文件中的有点过期了

[root@pubserver cluster]# dnf -y install ansible

 查看模块数量,原来的模块数只有69

[root@pubserver cluster]# ansible-doc -l | wc -l
7214

查看sysctl模块,成果过滤到了,再次运行剧本

[root@pubserver cluster]# ansible-doc -l | grep sysctl
[WARNING]: dellemc.openmanage.ome_active_directory has a documentation
formatting error
ansible.posix.sysctl                                                                     Manage entries ...

剧本运行成功,在client主机上测试

# 测试从客户端到服务器的访问
[root@client ~]# curl http://192.168.99.100
Welcome from web1
[root@client ~]# curl http://192.168.99.200
Welcome from web2

测试成功,路由转发成功。

安装lvs

[root@pubserver cluster]# vim 04-inst-lvs.yml
---
- name: install lvs
  hosts: lb
  tasks:
    - name: install lvs  # 安装lvs
      yum:
        name: ipvsadm
        state: present
        
[root@pubserver cluster]# ansible-playbook 04-inst-lvs.yml

ipvsadm使用说明

-A: 添加虚拟服务器
-E: 编辑虚拟服务器
-D: 删除虚拟服务器
-t: 添加tcp服务器
-u: 添加udp服务器
-s: 指定调度算法。如轮询rr/加权轮询wrr/最少连接lc/加权最少连接wlc
-a: 添加虚拟服务器后,向虚拟服务器中加入真实服务器
-r: 指定真实服务器
-w: 设置权重
-m: 指定工作模式为NAT
-g: 指定工作模式为DR

配置LVS

# 为web服务器创建虚拟服务器,使用rr调度算法
[root@lvs1 ~]# ipvsadm -A -t 192.168.88.5:80 -s rr
# 查看配置
[root@lvs1 ~]# ipvsadm -Ln  # L是列出,n是使用数字,而不是名字
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.88.5:80 rr

# 向虚拟服务器中添加RIP
[root@lvs1 ~]# ipvsadm -a -t 192.168.88.5:80 -r 192.168.99.100 -w 1 -m
[root@lvs1 ~]# ipvsadm -a -t 192.168.88.5:80 -r 192.168.99.200 -w 2 -m
# 查看配置
[root@lvs1 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.88.5:80 rr
  -> 192.168.99.100:80            Masq    1      0          0         
  -> 192.168.99.200:80            Masq    2      0          0         

# 验证
[root@client1 ~]# for i in {1..6}
> do
> curl http://192.168.88.5
> done
Welcome from web2
Welcome from web1
Welcome from web2
Welcome from web1
Welcome from web2
Welcome from web1

修改为加权轮询

# 删除配置。(如果配置有错,用以下命令删除重配置)
[root@lvs1 ~]# ipvsadm -D -t 192.168.88.5:80

# 修改调度模式为加权轮询
[root@lvs1 ~]# ipvsadm -E -t 192.168.88.5:80 -s wrr

# 验证配置
[root@client1 ~]# for i in {1..6}; do curl http://192.168.88.5; done
Welcome from web2
Welcome from web2
Welcome from web1
Welcome from web2
Welcome from web2
Welcome from web1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值