小白切记不要在已上线的生产环境随便测试,该部署我已经成熟使用在生产环境了,我自己搭建一套测试环境给大家演示,强调该文章是我原创,满满的干货和细节,还特意搭建部署验证,费时费力,各位姥爷赏脸点个关注和赞赞,一起进步,一起发财,共同奔赴小康!下面直接开整!!!
需求是:给文件服务器做高可用,实现主备,文件数据实时双向同步。
①正常运行时,两台服务器实现主备,保持数据同步
②当主文件服务宕机,切换为备文件服务器,业务服务器继续向备传输文件
③当主文件服务器恢复,切换回去主后,备向主同步数据
一、keepalive高可用集群简介
1.1 keepalived 是基于VRRP协议实现高可用
1.2 VRRP虚拟路由器冗余协议
-
原理:心跳,ip漂移
-
条件:优先级
-
工作模式:主/备节点切换
-
工作方式:抢占式或非抢占式
二、环境准备
2.1 准备两台服务器
IP:10.100.10.175/24 主机名:test1
IP:10.100.10.176/24 主机名:test2
VIP:10.100.10.178/24
2.2 完成yum仓库配置及系统优化
XXXXXXXXXXXX
三、keepalived部署和配置
3.1 keepalive下载安装
[root@test1 ~]# yum -y install keepalived
[root@test2 ~]# yum -y install keepalived
3.2 服务启动(两台服务器都要操作)
~]#systemctl start keepalived #启动keepalived服务
~]#systemctl enable keepalived #设置为开机自启
Created symlink from /etc/systemd/system/multi-user.target.wants/keepalived.service to /usr/lib/systemd/system/keepalived.service.
~]# systemctl status keepalived #查看keepalived服务状态
3.2 配置文件解析
3.2.1 配置文件存放路径默认为: /etc/keepalived/keepalived.conf
3.2.2 配置相关说明
♦ global_defs #全局定义块
♦ vrrp_instance #VRRP实例定义块
♦ virtual_server #keepalived配置LVS定义块(后期专门出一期LVS讲解)
用vim编辑工具打开配置文件,按下 “Shift键+ :” ,输入“set number”,就会有行编号了目前先不配置LVS定义块,使用vim命令,按键盘“ESC”键,确保退出编辑状态,然后将光标对准36行,输入数字和字母“150 d d”(此时界面是没有命令输出的,不熟悉的姥爷建议去看看vim命令),删除36行以下LVS内容。
3.3.3 keepalived配置深度解析
全局配置
global_defs {
notification_email {
root@localhost #keepalived 发生故障切换时邮件发送的目标邮箱,可以按行区分写
多个
}
notification_email_from keepalived@localhost #发邮件的地址
smtp_server 127.0.0.1 #邮件服务器地址
smtp_connect_timeout 30 #邮件服务器连接timeout
router_id ka1.example.com #每个keepalived主机唯一标识,建议使用当前主机名,如果多节点重
名可能会影响切换脚本执行
vrrp_skip_check_adv_addr #默认会对所有通告报文都检查,会比较消耗性能,启用此配置后,如果
收到的通告报文和上一个报文是同一个路由器,则跳过检查
vrrp_strict #严格遵守VRRP协议,启用此项后以下状况将无法启动服务或工作异
常:1.无VIP地址 2.配置了单播邻居 3.在VRRP版本2中有IPv6地址,开启动此项并且没有配置
vrrp_iptables时会自动开启iptables(旧内核)或者nft(新内核)的防火墙规则,默认导致VIP无法访问,
建议不加此项配置
vrrp_garp_interval 0 #gratuitous ARP messages 报文发送延迟,0表示不延迟
vrrp_gna_interval 0 #unsolicited NA messages (不请自来)消息发送延迟
vrrp_mcast_group4 224.0.0.18 #指定组播IP地址范围:224.0.0.0到239.255.255.255,默认
值:224.0.0.18,如果配置了单播,此项失效
vrrp_iptables #此项和vrrp_strict同时开启时,则不会添加防火墙规则,如果无配置
vrrp_strict项,则无需启用此项配置,注意:新版加此项仍有iptables(旧内核)或者nft(新内核)规则
虚拟路由配置(VRRP)
vrrp_instance <STRING> { #<String>为vrrp的实例名,一般为业务名称
配置参数
......
}
#配置参数:
state MASTER|BACKUP#当前节点在此虚拟路由器上的初始状态,状态为MASTER或者BACKUP,当
priority相同时,先启动的节点优先获取VIP
interface IFACE_NAME #绑定为当前VRRP虚拟路由器使用的物理接口,如:eth0,bond0,br0,可以和
VIP不在一个网卡,实现心跳功能
virtual_router_id VRID #每个虚拟路由器唯一标识,范围:0-255,每个虚拟路由器此值必须唯一,否
则服务无法启动,同属一个虚拟路由器的多个keepalived节点必须相同,务必要确认在同一网络中此值必须唯
一
priority 100 #当前物理节点在此虚拟路由器的优先级,范围:1-254,每个keepalived主机节点此
值不同,如果多节点此值相同,则先来后到原理获取VIP
advert_int 1 #vrrp通告的时间间隔,默认1s,注意:集群内多节点此值必须相同
authentication { #认证机制
auth_type AH|PASS #AH为IPSEC认证(不推荐),PASS为简单密码(建议使用)
auth_pass <PASSWORD> #预共享密钥,仅前8位有效,同一个虚拟路由器的多个keepalived节点必
须一样
}
virtual_ipaddress { #虚拟IP,生产环境可能指定几十上百个VIP地址
<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
192.168.200.100 #指定VIP,不指定网卡,默认为eth0,注意:不指定/prefix,默认
为/32
192.168.200.101/24 dev eth1 #指定VIP的网卡,建议和interface指令指定的网卡不在一个
网卡
192.168.200.102/24 dev eth2 label eth2:1 #指定VIP的网卡label
}
track_interface { #配置监控网络接口,一旦出现故障,则转为FAULT状态实现地址转移
eth0
eth1
…
}
3.4 配置test1和test2
◆将test1设置主,test2为备
3.4.1 在修改配置之前把配置文件备份一下,要养成在修改文件前备份的习惯,有情况可以还原的,特别是生产环境,避免麻烦。
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.backup
3.4.2 配置参数
test1
test2
3.4.3 启动服务和查看服务状态
[root@test1 ~]# systemctl start keepalived
[root@test1 ~]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disabled)
Active: active (running) since 四 2024-09-26 17:44:51 CST; 16min ago
Process: 11166 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
Main PID: 11167 (keepalived)
CGroup: /system.slice/keepalived.service
├─11167 /usr/sbin/keepalived -D -S 6
├─11168 /usr/sbin/keepalived -D -S 6
└─11169 /usr/sbin/keepalived -D -S 6
9月 26 17:44:53 test1 Keepalived_vrrp[11169]: Sending gratuitous ARP on ens192 for 10.100.10.178
9月 26 17:44:53 test1 Keepalived_vrrp[11169]: Sending gratuitous ARP on ens192 for 10.100.10.178
9月 26 17:44:53 test1 Keepalived_vrrp[11169]: Sending gratuitous ARP on ens192 for 10.100.10.178
9月 26 17:44:53 test1 Keepalived_vrrp[11169]: Sending gratuitous ARP on ens192 for 10.100.10.178
9月 26 17:44:58 test1 Keepalived_vrrp[11169]: Sending gratuitous ARP on ens192 for 10.100.10.178
9月 26 17:44:58 test1 Keepalived_vrrp[11169]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on ens192 for 10.100.10.178
9月 26 17:44:58 test1 Keepalived_vrrp[11169]: Sending gratuitous ARP on ens192 for 10.100.10.178
9月 26 17:44:58 test1 Keepalived_vrrp[11169]: Sending gratuitous ARP on ens192 for 10.100.10.178
9月 26 17:44:58 test1 Keepalived_vrrp[11169]: Sending gratuitous ARP on ens192 for 10.100.10.178
9月 26 17:44:58 test1 Keepalived_vrrp[11169]: Sending gratuitous ARP on ens192 for 10.100.10.178
查看虚拟ip
[root@test1 ~]# ip a s
我们会发现在test1的网卡中看到出现10.100.10.178,也称vip,同样在test2上查看网卡没有vip。
3.4.4 心跳测试
1)停掉test1主设备keepalived服务
[root@test1 ~]# systemctl stop keepalived
现象:查看test1的网卡上,vip不见了,同时在test2的网卡上出现vip。
2)开启test1主设备keepalived服务
[root@test1 ~]# systemctl start keepalived
现象:test2网卡上的vip消失,同时又出现在test1的网卡上。
到此已完成keepalived服务部署,完成主备切换高可用的效果,VRRP协议默认为抢占模式(preempt),即当高优先级的主机恢复在线后,会抢占低先级的主机的master角色,也可以配置为非抢占模式(notpreempt),即高优先级主机恢复后,并不会抢占低优先级主机的master角色 非抢占模块下,如果原主机down机, VIP迁移至的新主机, 后续也发生down时,仍会将VIP迁移回原主机。
四、rsync+cron数据实时同步
环境用以上test1和test2为环境
4.1 rsync数据同步
4.1.1 rsync简介
rsync是linux系统下的数据镜像备份工具。使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH、rsync主机同步。
4.1.2 rsync特性
可以镜像保存整个目录树和文件系统。可以很容易做到保持原来文件的权限、时间、软硬链接等等。无须特殊权限即可安装。快速:第一次同步时 rsync 会复制全部内容,但在下一次只传输修改过的文件。rsync 在传输数据的过程中可以实行压缩及解压缩操作,因此可以使用更少的带宽。安全:可以使用scp、ssh等方式来传输文件,当然也可以通过直接的socket连接。支持匿名传输,以方便进行网站镜像。
4.1.3 参数详情
-v, --verbose 详细模式输出
-q, --quiet 精简输出模式
-c, --checksum 打开校验开关,强制对文件传输进行校验
-a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
-r, --recursive 对子目录以递归模式处理
-R, --relative 使用相对路径信息
-b, --backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename
--backup-dir 将备份文件(如~filename)存放在在目录下。
-suffix=SUFFIX 定义备份文件前缀
-u, --update 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件。(不覆盖更新的文件)
-l, --links 保留软链结
-L, --copy-links 像对待常规文件一样处理软链接
-p, --perms 保持文件权限
-o, --owner 保持文件属主信息
-g, --group 保持文件属组信息
-D, --devices 保持设备文件信息
-t, --times 保持文件时间信息
-z, --compress 对备份的文件在传输时进行压缩处理
-h, --help 显示帮助信息
--rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息
--delete 删除那些DST中SRC没有的文件
--delete-excluded 同样删除接收端那些被该选项指定排除的文件
--delete-after 传输结束以后再删除
--ignore-errors 即使出现IO错误也进行删除
--exclude=PATTERN 指定排除不需要传输的文件模式
--include=PATTERN 指定不排除而需要传输的文件模式
--exclude-from=FILE 排除FILE中指定模式的文件
--include-from=FILE 不排除FILE指定模式匹配的文件
--config=FILE 指定其他的配置文件,不使用默认的rsyncd.conf文件
--port=PORT 指定其他的rsync服务端口
--blocking-io 对远程shell使用阻塞IO
-stats 给出某些文件的传输状态
--progress 在传输时显示传输过程
--log-format=formAT 指定日志文件格式
--password-file=FILE 从FILE中得到密码
4.2 cron定时任务
4.2.1 cron简介
Cron是一个用于Unix系统的时间表调度工具,可以用来在指定的时间执行某个任务。需要编辑crontab文件添加定时任务。
4.2.2 cron编写格式
共六列: 第一列:分(M) minute (0 - 59) 第二列:时(H) hour (0 - 23) 第三列:日(D) day of month (1 - 31) 第四列:月(m) month (1 - 12) 第五列:周(d) 一星期内的天(0~7,0,7为星期天,6为星期六) 第六列:cmd 要执行的任务命令或程序
4.2.3 常用命令和特殊符号
crontab -l #查看定时任务内容 ,l为list缩写
crontab -e #编辑定时任务内容,e为edit缩写
* 代表所有的取值范围内的数字
"/" 代表每的意思
"*/5" 表示每5个单位
"-" 代表从某个数字到某个数字
"," 分开几个离散的数字
4.2.4 表达式
Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式:
Seconds Minutes Hours DayofMonth Month DayofWeek Year或
Seconds Minutes Hours DayofMonth Month DayofWeek
4.3 rsync和cron部署运用(两台服务器都要部署)
4.3.1 下载rsync、cron(包名:crontabs centos系统自带服务)
[root@test1 ~]# yum -y install rsync
4.3.2 修改rsync配置文件(修改前备份)
进入配置文件,利用vim命令,ctrl+v进入可视化,选中参数前面#字符,按下键盘delete键,就可以批量删除,不熟悉的姥爷去看看vim命令,本来这些基础命令的不想讲的,又怕各位姥爷临时找不到着急。
rsync配置文件参数详解
###我test1和test2本次共享文件为/fileserver,该目录权限为icd的,给位姥爷要看自己环境来修改
uid = icd #用户id,表示共享权限能执行的身份
gid = icd #组id
read only = no #是否只读
write only = no 是否只写入
use chroot = ture #开启,禁锢在源目录,表示允许在访问我备份的目录或文件的时候,使用的角色是icd,同时你访问本地目录时拥有的也是icd权限
log file = /var/log/rsyncd.log #日志文件存放位置
pid file = /var/run/rsyncd.pid #存放进程id的文件位置
hosts allow = 10.100.10.176 #允许访问的主机,可以是多个
[fileserver] #文件共享模块
path = /fileserver #共享目录
comment = fileserver #有说明作用
auth users = icd #用户
secrets file = /etc/rsyncd.password #用户密码文件
使用scp将test1修改好的配置文件传输到test2,修改访问主机ip。
[root@test1 ~]# scp /etc/rsyncd.conf 10.100.10.176:/etc/
root@10.100.10.176's password:
rsyncd.conf 100% 518 564.6KB/s 00:00
创建两个用户密码文件
[root@test1 ~]# vim /etc/rsyncd.password #配置文件中共享目录/fileserver,权限是icd,所以需要验证icd用户密码
icd:Arkj1234
[root@test1 ~]# vim /etc/rsyncd.passwd #在共享时,需要访问对面主机的密码,执行命令用带有密码文件执行
qingshanhu123
同样,scp将test1创建好的密码文件传输到test2
[root@test1 etc]# scp rsyncd.password rsyncd.passwd 10.100.10.176:/etc/ root@10.100.10.176's password:
rsyncd.password 100% 13 0.2KB/s 00:00 rsyncd.passwd 100% 9 13.9KB/s 00:00
给这两个密码文件权限(test1和test2密码文件都要给权限)
[root@test1 ~]# chmod 600 /etc/rsyncd.password
[root@test1 ~]# chmod 600 /etc/rsyncd.passwd
4.4 启动rsync服务和验证
4.4.1 rsync启动服务
[root@test1 etc]# systemctl start rsyncd.service #启动服务
[root@test1 etc]# systemctl enable rsyncd.service #开机自启
Created symlink from /etc/systemd/system/multi-user.target.wants/rsyncd.service to /usr/lib/systemd/system/rsyncd.service.
4.4.2 执行rsync命令查看是否正常同步
没执行命令前/fileserver下面的文件
test1
test2
在test1上执行命令完成同步
[root@test1 ~]# rsync -auv --password-file=/etc/rsyncd.passwd /fileserver/ icd@10.100.10.176::fileserver
sending incremental file list
./
1.txt
12.txt
123.txt
1234.txt
1/
2/
3/
4/
sent 388 bytes received 115 bytes 47.90 bytes/sec
total size is 0 speedup is 0.00
完成同步后查看test1上/fileserver目录文件变化
从这里可以看到test2的/fileserver目录下完成同步,也可以在test2的/fileserver目录下新增文件,执行同步命令:
rsync -auv --password-file=/etc/rsyncd.passwd /fileserver/ icd@10.100.10.175::fileserver
这样可以完成双向同步,具体各位姥爷去验证一下吧。
如果/fileserver目录下有文件夹里的文件不需要同步(如/fileserver/2),可以添加参数 --exclude '文件名' ,命令如下:
rsync -auv --password-file=/etc/rsyncd.passwd --exclude '2' /fileserver/ icd@10.100.10.175::fileserver
4.4.3 将rsync同步的命令写成简单脚本
[root@test1 ~]# vim /rsync.sh
#!/bin/bash
rsync -auv --password-file=/etc/rsyncd.passwd /fileserver/ icd@10.100.10.176::fileserver
chmod +755 /rsync.sh #给脚本权限
scp将脚本传输test2的根目录下,修改ip即可(主打方便快捷省时)
4.5 设置cron定时任务(test1和test2都要做定时任务)
[root@test1 ~]# crontab -e #创建定时任务
*/5 * * * * /rsync.sh #每5分钟执行一次
[root@test1 ~]# crontab -l #查看定时任务
*/5 * * * * /rsync.sh
这样我们就可以实现两台服务高可用,数据双向实时同步了。
五、需求验证
5.1 验证test1和test2的高可用
关闭test1主机,查看ip是否漂移到test2上,看业务服务器是否在向test2传输文件(因为本次没有设置业务服务器,如果ip漂移到test2,test1则会继续向test2上传文件,如果各执意位姥爷需要验证,在文件服务器上弄个ftp文件传输)。
5.2 验证test1和test2的主备恢复数据同步
开启test1主机,查看ip是否漂移回来,test1是否抢占master角色,观察在test1宕机这段时间test2上新增的文件,5分钟后是否同步到test1(之前定时任务设置每五分钟执行一次同步脚本)。