LVS负载均衡集群

集群

什么是集群

通过高速网络将很多服务器集中起来一起提供同一种服务,在客户端看来就像是只有一个服务器

可以在付出较低成本的情况下获得在性能、可靠性、灵活性方面的相对较高的收益

任务调度是集群系统中的核心技术

集群目的

提高性能

---如计算密集型应用,如:天气预报、核试验模拟

降低成本

---相对百万美元级的超级计算机,价格便宜

提高可扩展性

---只要增加集群节点即可

增强可靠性

---多个节点完成相同功能,避免单点失败

集群分类

高性能计算集群HPC(High Performance Computing)

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

负载均衡(LB)集群(Load Balance)

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

高可用(HA)集群(High Availability)

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

LVS概述

实现负载均衡集群

LVS项目介绍

Linux虚拟服务器(LVS)是章文嵩在国防科技大学就读博士期间创建的

LVS可以实现高可用的、可伸缩的Web、Mail、Cache和Media等网络服务

最终目标是利用Linux操作系统和LVS集群软件实现一个高可用、高性能、低成本的服务器应用集群

LVS集群组成

前端:负载均衡层

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

中间:服务器群组成

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

底端:数据共享存储层

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

LVS术语

Director Server:调度服务器(LVS服务器)

---将负载分发到Real Server的服务器

Real Server:真实服务器

---真正提供应用服务的服务器

VIP:虚拟IP地址

---公布给用户访问的虚拟IP地址

DIP:指定地址,LVS服务器上与真实服务器通信的地址

RIP:真实地址

---真实服务器的地址

LVS工作模式

NAT:网络地址转换

DR:路由模式

TUN:隧道模式

常见的调度算法

轮询rr:Real Server轮流提供服务

加权轮询wrr:根据服务器性能设置权重,权重大的得到的请求更多

最少连接lc:根据Real Server的连接数分配请求

加权最少连接wlc:类似于wrr,根据权重分配请求

配置LVS NAT模式

环境准备:

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

在pubserver上准备管理环境

#创建工作目录
[root@pubserver ~]# mkdir cluster
[root@pubserver ~]# cd cluster
#创建主配置文件
[root@pubserver cluster]# vim ansible.cfg
[defaults]
inventory = inventory
host_key_checking = false  # 不检查主机密钥
#创建主机清单文件及相关变量
[root@pubserver cluster]# vim inventory
[clients]
client1 ansible_host=192.168.88.10

[webservers]
web1 ansible_host=192.168.99.100
web2 ansible_host=192.168.99.200

[lb]
lvs1 ansible_host=192.168.88.5
[all:vars]   # all是ansible自带的组,表示全部主机
ansible_ssh_user=root
ansible_ssh_pass=a
#创建文件目录,用于保存将要拷贝到远程主机的文件
[root@pubserver cluster]# mkdir files
#编写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
[rpms]
name = rpms
baseurl = ftp://192.168.88.240/rpms
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
[rpms]
name = rpms
baseurl = ftp://192.168.99.240/rpms
enabled = 1
gpgcheck = 0

#编写用于上传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

配置两台web服务器

#创建首页文件,文件中包含ansible facts变量
[root@pubserver cluster]# vim files/index.html
Welcome from {{ansible_hostname}}
#配置web服务器
[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
#在lvs1上测试到web服务器的访问
[root@lvs1 ~]# curl http://192.168.99.100
Welcome from web1
[root@lvs1 ~]# curl http://192.168.99.200
Welcome from web2

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

#查看ip转发功能的内核参数
[root@lvs1 ~]# sysctl -a    # 查看所有的内核参数
[root@lvs1 ~]# sysctl -a | grep ip_forward  # 查看ip_foward参数
net.ipv4.ip_forward = 1   # 1表示打开转发,0表示关闭转发
#设置打开ip_forward功能
[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
#测试从客户端到服务器的访问
[root@client1 ~]# curl http://192.168.99.100
Welcome from web1
[root@client1 ~]# 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使用说明

[root@lvs1 ~]# 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是使用数字,而不是名字
# 向虚拟服务器中添加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
# 验证
[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

LVS DR模式

LVS DR模式,LVS主机和web服务器都是单网卡。它们连在同一网络中

修改实验环境

client1:eth0-> 192.168.88.10

lvs1:eth0->192.168.88.5,删除eth1的IP

web1:eth0->192.168.88.100,删除eth1的IP

web2:eth0->192.168.88.200,删除eth1的IP

#删除lvs虚拟服务器配置
[root@lvs1 ~]# ipvsadm -D -t 192.168.88.5:80
[root@lvs1 ~]# ipvsadm -Ln
#删除lvs1上eth1的配置
[root@lvs1 ~]# nmcli connection modify eth1 ipv4.method disabled ipv4.addresses ''
[root@lvs1 ~]# nmcli connection down eth1
#修改web1的配置:停掉eth1的地址。配置eth0的地址为192.168.88.100
#进入网卡配置文件目录
[root@web1 ~]# cd /etc/sysconfig/network-scripts/
#eth0网卡的配置文件叫ifcfg-eth0
[root@web1 network-scripts]# ls ifcfg-eth*
ifcfg-eth0  ifcfg-eth1
#配置eth0地址
[root@web1 network-scripts]# vim ifcfg-eth0
TYPE=Ethernet             # 网络类型为以太网
BOOTPROTO=none            # IP地址是静态配置的,也可以用static
NAME=eth0                 # 为设备重命名
DEVICE=eth0               # 网卡设备名
ONBOOT=yes                # 开机激活网卡
IPADDR=192.168.88.100     # IP地址
PREFIX=24                 # 子网掩码长度
GATEWAY=192.168.88.254    # 网关
[root@web1 ~]# systemctl restart NetworkManager    # 重启网络服务
#在web1上停掉eth1
[root@web1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE=Ethernet
BOOTPROTO=none
NAME=eth1
DEVICE=eth1
ONBOOT=no
[root@web1 ~]# nmcli connection down eth1     # 终端卡住,关掉它,在新终端重新连
#修改web2的网络
[root@web2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0 
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.88.200
PREFIX=24
GATEWAY=192.168.88.254
[root@web2 ~]# systemctl restart NetworkManager
[root@web2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE=Ethernet
BOOTPROTO=none
NAME=eth1
DEVICE=eth1
ONBOOT=no
[root@web2 ~]# nmcli connection down eth1
#修改pubserver的主机清单文件
[root@pubserver cluster]# cp inventory inventory.bak
[root@pubserver cluster]# vim inventory
[clients]
client1 ansible_host=192.168.88.10
[webservers]
web1 ansible_host=192.168.88.100
web2 ansible_host=192.168.88.200
[lb]
lvs1 ansible_host=192.168.88.5
[all:vars]
ansible_ssh_user=root
ansible_ssh_pass=a
#修改2台web服务器yum配置文件中的地址
[root@web1 ~]# sed -i 's/99/88/' /etc/yum.repos.d/local99.repo
[root@web1 ~]# cat /etc/yum.repos.d/local99.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
[rpms]
name = rpms
baseurl = ftp://192.168.88.240/rpms
enabled = 1
gpgcheck = 0

在lvs1的eth0上配置vip 192.168.88.15

[root@pubserver cluster]# vim 05-config-lvsvip.yml
---
- name: config lvs vip
  hosts: lb
  tasks:
    - name: add vip
      lineinfile:   # 确保文件中有某一行内容
        path: /etc/sysconfig/network-scripts/ifcfg-eth0
        line: IPADDR2=192.168.88.15
      notify: restart eth0  # 通知执行handlers中的任务
  handlers:   # 被通知执行的任务写到这里
    - name: restart eth0
      shell: nmcli connection down eth0; nmcli connection up eth0
[root@pubserver cluster]# ansible-playbook 05-config-lvsvip.yml
# 在lvs1查看添加的IP地址
[root@lvs1 ~]# ip a s eth0 | grep 88
    inet 192.168.88.5/24 brd 192.168.88.255 scope global noprefixroute eth0
    inet 192.168.88.15/24 brd 192.168.88.255 scope global secondary noprefixroute eth0

在2台web服务器的lo上配置vip 192.168.88.15。lo:0网卡需要使用network-scripts提供的配置文件进行配置

[root@pubserver cluster]# vim 06-config-webvip.yml
---
- name: config webservers vip
  hosts: webservers
  tasks:
    - name: install network-scripts  # 安装服务
      yum:
        name: network-scripts
        state: present
    - name: add lo:0   # 创建lo:0的配置文件
      copy:
        dest: /etc/sysconfig/network-scripts/ifcfg-lo:0
        content: |
          DEVICE=lo:0
          NAME=lo:0
          IPADDR=192.168.88.15
          NETMASK=255.255.255.255
          NETWORK=192.168.88.15
          BROADCAST=192.168.88.15
          ONBOOT=yes
      notify: activate lo:0
  handlers:
    - name: activate lo:0   # 激活网卡
      shell: ifup lo:0
[root@pubserver cluster]# ansible-playbook 06-config-webvip.yml
# 查看结果
[root@web1 ~]# cd /etc/sysconfig/network-scripts/
[root@web1 network-scripts]# cat ifcfg-lo:0
DEVICE=lo:0
NAME=lo:0
IPADDR=192.168.88.15
NETMASK=255.255.255.255
NETWORK=192.168.88.15
BROADCAST=192.168.88.15
ONBOOT=yes
[root@web1 network-scripts]# ifconfig  # 可以查看到lo:0网卡信息
lo:0: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 192.168.88.15  netmask 255.255.255.255
        loop  txqueuelen 1000  (Local Loopback)

在2台web服务器上配置内核参数,使得它们不响应对192.168.88.15的请求

[root@web1 ~]# sysctl -a | grep arp_ignore
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 0
[root@web1 ~]# sysctl -a | grep arp_announce
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 0
[root@web1 ~]# vim /etc/sysctl.conf 
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
[root@web1 ~]# sysctl -p
[root@web2 ~]# vim /etc/sysctl.conf 
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
[root@web2 ~]# sysctl -p

在lvs1上配置虚拟服务器

#创建虚拟服务器
[root@lvs1 ~]# ipvsadm -A -t 192.168.88.15:80 -s wlc
#向虚拟服务器中加真实服务器
[root@lvs1 ~]# ipvsadm -a -t 192.168.88.15:80 -r 192.168.88.100 -w 1 -g
[root@lvs1 ~]# ipvsadm -a -t 192.168.88.15:80 -r 192.168.88.200 -w 2 -g
#查看配置
[root@lvs1 ~]# ipvsadm -Ln
#客户验证
[root@client1 ~]# for i in {1..6}; do curl http://192.168.88.15/; done
Welcome from web2
Welcome from web1
Welcome from web2
Welcome from web2
Welcome from web1
Welcome from web2

msg:出错时,排错步骤:

#在lvs上可以访问到web服务器
[root@lvs1 ~]# curl http://192.168.88.100/
192.168.99.100
[root@lvs1 ~]# curl http://192.168.88.200/
apache web server2

#查看vip
[root@lvs1 ~]# ip a s eth0 | grep 88
    inet 192.168.88.5/24 brd 192.168.88.255 scope global noprefixroute eth0
    inet 192.168.88.15/24 brd 192.168.88.255 scope global secondary noprefixroute eth0
[root@web1 ~]# ifconfig lo:0
lo:0: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 192.168.88.15  netmask 255.255.255.255
        loop  txqueuelen 1000  (Local Loopback)
#查看内核参数
[root@web1 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2

#查看规则
[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.15:80 wlc
  -> 192.168.88.100:80            Route   1      0          12
  -> 192.168.88.200:80            Route   2      0          18

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值