集群架构的操作步骤
前言
本次学习采用的是 VMware 虚拟机,系统为 CentOS 7.2 操作系统,镜像为清华开源网站的CentOS-7-x86_64-DVD-1511.iso文件。
虚拟机安装两台 Linux 配置为默认配置,但更改了网络连接方式为桥接模式。因此需要优先获取到宿主机的相关网络配置信息,然后来修改虚拟机的网络配置信息。
虽然 CentOS 默认的 yum 源里就有 keepalived 包,但是这些源已经于 2024 年下线了。包在源里看得见但下不下来。所以需要更换源才能够正确的安装 keepalived,才能进行后续的操作。
一、搭建高可用集群
1. 修改网络配置
因为本次使用的网络连接方式为桥接模式,所以需要优先给虚拟机配置静态 IP 地址来达到上网功能。因为桥接模式是 “寄生” 在物理网卡上的,所以要更改为和宿主机相同的网段才能够连通外网,才可以安装 keepalived。
1) 查看宿主机的真实 IP
win+r 输入 cmd 并输入ipconfig查看宿主机的真实 IP 与网关
2)修改网卡配置文件(配置静态 IP)
vi /etc/sysconfig/network-scripts/ifcfg-eno16777736
|
修改BOOTPROTO为static,追加如下配置:
IPADDR=192.168.104.161 PREFIX=24 GATEWAY=192.168.104.254 DNS1=114.114.114.114 DNS2=8.8.8.8
|
第二台虚拟机 IPADDR 改为192.168.104.162
3)重启网络服务
systemctl restart network
|
4)确认 IP
5) 关闭防火墙
关闭防火墙防止遇到奇怪的错误
systemctl stop firewalld systemctl disable firewalld
|
2. 修改主机名
master 节点 (192.168.104.161)
hostnamectl set-hostname master bash
|
backup 节点 (192.168.104.162)
hostnamectl set-hostname backup bash
|
3. 安装 keepalived
1)确认归档站可达(输出 200)
curl -s -o /dev/null -w "%{http_code}\n" https://mirrors.aliyun.com/centos-vault/7.2.1511/os/x86_64/repodata/repomd.xml
|
2)将原源移走备份
mkdir -p /root/repo.bak mv /etc/yum.repos.d/CentOS-*.repo /root/repo.bak/
|
3)写入阿里云的归档源
cat > /etc/yum.repos.d/CentOS-Vault.repo <<'EOF' [centos-vault-os] name=CentOS-7.2.1511 - os - aliyun vault baseurl=https://mirrors.aliyun.com/centos-vault/7.2.1511/os/$basearch/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 enabled=1
[centos-vault-updates] name=CentOS-7.2.1511 - updates - aliyun vault baseurl=https://mirrors.aliyun.com/centos-vault/7.2.1511/updates/$basearch/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 enabled=1
[centos-vault-extras] name=CentOS-7.2.1511 - extras - aliyun vault baseurl=https://mirrors.aliyun.com/centos-vault/7.2.1511/extras/$basearch/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 enabled=1 EOF
|
4)清理并重建 yum 缓存
yum clean all yum makecache
|
5)安装 keepalived
yum install -y keepalived
|
4. 安装 Nginx
加 EPEL 归档源
cat > /etc/yum.repos.d/EPEL-Archive.repo <<'EOF' [epel-archive] name=EPEL-7 Archive - aliyun baseurl=https://mirrors.aliyun.com/epel-archive/7/x86_64/ gpgcheck=1 gpgkey=https://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-7 enabled=1 EOF
yum install -y nginx
|
5. 编辑 keepalived 配置文件
vim /etc/keepalived/keepalived.conf
|
配置内容:
global_defs { notification_email { 131917381@qq.com } notification_email_from root@aaaaa.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 eno16777736 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 5201314>g } virtual_ipaddress { 192.168.104.100 } track_script { chk_nginx } }
|
keepalived 要实现高可用,还需要监控 Nginx,它自己本身没有这个功能,需要借助自定义脚本。
编写 Nginx 监控脚本
vim /usr/local/sbin/check_ng.sh
|
脚本内容:
#!/bin/bash
d=`date --date today +%Y%m%d_%H:%M:%S`
n=`ps -C nginx --no-heading|wc -l`
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
|
赋予执行权限
chmod a+x /usr/local/sbin/check_ng.sh
|
⚠️backup 节点:keepalived 配置中state BACKUP、priority 90,其余配置、脚本、权限和 master 保持一致。
启动服务(master)
systemctl start keepalived systemctl start nginx
|
6. 验证 keepalived 高可用
ip a
curl -I 192.168.104.100
systemctl stop keepalived curl -I 192.168.104.100
systemctl start keepalived curl -I 192.168.104.100
|
7. 总结
- Keepalived:高可用软件
- 高可用(HA):故障时自动顶替
- VIP(虚拟 IP):漂移 IP
- VRRP(虚拟路由冗余协议):心跳协议、选主协议
- Master / Backup:主节点 / 备节点
- 健康检查(check_ng.sh):自定义脚本
- Nginx:流量大管家
二、搭建负载均衡集群
1. 在 NAT 模式下 LVS 搭建
准备: 首先需要准备 3 台虚拟机,一台作为作为调度器,另外两台模拟真实的服务器。调度器需要有两个 IP,一个公网 IP,一个内网 IP,所以需要设置两张网卡。另外两个模拟服务器只需要内网 IP 就可以了。
调度器 dir 两张网卡模式分别为 NAT 模式(外网)和仅主机模式(内网)另外两台真实服务器都为仅主机模式(内网)。
表格
| 主机 |
IP |
模式 |
| dir 调度器 |
172.16.51.134(外网)、192.168.199.130(内网) |
NAT + 仅主机 |
| rs1 |
192.168.199.131 |
仅主机 |
| rs2 |
192.168.199.132 |
仅主机 |
1). 修改网络配置
rs1 和 rs2 的网关为 dir 内网 IP:192.168.199.130
修改网卡配置
vi /etc/sysconfig/network-scripts/ifcfg-xxx systemctl restart network
|
2). 修改主机名
hostnamectl set-hostname dir bash
hostnamectl set-hostname rs1 bash
hostnamectl set-hostname rs2 bash
|
3). 关闭防火墙 & 清空 iptables
三台机器全部执行
systemctl stop firewalld systemctl disable firewalld
iptables -F iptables -t nat -F service iptables save
|
4). dir 安装 ipvsadm(使用阿里归档源)
mkdir -p /root/repo.bak mv /etc/yum.repos.d/CentOS-*.repo /root/repo.bak/
cat > /etc/yum.repos.d/CentOS-Vault.repo <<'EOF' [centos-vault-os] name=CentOS-7.2.1511 - os - aliyun vault baseurl=https://mirrors.aliyun.com/centos-vault/7.2.1511/os/$basearch/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 enabled=1
[centos-vault-updates] name=CentOS-7.2.1511 - updates - aliyun vault baseurl=https://mirrors.aliyun.com/centos-vault/7.2.1511/updates/$basearch/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 enabled=1
[centos-vault-extras] name=CentOS-7.2.1511 - extras - aliyun vault baseurl=https://mirrors.aliyun.com/centos-vault/7.2.1511/extras/$basearch/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 enabled=1 EOF
yum clean all yum makecache yum install -y ipvsadm
|
5). dir 编写 LVS-NAT 脚本
vim /usr/local/sbin/lvs_nat.sh
|
脚本内容
#!/bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/ens33/send_redirects echo 0 > /proc/sys/net/ipv4/conf/ens34/send_redirects
iptables -t nat -F iptables -t nat -X iptables -t nat -A POSTROUTING -s 192.168.199.0/24 -j MASQUERADE
IPVSADM='/usr/sbin/ipvsadm' $IPVSADM -C $IPVSADM -A -t 172.16.51.134:80 -s wlc $IPVSADM -a -t 172.16.51.134:80 -r 192.168.199.131:80 -m -w 1 $IPVSADM -a -t 172.16.51.134:80 -r 192.168.199.132:80 -m -w 1
|
赋予权限并执行
chmod +x /usr/local/sbin/lvs_nat.sh bash /usr/local/sbin/lvs_nat.sh
|
6). 给 rs1、rs2 部署 Nginx(内网机器无法联网,dir 下载 rpm 包分发)
dir 机器下载 nginx rpm 包,scp 传到 rs1 rs2,本地 yum 安装。 修改 rs1、rs2 首页用于区分节点
echo "rs1" > /usr/share/nginx/html/index.html systemctl start nginx systemctl enable nginx
echo "rs2" > /usr/share/nginx/html/index.html systemctl start nginx systemctl enable nginx
|
dir 测试连通后端
curl 192.168.199.131 curl 192.168.199.132
|
访问 dir 外网 IP172.16.51.134验证负载均衡。
脚本中-p是持久会话,测试时删除-p 300,重新执行脚本:
vim /usr/local/sbin/lvs_nat.sh bash /usr/local/sbin/lvs_nat.sh
|
2. DR 模式 LVS 搭建
IP 规划:
- dir 调度器:
192.168.199.130
- rs1:
192.168.199.131
- rs2:
192.168.199.132
- VIP:
192.168.199.110
DR 模式 rs 网关不能指向 dir,修改为真实网关192.168.199.1
rs1、rs2 修改网卡配置
vi /etc/sysconfig/network-scripts/ifcfg-eno16777736
systemctl restart network
|
dir 编写 lvs_dr.sh
vim /usr/local/sbin/lvs_dr.sh
echo 1 > /proc/sys/net/ipv4/ip_forward ipv=/usr/sbin/ipvsadm vip=192.168.199.110 rs1=192.168.199.131 rs2=192.168.199.132
ifconfig eno33554976:2 $vip broadcast $vip netmask 255.255.255.255 up route add -host $vip dev eno33554976:2
$ipv -C $ipv -A -t $vip:80 -s wrr $ipv -a -t $vip:80 -r $rs1:80 -g -w 1 $ipv -a -t $vip:80 -r $rs2:80 -g -w 1
|
rs1、rs2 编写 lvs_rs.sh
vim /usr/local/sbin/lvs_rs.sh
vip=192.168.199.110
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up route add -host $vip lo:0
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
|
执行脚本
chmod +x /usr/local/sbin/lvs_dr.sh bash /usr/local/sbin/lvs_dr.sh
chmod +x /usr/local/sbin/lvs_rs.sh bash /usr/local/sbin/lvs_rs.sh
|
3. keepalived+LVS (DR 模式)
dir 安装 keepalived
yum install -y keepalived
|
清空原有配置,写入 keepalived 完整 LVS-DR 配置
> /etc/keepalived/keepalived.conf vim /etc/keepalived/keepalived.conf vrrp_instance VI_1 { state MASTER interface eno33554976 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.199.110 } }
virtual_server 192.168.199.110 80 { delay_loop 10 lb_algo wlc lb_kind DR persistence_timeout 0 protocol TCP
real_server 192.168.199.131 80 { weight 100 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 80 } }
real_server 192.168.199.132 80 { weight 100 TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 80 } } }
|
清理旧 LVS 规则
ipvsadm -C systemctl restart network
|
rs1、rs2 执行 arp 调优脚本
bash /usr/local/sbin/lvs_rs.sh
|
dir 启动 keepalived
systemctl start keepalived ps aux |grep keepalived
|
检验
浏览器访问 VIP:192.168.199.110
systemctl stop nginx
ipvsadm -ln
systemctl start nginx ipvsadm -ln
|
浏览器强制刷新 Ctrl+F5,规避缓存。
4. 总结
- LVS:Linux 的负载均衡器,负责把请求分给多台服务器。
- NAT:改 IP 地址,让内网机器共享公网或转发请求。
- DR:LVS 的一种模式,只改 MAC 地址,回包不经过调度器,速度快。
- iptables:Linux 防火墙,也能做 NAT 地址转换。
评论