Linux集群搭建
集群分类:
HAC(高可用集群)
尽可能的保障网络通讯的正常状态
实现方案:
心跳检测
故障:
脑分裂
出现的问题:
网络访问的中断
实现方案:
keepalived VRRP技术
heartbeat Linux-HA 脚本监测切换
HPC(高性能集群)
提供单台服务器不能提供的计算能力
结构:
任务拆分
文件共享
LBC(负载均衡集群)
构成:
负载调度器
真实服务器
共享存储
负载调度器实现方案:
LVS、Nginx
工作原理:
四层:LVS ,一次TCP连接完成,由Client与RS(实际服务器)之间完成。D(负载调度器)只起到中间转发左右,不参与实际流量。
七层:nginx ,两次TCP连接,一次由client和D(调度器)完成,一次由D与RS(实际服务器)完成。
使用场景:
四层:TCP/UDP的C/S架构,压力小,并发大。但是识别不精确。
七层:由域名结构统领的网络服务器,支持调度多个集群。
安全性:
四层:不会拦截SYN(tcp连接请求包)攻击
七层:可以拦截SYN攻击
HPC与LBC区别:
LBC:提升的是单位时间内处理的任务数量提升系统效率
HPC:通过降低处理单个任务的时间提升系统效率
HAC(高可用集群)
尽可能的保障网络通讯的正常状态
实现方案:
心跳检测
故障:
脑分裂
出现的问题:
网络访问的中断
实现方案:
keepalived VRRP技术
heartbeat Linux-HA 脚本监测切换
HPC(高性能集群)
提供单台服务器不能提供的计算能力
结构:
任务拆分
文件共享
LBC(负载均衡集群)
构成:
负载调度器
真实服务器
共享存储
负载调度器实现方案:
LVS、Nginx
工作原理:
四层:LVS ,一次TCP连接完成,由Client与RS(实际服务器)之间完成。D(负载调度器)只起到中间转发左右,不参与实际流量。
七层:nginx ,两次TCP连接,一次由client和D(调度器)完成,一次由D与RS(实际服务器)完成。
使用场景:
四层:TCP/UDP的C/S架构,压力小,并发大。但是识别不精确。
七层:由域名结构统领的网络服务器,支持调度多个集群。
安全性:
四层:不会拦截SYN(tcp连接请求包)攻击
七层:可以拦截SYN攻击
HPC与LBC区别:
LBC:提升的是单位时间内处理的任务数量提升系统效率
HPC:通过降低处理单个任务的时间提升系统效率
Nginx:
调度多个集群操作
vim nginx.conf
http{ #http 内配置
upstream qixiao.com{ #集群配置区
server 10.244.16.21:8080; #集群主机(默认是轮询,可以支持多端口)
server 10.244.16.22:80; #集群主机
}
upstream lingshu.com{ #第二个集群配置区
server 10.244.16.23:80;
server 10.244.16.24:80;
}
server { #server区域
listen 80;
server_name www.qixiao.com; #域名
location / {
proxy_pass http://qixiao.com; #当访问www.qixiao.com时反向代理到qixiao.com集群
}
}
server { #第二个server区域
listen 80; #监听端口
server_name www.lingshu.com; #域名
location / {
proxy_pass http://lingshu.com; #当访问www.lingshu.com时反向代理到lingshu.com集群
}
}
}
LVS:Linux虚拟服务
数据报文通过网卡层层解析到达内核,内核根据报文的类型交给上层用户空间的应用执行。在数据包从内核空间传送到用户空间过程中,钩子函数强行获取报文的使用权限。查看报文的五元组是否符合LVS规则,如果符合,更改目的地址和端口,进行转发,不符合就还给上层用户空间由上层应用解析。
构成:
ipvs:核心程序,内核内置
ipvsadm:用户空间的命令行管理工具
工作模式:
LVS-NAT
SNAT:主要用于局域网使用一个外网IP进行外网访问
DNAT:端口映射
负载调度器位于client和真实RS之间
负载调度器必须是Linux,真实提供服务的RS可以是任何操作系统
负载调度器一块网卡负责提供VIP能力,另一块网卡与内网RS通讯
负载调度器与真实RS位于同一个二层环境。
负载调度器只负责处理入栈以及出栈请求。
LVS-DR(直接路由模式)
负载调度器与真实服务器位于同一网络环境
负载调度器与真实服务器必须是Linux操作系统,不支持端口映射
负载调度器只负责处理入栈请求,出栈请求由真实服务器完成。
VIP地址配置在各个节点之上,但是只有负载调度器拥有通讯权,RS上的lo网卡解析数据报文
LVS-TUN(隧道模式)
负载调度器与真实服务器必须是Linux操作系统
负载调度器与真实服务器必须拥有公网IP或者能被路由
负载调度器与真实服务器必须支持数据包二次封装
负载调度器处理入栈请求,出栈请求由真实服务器完成
难度: NAT < DR < TUN
并发量:RD > TUN > NAT
使用量:NAT > DR > TUN
调度算法:
固定算法(静态调度算法):只根据算法本身调度,不考虑服务器本身
动态算法(动态调度算法):处理考虑算法本身,还要考虑服务器状态。【消耗CPU资源,但是更加智能】
静态:
RR:轮询,将每次用户的请求分配给后端的服务器,从第一台服务器开始到第N台结束,然后循环
WRR:加权轮询,按照权重的比例实现在多台主机之间进行调度
SH:源地址散列,将同一个IP的用户请求,发送给同一个服务器。
DH:目标地址散列,将同一个目标地址的用户请求发送给同一个真实服务器(提高缓存的命中率)
动态:
LC:最少连接,将新的连接请求,分配给连接数最少的服务器。活动连接*256+非活动连接
WLC:加权最少连接:特殊的最少连接法,权重越大承担的请求数越多(活动连接*256+非活动连接)/权重
SED:最短期延迟,特殊的WLC算法,(活动连接+1)*256/权重
NQ:永不排队,特殊的SED算法。如果发现有连接数为0直接分配。如果全部不为0。则按SED算法分配
LBLC:特殊的DH算法,既能提高缓存命中率,又要考虑服务器性能。缓存压力达到一定阀值,就将流量分发给其他服务器。
LBLCR:LBLC+缓存,尽可能提高负载均衡和缓存命中率的折中方案
持久连接:
1、优先于任何算法最先匹配
2、可以和任意算法进行配合处理,优先级最高
3、存储数据在内存分页中(内存空间)
分类:
PCC(持久客户端连接)将来自于同一客户端的所有请求定向至选定的RS,只要IP相同,分配的服务器始终相同
ipvsadm -A -t 172.16.0.8:0 -s wlc -p 120
PPC(持久端口连接)将来自于同一个客户端对同一个服务(端口)的请求,定向至选定的RS
ipvsadm -A -t 172.16.0.8:80 -s rr -p 120
PFMC(持久防火墙标记连接)将来自于同一客户端对指定服务(端口)的请求,始终定向至此选定的RS,不过可以将两个毫不相干的服务定义为一个集群服务。
iptables -t mangle -A PREROUTING -d 172.16.0.8 -p -tcp -dport 80 -j MARK --set-mark 10
iptables -t mangle -A PREROUTING -d 172.16.0.8 -p -tcp -dport 443 -j MARK --set-mark 10
service iptables save
上边两条表示:将访问172.16.0.8的80和443端口的流量打上10标签
ipvsadm -A -f 10 -s wlc -p 120 表示将标签为10的流量执行wlc算法,持久化连接时间为120秒。持久化时间内发生连接,时间增加120秒。最多不超过200秒【持久化连接时间不宜过大或过小】
LVS-NAT模式搭建:
NFS服务器:
mkdir /share 创建共享目录
chown nfsnobody:nfsnobody /share/ NFS服务默认使用nfsnobody用户,将共享目录属主和属组更改为nfsnobody
yum install -y nfs
vim /etc/exports
/share 10.244.16.0/24(rw,sync) #可以共享多个网段。每一行是一个共享。三个字段【共享目录路径 共享网段 共享权限】
service rpcbind restart #rpcbind服务是nfs同步数据的服务
service nfs start #开启nfs服务
chkconfig rpcbind on
chkconfig nfs on
showmount -e [NFS服务器IP地址] 测试NFS服务器是否了连接
注:如果出现权限问题。可以尝试将apache用户加入到nfsnobody组。用户提交的文件就可以写入共享服务器
负载调度器:
yum install -y ipvsadm
vim /etc/sysctl.conf
net,ipv4.ip_forward=1
sysctl -p
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 10.244.16.30
ipvsadm -A -t 10.244.16.30:80 -s rr
ipvsadm -a -t 10.244.16.30:80 -r 192.168.1.1:80 -m
ipvsadm -a -t 10.244.16.30:80 -r 192.168.1.2:80 -m
ipvsadm -Ln --stats
LVS-DR模式搭建:
NFS服务器:同上
负载调度器:
关闭NetworkManager服务,并设置开机不自启
service NetworkManager stop
chkconfig NetworkManager off
添加一块网卡,或编辑虚拟网卡
cp ifcfg-eth0 ifcfg-eth0:0
vim ifcfg-eth0:0
DEVICE=eth0:0
IPADDR=10.244.16.100 #vip地址
PREFIX=24
ifup eth0:0 #如果虚地址起不来,则查看NetworkManager服务有没有关闭。一般是NetworkManager服务与network服务冲突所致,建议重启一下
修改内核参数,防止相同的网络地址广播冲突
vim /etc/sysctl
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
sysctl -p #刷新内核参数
modprobe ip_vs #查看内核是否加载,无法应则以加载
cat /proc/net/ip_vs #参看版本,确认知否正确加载
安装LVS管理工具ipvsadm
yum install -y ipvsadm
设置DR模式的负载调度规则
ipvsadm -A -t 10.244.16.100:80 -s rr #10.244.16.100为VIP,21和22为实际RS服务器IP
ipvsadm -a -t 10.244.16.100:80 -r 10.244.16.21:80 -g
ipvsadm -a -t 10.244.16.100:80 -r 10.244.16.22:80 -g
ipvsadm -Ln 查看调度规则
保存配置:
service ipvsadm save
chkconfig ipvsadm on
实际RS1:
关闭NetworkManager服务,并设置开机不自启
service NetworkManager stop
chkconfig NetworkManager off
修改内核参数,防止相同的网络地址广播冲突
vim /etc/sysctl
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
sysctl -p 刷新内核参数
配置虚拟回环网卡lo:0用于解析数据报文
cp ifcfg-lo ifcfg-lo:0
vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=10.244.16.100
NETMASK=255.255.255.255
ifup eth0:0 #如果虚地址起不来,则查看NetworkManager服务有没有关闭。一般是NetworkManager服务与network服务冲突所致,建议重启一下
mount -t nfs [共享存储:/路径] [网站根目录]
实际RS2:与RS1类似
调度多个集群操作
vim nginx.conf
http{ #http 内配置
upstream qixiao.com{ #集群配置区
server 10.244.16.21:8080; #集群主机(默认是轮询,可以支持多端口)
server 10.244.16.22:80; #集群主机
}
upstream lingshu.com{ #第二个集群配置区
server 10.244.16.23:80;
server 10.244.16.24:80;
}
server { #server区域
listen 80;
server_name www.qixiao.com; #域名
location / {
proxy_pass http://qixiao.com; #当访问www.qixiao.com时反向代理到qixiao.com集群
}
}
server { #第二个server区域
listen 80; #监听端口
server_name www.lingshu.com; #域名
location / {
proxy_pass http://lingshu.com; #当访问www.lingshu.com时反向代理到lingshu.com集群
}
}
}
LVS:Linux虚拟服务
数据报文通过网卡层层解析到达内核,内核根据报文的类型交给上层用户空间的应用执行。在数据包从内核空间传送到用户空间过程中,钩子函数强行获取报文的使用权限。查看报文的五元组是否符合LVS规则,如果符合,更改目的地址和端口,进行转发,不符合就还给上层用户空间由上层应用解析。
构成:
ipvs:核心程序,内核内置
ipvsadm:用户空间的命令行管理工具
工作模式:
LVS-NAT
SNAT:主要用于局域网使用一个外网IP进行外网访问
DNAT:端口映射
负载调度器位于client和真实RS之间
负载调度器必须是Linux,真实提供服务的RS可以是任何操作系统
负载调度器一块网卡负责提供VIP能力,另一块网卡与内网RS通讯
负载调度器与真实RS位于同一个二层环境。
负载调度器只负责处理入栈以及出栈请求。
LVS-DR(直接路由模式)
负载调度器与真实服务器位于同一网络环境
负载调度器与真实服务器必须是Linux操作系统,不支持端口映射
负载调度器只负责处理入栈请求,出栈请求由真实服务器完成。
VIP地址配置在各个节点之上,但是只有负载调度器拥有通讯权,RS上的lo网卡解析数据报文
LVS-TUN(隧道模式)
负载调度器与真实服务器必须是Linux操作系统
负载调度器与真实服务器必须拥有公网IP或者能被路由
负载调度器与真实服务器必须支持数据包二次封装
负载调度器处理入栈请求,出栈请求由真实服务器完成
难度: NAT < DR < TUN
并发量:RD > TUN > NAT
使用量:NAT > DR > TUN
调度算法:
固定算法(静态调度算法):只根据算法本身调度,不考虑服务器本身
动态算法(动态调度算法):处理考虑算法本身,还要考虑服务器状态。【消耗CPU资源,但是更加智能】
静态:
RR:轮询,将每次用户的请求分配给后端的服务器,从第一台服务器开始到第N台结束,然后循环
WRR:加权轮询,按照权重的比例实现在多台主机之间进行调度
SH:源地址散列,将同一个IP的用户请求,发送给同一个服务器。
DH:目标地址散列,将同一个目标地址的用户请求发送给同一个真实服务器(提高缓存的命中率)
动态:
LC:最少连接,将新的连接请求,分配给连接数最少的服务器。活动连接*256+非活动连接
WLC:加权最少连接:特殊的最少连接法,权重越大承担的请求数越多(活动连接*256+非活动连接)/权重
SED:最短期延迟,特殊的WLC算法,(活动连接+1)*256/权重
NQ:永不排队,特殊的SED算法。如果发现有连接数为0直接分配。如果全部不为0。则按SED算法分配
LBLC:特殊的DH算法,既能提高缓存命中率,又要考虑服务器性能。缓存压力达到一定阀值,就将流量分发给其他服务器。
LBLCR:LBLC+缓存,尽可能提高负载均衡和缓存命中率的折中方案
持久连接:
1、优先于任何算法最先匹配
2、可以和任意算法进行配合处理,优先级最高
3、存储数据在内存分页中(内存空间)
分类:
PCC(持久客户端连接)将来自于同一客户端的所有请求定向至选定的RS,只要IP相同,分配的服务器始终相同
ipvsadm -A -t 172.16.0.8:0 -s wlc -p 120
PPC(持久端口连接)将来自于同一个客户端对同一个服务(端口)的请求,定向至选定的RS
ipvsadm -A -t 172.16.0.8:80 -s rr -p 120
PFMC(持久防火墙标记连接)将来自于同一客户端对指定服务(端口)的请求,始终定向至此选定的RS,不过可以将两个毫不相干的服务定义为一个集群服务。
iptables -t mangle -A PREROUTING -d 172.16.0.8 -p -tcp -dport 80 -j MARK --set-mark 10
iptables -t mangle -A PREROUTING -d 172.16.0.8 -p -tcp -dport 443 -j MARK --set-mark 10
service iptables save
上边两条表示:将访问172.16.0.8的80和443端口的流量打上10标签
ipvsadm -A -f 10 -s wlc -p 120 表示将标签为10的流量执行wlc算法,持久化连接时间为120秒。持久化时间内发生连接,时间增加120秒。最多不超过200秒【持久化连接时间不宜过大或过小】
LVS-NAT模式搭建:
NFS服务器:
mkdir /share 创建共享目录
chown nfsnobody:nfsnobody /share/ NFS服务默认使用nfsnobody用户,将共享目录属主和属组更改为nfsnobody
yum install -y nfs
vim /etc/exports
/share 10.244.16.0/24(rw,sync) #可以共享多个网段。每一行是一个共享。三个字段【共享目录路径 共享网段 共享权限】
service rpcbind restart #rpcbind服务是nfs同步数据的服务
service nfs start #开启nfs服务
chkconfig rpcbind on
chkconfig nfs on
showmount -e [NFS服务器IP地址] 测试NFS服务器是否了连接
注:如果出现权限问题。可以尝试将apache用户加入到nfsnobody组。用户提交的文件就可以写入共享服务器
负载调度器:
yum install -y ipvsadm
vim /etc/sysctl.conf
net,ipv4.ip_forward=1
sysctl -p
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 10.244.16.30
ipvsadm -A -t 10.244.16.30:80 -s rr
ipvsadm -a -t 10.244.16.30:80 -r 192.168.1.1:80 -m
ipvsadm -a -t 10.244.16.30:80 -r 192.168.1.2:80 -m
ipvsadm -Ln --stats
LVS-DR模式搭建:
NFS服务器:同上
负载调度器:
关闭NetworkManager服务,并设置开机不自启
service NetworkManager stop
chkconfig NetworkManager off
添加一块网卡,或编辑虚拟网卡
cp ifcfg-eth0 ifcfg-eth0:0
vim ifcfg-eth0:0
DEVICE=eth0:0
IPADDR=10.244.16.100 #vip地址
PREFIX=24
ifup eth0:0 #如果虚地址起不来,则查看NetworkManager服务有没有关闭。一般是NetworkManager服务与network服务冲突所致,建议重启一下
修改内核参数,防止相同的网络地址广播冲突
vim /etc/sysctl
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
sysctl -p #刷新内核参数
modprobe ip_vs #查看内核是否加载,无法应则以加载
cat /proc/net/ip_vs #参看版本,确认知否正确加载
安装LVS管理工具ipvsadm
yum install -y ipvsadm
设置DR模式的负载调度规则
ipvsadm -A -t 10.244.16.100:80 -s rr #10.244.16.100为VIP,21和22为实际RS服务器IP
ipvsadm -a -t 10.244.16.100:80 -r 10.244.16.21:80 -g
ipvsadm -a -t 10.244.16.100:80 -r 10.244.16.22:80 -g
ipvsadm -Ln 查看调度规则
保存配置:
service ipvsadm save
chkconfig ipvsadm on
实际RS1:
关闭NetworkManager服务,并设置开机不自启
service NetworkManager stop
chkconfig NetworkManager off
修改内核参数,防止相同的网络地址广播冲突
vim /etc/sysctl
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
sysctl -p 刷新内核参数
配置虚拟回环网卡lo:0用于解析数据报文
cp ifcfg-lo ifcfg-lo:0
vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=10.244.16.100
NETMASK=255.255.255.255
ifup eth0:0 #如果虚地址起不来,则查看NetworkManager服务有没有关闭。一般是NetworkManager服务与network服务冲突所致,建议重启一下
mount -t nfs [共享存储:/路径] [网站根目录]
实际RS2:与RS1类似