LVS - 1

一、集群

概念解析

  • 集群(CLUSTER)概念

    • 集群就是一组计算机,它们作为一个整体向用户提供一组网络资源
  • 集群核心:任务调度

  • 集群目的

    • 提高性能:如计算密集型应用
    • 降低成本:相对超级计算机价格低廉
    • 提高可扩展性:只要增加集群节点即可
    • 增强可靠性:多个节点完成相同功能,有效避免单点
  • 集群分类

    • HA:高可用集群(High Availability Cluster)

    • LBC:负载均衡集群/负载均衡系统(Load Balance Cluster)

    • HPC:

      • 科学计算集群(High Performance Computing Cluster)
      • 高性能计算集群(High Performance Computing)
  • 集群有以下几种类型:

    1. 高性能计算集群:用于处理大规模计算任务,如科学计算、气象预测、金融建模等。

    2. 负载均衡集群:用于分配网络流量和负载,以确保网络服务的高可用性和可靠性。

    3. 高可用性集群:用于提供高可用性和容错能力,以确保系统在故障时仍能正常运行。

    集群的主要作用是提高计算能力、可靠性和可扩展性。通过将多个计算机或服务器组合在一起,集群可以同时处理多个任务,从而提高计算能力。此外,集群还可以提供容错和负载均衡功能,以确保系统的高可用性和可靠性。最后,集群还可以通过添加新的计算机或服务器来扩展系统的规模,以满足不断增长的计算需求。

二、LVS

概念解析

  • LVS:Linux Virtual Server,Linux虚拟服务器

    • Linux虚拟服务器(LVS)是章文嵩在国防科技大学就读博士期间研发的
    • 由于性能过于强悍被Linux内核维护组织收录,从2.4版本内核开始嵌入
  • 功能

    • 实现高可用的、可伸缩的Web、Mail、Cache和Media等网络服务
  • 目标

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

    • 工作在内核空间的IPVS模块
    • 工作在用户空间的ipvsadm管理工具
  • LVS的工作模式:

    • NAT:网络地址转换
    • DR:路由模式
    • TUN:隧道模式
  • 术语:

    • 调度器:LVS服务器
    • 真实服务器Real Server:提供服务的服务器
    • VIP:虚拟地址,提供给用户访问的地址
    • DIP:指定地址,LVS服务器上与真实服务器通信的地址
    • RIP:真实地址,真实服务器的地址
  • 常见的调度算法,共10个,常用的有4个:

    • 轮询rr:Real Server轮流提供服务
    • 加权轮询wrr:根据服务器性能设置权重,权重大的得到的请求更多
    • 最少连接lc:根据Real Server的连接数分配请求
    • 加权最少连接wlc:类似于wrr,根据权重分配请求
LVS-NAT模式
实验环境准备
主机名IP地址角色
pubserver(已存在)eth0:192.168.88.240
eth1->192.168.99.240
ansible主机
clienteth0->192.168.88.10
网关:192.168.88.5
客户端
lvs1eth0 -> 192.168.88.5
eth1->192.168.99.5
lvs服务器
web1eth1->192.168.99.100
网关:192.168.99.5
web服务器
web2web2:eth1->192.168.99.200
网关:192.168.99.5
web服务器

  • Ansible配置

## 配置Ansible

# 创建单独工作目录

[root@pubserver ~]# mkdir cluster

[root@pubserver ~]# cd cluster/

# 编写ansible配置文件和主机清单列表文件

[root@pubserver cluster]# vim ansible.cfg 

[defaults]

inventory = inventory

host_key_checking = false

module_name = shell

[root@pubserver cluster]# vim inventory 

[clients]

client ansible_ssh_host=192.168.88.10

[webservers]

web1 ansible_ssh_host=192.168.99.100

web2 ansible_ssh_host=192.168.99.200

[lbs]

lvs1 ansible_ssh_host=192.168.88.5

[all:vars]

ansible_ssh_user=root

ansible_ssh_pass=a

# 测试ansible配置

[root@pubserver cluster]# ansible all -m ping

# 准备repo文件

[root@pubserver cluster]# mkdir files

[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]# cp files/local88.repo files/local99.repo 

[root@pubserver cluster]# sed -i '/88/s/88/99/' files/local99.repo 

[root@pubserver cluster]# cat 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

  • 配置测试NAT模式

## 配置LVS-NAT模式

# 同步yum源文件

[root@pubserver cluster]# vim 01_config_yum.yml

---

- name: config yum

  hosts: all

  tasks:

    - name: rm dir      #删除/etc/yum.repos.d/目录

      file:

        path: /etc/yum.repos.d/

        state: absent

    - name: create dir  #创建/etc/yum.repos.d/目录

      file:

        path: /etc/yum.repos.d/

        mode: '0755'

        state: directory

- name: upload 88 yum

  hosts: clients,lbs

  tasks:

    - name: copy repo   #发送repo文件到目标主机

      copy:

        src: files/local88.repo

        dest: /etc/yum.repos.d/

- name: upload 99 yum

  hosts: webservers

  tasks:

    - name: copy repo   #发送repo文件到目标主机

      copy:

        src: files/local99.repo

        dest: /etc/yum.repos.d/

[root@pubserver cluster]# ansible-playbook 01_config_yum.yml 

# 配置web服务器组

[root@pubserver cluster]# vim files/index.html.j2

Welcome to {{ ansible_hostname }}

[root@pubserver cluster]# vim 02_config_web.yml 

---

- name: config web

  hosts: webservers

  tasks:

    - name: install nginx   #安装nginx

      yum:

        name: nginx

        state: present

    - name: copy index      #发送index.html.j2生成index.html文件

      template:

        src: files/index.html.j2

        dest: /usr/share/nginx/html/index.html

    - name: start nginx     #启动nginx服务

      service:

        name: nginx

        state: started

        enabled: true

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

[root@pubserver cluster]# curl http://192.168.99.100/

Welcome to web1

[root@pubserver cluster]# curl http://192.168.99.200/

Welcome to web2

# 配置LVS服务器

[root@pubserver cluster]# sysctl -a

[root@pubserver cluster]# ansible lvs1 -a "sysctl -a | grep ip_forward"

[root@pubserver cluster]# vim 03_config_nat_sysctl.yml

---

- name: config sysctl

  hosts: lbs

  tasks:

    - name: modify kernel args          #持久开启Linux路由转发功能

      sysctl:

        name: net.ipv4.ip_forward

        value: '1'

        sysctl_set: true

        sysctl_file: /etc/sysctl.conf

      notify: flush args

  handlers:

    - name: flush args                  #刷新sysctl.conf文件

      shell: "sysctl -p"

[root@pubserver cluster]# ansible-playbook 03_config_nat_sysctl.yml 

[root@pubserver cluster]# ansible lvs1 -a "cat /proc/sys/net/ipv4/ip_forward"

lvs1 | CHANGED | rc=0 >>

1

[root@pubserver cluster]# vim 04_install_lvs.yml

---

- name: install lvs

  hosts: lbs

  tasks:

    - name: install soft    #安装ipvsadm软件

      yum:

        name: ipvsadm

        state: present

[root@pubserver cluster]# ansible-playbook 04_install_lvs.yml 

# ipvsadm命令常用选项

    -A: 添加虚拟服务器

    -E: 编辑虚拟服务器

    -D: 删除虚拟服务器

    -C: 删除所有虚拟服务器

    -t: 添加tcp服务器

    -u: 添加udp服务器

    -s: 指定调度算法。如轮询rr/加权轮询wrr/最少连接lc/加权最少连接wlc

    -a: 添加虚拟服务器后,向虚拟服务器中加入真实服务器

    -r: 指定真实服务器

    -w: 设置权重

    -m: 指定工作模式为NAT

    -g: 指定工作模式为DR

# 配置LVS-NAT模式规则

[root@lvs1 ~]# ipvsadm -Ln      #-n为显示具体IP地址

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

[root@lvs1 ~]# ipvsadm -A -t 192.168.88.5:80 -s rr

[root@lvs1 ~]# ipvsadm -a -t 192.168.88.5:80 -r 192.168.99.100:80 -w 1 -m   

[root@lvs1 ~]# ipvsadm -a -t 192.168.88.5:80 -r 192.168.99.200:80 -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         

# 测试访问,必须使用LVS集群之外的主机作为客户端

[root@client ~]# for i in {1..6}

 do

 curl http://192.168.88.5

 done

Welcome to web2

Welcome to web1

Welcome to web2

Welcome to web1

Welcome to web2

Welcome to web1

# 调整LVS-NAT规则

[root@lvs1 ~]# ipvsadm -E -t 192.168.88.5:80 -s wrr

[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 wrr    #算法为wrr后权重生效

  -> 192.168.99.100:80            Masq    1      0          3         

  -> 192.168.99.200:80            Masq    2      0          3         

# 访问测试,必须使用LVS集群之外的主机作为客户端

[root@client ~]# for i in {1..6}

 do

 curl http://192.168.88.5

 done

Welcome to web2

Welcome to web1

Welcome to web2

Welcome to web2

Welcome to web1

Welcome to web2

LVS-DR模式

实验环境准备

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

主机名IP地址角色
pubserver(已存在)eth0:192.168.88.240ansible主机
client(已存在)eth0:192.168.88.10客户端
lvs1(已存在)eth0:192.168.88.5
ech1:关闭网卡
lvs服务器
web1(已存在)eth0:192.168.88.100web服务器
web2(已存在)eth0:192.168.88.100web服务器


## 实验环境准备

# 重新创建web主机

  • Ansible配置

## 调整Ansible配置

# 调整主机清单文件,将webservers主机组内主机IP地址为88段

[root@pubserver ~]# cd cluster/

[root@pubserver cluster]# vim inventory 

[clients]

client ansible_ssh_host=192.168.88.10

[webservers]

web1 ansible_ssh_host=192.168.88.100

web2 ansible_ssh_host=192.168.88.200

[lbs]

lvs1 ansible_ssh_host=192.168.88.5

[all:vars]

ansible_ssh_user=root

ansible_ssh_pass=a

[root@pubserver cluster]# ansible all -m ping

# 配置各主机yum源

[root@pubserver cluster]# vim 05_config_yum.yml 

---

- name: config yum

  hosts: all

  tasks:

    - name: rm dir          #删除目录

      file:

        path: /etc/yum.repos.d/

        state: absent

    - name: create dir      #创建目录

      file:

        path: /etc/yum.repos.d/

        state: directory

        mode: '0755'

    - name: copy repo       #发送repo文件

      copy:

        src: files/local88.repo

        dest: /etc/yum.repos.d/

[root@pubserver cluster]# ansible-playbook 05_config_yum.yml 

# 配置webservers主机内主机web服务

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

[root@pubserver cluster]# curl http://192.168.88.100

Welcome to web1

[root@pubserver cluster]# curl http://192.168.88.200

Welcome to web2

  • 配置测试DR模式

## 配置DR模式

# 配置虚拟IP地址(VIP)

[root@pubserver cluster]# vim 06_config_dr_vip.yml 

---

- name: install soft        #安装network-scripts软件

  hosts: lbs,webservers

  tasks:

    - name: install network-scripts     #安装软件

      yum: 

        name: network-scripts

        state: present

- name: config lvs vip      #配置lvs1主机eth0网卡虚拟接口IP地址

  hosts: lbs

  tasks:

    - name: config file                 #生成ifcfg-eth0:0配置文件

      copy: 

        content: |

          TYPE=Ethernet

          DEVICE=eth0:0

          NAME=eth0:0

          IPADDR=192.168.88.15

          PREFIX=24

          BROADCAST=192.168.88.255

          ONBOOT=yes

        dest: /etc/sysconfig/network-scripts/ifcfg-eth0:0

      notify: active vip

  handlers:

    - name: active vip                  #激活eth0:0

      shell: ifup eth0:0

- name: config web vip      #配置webservers主机lo虚拟接口IP地址

  hosts: webservers

  tasks:

    - name: config file                 #生成ifcfg-lo:0配置文件

      copy:

        content: |

          DEVICE=lo:0

          NAME=lo:0

          IPADDR=192.168.88.15

          PREFIX=32

          NETWORK=192.168.88.15

          BROADCAST=192.168.88.15

          ONBOOT=yes

        dest: /etc/sysconfig/network-scripts/ifcfg-lo:0

      notify: active vip

  handlers:

    - name: active vip                  #激活lo:0

      shell: ifup lo:0

[root@pubserver cluster]# ansible-playbook 06_config_dr_vip.yml 

[root@pubserver cluster]# ansible lbs,webservers -a "ip a s | grep 192.168"

lvs1 | CHANGED | rc=0 >>

    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 eth0:0

web2 | CHANGED | rc=0 >>

    inet 192.168.88.15/32 brd 192.168.88.15 scope global lo:0

    inet 192.168.88.200/24 brd 192.168.88.255 scope global noprefixroute eth0

web1 | CHANGED | rc=0 >>

    inet 192.168.88.15/32 brd 192.168.88.15 scope global lo:0

    inet 192.168.88.100/24 brd 192.168.88.255 scope global noprefixroute eth0

# 配置web服务器内核参数,两种方法二选一即可

##参数解析

net.ipv4.conf.all.arp_ignore

    Linux 系统中的一个内核参数,用于控制是否忽略来自所有网络接口的 ARP(地址解析协议)请求

    0:表示不忽略来自所有网络接口的 ARP 请求,即对所有接口发来的 ARP 请求都会进行响应

    1:表示忽略来自所有网络接口的 ARP 请求,即不会对任何接口发来的 ARP 请求进行响应

net.ipv4.conf.lo.arp_ignore

    Linux 系统中的一个内核参数,用于控制是否忽略本地回环接口(lo)上的 ARP(地址解析协议)请求

    0:表示不忽略本地回环接口上的 ARP 请求,即对本地回环接口上的 ARP 请求进行响应

    1:表示忽略本地回环接口上的 ARP 请求,即不对本地回环接口上的 ARP 请求进行响应

net.ipv4.conf.all.arp_announce

    Linux 内核参数之一,用于控制源 IP 地址在 ARP 请求中的发布方式

    0:系统使用物理接口上的 IP 地址作为 ARP 请求中的源 IP 地址。这是默认设置,适用于大多数情况。

    1: 系统使用主机上的所有 IP 地址中与目标 IP 地址在同一子网上的 IP 地址作为 ARP 请求中的源 IP 地址。这个选项适用于多地址绑定的服务器,确保 ARP 请求使用与目标 IP 在同一子网上的 IP 地址,以提高 ARP 的准确性和性能。

    2: 系统使用主机上配置的主 IP 地址作为 ARP 请求中的源 IP 地址。这个选项适用于某些特殊网络环境,例如负载均衡的集群中,确保 ARP 请求使用主 IP 地址,以避免 ARP 缓存中的旧条目导致流量被错误地发送到主机的其他地址

net.ipv4.conf.lo.arp_announce

    Linux 内核参数之一,用于控制本地回环接口(lo)上 ARP 请求中的源 IP 地址的发布方式

    0: 表示系统将使用物理接口上的 IP 地址作为 ARP 请求中的源 IP 地址。这是默认设置,适用于大多数情况。在本地回环接口上,通常情况下使用此设置,因为本地回环接口用于本地通信,不需要进行 ARP 请求。

    1: 表示系统将使用主机上的所有 IP 地址中与目标 IP 地址在同一子网上的 IP 地址作为 ARP 请求中的源 IP 地址。这个选项适用于多地址绑定的服务器,确保 ARP 请求使用与目标 IP 在同一子网上的 IP 地址,以提高 ARP 的准确性和性能

    2: 表示系统将使用主机上配置的主 IP 地址作为 ARP 请求中的源 IP 地址。这个选项适用于某些特殊网络环境,例如负载均衡的集群中,确保 ARP 请求使用主 IP 地址,以避免 ARP 缓存中的旧条目导致流量被错误地发送到主机的其他地址

[root@pubserver cluster]# vim 07_config_dr_sysctl.yml 

---

- name: config kernel args

  hosts: webservers

  tasks:

    - name: config arp_ignore   #配置忽略arp广播

      sysctl:

        name: "{{ item }}"

        value: "1"

        sysctl_set: true

        sysctl_file: /etc/sysctl.conf

      loop: 

        - net.ipv4.conf.all.arp_ignore

        - net.ipv4.conf.lo.arp_ignore

      notify: flush args

    - name: config arp_announce #配置禁止arp宣告

      sysctl:

        name: "{{ item }}"

        value: "2"

        sysctl_set: true

        sysctl_file: /etc/sysctl.conf

      loop:

        - net.ipv4.conf.all.arp_announce

        - net.ipv4.conf.lo.arp_announce

      notify: flush args

  handlers:

    - name: flush args          #刷新sysctl.conf文件配置

      shell: "sysctl -p"

[root@pubserver cluster]# ansible-playbook 07_config_dr_sysctl.yml 

[root@pubserver cluster]# vim 07_config_dr_sysctl2.yml 

---

- name: config kernel args

  hosts: webservers

  tasks:

    - name: modify kernel args

      blockinfile:

        path: /etc/sysctl.conf

        block: |

          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

      notify: flush args

  handlers:

    - name: flush args

      shell: "sysctl -p"

[root@pubserver cluster]# ansible-playbook 07_config_dr_sysctl2.yml 

[root@pubserver cluster]# ansible webservers -a "tail -6 /etc/sysctl.conf"

web1 | CHANGED | rc=0 >>

# BEGIN ANSIBLE MANAGED BLOCK

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

# END ANSIBLE MANAGED BLOCK

web2 | CHANGED | rc=0 >>

# BEGIN ANSIBLE MANAGED BLOCK

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

# END ANSIBLE MANAGED BLOCK

# 配置LVS-DR模式规则

[root@lvs1 ~]# ipvsadm -Ln

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

[root@lvs1 ~]# ipvsadm -A -t 192.168.88.15:80 -s wrr

[root@lvs1 ~]# ipvsadm -a -t 192.168.88.15:80 -r 192.168.88.100:80 -w 1 -g

[root@lvs1 ~]# ipvsadm -a -t 192.168.88.15:80 -r 192.168.88.200:80 -w 2 -g

[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 wrr

  -> 192.168.88.100:80            Route   1      0          6         

  -> 192.168.88.200:80            Route   2      0          6        

# 访问测试,必须使用LVS集群之外的主机作为客户端

[root@client ~]# for i in {1..6}

 do

 curl http://192.168.88.15

 done

Welcome to web2

Welcome to web2

Welcome to web1

Welcome to web2

Welcome to web2

Welcome to web1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值