集群

  • 将很多机器组织到一起,作为一个整体对外提供服务
  • 集群在扩展性、性能方面都可以做到很灵活
  • 集群分类:

    • 负载均衡集群:Load Balance
    • 高可用集群:High Availability
    • 高性能计算:High Performance Computing

      LVS

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

  • 实现负载均衡集群
  • 作者:章文嵩。国防科技大学读博士期间编写
  • LVS的工作模式:
    • NAT:网络地址转换
    • DR:路由模式
    • TUN:隧道模式
  • 术语:
    • 调度器:LVS服务器
    • 真实服务器Real Server:提供服务的服务器
    • VIP:虚拟地址,提供给用户访问的地址
    • DIP:指定地址,LVS服务器上与真实服务器通信的地址
    • RIP:真实地址,真实服务器的地址
  • 常见的调度算法,共10个,常用的有4个:
    • 轮询rr:Real Server轮流提供服务
    • 加权轮询wrr:根据服务器性能设置权重,权重大的得到的请求更多
    • 最少连接lc:根据Real Server的连接数分配请求
    • 加权最少连接wlc:类似于wrr,根据权重分配请求

      配置LVS NAT模式

image.png

  • 环境准备
    • 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
  1. # 创建4台虚拟机
  2. [root@zzgrhel8 ~]# clone-vm7
  3. Enter VM number: 1 # 此处填的数字,是虚拟机编号
  4. [root@zzgrhel8 ~]# clone-vm7
  5. Enter VM number: 2
  6. [root@zzgrhel8 ~]# clone-vm7
  7. Enter VM number: 3
  8. [root@zzgrhel8 ~]# clone-vm7
  9. Enter VM number: 4
  10. # 查看虚拟机
  11. [root@zzgrhel8 ~]# virsh list --all
  12. Id 名称 状态
  13. --------------------------
  14. - tedu_node01 关闭
  15. - tedu_node02 关闭
  16. - tedu_node03 关闭
  17. - tedu_node04 关闭
  18. # 启动虚拟机
  19. [root@zzgrhel8 ~]# for i in {1..4}
  20. > do
  21. > virsh start tedu_node0$i
  22. > done
  23. # 初始化虚拟机
  24. [root@zzgrhel8 ~]# virsh console tedu_node01 # 连接tedu_node01控制台
  25. localhost login: root
  26. Password: 123456
  27. # 登陆之后,将以下内容粘贴到终端
  28. hostnamectl set-hostname client1
  29. nmcli connection modify eth0 ipv4.method manual ipv4.addresses 192.168.88.10/24
  30. nmcli connection down eth0
  31. nmcli connection up eth0
  32. echo a | passwd --stdin root
  33. nmcli connection modify eth0 ipv4.gateway 192.168.88.5
  34. nmcli connection down eth0
  35. nmcli connection up eth0
  36. # 退出
  37. [root@localhost ~]# exit
  38. # 退出之后,按ctrl+]可回到真机
  39. # 真机通过ssh连接client1
  40. [root@zzgrhel8 ~]# rm -f ~/.ssh/known_hosts
  41. [root@zzgrhel8 ~]# ssh 192.168.88.10
  42. # 配置第2台机器作为lvs1
  43. [root@zzgrhel8 ~]# virsh console tedu_node02
  44. Kernel 3.10.0-862.el7.x86_64 on an x86_64
  45. localhost login: root
  46. Password: 123456
  47. # 登陆之后,将以下内容复制到命令行
  48. hostnamectl set-hostname lvs1
  49. nmcli connection modify eth0 ipv4.method manual ipv4.addresses 192.168.88.5/24
  50. nmcli connection down eth0
  51. nmcli connection up eth0
  52. nmcli connection modify eth1 ipv4.method manual ipv4.addresses 192.168.99.5/24
  53. nmcli connection down eth1
  54. nmcli connection up eth1
  55. echo a | passwd --stdin root
  56. # 退出
  57. [root@localhost ~]# exit
  58. # 退出之后,按ctrl+]可回到真机
  59. # 真机通过ssh连接lvs1
  60. [root@zzgrhel8 ~]# ssh 192.168.88.5
  61. # 配置第3台机器作为web1
  62. [root@zzgrhel8 ~]# virsh console tedu_node03
  63. localhost login: root
  64. Password: 123456
  65. # 登陆之后,将以下内容复制到命令行
  66. hostnamectl set-hostname web1
  67. nmcli connection modify eth1 ipv4.method manual ipv4.addresses 192.168.99.100/24
  68. nmcli connection down eth1
  69. nmcli connection up eth1
  70. nmcli connection modify eth1 ipv4.gateway 192.168.99.5
  71. nmcli connection down eth1
  72. nmcli connection up eth1
  73. echo a | passwd --stdin root
  74. # 退出
  75. [root@localhost ~]# exit
  76. # 退出之后,按ctrl+]可回到真机
  77. # 真机通过ssh连接web1
  78. [root@zzgrhel8 ~]# ssh 192.168.99.100
  79. # 配置第4台机器作为web2
  80. [root@zzgrhel8 ~]# virsh console tedu_node04
  81. localhost login: root
  82. Password: 123456
  83. # 登陆之后,将以下内容复制到命令行
  84. hostnamectl set-hostname web2
  85. nmcli connection modify eth1 ipv4.method manual ipv4.addresses 192.168.99.200/24
  86. nmcli connection down eth1
  87. nmcli connection up eth1
  88. nmcli connection modify eth1 ipv4.gateway 192.168.99.5
  89. nmcli connection down eth1
  90. nmcli connection up eth1
  91. echo a | passwd --stdin root
  92. # 退出
  93. [root@localhost ~]# exit
  94. # 退出之后,按ctrl+]可回到真机
  95. # 真机通过ssh连接web2
  96. [root@zzgrhel8 ~]# ssh 192.168.99.200
  • 通过clone-vm7创建出来的虚拟机器,如果有192.168.88.0网段的地址,yum已经配置了。虚拟机已关闭selinux和防火墙 。

    配置LVS NAT模式步骤

  • 配置2台web服务器 ```shell [root@web1 ~]# vim /etc/yum.repos.d/local.repo [local_repo] name=CentOS-$releasever - Base baseurl=ftp://192.168.99.240/dvd enabled=1 gpgcheck=0 [root@web2 ~]# vim /etc/yum.repos.d/local.repo [local_repo] name=CentOS-$releasever - Base baseurl=ftp://192.168.99.240/dvd enabled=1 gpgcheck=0 [root@web1 ~]# yum install -y httpd [root@web2 ~]# yum install -y httpd

创建测试页面

[root@web1 ~]# echo “192.168.99.100” > /var/www/html/index.html [root@web2 ~]# echo “apache web server2” > /var/www/html/index.html [root@web1 ~]# systemctl enable httpd —now [root@web2 ~]# systemctl enable httpd —now

在lvs1上测试到web服务器的访问

[root@lvs1 ~]# curl http://192.168.99.100/ 192.168.99.100 [root@lvs1 ~]# ^100^200 # 将上一条命令中的100换成200,执行 curl http://192.168.99.200/ apache web server2

  1. - 确保lvs1ip转发功能已经打开。该功能需要改变内核参数
  2. ```shell
  3. # 查看ip转发功能的内核参数
  4. [root@lvs1 ~]# sysctl -a # 查看所有的内核参数
  5. [root@lvs1 ~]# sysctl -a | grep ip_forward # 查看ip_foward参数
  6. net.ipv4.ip_forward = 1 # 1表示打开转发,0表示关闭转发
  7. # 永久设置打开ip_forward功能
  8. [root@lvs1 ~]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
  9. [root@lvs1 ~]# sysctl -p
  10. # 测试从客户端到服务器的访问
  11. [root@client1 ~]# curl http://192.168.99.100/
  12. 192.168.99.100
  13. [root@client1 ~]# curl http://192.168.99.200/
  14. apache web server2
  • 安装LVS

    1. [root@lvs1 ~]# yum install -y ipvsadm
  • ipvsadm使用说明 ```shell [root@lvs1 ~]# ipvsadm -A: 添加虚拟服务器 -E: 编辑虚拟服务器 -D: 删除虚拟服务器 -t: 添加tcp服务器 -u: 添加udp服务器 -s: 指定调度算法。如轮询rr/加权轮询wrr/最少连接lc/加权最少连接wlc

-a: 添加虚拟服务器后,向虚拟服务器中加入真实服务器 -r: 指定真实服务器 -w: 设置权重 -m: 指定工作模式为NAT -g: 指定工作模式为DR

  1. - 配置LVS
  2. ```shell
  3. # 为web服务器创建虚拟服务器,使用rr调度算法
  4. [root@lvs1 ~]# ipvsadm -A -t 192.168.88.5:80 -s rr
  5. # 查看配置
  6. [root@lvs1 ~]# ipvsadm -Ln # L是列出,n是使用数字,而不是名字
  7. # 向虚拟服务器中添加RIP
  8. [root@lvs1 ~]# ipvsadm -a -t 192.168.88.5:80 -r 192.168.99.100 -w 1 -m
  9. [root@lvs1 ~]# ipvsadm -a -t 192.168.88.5:80 -r 192.168.99.200 -w 2 -m
  10. # 查看配置
  11. [root@lvs1 ~]# ipvsadm -Ln
  12. IP Virtual Server version 1.2.1 (size=4096)
  13. Prot LocalAddress:Port Scheduler Flags
  14. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
  15. TCP 192.168.88.5:80 rr
  16. -> 192.168.99.100:80 Masq 1 0 0
  17. -> 192.168.99.200:80 Masq 2 0 0
  18. # 验证
  19. [root@client1 ~]# for i in {1..4}
  20. > do
  21. > curl http://192.168.88.5/
  22. > done
  23. apache web server2
  24. 192.168.99.100
  25. apache web server2
  26. 192.168.99.100
  27. # 删除配置。(如果配置有错,用以下命令删除重配置)
  28. [root@lvs1 ~]# ipvsadm -D -t 192.168.88.5:80
  29. # 修改调度模式为加权轮询
  30. [root@lvs1 ~]# ipvsadm -E -t 192.168.88.5:80 -s wrr
  31. # 验证配置
  32. [root@client1 ~]# for i in {1..6}; do curl http://192.168.88.5/; done
  33. apache web server2
  34. apache web server2
  35. 192.168.99.100
  36. apache web server2
  37. apache web server2
  38. 192.168.99.100

LVS DR模式

image.png

  • 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 ```shell

      删除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 ~]# ifdown 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 ifcfg-eth2 ifcfg-eth3

配置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地址 NETMASK=255.255.255.0 # 子网掩码 GATEWAY=192.168.88.254 # 网关 [root@web1 network-scripts]# ifdown eth0; ifup eth0 # 禁用激活网卡

在web1上停掉eth1

[root@web1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1 TYPE=Ethernet BOOTPROTO=none NAME=eth1 DEVICE=eth1 ONBOOT=no [root@web1 ~]# ifdown 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 NETMASK=255.255.255.0 GATEWAY=192.168.88.254 [root@web2 ~]# ifdown eth0; ifup eth0 [root@web2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1 TYPE=Ethernet BOOTPROTO=none NAME=eth1 DEVICE=eth1 ONBOOT=no [root@web2 ~]# ifdown eth1 # 终端卡住,关掉它,在新终端重新连

  1. <a name="GOCpM"></a>
  2. ## 配置LVS DR模式
  3. 1. 在lvs1的eth0上配置vip 192.168.88.15。通过为eth0创建逻辑端口的方式配置vip,为逻辑端口起名为eth0:0
  4. ```shell
  5. [root@lvs1 ~]# cd /etc/sysconfig/network-scripts/
  6. [root@lvs1 network-scripts]# cp ifcfg-eth0 ifcfg-eth0:0
  7. [root@lvs1 network-scripts]# vim ifcfg-eth0:0
  8. TYPE=Ethernet
  9. BOOTPROTO=none
  10. NAME=eth0:0
  11. DEVICE=eth0:0
  12. ONBOOT=yes
  13. IPADDR=192.168.88.15
  14. PREFIX=24
  15. [root@lvs1 network-scripts]# ifup eth0:0
  16. # 查看新的地址
  17. [root@lvs1 network-scripts]# ifconfig
  1. 在2台web服务器的lo上配置vip 192.168.88.15

    1. [root@web1 ~]# cd /etc/sysconfig/network-scripts/
    2. [root@web1 network-scripts]# cp ifcfg-lo ifcfg-lo:0
    3. [root@web1 network-scripts]# vim ifcfg-lo:0
    4. DEVICE=lo:0
    5. IPADDR=192.168.88.15
    6. NETMASK=255.255.255.255
    7. NETWORK=192.168.88.15
    8. BROADCAST=192.168.88.15
    9. ONBOOT=yes
    10. NAME=lo:0
    11. [root@web1 network-scripts]# ifup lo:0
    12. [root@web1 network-scripts]# ifconfig
    13. # 把web1的配置拷贝到web2上
    14. [root@web1 network-scripts]# scp ./ifcfg-lo:0 192.168.88.200:/etc/sysconfig/network-scripts/
    15. [root@web2 ~]# ifup lo:0
    16. [root@web2 ~]# ifconfig
  2. 在2台web服务器上配置内核参数,使得它们不响应对192.168.88.15的请求 ```shell [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

  1. 4. lvs1上配置虚拟服务器
  2. ```shell
  3. # 创建虚拟服务器
  4. [root@lvs1 ~]# ipvsadm -A -t 192.168.88.15:80 -s wlc
  5. # 向虚拟服务器中加真实服务器
  6. [root@lvs1 ~]# ipvsadm -a -t 192.168.88.15:80 -r 192.168.88.100 -w 1 -g
  7. [root@lvs1 ~]# ipvsadm -a -t 192.168.88.15:80 -r 192.168.88.200 -w 2 -g
  8. # 查看配置
  9. [root@lvs1 ~]# ipvsadm -Ln
  10. # 客户验证
  11. [root@client1 ~]# for i in {1..6}; do curl http://192.168.88.15/; done
  12. apache web server2
  13. 192.168.99.100
  14. apache web server2
  15. apache web server2
  16. 192.168.99.100
  17. apache web server2
  1. lvs本身没有应用服务器监控功能,如果web服务器出现问题,需要手工从规则中删掉
    1. [root@web1 ~]# systemctl stop httpd
    2. # 客户端访问时,转发到web1上的请求,将会拒绝连接
    3. [root@client1 ~]# for i in {1..6}; do curl http://192.168.88.15/; done
    4. apache web server2
    5. curl: (7) Failed connect to 192.168.88.15:80; 拒绝连接
    6. apache web server2
    7. apache web server2
    8. curl: (7) Failed connect to 192.168.88.15:80; 拒绝连接
    9. apache web server2
    10. # 的规则中删除web1
    11. [root@lvs1 ~]# ipvsadm -d -t 192.168.88.15:80 -r 192.168.88.100
    12. [root@client1 ~]# for i in {1..6}; do curl http://192.168.88.15/; done
    13. apache web server2
    14. apache web server2
    15. apache web server2
    16. apache web server2
    17. apache web server2
    18. apache web server2
    附:出错时,排错步骤: ```shell

    在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 ~]# ifconfig eth0:0 eth0:0: flags=4163 mtu 1500 inet 192.168.88.15 netmask 255.255.255.0 broadcast 192.168.88.255 ether 52:54:00:0d:fb:79 txqueuelen 1000 (Ethernet)

[root@web1 ~]# ifconfig lo:0 lo:0: flags=73 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 0
-> 192.168.88.200:80 Route 2 0 0 ```