# 集群架构介绍 1、什么是集群 多台机器组成一个整体,共同提供服务支撑。 2、集群分类 1)高可用集群 两台或多台机器,相互之间是备份关系,同一时间一台机器提供服务,另外一台备着。当提供服务的机器故障,切换到另外一台。高可用集群中,有一个角色用来实现业务存活状态监测和切换。 高可用集群案例:redis哨兵、mysql组复制、MHA 开源高可用集群软件:keepalived、heartbeat 2)负载均衡集群 至少两台机器,所有机器同时提供服务,每一台机器都可以处理业务请求。在负载均衡集群中有一个负载均衡角色,它负责将请求均衡地分发到每一台服务器上。 开源负载均衡软件:Nginx、LVS、haproxy 分布式集群属于高可用+负载均衡集群综合体,案例:redis cluster、mongodb分片集群 3、为什么要做集群 1)解决单点故障 2)单节点不足以支撑业务体量 垂直扩容 : 用更好的服务器,提高 CPU 处理核数、内存数、带宽等 水平扩容 : 将任务分配到多台计算机上 ![](./1.png) 对于不持续的业务增长,并且增长量不是很大,可以使用垂直扩容,因为单纯地增加服务器硬件更加快捷高效,甚至成本也不高。 但反之,就需要水平扩容,即增加服务器数量。 # 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高可用场景举例 1. keepalived + nginx ![](./2.png) 2. keepalived + mysql ![](./3.png) 3. keepalived + NFS ![](./4.png) | 主机名 | 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 #内容如下 ```bash [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 ```