Linux 集群管理
1. 集群
1.1 什么是集群
集群(cluster)是由一组独立的计算机系统构成的一个松耦合的多处理器系统,作为一个整体向用户提供一组网络资源,这些单个的计算机系统就是集群的节点(node)。它们之间通过网络实现进程间的通信。
通俗一点来说,就是让若干台计算机联合起来工作(服务),可以是并行的,也可以是做备份。
1.2 集群的类型
集群根据不同类型可分为:
- 负载均衡集群
- 高可用集群
- 高性能计算集群
- 负载均衡集群
1.2.1 负载均衡集群 Load Balance cluster
负载均衡集群是指:把负载压力根据某种算法合理分配到集群中的每一台计算机上,以减轻主服务器的压力,降低对主服务器的硬件和软件要求。
例如:四兄弟开裁缝铺,生意特别多,一个人做不下来,老是延误工期,于是四个兄弟商量:老大接订单, 三个兄弟来干活。客户多起来之后,老大根据一定的原则(policy) 根据三兄弟手上的工作量来分派新任务。
1.2.2 高可用集群 High Availability cluster
利用集群管理软件,当主服务器故障时,备份服务器能够自动接管主服务器的工作,并及时切换过去,以实现对用户的不间断服务。
例如:两兄弟开早餐铺,生意不大,但是每天早上7点到9点之间客户很多并且不能中断。为了保证2个小时内这个早餐铺能够保证持续提供服务,两兄弟商量几个方法:
方法一:平时老大做生意,老二这个时间段在家等候,一旦老大无法做生意了,老二就出来顶上,这个叫做 Active/Standby(双机冷备)
方法二:平时老大做生意,老二这个时候就在旁边帮工,一旦老大无法做生意,老二就马上顶上,这个叫做 Active/Passive(双机热备)
方法三:平时老大卖包子,老二也在旁边卖豆浆,老大有问题,老二就又卖包子,又卖豆浆,老二不行了,老大就又卖包子,又卖豆浆。这个叫做 Active/Active (dual Active)(双机互备)。
1.2.3 高性能计算集群 High Performance Computing clustering
即充分利用集群中的每一台计算机的资源,实现复杂运算的并行处理,通常用于科学计算领域,比如基因分析、化学分析等。
例如:10个兄弟一起做手工家具生意,一个客户来找他们的老爹要求做一套非常复杂的仿古家具,一个人做也可以做,不过要做很久很久,为了1个星期就交出这一套家具,10个兄弟决定一起做。老爹把这套家具的不同部分分开交给儿子们作,然后每个儿子都在做木制家具的加工,最后拼在一起。老爹是scheduler任务调度器,儿子们是compute node. 他们做的工作叫做作业。
2. 负载均衡集群 部署实践
2.1 HAProxy
集群主机清单如下:
主机名 | IP地址 | 服务器角色 |
---|---|---|
client2.gnb.cloud |
10.1.1.21 |
客户端 |
client1.gnb.cloud |
10.1.8.21 |
客户端 |
router.gnb.cloud |
10.1.1.20 , 10.1.8.20 |
路由器 |
lb.gnb.cloud |
10.1.1.10 , 10.1.8.10 |
代理服务器 |
web1.gnb.cloud |
10.1.8.11 |
Web 和 SSH 服务器 |
web2.gnb.cloud |
10.1.8.12 |
Web 和 SSH 服务器 |
web3.gnb.cloud |
10.1.8.13 |
Web 和 SSH 服务器 |
2.1.1 准备虚拟机
- 克隆一台模板机,在模板机上配置 hosts
bash
[root@centos7 ~ 10:50:26]# vim /etc/host
10.1.8.10 lb.gnb.cloud lb
10.1.8.11 web1.gnb.cloud web1
10.1.8.12 web2.gnb.cloud web2
10.1.8.13 web3.gnb.cloud web3
10.1.8.20 router.gnb.cloud router
10.1.8.21 client1.gnb.cloud client1
10.1.1.21 client2.gnb.cloud client2
- 继续在模板机上编辑批量配置主机名和 IP 的脚本
bash
#!/bin/bash
interface=ens33
domain=gnb.cloud
usage(){
echo "Usage: $0 10 | 11-13 | 20-22"
exit 1
}
function set_ip(){
if [ $# -eq 0 ]; then
usage
else
nmcli connection modify $interface ipv4.address 10.1.8.$1/24
nmcli connection up $interface
fi
}
function set_host(){
case $1 in
1[1-3])
HOSTNAME=web$[ $1 - 10 ].$domain
;;
21)
HOSTNAME=client1.$domain
;;
10)
HOSTNAME=lb.$domain
;;
20)
HOSTNAME=router.$domain
;;
*)
usage
;;
esac
hostnamectl set-hostname $HOSTNAME
}
function main(){
set_ip $1
set_host $1
}
main $*
10.1.1 网段的主机和网卡单独进行配置,减少脚本的复杂度
-
克隆虚拟机,所有
10.1.8.x
网段的主机网卡保持 NAT 模式,为lb
和router
主机额外添加一张网卡,并与client2
主机的网卡一并设置为VMnet1
-
启动虚拟机,将脚本上传至
/usr/local/bin
目录下,执行脚本修改主机名和 IP 地址。10.1.1.x
网段主机或网卡使用代码自行配置 -
向路由器主机中添加以下命令,以启用路由、启用防火墙并放行外网连接
bash
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
firewall-cmd --set-default-zone=trusted
firewall-cmd --add-masquerade --permanent
- 至此完成配置,记得打快照
2.1.2 环境配置
- 安装服务
在 lb
主机上安装 haproxy
服务,在三台 web
主机上安装 nginx
服务:
bash
[root@lb ~ 15:53:59]# yum -y install haproxy
[root@web1 ~ 15:54:06]# yum -y install nginx
[root@web2 ~ 15:54:13]# yum -y install nginx
[root@web3 ~ 15:54:22]# yum -y install nginx
- 准备测试页
bash
[root@web1 ~ 15:14:57]# mkdir /test
[root@web1 ~ 15:15:07]# echo hello text from $(hostname -s) > /test/index.txt
[root@web1 ~ 15:15:47]# echo hello html from $(hostname -s) > /test/index.html
[root@web1 ~ 15:16:24]# echo Welcome to $(hostname) > /usr/share/nginx/html/index.html
- 编辑配置文件
bash
# 备份配置文件
[root@lb ~ 15:16:11]# cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak
# 编辑配置文件
[root@lb ~ 15:16:44]# vim /etc/haproxy/haproxy.cfg
frontend front_web
bind *:80
default_backend back_web
acl test url_reg -i \.txt$
use_backend test if test
backend back_web
balance roundrobin
server web1 10.1.8.11:80 check
server web2 10.1.8.12:80 check
server web3 10.1.8.13:80 check
backend test
balance roundrobin
server test1 10.1.8.11:81 check
server test2 10.1.8.12:81 check
server test3 10.1.8.13:81 check
# 启动服务
[root@lb ~ 15:18:29]# systemctl enable haproxy.service --now
- 配置 TCP 访问
bash
[root@lb ~ 15:40:21]# vim /etc/haproxy/haproxy.cfg
listen ssh
mode tcp
bind *:1022
balance roundrobin
server web1 10.1.8.11:22 check
server web2 10.1.8.12:22 check
server web3 10.1.8.13:22 check
systemctl restart haproxy.service
2.2 Nginx 反向代理
bash
# 安装 nginx
[root@lb ~ 21:07:15]# yum install -y nginx
# 编辑配置文件
[root@lb ~ 21:07:59]# vim /etc/nginx/nginx.conf
......
http {
# http 块中增加upstream
upstream web {
server 10.1.8.11:80;
server 10.1.8.12:80;
server 10.1.8.13:80;
}
server {
.......
# 增加 location / 记录,后端指向web,上一步配置的upstream
location / {
# 添加如下语句
proxy_pass http://web;
}
}
}
# 启动服务
[root@lb ~ 21:10:26]# systemctl start nginx.service