集群是由多个计算机或服务器组成的网络,它们共同工作以完成单个任务或多个任务。集群可以提高计算能力、可靠性和可扩展性。
高性能 HPC
high performance Computing 用于处理大规模计算任务,如科学计算、气象预测、金融建模等。
负载均衡 LB 用于分配网络流量和负载,以确保网络服务的高可用性和可靠性。
Load Balance
高可用 HA
High Availability 双热设备 用于提供高可用性和容错能力,以确保系统在故障时仍能正常运行。
工作模式
NAT: 网络地址转换
DR: 路由模式
TUN: 隧道模式
术语
调度器
真实服务器
VIP 给用户访问的地址
DIP LVS服务器上的真实地址
RIP 真实地址
轮询 rr
加权轮询 wrr
最少连接 lc
加权最少连接 wlc
LVS linux虚拟服务器
环境准备
登陆之后,将以下内容粘贴到终端
hostnamectl set-hostname client1
nmcli connection modify "System eth0" con-name eth0 改名
nmcli connection modify eth0 ipv4.method manual ipv4.addresses 192.168.88.10/24 autoconnect yes ipv4.gateway 192.168.88.5
nmcli connection down eth0
nmcli connection up eth0
hostnamectl set-hostname lvs1
nmcli connection modify "System eth0" con-name eth0
nmcli connection modify eth0 ipv4.method manual ipv4.addresses 192.168.88.5/24 autoconnect yes
nmcli connection down eth0
nmcli connection up eth0
rm -f /etc/sysconfig/network-scripts/ifcfg-eth1
nmcli connection add con-name eth1 ifname eth1 type ethernet autoconnect yes ipv4.method manual ipv4.addresses 192.168.99.5/24
reboot # 重启系统,使得eth1网卡生效
hostnamectl set-hostname web1
nmcli connection modify "System eth0" con-name eth0
nmcli connection modify eth0 autoconnect no
rm -f /etc/sysconfig/network-scripts/ifcfg-eth1
nmcli connection add con-name eth1 ifname eth1 type ethernet autoconnect yes ipv4.method manual ipv4.addresses 192.168.99.100/24 ipv4.gateway 192.168.99.5
reboot
hostnamectl set-hostname web2
nmcli connection modify "System eth0" con-name eth0
nmcli connection modify eth0 autoconnect no
rm -f /etc/sysconfig/network-scripts/ifcfg-eth1
nmcli connection add con-name eth1 ifname eth1 type ethernet autoconnect yes ipv4.method manual ipv4.addresses 192.168.99.200/24 ipv4.gateway 192.168.99.5
reboot
第二种方式
yum -y install NetworkManager-tui 图形界面修改 Tab不了 更新一下缓存 yum makecache
disabled 禁用网卡 manual 配置IP
ls /etc/sysconfig/network-scripts/
rm -f /etc/sysconfig/network-scripts/ifcfg-eth1 删掉会配置重新生成
创建工作目录
[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仓库 到ansible目录下 99网段的88 改为99 使用sed -i s/88/99/
配置LVS NAT 模式步骤
确保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
ipvsadm使用说明
ipvsadm
-A: 添加虚拟服务器
-E: 编辑虚拟服务器
-D: 删除虚拟服务器
-t: 添加tcp服务器
-u: 添加udp服务器
-s: 指定调度算法。如轮询rr/加权轮询wrr/最少连接lc/加权最少连接wlc
-a: 添加虚拟服务器后,向虚拟服务器中加入真实服务器
-r: 指定真实服务器
-w: 设置权重
-m: 指定工作模式为NAT
-g: 指定工作模式为DR
NAT模式
为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
DR模式
1 网络参数
2 配置yum
3 在web上配置nginx
4 在LVS的物理网卡上配置VIP
5在web服务器的lo配置VIP
6 在web服务器上配置内核参数
7 在LVS上安装ipvsadm
8 在 LVS上编写转发规则
9 在client1上测试访
删除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
配置LVS DR模式
在lvs1的eth0上配置vip 192.168.88.15。
---
- 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
-
在2台web服务器的lo上配置vip 192.168.88.15。
lo:0
网卡需要使用network-scripts
提供的配置文件进行配置。
---
- 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)
重启就会消失 ifup lo:0(配置的名称) 重新激活才会显示
ls /etc/rc.d/rc.local 开机自动运行这个脚本 可以把命令放到这里开机自动运行
写入 ifup lo:0
在2台web服务器上配置内核参数,使得它们不响应对192.168.88.15的请求
apr -a 查看 缓存表
第一个和最后一个修改
sysctl -a | grep arp_ignore 修改为 1 1
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 0
[root@web1 ~]# sysctl -a | grep arp_announce 修改为 2 0
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
LVS实现的是哪种类型的集群?lvs的工作模式有哪些?
LVS属于负载均衡集群。
LVS的工作模式有以下几种:
NAT模式:通过修改数据包的源地址和目的地址,将请求分发到后端服务器,然后将响应返回给客户端。
DR模式:将请求分发到后端服务器,然后将响应返回给客户端,不修改数据包的源地址和目的地址。
TUN模式:将请求分发到后端服务器,然后将响应返回给LVS,再由LVS将响应返回给客户端。
解释一下LVS相关的术语
调度器:LVS服务器
真实服务器Real Server:提供服务的服务器
VIP:虚拟地址,提供给用户访问的地址
DIP:指定地址,LVS服务器上与真实服务器通信的地址
RIP:真实地址,真实服务器的地址
LVS有哪些常用的调度算法?
RR(Round Robin)调度算法:轮流将请求分配给后端服务器。
WRR(Weighted Round Robin)调度算法:根据服务器的权重比例进行轮询分配。
LC(Least Connection)调度算法:将请求分配给连接数最少的服务器。
WLC(Weighted Least Connection)调度算法:根据服务器的权重比例将请求分配给连接数最少的服务器。
LVS NAT模式需要什么样的网络拓扑?
在LVS的NAT模式下,需要一个三层网络拓扑结构。其中,客户端和LVS调度器位于同一子网中,后端服务器位于另一个子网中。客户端通过默认网关将请求发送到LVS调度器,LVS调度器将请求转发到后端服务器,后端服务器处理请求并将响应返回给LVS调度器,最后LVS调度器将响应返回给客户端。
手动配置LVS的NAT模式
-m 后缀为 NAT -g 后缀为 DR
创建虚拟机,并为eth0配置IP地址
为各主机配置主机名和适当的网络参数 上面有
配置yum
配置web服务器
yum install -y nginx
cho 'web11 web site' > /usr/share/nginx/html/index.html
systemctl enable nginx.service --now
# web22的配置
yum install -y nginx
cho 'Hello from web22' > /usr/share/nginx/html/index.html
systemctl enable nginx.service --now
配置LVS调度器
# 配置规则
[root@lvs11 ~]# yum install -y ipvsadm
[root@lvs11 ~]# ipvsadm -A -t 192.168.88.5:80 -s lc
[root@lvs11 ~]# ipvsadm -a -t 192.168.88.5:80 -r 192.168.99.100 -m
[root@lvs11 ~]# ipvsadm -a -t 192.168.88.5:80 -r 192.168.99.200 -m
# 查看规则
[root@lvs11 ~]# 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 lc
-> 192.168.99.100:80 Masq 1 0 0
-> 192.168.99.200:80 Masq 1 0 0
客户端验证
for i in {1..4}
do
curl http://192.168.88.5/
done
配置LVS的DR模式
不使用ansible
调度算法采用rr
创建虚拟机,并为eth0配置IP地址
配置yum
所有主机yum配置相同,以下以client10为例,配置yum
[root@client10 ~]# vim /etc/yum.repos.d/local.repo
[local_BaseOS]
name=Rocky Linux $releasever - BaseOS baseurl="ftp://192.168.88.240/dvd/BaseOS" enabled=1 gpgcheck=1 [local_AppStream] name=Rocky Linux $releasever - AppStream
baseurl="ftp://192.168.88.240/dvd/AppStream"
enabled=1
gpgcheck=1
配置web服务器
web11的配置
[root@web11 ~]# yum install -y nginx
[root@web11 ~]# echo 'web11 web site' > /usr/share/nginx/html/index.html
[root@web11 ~]# systemctl enable nginx.service --now
web22的配置
[root@web22 ~]# yum install -y nginx
[root@web22 ~]# echo 'Hello from web22' > /usr/share/nginx/html/index.html
[root@web22 ~]# systemctl enable nginx.service --now
配置VIP
在lvs上配置VIP
[root@lvs11 ~]# echo ' IPADDR2=192.168.88.15' >> /etc/sysconfig/network-scripts/ifcfg-eth0
[root@lvs11 ~]# nmcli connection down "System eth0" ; nmcli connection up "System eth0"
[root@lvs11 ~]# ip a s | grep 192
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
在WEB服务器上配置VIP,以web11为例
[root@web11 ~]# yum install -y network-scripts
[root@web11 ~]# vim /etc/sysconfig/network-scripts/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@web11 ~]# ifup lo:0
[root@web11 ~]# ip a s | grep 192
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服务器上配置内核参数
两台web服务器都要配置,以下以web1为例进行配置
[root@web11 ~]# 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@web11 ~]# sysctl -p
配置LVS规则
yum install -y ipvsadm
[root@lvs11 ~]# ipvsadm -A -t 192.168.88.15:80 -s lc
[root@lvs11 ~]# ipvsadm -a -t 192.168.88.15:80 -r 192.168.88.100 -g
[root@lvs11 ~]# ipvsadm -a -t 192.168.88.15:80 -r 192.168.88.200 -g
ipvsadm -Ln
客户端验证