一、集群
概念解析
-
集群(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主机 |
| client | eth0->192.168.88.10 网关:192.168.88.5 | 客户端 |
| lvs1 | eth0 -> 192.168.88.5 eth1->192.168.99.5 | lvs服务器 |
| web1 | eth1->192.168.99.100 网关:192.168.99.5 | web服务器 |
| web2 | web2: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.240 | ansible主机 |
| client(已存在) | eth0:192.168.88.10 | 客户端 |
| lvs1(已存在) | eth0:192.168.88.5 ech1:关闭网卡 | lvs服务器 |
| web1(已存在) | eth0:192.168.88.100 | web服务器 |
| web2(已存在) | eth0:192.168.88.100 | web服务器 |

## 实验环境准备
# 重新创建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

被折叠的 条评论
为什么被折叠?



