目录
集群
- 通过高速网络将很多服务器集中起来一起
- 提供同一种服务,在客户端看起来就像是只有一个服务器(即多台服务器提供同一种服务)
- 可以在付出较低成本的情况下获得在性能、可靠性、灵活性方面的相对较高的收益
- 任务调度是集群系统中的核心技术
集群的目的
提高性能:计算密集型应用,如:天气预报、核模拟实验
降低成本:相对百万美元级的超级计算机,价格便宜
提高可扩展性:只需要增加新的集群节点即可
增强可靠性:多个节点功能相同,避免单点失败
集群的分类
高性能计算集群HPC
- 通过以集群的方式并行应用程序,解决复杂的科学问题
负载均衡集群LB
- 客户端负载在计算机集群中尽可能的平均分摊
高可用集群HA
- 避免单点故障,当一个系统发生故障时,可以快速迁移
LVS介绍
LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士在1998年创建的一个开源项目,旨在实现高性能、高可用性的服务器集群系统。LVS主要用于构建高可伸缩和高可用的网络服务,如Web服务、邮件服务、FTP服务等,是实现负载均衡的一种技术解决方案。
LVS工作在操作系统网络层,主要通过IP负载均衡技术和基于内容请求分发技术,将来自客户端的访问请求动态地分配给后端的真实服务器集群,从而达到分散单台服务器压力、提升整体系统处理能力的目的。LVS主要包含以下三种工作模式:
-
VS/NAT(Network Address Translation,网络地址转换): 在这种模式下,LVS作为所有客户端和服务集群之间的网关,客户端发送的请求首先到达LVS,然后LVS将请求的源IP地址改写为自身的IP地址,再将请求转发给真实服务器。真实服务器处理完请求后,将响应返回给LVS,LVS再将响应的源地址改回客户端的IP地址,最后将响应发送给客户端。这种方式需要LVS有足够的处理能力和带宽,因为它需要处理所有的进出流量。
-
VS/TUN(Tunneling,隧道): 使用IP隧道技术,LVS只需要将客户端的请求封装在一个新的IP包中,然后根据调度算法选择一台真实服务器,并将这个封装的IP包发送给它。真实服务器处理完请求后,直接将响应返回给客户端,无需经过LVS。这种方式减少了LVS的网络负担,但是增加了网络的复杂度,因为需要在真实服务器和LVS之间建立隧道。
-
VS/DR(Direct Routing,直接路由): 在直接路由模式下,LVS直接根据调度算法修改请求的数据包的目标MAC地址,使其指向某台真实服务器,然后将数据包直接发送到局域网内的真实服务器。真实服务器处理完请求后,直接将响应发送给客户端,无需经过LVS。这种方式效率最高,但是要求LVS和真实服务器必须在同一物理网络段内。
LVS集群组成
前端:负载均衡层
- 由一台或多台负载调度器组成
中间:服务器群组层
- 由一组实际运行应用服务的服务器组成
底端:数据共享存储层
- 提供共享存储空间的存储区域
Director Server:调度服务器
- 将负载分发到RealServer的服务器
Real Server:真实服务器
- 真正提供应用服务的服务器
VIP:虚拟IP地址
- 公布给用户访问的虚拟IP地址
DIP:调度器连接后端节点服务器的IP地址
RIP:真实IP地址
- 集群节点上使用的IP地址
LVS工作模式
VS/NAT
- 通过网络地址转换实现的虚拟服务器
- 大并发访问时,调度器的性能成为瓶颈
VS/DR
- 直接使用路由技术实现虚拟服务器
- 节点服务器需要配置VIP,注意MAC地址广播
VS/TUN
- 通过隧道方式实现虚拟服务器
负载均衡调度算法
LVS目前实现了10种调度算法
常用调度算法有4种
- 轮询(Round Robin)
- 加权轮询(Weighted Round Robin)
- 最少连接(Least Connections
- 加权最少连接(Weighted Least Connections
其他调度算法
- 源地址散列(Source Hashing)
- 目标地址散列(Destination Hashing)
- 基于局部性的最少链接
- 带复制的基于局部性最少链接
- 最短的期望的延迟
- 最少队列调度
环境准备
- 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
安装ansible
将pubserver当做控制端,其他机器作为被控端
[root@pubserver ~]# dnf -y install ansible-core
[root@pubserver ~]# mkdir cluster;cd cluster
#创建主配置文件
[root@pubserver cluster]# vim ansible.cfg
[defaults]
inventory = inventory
host_key_checking = false # 不检查主机密钥
# 创建主机清单文件及相关变量
[root@pubserver cluster]# vim inventory
[clients]
client ansible_host=192.168.88.10
[lb]
lvs ansible_host=192.168.88.5
[webservers]
web1 ansible_host=192.168.99.100
web2 ansible_host=192.168.99.200
[all:vars] # all是ansible自带的组,表示全部主机
ansible_ssh_user=root
ansible_ssh_pass=a
创建文件夹用于存放将要拷贝到远程主机的文件
# 创建文件目录,用于保存将要拷贝到远程主机的文件
[root@pubserver cluster]# mkdir files
编写yum文件
# 编写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
[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
编写用于上传yum配置文件的playbook,为了方便编写yml文件,修改一下vim的配置
该配置文件,使得vim编写yml文件时按tab会缩进两个空格,编写其他格式文件时正常缩进,同时为了方便使用按下空格换到下一行时,光标和上一行内容对齐
[root@pubserver cluster]# vim ~/.vimrc
内容如下:
" 设置通用的tabstop为4空格,softtabstop也为4空格(用于自动转换tab为space)
set tabstop=4
set softtabstop=4
" 设置默认的shiftwidth为2空格,用于普通情况下的缩进
set shiftwidth=2
" 开启自动缩进
set autoindent
" 文件类型检测相关的设置
filetype plugin indent on
" 为.yml和.yaml文件专门设置
autocmd FileType yaml setlocal shiftwidth=2 tabstop=2 softtabstop=2
" 保持回车后光标与上一行对齐
function! SmartEnter()
let save_cursor = getpos(".")
normal! o
call setpos(".", [0, save_cursor[1]+1, save_cursor[2], save_cursor[3]])
if &filetype == 'yaml'
normal! 2i
endif
endfunction
map <CR> :call SmartEnter()<CR>
编写用于上传yum配置的playbook
# 编写用于上传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
配置LVS NAT模式
配置2台web服务器
创建首页文件,文件中包含ansible facsts变量
[root@pubserver cluster]# vim files/index.html
Welcome from {{ansible_hostname}}
配置web服务器,编写剧本2
[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
据说现在红帽在推行新的ansible-navigator,说实话两个差不多,不过navigator看错误消息还是挺方便的
执行完毕,在lvs上测试web服务器
[root@lvs ~]# curl http://192.168.99.100
Welcome from web1
[root@lvs ~]# curl http://192.168.99.200
Welcome from web2
确保lvs1的ip转发功能已经打开。该功能需要改变内核参数
[root@lvs1 ~]# sysctl -a # 查看所有的内核参数
[root@lvs1 ~]# sysctl -a | grep ip_forward # 查看ip_foward参数
net.ipv4.ip_forward = 0 # 1表示打开转发,0表示关闭转发
设置打开ip路由转发功能
[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
执行脚本时,出现了问题
这个问题是ansible找不到这个叫sysctl的模块,我们尝试搜索一下看看
[root@pubserver cluster]# ansible-doc -l | grep sysctl
[root@pubserver cluster]#
过滤出来时空白的,说明没有这个模块,我们去新添加一下,因为连接不到外网,所以准备了两个rpm文件放到/var/ftp/rpms中
[root@pubserver cluster]# mkdir /var/ftp/rpms
下载createrepo软件包
[root@pubserver cluster]# dnf -y install createrepo
创建软件包清单
[root@pubserver cluster]# createrepo /var/ftp/rpms/
[root@pubserver cluster]# ls /var/ftp/rpms/
ansible-6.3.0-1.el8.noarch.rpm repodata
ansible-core-2.13.3-1.el8.x86_64.rpm
修改pubserver主机yum配置文件
[root@pubserver cluster]# vim /etc/yum.repos.d/local.repo
[AppStream]
name=AppStream
baseurl=ftp://192.168.88.240/dvd/AppStream
enabled=1
gpgcheck=0
[BaseOS]
name=BaseOS
baseurl=ftp://192.168.88.240/dvd/BaseOS
enabled=1
gpgcheck=0
[rpms]
name=rpms
baseurl=ftp://192.168.88.240/rpms
enabled=1
gpgcheck=0
关于ftp的配置后面再说
下载新的ansible,卸载原有的ansible-core,镜像文件中的有点过期了
[root@pubserver cluster]# dnf -y install ansible
查看模块数量,原来的模块数只有69
[root@pubserver cluster]# ansible-doc -l | wc -l
7214
查看sysctl模块,成果过滤到了,再次运行剧本
[root@pubserver cluster]# ansible-doc -l | grep sysctl
[WARNING]: dellemc.openmanage.ome_active_directory has a documentation
formatting error
ansible.posix.sysctl Manage entries ...
剧本运行成功,在client主机上测试
# 测试从客户端到服务器的访问
[root@client ~]# curl http://192.168.99.100
Welcome from web1
[root@client ~]# 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使用说明
-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是使用数字,而不是名字
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
# 向虚拟服务器中添加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
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
# 验证
[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