集群架构介绍
1、什么是集群 多台机器组成一个整体,共同提供服务支撑。
2、集群分类 1)高可用集群 两台或多台机器,相互之间是备份关系,同一时间一台机器提供服务,另外一台备着。当提供服务的机器故障,切换到另外一台。高可用集群中,有一个角色用来实现业务存活状态监测和切换。 高可用集群案例:redis哨兵、mysql组复制、MHA 开源高可用集群软件:keepalived、heartbeat 2)负载均衡集群 至少两台机器,所有机器同时提供服务,每一台机器都可以处理业务请求。在负载均衡集群中有一个负载均衡角色,它负责将请求均衡地分发到每一台服务器上。 开源负载均衡软件:Nginx、LVS、haproxy 分布式集群属于高可用+负载均衡集群综合体,案例:redis cluster、mongodb分片集群
3、为什么要做集群 1)解决单点故障
2)单节点不足以支撑业务体量
垂直扩容 : 用更好的服务器,提高 CPU 处理核数、内存数、带宽等 水平扩容 : 将任务分配到多台计算机上

对于不持续的业务增长,并且增长量不是很大,可以使用垂直扩容,因为单纯地增加服务器硬件更加快捷高效,甚至成本也不高。 但反之,就需要水平扩容,即增加服务器数量。
keepalived
keepalived简介
keepalived通过VRRP(Virtual Router Redundancy Protocl)来实现高可用。
在这个协议里会将多台功能相同的路由器组成一个小组,这个小组里会有1个master角色和N(N>=1)个backup角色。
master会通过组播的形式向各个backup发送VRRP协议的数据包,当backup收不到master发来的VRRP数据包时,就会认为master宕机了。此时就需要根据各个backup的优先级来决定谁成为新的mater。
Keepalived要有三个模块,分别是core、check和vrrp。其中core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析,check模块负责健康检查,vrrp模块是来实现VRRP协议的
keepalived高可用场景举例
keepalived + nginx

keepalived + mysql

keepalived + NFS

| 主机名 | ip | 角色 |
|---|---|---|
| Centos8 | 192.168.158.101 | keepalived1、nginx1 |
| Centos8-1 | 192.168.158.102 | keepalived2、nginx2 |
| 192.168.158.103 | vip |
安装nginx(两台机器都安装)
编辑源 vi /etc/yum.repos.d/nginx.repo #内容如下
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/Centos8/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/Centos8/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
安装
yum install -y nginx
启动
systemctl start nginx
安装keepalived(两台都安装)
yum install -y keepalived
配置keepalived(Centos8上)
将默认配置文件挪走
mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.default
定义新的配置
vi /etc/keepalived/keepalived.conf ## 写入如下内容
! Configuration File for keepalived
global_defs {
router_id aming
script_user root
enable_script_security
}
vrrp_script chk_ng {
## 定义监测nginx是否正常的监控脚本
script "/etc/keepalived/checkng.sh"
interval 10
fall 5
}
vrrp_instance VI_NG {
##这里定义成BACKUP,目的是为了配置成非抢占模式,即一旦切换到从,当主状态恢复时,不自动切回来
state BACKUP
nopreempt
##定义VRRP协议通信网卡
interface ens160
virtual_router_id 76
##权重高
priority 100
advert_int 2
authentication {
auth_type PASS
##8位字符串
auth_pass dWc4Tddl
}
virtual_ipaddress {
## 定义vip以及绑定vip的网卡
192.168.222.200 dev ens160 label ens160:1
}
unicast_src_ip 192.168.222.128
unicast_peer {
192.168.222.132
}
track_script {
chk_ng
}
}
定义keepalived配置(Centos8-1上)
将默认配置文件挪走
mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.default
定义新的配置
vi /etc/keepalived/keepalived.conf ## 写入如下内容
! Configuration File for keepalived
global_defs {
router_id aming
script_user root
enable_script_security
}
vrrp_script chk_ng {
## 定义监测nginx是否正常的监控脚本
script "/etc/keepalived/checkng.sh"
interval 10
fall 5
}
vrrp_instance VI_NG {
##这里定义成BACKUP,目的是为了配置成非抢占模式,即一旦切换到从,当主状态恢复时,不自动切回来
state BACKUP
nopreempt
##定义VRRP协议通信网卡
interface ens160
virtual_router_id 76
##权重低
priority 90
advert_int 2
authentication {
auth_type PASS
##8位字符串
auth_pass dWc4Tddl
}
virtual_ipaddress {
## 这里的ens160为内网ip
192.168.222.200 dev ens160 label ens160:1
}
unicast_src_ip 192.168.222.132
unicast_peer {
192.168.222.128
}
track_script {
chk_ng
}
}
定义监测脚本(两台机器)
vi /etc/keepalived/checkng.sh ##内容如下
#!/bin/bash
ng_pid_num=$(ps -ef | grep nginx | grep -v grep | wc -l)
if [[ ${ng_pid_num} -ne 0 ]];then
exit 0
else
exit 1
fi
##保存后,给执行权限
chmod a+x /etc/keepalived/checkng.sh
启动服务
按如下顺序逐一启动
Centos8上:
systemctl start nginx
keepalived -t ##启动之前,先检测配置是否正确
systemctl start keepalived
Centos8-1上:
systemctl start nginx
keepalived -t ##启动之前,先检测配置是否正确
systemctl start keepalived
检测
Centos8上:
##查看进程
ps aux|grep keepalived
##查看vip
ip add
##查看日志
journalctl -u keepalived
验证
Centos8上停止nginx
systemctl stop nginx
实时查看日志
journalctl -f -u keepalived.service
等一会儿,vip会自动配置到Centos8-1上 先将Centos8上的nginx服务恢复
systemctl start nginx
Centos8-1上,停止keepalived服务
systemctl stop keepalived
vip会马上配置到Centos8。
另外,还可以将两台机器的nginx主页设置不一样,当vip切换的时候,可以通过直接浏览器访问vip来观察变化。
遇到keepalived问题,排查思路
看日志
journalctl -u keepalived
看进程
ps aux |grep keepalived
看脚本执行结果
sh -x /etc/keepalived/checkng.sh