集群(cluster)就是一组计算机,它们做为一个总体向用户提供一组网络资源。这些单个的计算机系统就是集群的节点(node)。一个理想的集群是,用户历来不会意识到集群系统底层的节点,在他们看来,集群是一个系统,而非多个计算机系统。而且集群系统的管理员能够随意增长和删改集群系统的节点
集群根据功能划分为两大类:高可用和负载均衡。
高可用集群 html
高可用集群一般为2台服务器,一台工做,另外一台做为冗余,当提供服务的机器宕机时,冗余将接替继续提供服务。
实现高可用的开源软件有:heartbeat、Keepalived,其中heartbeat已无人维护,因此从此使用Keepalived来搭建高可用集群。
负载均衡集群node
负载均衡集群,须要有1台服务器做为分发器,它负责把用户的请求分发给后端的服务器处理,在这个集群里,除了分发器外就是给用户提供服务的服务器了,这些服务器数量至少为2台,因此负载均衡集群至少要3台服务器。
实现负载均衡的开源软件有:LVS、Keepalived、haproxy、nginx;商业软件有:F五、Netscaler。linux
1.keepalived经过VRRP协议来实现高可用nginx
2.在VRRP协议里,将多台功能相同的集齐组成一个小组,这个小组会又一个master角色和backup角色(N>=1)这个角色能够多个。web
3.master会经过组播的形式向各个backup发现VRRP协议的数据包,当backup收不到master发来的VPPR数据包时,就会认为master宕机了,这时backup就会启动服务来替换新的master,若是有多台backup就要看优先级来决定。算法
4.keepalived要有三个模块:apache
core :核心,负责主进程的启动、维护以及全局配置文件的加载和解析 check:负责模块的健康检查 vrrp:提供VPPR协议
这里用keppalived实现nginx服务的高可用,由于nginx在生产环境中,不少企业把nginx作一个负载均衡器 ,假设nginx一旦挂掉,那么后端全部的web,即便说是正常的,那也没法访问到
一、首先准备两台机器,都安装keepalived
master:192.168.66.128
backup:192.168.66.129vim
[root@master ~]# yum install -y keepalived [root@backup ~]# yum install -y keepalived
二、两台机分别安装nginx,能够源码安装,也能够直接yum安装,安装nginx须要epel扩展源后端
yum install -y epel-release yum install -y nginx [root@master ~]# nginx -v nginx version: nginx/1.10.2 [root@backup ~]# nginx -v nginx version: nginx/1.10.2
三、master192.168.66.128配置
(1)修改keppalived默认配置文件/etc/keepalived/keepalived.confcentos
[root@master ~]# > /etc/keepalived/keepalived.conf #清空默认配置文件 [root@master ~]# vi /etc/keepalived/keepalived.conf #添加下面的内容,记得把注释去掉 global_defs { //global_defs 全局配置标识 notification_email { //notification_email用于设置报警邮件地址 luo@qq.com //能够设置多个,每行一个 } notification_email_from root@luo.com //设置邮件发送地址 smtp_server 127.0.0.1 //设置邮件的smtp server地址,这里为本机 smtp_connect_timeout 30 //设置链接smtp sever超时时间 router_id LVS_DEVEL } ####################### check模块配置 ###################### vrrp_script chk_nginx { script "/usr/local/sbin/check_ng.sh" //检查服务是否正常,经过写脚本实现,脚本检查服务健康状态 interval 3 //检查的时间间断是3秒 } ####################### vrrp模块配置 ###################### vrrp_instance VI_1 { //VRRP配置标识 VI_1是实例名称 state MASTER //定义master相关 interface eth0 //网卡名称,这里个人为eth0,经过vrrp协议去通讯、去发广播 virtual_router_id 51 //定义路由器ID ,配置的时候和从机器一致 priority 100 //权重,主角色和从角色的权重是不一样的 advert_int 1 //设定MASTER与BACKUP主机质检同步检查的时间间隔,单位为秒 authentication { //认证相关信息 auth_type PASS //这里认证的类型是PASS auth_pass 123456 //密码的形式是一个字符串 } virtual_ipaddress { //设置虚拟IP地址 (VIP),又叫作漂移IP地址 192.168.66.100 //更改成192.168.66.100 } track_script { //加载脚本 chk_nginx } }
注意:须要把注释去掉后保存退出,虚拟IP地址是一个共有地址,当主机宕机后,备机Nginx启动,若是备机Nginx解析地址依然为源主机IP,则依旧没法正常访问(源主机宕机,IP地址失效)。为解决上述问题,主机和备机都解析到一个公共IP地址,在主机宕机后备机Nginx服务启动便可解析到正常能够访问的IP地址
(2)编辑上面keppalived配置中定义的检查nginx的脚本,路径也是在上面定义的
[root@master ~]# vi /usr/local/sbin/check_ng.sh #添加下面的内容 #!/bin/bash #时间变量,用于记录日志 d=`date --date today +%Y%m%d_%H:%M:%S` #计算nginx进程数量 n=`ps -C nginx --no-heading|wc -l` #若是进程为0,则启动nginx,而且再次检测nginx进程数量, #若是还为0,说明nginx没法启动,此时须要关闭keepalived if [ $n -eq "0" ]; then /etc/init.d/nginx start n2=`ps -C nginx --no-heading|wc -l` if [ $n2 -eq "0" ]; then echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log systemctl stop keepalived fi fi
若是不中止keepalived服务,则容易使服务器发生脑裂,在高可用(HA)系统中,当联系2个节点的“心跳线”断开时,原本为一总体、动做协调的HA系统,就分裂成为2个独立的个体。因为相互失去了联系,都觉得是对方出了故障。两个节点上的HA软件像“裂脑人”同样,争抢“共享资源”、争起“应用服务”,就会发生严重后果——或者共享资源被瓜分、2边“服务”都起不来了;或者2边“服务”都起来了,但同时读写“共享存储”,致使数据损坏。
如何判断脑裂?
分别在两台机查看当前服务器是否拥有虚拟IP,若是两台服务器都拥有,则说明发生了脑裂,证实目前双机通讯出现问题,产生此问题的原有在于 两台服务器都探测不到组内其余服务器的状态(心跳请求没法正常响应),私自断定另外一台服务器挂起,则抢占虚拟IP,脑裂的出现是不被容许的,解决此问题的方法为检查防火墙设置(关闭防火墙)或者使用串口通讯。
注:须要注意脚本中nginx的启动方式,若是是自定义脚本启动的用上面的方式,yum 安装使用service 或者systemctl启动
keepalived的中止方式,由于是centos7因此用 systemctl stop
(3)给脚本加上执行权限
[root@master ~]# chmod 755 /usr/local/sbin/check_ng.sh
(4)启动keepalived
主机和备机启动keepalived服务前都要先检查selinux以及防火墙是否关闭,防止两边检测不到对方的状态
[root@master ~]# systemctl start keepalived [root@master ~]# ps aux |grep keepalived root 3386 0.0 0.1 17224 1100 ? Ss 16:41 0:00 /usr/sbin/keepalived -D root 3388 0.0 0.2 17308 2660 ? S 16:41 0:00 /usr/sbin/keepalived -D root 3389 0.1 0.1 17308 1920 ? S 16:41 0:00 /usr/sbin/keepalived -D root 3678 0.0 0.0 6044 812 pts/0 S+ 16:43 0:00 grep keepalived
(5)测试监控脚本可用性
由于在keepalived配置中定义了nginx检查脚本,并加载,因此启动keepalived会去检查nginx的进程,没有会自动启动nginx,这里已经把nginx也带起来,说明脚本正常
[root@master ~]# ps aux |grep nginx root 3417 0.0 0.1 15776 1560 ? Ss 16:41 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf nginx 3420 0.0 0.2 15940 2388 ? S 16:41 0:00 nginx: worker process root 4366 0.0 0.0 6044 808 pts/0 S+ 16:49 0:00 grep nginx
(6)keepalived相关的日志会记录在/var/log/messages下,能够看到vip已经添加
[root@master ~]# cat /var/log/messages Jul 16 16:41:41 localhost Keepalived_healthcheckers[3388]: Opening file '/etc/keepalived/keepalived.conf'. Jul 16 16:41:41 localhost Keepalived_healthcheckers[3388]: Configuration is using : 6710 Bytes Jul 16 16:41:41 localhost Keepalived_healthcheckers[3388]: Using LinkWatch kernel netlink reflector... Jul 16 16:41:41 localhost Keepalived_healthcheckers[3388]: Netlink reflector reports IP 192.168.66.100 added Jul 16 16:41:45 localhost Keepalived_vrrp[3389]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.66.100
(7)查看vip地址
[root@master ~]# ip add 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:95:62:81 brd ff:ff:ff:ff:ff:ff inet 192.168.66.128/24 brd 192.168.66.255 scope global eth0 inet 192.168.66.100/32 scope global eth0 inet6 fe80::20c:29ff:fe95:6281/64 scope link valid_lft forever preferred_lft forever
能够看到eth0已经有两个地址192.168.66.128和192.168.66.100
(8)检查防火墙
[root@master ~]# iptables -nvL Chain INPUT (policy ACCEPT 35856 packets, 38M bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 13895 packets, 2078K bytes) pkts bytes target prot opt in out source destination [root@master ~]# getenforce Disabled
四、backup192.168.66.129配置
(1)修改keppalived默认配置文件/etc/keepalived/keepalived.conf
[root@backup ~]# > /etc/keepalived/keepalived.conf [root@backup ~]# vi /etc/keepalived/keepalived.conf #添加下面的内容 global_defs { notification_email { luo@qq.com } notification_email_from luo.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_script chk_nginx { script "/usr/local/sbin/check_ng.sh" interval 3 } vrrp_instance VI_1 { state BACKUP #这里须要注意设置成大写BACKUP interface eth0 #注意网卡的名字 virtual_router_id 51 #设置成和MASTER相同的,才会认为是一组 priority 90 #权重设置的比MASTER低 advert_int 1 authentication { auth_type PASS auth_pass 123456 } virtual_ipaddress { 192.168.66.100 } track_script { chk_nginx } }
把注释去掉后保存退出,注意注释的内容
说明: 若是是多台服务器,权重决定了master宕机后,backup接管master角色的顺序
(2)编辑上面keppalived配置中定义的检查nginx的脚本,路径也是在上面定义的
[root@backup ~]# vi /usr/local/sbin/check_ng.sh #添加下面的内容 #!/bin/bash #时间变量,用于记录日志 d=`date --date today +%Y%m%d_%H:%M:%S` #计算nginx进程数量 n=`ps -C nginx --no-heading|wc -l` #若是进程为0,则启动nginx,而且再次检测nginx进程数量, #若是还为0,说明nginx没法启动,此时须要关闭keepalived if [ $n -eq "0" ]; then /etc/init.d/nginx start n2=`ps -C nginx --no-heading|wc -l` if [ $n2 -eq "0" ]; then echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log systemctl stop keepalived fi fi
(3)给脚本加上执行权限
[root@backup ~]# chmod 755 /usr/local/sbin/check_ng.sh
(4)检查selinux和防火墙相关的配置
[root@backup ~]# iptables -nvL Chain INPUT (policy ACCEPT 35856 packets, 38M bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 13895 packets, 2078K bytes) pkts bytes target prot opt in out source destination [root@master ~]# getenforce Disabled
(5)启动keepalived,并查看
[root@backup ~]# systemctl start keepalived [root@backup ~]# ps aux |grep keepalived root 3697 0.0 0.1 17532 1084 ? Ss 01:23 0:00 /usr/sbin/keepalived -D root 3699 0.0 0.2 17616 2628 ? S 01:23 0:00 /usr/sbin/keepalived -D root 3700 0.0 0.1 17616 1884 ? S 01:23 0:00 /usr/sbin/keepalived -D root 3705 0.0 0.0 5980 776 pts/2 S+ 01:26 0:00 grep keepalived
(6)查看脚本是否有效,看nginx有没自动启动
[root@backup ~]# ps aux |grep nginx root 3746 0.0 0.1 16072 1548 ? Ss 01:27 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf nginx 3749 0.0 0.1 16236 1972 ? S 01:27 0:00 nginx: worker process root 4241 0.0 0.0 5980 776 pts/2 S+ 01:31 0:00 grep nginx
测试
(1)在master和backup上建立一个nginx默认索引页,用来区分主和从的nginx服务
[root@master ~]# vi /usr/share/nginx/html/index.html [root@master ~]# cat /usr/share/nginx/html/index.html Master Master [root@backup ~]# vi /usr/share/nginx/html/index.html [root@backup ~]# cat /usr/share/nginx/html/index.html backup backup
(2)用浏览器访问VIP
由于VIP是在主上,因此访问到主的nginx默认索引页
(3)模拟主宕机,把主上的keepalived服务停掉,再访问VIP,看有没漂移到backup上
[root@master ~]# systemctl stop keepalived
能够看到访问是backup的nginx的默认索引页,说明VIP已经漂移到backup上
(4)模拟主已经恢复好,把主上的keepalived服务启动,看vip会不会自动漂移到master上
[root@master ~]# systemctl start keepalived
访问vip
说明测试是成功的
注意事项:
一、keepalived配置文件中的角色master和backup,网卡名字,权重和virtual_router_id
二、vip要用ip add命令查看
三、注意selinux和防火墙设置
四、keepalived服务日志记录在/var/log/message上
主流开源软件LVS、keepalived、haproxy、nginx等
①其中LVS属于4层(网络OSI 7层模型),nginx属于7层,haproxy既能够认为是4层,也能够当作7层使用
②keepalived的负载均衡功能其实就是lvs,lvs是keepalived内置的
③lvs这种4层的负载均衡是能够分发TCP协议,web服务是80端口,除了分发80端口,还有其余的端口通讯的,好比MySQL的负载均衡,就能够用LVS实现,而nginx仅仅支持http,https,mail,haproxy;haproxy也支持MySQL这种TCP负载均衡的
④7层有限制,不过有些更高级的功能,nginx能够经过站点目录,去区分网站服务器以前,LVS4层的就不支持
⑤相比较来讲,LVS这种4层的更稳定,能承受更多的请求,承载的并发量更高,而nginx这种7层的更加灵活,能实现更多的个性化需求
•LVS是由国人章文嵩开发
• 流行度不亚于apache的httpd,基于TCP/IP作的路由和转发,稳定性和效率很高
• LVS最新版本基于Linux内核2.6,有好多年不更新了
• LVS有三种常见的模式:NAT、DR、IP Tunnel
• LVS架构中有一个核心角色叫作分发器(Load balance),它用来分发用户的请求,还有诸多处理用户请求的服务器(Real Server,简称rs)
• 这种模式借助iptables的nat表来实现
• 用户的请求到分发器后,经过预设的iptables规则,把请求的数据包转发到后端的rs上去
• rs须要设定网关为分发器的内网ip
• 用户请求的数据包和返回给用户的数据包所有通过分发器,因此分发器成为瓶颈
• 在nat模式中,只须要分发器有公网ip便可,因此比较节省公网ip资源
LVS NAT模式的特色
一、LVS NAT模式是经过一个分发器(Load Balancer);把用户的请求,分发给后端的Real Server ,Real Server这些服务器接收到请求之后,处理好用户请求之后,就从新丢回给分发器;最后分发器再返回给用户;
二、LVS NAT模式的弊端是分发器会成为整个网络的瓶颈,当访问量、请求量、反馈量大的时候,分发器的压力会很大
三、LVS NAT模式的规模,通常最多支持10来台服务器,超过10台的话就会有力不从心;
四、LVS NAT模式这个结构,只须要有一个公网IP,其余real server服务器所有在内网就能够实现。能够节省不少的公网IP资源
• 这种模式,须要有一个公共的IP配置在分发器和全部rs上,咱们把它叫作vip
• 客户端请求的目标IP为vip,分发器接收到请求数据包后,会对数据包作一个加工,会把目标IP改成rs的IP,这样数据包就到了rs上
• rs接收数据包后,会还原原始数据包,这样目标IP为vip,由于全部rs上配置了这个vip,因此它会认为是它本身
LVS IP Tunnel模式的特色
在分发器(load balancer)与真实服务器(real server)之间创建了虚拟通道,叫作 ip tunnel ;其实是更改了数据包目的IP;请求过来经过分发器,经过在真实服务器上配置的VIP;用户请求的时候,数据包里面包好的目的IP,当数据包到达分发器的时候,分发器会进行一个数据包目的IP的更改,而后发送到具体的真实服务器上,经过lvs的本身的算法,进行实现到底传输到哪台真实服务器上;而后真实服务器再解包处理,再经过一个VIP直接经过公网返回到用户,这样省略数据回到分发器的过程,减少了分发器的压力,解决了分发器的瓶颈。
• 这种模式,也须要有一个公共的IP配置在分发器和全部rs上,也就是vip
• 和IP Tunnel不一样的是,它会把数据包的MAC地址修改成rs的MAC地址
• rs接收数据包后,会还原原始数据包,这样目标IP为vip,由于全部rs上配置了这个vip,因此它会认为是它本身
LVS DR模式的特色
与IP Tunnel模式总体过程相同,不一样的是,它会把数据包的MAC地址修改成rs的MAC地址进行分发。
• 轮询 Round-Robin rr
• 加权轮询 Weight Round-Robin wrr
• 最小链接 Least-Connection lc
• 加权最小链接 Weight Least-Connection wlc
• 基于局部性的最小链接 Locality-Based Least Connections lblc
• 带复制的基于局部性最小链接 Locality-Based Least Connections with Replication lblcr
• 目标地址散列调度 Destination Hashing dh
• 源地址散列调度 Source Hashing sh
注:前4种为经常使用的调度算法
lvs的nat模式,其实就是iptables端口转发,把请求转发到后端的的主机上
准备三台机器
• 分发器,也叫调度器(简写为dir)
内网 192.168.66.130,外网:192.168.159.100(vmware仅主机模式)这个IP更据你虚拟机IP段来设置
• rs1
内网:192.168.66.131,设置网关为192.168.66.130也就是分发器的IP
• rs2
内网:192.168.66.132,设置网关为192.168.66.130
增长网卡时须要注意:
在虚拟机增长一个新的网卡以后,并设置为仅主机模式
开启虚拟机,用ifconfig命令,查看是否已经加载了网卡——>安装ifconfig包:yum install -y net-tools
复制网卡配置文件到新的网卡里面,并更改配置文件中的IP,删除UUID,更改mac
[root@localhost ~]# cd /etc/sysconfig/network-scripts/ [root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-ens37 [root@localhost network-scripts]# vim ifcfg-ens37
更改mac,可使用ip add命令查看,新的网卡的mac,并在配置文件中更改
重启网卡
ifup ens37
重启网络服务
systemctl restart network
用物理机尝试新的网卡IP是否能通讯
三台机器上都执行执行
systemctl stop firewalld systemc disable firewalld systemctl start iptables iptables -F service iptables save
在分发器192.168.66.130上安装ipvsadm
[root@localhost network-scripts]# yum install -y ipvsadm
在分发器192.168.66.130上编写脚本
vim /usr/local/sbin/lvs_nat.sh 内容以下 #! /bin/bash # director 服务器上开启路由转发功能 echo 1 > /proc/sys/net/ipv4/ip_forward //对内核参数修改,打开路由转发 # 关闭icmp的重定向 echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects //假装操做,否则不能转发rs的数据 echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects //假装操做,否则不能转发rs的数据 # 注意区分网卡名字,两个网卡分别为ens33和ens37 echo 0 > /proc/sys/net/ipv4/conf/ens33/send_redirects echo 0 > /proc/sys/net/ipv4/conf/ens37/send_redirects # director 设置nat防火墙 iptables -t nat -F iptables -t nat -X iptables -t nat -A POSTROUTING -s 192.168.66.0/24 -j MASQUERADE //MASQUERADE实现同网段的机器去上网,路由器使用的就是这个功能 # director设置ipvsadm IPVSADM='/usr/sbin/ipvsadm' //定义一个变量,方便下面命令引用 $IPVSADM -C //清空规则 $IPVSADM -A -t 192.168.159.100:80 -s wlc -p 3 //用来定义lvs的模式;wlc为算法,能够按需求选择lvs里面适合的算法 $IPVSADM -a -t 192.168.159.100:80 -r 192.168.66.131:80 -m -w 1 //详细规则,-r 指定rs机器IP,-m 指定nat模式,-w指定rs权重 $IPVSADM -a -t 192.168.159.100:80 -r 192.168.66.132:80 -m -w 1 //详细规则,-r 指定rs机器IP,-m 指定nat模式,-w指定rs权重
-A增长一个规则,-t 制定lvs 模式,以后IP 就是分发器的IP,-s 指定算法;-p 指定超时时间(数据包转发超时时间),例如用户1访问的是a机器,-p 的意思就是在同一个时间,一直在同一台机器上进行请求
测试脚本
[root@localhost network-scripts]# sh /usr/local/sbin/lvs_nat.sh
执行脚本,如果没输出,表示脚本没有错误
效果测试
使用curl模拟公网IP进行访问
[root@localhost ~]# curl 192.168.159.100 master master [root@localhost ~]# curl 192.168.159.100 backup backup [root@localhost ~]# curl 192.168.159.100 master master [root@localhost ~]# curl 192.168.159.100 backup backup [root@localhost ~]# curl 192.168.159.100 master master
经过上述结果,说明lvs已经部署成功了