18.1 集群介绍html
根据功能划分为两大类:高可用和负载均衡mysql
高可用集群一般为两台服务器,一台工做,另一台做为冗余,当提供服务的机器宕机,冗余将接替继续提供服务linux
实现高可用的开源软件有:heartbeat、keepalivednginx
负载均衡集群,须要有一台服务器做为分发器,它负责把用户的请求分发给后端的服务器处理,在这个集群里,除了分发器外,就是给用户提供服务的服务器了,这些服务器数量至少为2算法
实现负载均衡的开源软件有 LVS、keepalived、haproxy、nginx,商业的有 F五、Netscalersql
18.2 keepalived介绍apache
在这里咱们使用 keepalived 来实现高可用集群,由于 heartbeat 在 centos6 上有一些问题,影响实验效果vim
keepalived经过 VRRP(Virtual Router Redundancy Protocl)来实现高可用。windows
在这个协议里会将多台功能相同的路由器组成一个小组,这个小组里会有1个 master 角色和N(N>=1)个backup角色。后端
master 会经过组播的形式向各个 backup 发送 VRRP 协议的数据包,当 backup 收不到master 发来的 VRRP 数据包时,就会认为 master 宕机了。此时就须要根据各个 backup 的优先级来决定谁成为新的 mater。
Keepalived 要有三个模块,分别是 core、check 和 vrrp。其中 core 模块为 keepalived 的核心,负责主进程的启动、维护以及全局配置文件的加载和解析,check 模块负责健康检查,vrrp 模块是来实现 VRRP 协议的。
18.3/18.4/18.5 用keepalived配置高可用集群
一、准备两台机器 130 和 132,130 为 master,132 为 backup
二、两台机器都安装 keepalived
[root@arslinux-01 ~]# yum install -y keepalived [root@arslinux-02 ~]# yum install -y keepalived
三、两台机器都须要安装 nginx,130 以前已经编译安装过,132 须要 yum 安装
[root@arslinux-02 ~]# yum install -y nginx
四、从新编辑主上的 /etc/keepalived/keepalived.conf
[root@arslinux-01 ~]# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@arslinux-02 ~]# vim /etc/keepalived/keepalived.conf global_defs { notification_email { arslinux@arslinux.com } notification_email_from root@arslinux.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 MASTER interface ens33 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass aminglinux>com } virtual_ipaddress { 192.168.194.100 } track_script { chk_nginx } }
notification_email 有问题,发邮件给哪一个邮箱,能够不定义
notification_email_from 有问题用哪一个邮箱发邮件,能够不定义
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL 均可以不定义
vrrp_script chk_nginx 检测服务是否正常 interval 3 检测间断为3秒
vrrp_instance VI_1 master相关的配置
state 角色是master,若是是从的话就是 backup
interface 发送广播使用的网卡
virtual_router_id 路由id
priority 100 权重
authentication 认证相关信息
auth_type PASS 认证类型,密码形式
auth_pass 密码,定义一个字符串
virtual_ipaddress 主从共有ip,也就是vip,主宕机,从解析到该ip上去,两个主机都194段
track_script 加载脚本,以前定义的chk_nginx检查nginx
五、编辑检查 nginx 是否正常的脚本
[root@arslinux-01 ~]# vim /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
执行ps -C nginx --no-heading|wc -l命令计算nginx进程数,若是进程数等于0,则说明nginx服务没有启动,那么须要启动nginx服务,启动以后再查看进程数值,若是仍是0,说明nginx依然没有启动,那么须要写一个日期的错误提示到日志里,方便排查问题。以后中止keepalived,主keepalived一停,从就会自动起来服务,以避免主从都有keepalived启动,产生紊乱,脑裂。
参考连接:https://note.youdao.com/ynoteshare1/index.html?id=17b7d082afd8d31b4fd5c48b5f93bcc1&type=note
六、给 /usr/local/sbin/check_ng.sh 更改权限 755
[root@arslinux-01 ~]# chmod 755 /usr/local/sbin/check_ng.sh
七、启动 keepalived
[root@arslinux-01 ~]# systemctl start keepalived [root@arslinux-01 ~]# ps aux|grep keepalived root 8138 0.0 0.1 122980 1412 ? Ss 22:43 0:00 /usr/sbin/keepalived -D root 8139 0.0 0.3 133940 3328 ? S 22:43 0:00 /usr/sbin/keepalived -D root 8140 0.1 0.2 133880 2860 ? S 22:43 0:00 /usr/sbin/keepalived -D root 8174 0.0 0.0 112724 992 pts/0 R+ 22:43 0:00 grep --color=auto keepalived
八、查看 nginx 是否会自动加载
[root@arslinux-01 ~]# ps aux|grep nginx root 7988 0.0 0.1 46052 1292 ? Ss 21:48 0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf nobody 7989 0.0 0.3 48540 3932 ? S 21:48 0:00 nginx: worker process nobody 7990 0.0 0.3 48540 3932 ? S 21:48 0:00 nginx: worker process root 8357 0.0 0.0 112724 988 pts/0 R+ 22:45 0:00 grep --color=auto nginx [root@arslinux-01 ~]# /etc/init.d/nginx stop Stopping nginx (via systemctl): [ 肯定 ] [root@arslinux-01 ~]# ps aux|grep nginx root 8395 0.0 0.0 112724 984 pts/0 S+ 22:45 0:00 grep --color=auto nginx [root@arslinux-01 ~]# ps aux|grep nginx root 8417 0.0 0.1 46052 1296 ? Ss 22:45 0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf nobody 8421 0.0 0.3 48540 3932 ? S 22:45 0:00 nginx: worker process nobody 8422 0.0 0.3 48540 3932 ? S 22:45 0:00 nginx: worker process root 8466 0.0 0.0 112724 988 pts/0 R+ 22:46 0:00 grep --color=auto nginx
九、https://blog.51cto.com/11530642/2096227
十、日志都在 /var/log/messages 下
十一、vip 不能用 ipconfig 查看,只能用 ip add 看到
[root@arslinux-01 ~]# ip add 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:24:ea:f2 brd ff:ff:ff:ff:ff:ff inet 192.168.194.130/24 brd 192.168.194.255 scope global noprefixroute ens33 valid_lft forever preferred_lft forever inet 192.168.194.100/32 scope global ens33 valid_lft forever preferred_lft forever inet 192.168.194.150/24 brd 192.168.194.255 scope global secondary noprefixroute ens33:0 valid_lft forever preferred_lft forever inet6 fe80::c905:5e78:b916:41da/64 scope link noprefixroute valid_lft forever preferred_lft forever 3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:24:ea:fc brd ff:ff:ff:ff:ff:ff inet 192.168.100.1/24 brd 192.168.100.255 scope global noprefixroute ens37 valid_lft forever preferred_lft forever inet6 fe80::f41:9da7:d8e3:10ba/64 scope link noprefixroute valid_lft forever preferred_lft forever
十二、配置以前,必定要检查防火墙主从 iptables 和 getenforce 是否关闭
1三、编辑从上的配置文件 /etc/keepalived/keepalived.conf
[root@arslinux-02 ~]# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@arslinux-02 ~]# vim /etc/keepalived/keepalived.conf global_defs { notification_email { aming@aminglinux.com } notification_email_from root@aminglinux.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 interface ens33 virtual_router_id 51 priority 90 advert_int 1 authentication { auth_type PASS auth_pass aminglinux>com } virtual_ipaddress { 192.168.194.100 } track_script { chk_nginx } }
参考连接:https://note.youdao.com/ynoteshare1/index.html?id=b12b72e89f72aca6896e4f250f7b4ce2&type=note
state 为BACKUP
virtual_router_id,vip 都和主一致
priority 主是100,从是90,要低于主
1四、编辑检查 nginx 是否正常的脚本
[root@arslinux-02 ~]# vim /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 systemctl start nginx 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
若是nginx是yum 安装的,能够用systemctl start nginx为启动命令
1五、给 /usr/local/sbin/check_ng.sh 更改权限 755
[root@arslinux-02 ~]# chmod 755 /usr/local/sbin/check_ng.sh
1六、启动 keepalived
[root@arslinux-02 ~]# systemctl start keepalived [root@arslinux-02 ~]# ps aux|grep keepalived root 7836 0.0 0.1 122876 1412 ? Ss 23:14 0:00 /usr/sbin/keepalived -D root 7837 0.0 0.3 133836 3340 ? S 23:14 0:00 /usr/sbin/keepalived -D root 7838 0.0 0.2 133776 2872 ? S 23:14 0:00 /usr/sbin/keepalived -D root 7878 0.0 0.0 112724 992 pts/0 S+ 23:14 0:00 grep --color=auto keepalived
1七、检查从上的 nginx 是否启动
[root@arslinux-02 ~]# ps aux|grep nginx root 7813 0.0 0.2 125004 2108 ? Ss 23:11 0:00 nginx: master process /usr/sbin/nginx nginx 7814 0.0 0.3 125392 3148 ? S 23:11 0:00 nginx: worker process root 7976 0.0 0.0 112724 984 pts/0 R+ 23:15 0:00 grep --color=auto nginx
1八、浏览器访问主
此时访问的是主的默认虚拟服务器,在 nginx 中定义
1九、从上的默认页在 /usr/share/nginx/html/index.html ,将默认页改成 backup,backup
[root@arslinux-02 ~]# cat /usr/share/nginx/html/index.html backup,backup
20、浏览器访问从
2一、ip add 查看从上 ip
[root@arslinux-02 ~]# ip add 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:14:4f:d9 brd ff:ff:ff:ff:ff:ff inet 192.168.194.132/24 brd 192.168.194.255 scope global noprefixroute ens33 valid_lft forever preferred_lft forever inet6 fe80::4c99:ed43:5757:e772/64 scope link noprefixroute valid_lft forever preferred_lft forever
2二、浏览器访问 vip 192.168.194.100,实际上就是 master,vip 在 master 上
2三、测试高可用
测试1:关闭 主上 nginx,会从新启动,由于 keepalived
测试2:增长规则:iptables -I OUTPUT -p vrrp -j DROP,从上出现出现了 vip ,但 主上 vip 依然没有释放
访问 vip,依然是主上的默认虚拟服务器
测试3:中止主上的 keepalived,主上的 vip 被释放了
此时访问 vip 则是 从上的默认虚拟服务器
测试4:重启主上的 keepalived,访问 vip,立刻回到了主上的默认虚拟服务器
2四、mysql 也能够弄高可用,可是要确保两边数据一致
18.6 负载均衡集群介绍
主流开源软件 LVS、keepalived、haproxy、nginx等
其中LVS 属于4层(网络OSI 7层模型),nginx 属于7层,haproxy 既能够认为是4层,也能够当作7层使用
keepalived 的负载均衡功能其实就是 lvs
lvs 这种4层的负载均衡是能够分发除80外的其余端口通讯的,好比 MySQL 的,而 nginx 仅仅支持 http,https,mail,haproxy 也支持MySQL这种
相比较来讲,LVS 这种4层的更稳定,能承受更多的请求,而 nginx 这种7层的更加灵活,能实现更多的个性化需求
18.7 LVS介绍
LVS 是由国人章文嵩开发
流行度不亚于 apache 的 httpd,基于 TCP/IP 作的路由和转发,稳定性和效率很高
LVS 最新版本基于 Linux 内核2.6,有好多年不更新了
LVS 有三种常见的模式:NAT、DR、IP Tunnel
LVS 架构中有一个核心角色叫作分发器(Load balance),它用来分发用户的请求,还有诸多处理用户请求的服务器(Real Server,简称 rs)
LVS NAT模式(10台如下)
这种模式借助 iptables 的 nat 表来实现
用户的请求到分发器后,经过预设的 iptables 规则,把请求的数据包转发到后端的 rs 上去
rs 须要设定网关为分发器的内网 ip
用户请求的数据包和返回给用户的数据包所有通过分发器,因此分发器成为瓶颈
在 nat 模式中,只须要分发器有公网 ip 便可,因此比较节省公网 ip 资源
LVS IP Tunnel模式
这种模式,须要有一个公共的 IP 配置在分发器和全部rs上,咱们把它叫作 vip
客户端请求的目标 IP 为 vip,分发器接收到请求数据包后,会对数据包作一个加工,会把目标 IP 改成 rs 的 IP,这样数据包就到了 rs 上
rs 接收数据包后,会还原原始数据包,这样目标 IP 为 vip,由于全部 rs 上配置了这个 vip,因此它会认为是它本身
结果反馈给客户端
NAT 就是 iptables 转发,IP Tunnel 把模板 ip 作更改
LVS DR模式
这种模式,也须要有一个公共的 IP 配置在分发器和全部 rs 上,也就是 vip
和IP Tunnel 不一样的是,它会把数据包的 MAC 地址修改成 rs 的 MAC 地址
rs接收数据包后,会还原原始数据包,这样目标 IP 为 vip ,由于全部 rs 上配置了这个 vip,因此它会认为是它本身
结果反馈给客户端
18.8 LVS调度算法
轮询 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
18.9/18.10 LVS NAT模式搭建
准备工做
一、准备三台机器
分发器,简称 dir 192.168.194.130
rs1 192.168.194.132
rs2 192.168.194.133
二、给分发器添加一块网卡
ens37:192.168.174.100,本地 windows 上能 ping 通
三、三台机器上所有关闭 firewalld
四、三台机器安装 iptables-services,保存空规则
[root@arslinux-02 ~]# yum install -y iptables-services
[root@arslinux-02 ~]# systemctl start iptables
[root@arslinux-02 ~]# systemctl enable iptables
[root@arslinux-02 ~]# iptables -F
[root@arslinux-02 ~]# service iptables save
五、关闭selinux,编辑 /etc/selinux/config,状态改成 disable
六、将 rs1 和 rs2 的网关设置为分发器的 ip 地址 192.168.194.130
搭建工做
一、在 dir 上安装 ipvsadm
[root@arslinux-01 ~]# yum install -y ipvsadm
二、主上写脚本 /usr/local/sbin/lvs_nat.sh
[root@arslinux-01 ~]# 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 echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects # 注意区分网卡名字,阿铭的两个网卡分别为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.194.0/24 -j MASQUERADE # director设置ipvsadm IPVSADM='/usr/sbin/ipvsadm' $IPVSADM -C $IPVSADM -A -t 192.168.174.100:80 -s lc -p 3 $IPVSADM -a -t 192.168.174.100:80 -r 192.168.194.132:80 -m -w 1 $IPVSADM -a -t 192.168.174.100:80 -r 192.168.194.133:80 -m -w 1
三、测试
确保 rs1 和 rs2 上 nginx 都已经启动,并已监听 80端口
rs1 上
[root@arslinux-02 ~]# curl localhost backup,backup
rs2 上
rs2 上的默认页要和 rs1 上区分开,先编辑默认页,再 curl
[root@arslinux-03 ~]# mv /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.bak
[root@arslinux-03 ~]# vim /usr/share/nginx/html/index.html backup2,backup2 [root@arslinux-03 ~]# curl localhost backup2,backup2
访问 192.168.174.100
四、ipvsadm的规则:
[root@arslinux-01 ~]# 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.174.174:80 wlc persistent 3 -> 192.168.65.132:80 Masq 1 0 0 -> 192.168.65.133:80 Masq 1 0 1
五、可能连续几回访问该ip结果都是RS2,也许是缓存的缘由
能够把lvs_nat.sh的IPVSADM规则第一条改成:轮询
$IPVSADM -A -t 192.168.174.100:80 -s rr
六、从新sh一下
[root@arslinux-01 ~]# sh /usr/local/sbin/lvs_nat.sh
七、用curl来连外网ip,看看结果
[root@arslinux-01 ~]# curl 192.168.174.100 backup2,backup2 [root@arslinux-01 ~]# curl 192.168.174.100 backup,backup [root@arslinux-01 ~]# curl 192.168.174.100 backup2,backup2 [root@arslinux-01 ~]# curl 192.168.174.100 backup,backup [root@arslinux-01 ~]# curl 192.168.174.100 backup2,backup2 [root@arslinux-01 ~]# curl 192.168.174.100 backup,backup [root@arslinux-01 ~]# curl 192.168.174.100 backup2,backup2 [root@arslinux-01 ~]# curl 192.168.174.100 backup,backup
访问仍是很是平均的,这是 rr 起做用了
实验成功!
课堂笔记
一、集群以及分类
高可用、负载均衡、分布式
二、高可用架构的意义
保证服务长久可用,稳定性,双机热备
三、Keepalived 的实现原理
VRRP协议 虚拟路由协议
A 工做中,B C 探测 A 是否正常工做,A 出现问题,会从 B/C 中根据权重选一个顶上
http://www.javashuo.com/article/p-fbeyqjra-ek.html
四、LVS 三种模式图解
http://www.javashuo.com/article/p-mnskecwn-m.html
五、fullnat 模式
https://ieevee.com/tech/2015/12/08/fullnat.html
lvs四种集群有点及使用场景