【0604】集群架构、高可用、负载均衡(上)

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
}
}

参考连接:http://note.youdao.com/noteshare?id=196f3a77c4d99a8c21286d50704690b9&sub=EEAC512A00D54B3B98BFCB6E0B67DE26


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为启动命令

参考连接:http://note.youdao.com/noteshare?id=abf23beadd51b4ec2a510b5e395f9d46&sub=C046236E7A14453FADEF8DADDD81C840

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八、浏览器访问主

1.png

此时访问的是主的默认虚拟服务器,在 nginx 中定义

2.png

1九、从上的默认页在 /usr/share/nginx/html/index.html ,将默认页改成 backup,backup

[root@arslinux-02 ~]# cat /usr/share/nginx/html/index.html
backup,backup

20、浏览器访问从

3.png

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 上

4.png

2三、测试高可用

测试1:关闭 主上 nginx,会从新启动,由于 keepalived

测试2:增长规则:iptables -I OUTPUT -p vrrp -j DROP,从上出现出现了 vip ,但 主上 vip 依然没有释放

5.png

6.png

访问 vip,依然是主上的默认虚拟服务器

测试3:中止主上的 keepalived,主上的 vip 被释放了

7.png

8.png

9.png

此时访问 vip 则是 从上的默认虚拟服务器

测试4:重启主上的 keepalived,访问 vip,立刻回到了主上的默认虚拟服务器

10.png

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台如下)

11.png

  • 这种模式借助 iptables 的 nat 表来实现

  • 用户的请求到分发器后,经过预设的 iptables 规则,把请求的数据包转发到后端的 rs 上去

  • rs 须要设定网关为分发器的内网 ip

  • 用户请求的数据包和返回给用户的数据包所有通过分发器,因此分发器成为瓶颈

  • 在 nat 模式中,只须要分发器有公网 ip 便可,因此比较节省公网 ip 资源


LVS IP Tunnel模式

12.png

  • 这种模式,须要有一个公共的 IP 配置在分发器和全部rs上,咱们把它叫作 vip

  • 客户端请求的目标 IP 为 vip,分发器接收到请求数据包后,会对数据包作一个加工,会把目标 IP 改成 rs 的 IP,这样数据包就到了 rs 上

  • rs 接收数据包后,会还原原始数据包,这样目标 IP 为 vip,由于全部 rs 上配置了这个 vip,因此它会认为是它本身

  • 结果反馈给客户端

NAT 就是 iptables 转发,IP Tunnel 把模板 ip 作更改


LVS DR模式

1523371556386328.png

  • 这种模式,也须要有一个公共的 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 通

14.png

15.png

16.png

三、三台机器上所有关闭 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

clipboard.png


四、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四种集群有点及使用场景

https://www.jianshu.com/p/ce7ba9dfe103

相关文章
相关标签/搜索