Keepalived是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。它是以VRRP协议(虚拟路由冗余协议)为基础的。Keepalived主要有三个模块,分别是core、check和vrrp。Core模块是keepalived的核心模块,主要负责主进程的启动,维护以及全局配置文件的加载和解析。Check模块主要负责健康检查。Vrrp模块主要用来实现VRRP协议的。
环境:一共开启四台主机,每台主机均关闭火墙和selinux,并且都做好解析。sever1:172.25.30.1,server2:172.25.30.2,其中server1充当master,server2充当backup,server4:172.25.30.4,server5:172.25.30.5这两台主机充当real_server,主要用来测试。还有一个Vip:172.25.30.100/24.
首先在官网上下载keepalived的安装包并解压。
[root@server1 ~]# tar zxf keepalived-1.2.20.tar.gz
[root@server1 ~]# cd keepalived-1.2.20
解压完成后进到对应的目录下对其进行编译:
[root@server1 keepalived-1.2.20]# ./configure --prefix=/usr/local/keepalived
如果编译不成功,此时可能时缺少某些包,所以应该先将需要的安装包安装好在对其编译:
[root@server1 keepalived-1.2.20]# yum install openssl-devel -y
[root@server1 keepalived-1.2.20]# ./configure --prefix=/usr/local/keepalived
[root@server1 keepalived-1.2.20]# make
[root@server1 keepalived-1.2.20]# make install
[root@server1 ~]# cd /usr/local/keepalived/
[root@server1 etc]# cd rc.d
[root@server1 rc.d]# ls
init.d
[root@server1 rc.d]# cd init.d/
[root@server1 init.d]# ls
keepalived
[root@server1 init.d]# pwd
/usr/local/keepalived/etc/rc.d/init.d
[root@server1 init.d]# ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
[root@server1 init.d]# ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@server1 init.d]# ln -s /usr/local/keepalived/etc/keepalived/ /etc/
[root@server1 sbin]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/
[root@server1 bin]# /etc/init.d/keepalived status
keepalived is stopped
[root@server1 bin]# cd ..
[root@server1 keepalived]# cd ..
[root@server1 local]# scp -r keepalived/ 172.25.30.2:/usr/local
另一台主机和那个无需编译,只需要将安装包解压后,从server1上传过来即可。
[root@server2 ~]# tar zxf keepalived-1.2.20.tar.gz
[root@server2 ~]# cd /usr/local
[root@server2 local]# ls
bin etc games include keepalived lib lib64 libexec sbin share src
[root@server2 local]# cd
[root@server2 ~]# ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
[root@server2 ~]# ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@server2 ~]# ln -s /usr/local/keepalived/etc/keepalived/ /etc/
[root@server2 ~]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/
[root@server2 ~]# /etc/init.d/keepalived status
keepalived is stopped
[root@server1 keepalived]# cd /etc/keepalived/
[root@server1 keepalived]# ls
keepalived.conf samples
[root@server1 keepalived]# vim keepalived.conf
[root@server1 keepalived]# scp keepalived.conf 172.25.30.2:/etc/keepalived/
此时,在real_server上分别安装httpd 并且打开它,再分别在server4,server5的默认测试界面写上server4,server5.
[root@server4 ~]# yum install httpd -y
[root@server4 ~]# /etc/init.d/httpd start
Starting httpd:
[root@server4 ~]# ip addr add 172.25.30.100 dev eth0
[root@server4 ~]# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:c2:bc:60 brd ff:ff:ff:ff:ff:ff
inet 172.25.30.4/24 brd 172.25.30.255 scope global eth0
inet 172.25.30.100/32 scope global eth0
inet6 fe80::5054:ff:fec2:bc60/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN ql
[root@server4 ~]# yum install arptables_jf -y
[root@server4 ~]# arptables -A IN -d 172.25.30.100 -j DROP
[root@server4 ~]# arptables -A OUT -s 172.25.30.100 -j mangle --mangle-ip-s 172.25.30.4
[root@server4 ~]# /etc/init.d/arptables_jf save
Saving current rules to /etc/sysconfig/arptables: [ OK ]
[root@server4 ~]# /etc/init.d/arptables_jf start
Flushing all current rules and user defined chains: [ OK ]
Clearing all current rules and user defined chains: [ OK ]
Applying arptables firewall rules: [ OK ]
[root@server4 ~]# arptables -nL
Chain IN (policy ACCEPT)
target source-ip destination-ip source-hw destination-hw hlen op hrd pro
DROP 0.0.0.0/0 172.25.30.100 00/00 00/00 any 0000/0000 0000/0000 0000/0000
Chain OUT (policy ACCEPT)
target source-ip destination-ip source-hw destination-hw hlen op hrd pro
mangle 172.25.30.100 0.0.0.0/0 00/00 00/00 any 0000/0000 0000/0000 0000/0000 --mangle-ip-s 172.25.30.4
Chain FORWARD (policy ACCEPT)
target source-ip destination-ip source-hw destination-hw hlen op hrd pro
[root@server4 ~]# cd /var/www/html/
[root@server4 html]# ls
[root@server4 html]# vim index.html
Server4
[root@server1 keepalived]# /etc/init.d/keepalived start
Starting keepalived: [ OK ]
这种情况下需要检查配置文件,如果确定配置文件没有错误时,应该查看是不是端口冲突了,此时可以重启一下rpcbind,因为rpcbind中有很多接口时随机的,重启以下,可能就改善接口冲突的问题。
[root@server1 keepalived]# /etc/init.d/keepalived stop
Stopping keepalived: [ OK ]
[root@server1 keepalived]# /etc/init.d/rpcbind restart
Stopping rpcbind: [ OK ]
Starting rpcbind: [ OK ]
[root@server1 keepalived]# /etc/init.d/keepalived start
Starting keepalived: [ OK ]
[root@server1 keepalived]# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 52:54:00:a0:04:b3 brd ff:ff:ff:ff:ff:ff
inet 172.25.30.1/24 brd 172.25.30.255 scope global eth0
inet 172.25.30.100/32 scope global eth0
inet6 fe80::5054:ff:fea0:4b3/64 scope link
valid_lft forever preferred_lft forever
[root@server1 keepalived]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.30.100:http rr
-> server5.example.com:http Route 1 0 5
[root@server2 keepalived]# yum install -y mailx
[root@server2 keepalived]# vim keepalived.conf
[root@server2 keepalived]# /etc/init.d/keepalived start
Starting keepalived: [ OK ]
[root@server1 keepalived]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.30.100:http rr
-> server4.example.com:http Route 1 0 3
-> server5.example.com:http Route 1 0 5
You have new mail in /var/spool/mail/root
此时,用浏览器访问VIP:172.25.30.100,会看到server4和server5 轮叫:
当server4或者server5上的httpd被关闭或者坏掉时,比如server4上的httpd关掉,浏览器上就只显示server5上的默认测试界面。
而,当停掉server1的keepalived时,server2自动接管master,此时会有邮件通知,但是用户在浏览器上访问时,依然是server4和server5轮叫,并没有影响。
[root@server1 keepalived]# /etc/init.d/keepalived stop
Stopping keepalived: [ OK ]
You have mail in /var/spool/mail/root
[root@server2 keepalived]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.30.100:http rr
-> server4.example.com:http Route 1 0 0
-> server5.example.com:http Route 1 0 0
Vfstpd:
现在server4和server5 上安装vsftpd ,并开启他。
[root@server4 html]# yum install vsftpd -y
[root@server4 html]# /etc/init.d/vsftpd start
Starting vsftpd for vsftpd: [ OK ]
[root@server4 html]# cd /var/ftp
[root@server4 ftp]# touch server4
[root@server5 html]# yum install vsftpd -y
[root@server5 html]# /etc/init.d/vsftpd start
Starting vsftpd for vsftpd: [ OK ]
[root@server5 html]# touch /var/ftp/server5
此时在keepalived的配置文件中添加vsftpd和他的端口。
[root@server4 html]# yum install vsftpd -y
[root@server4 html]# /etc/init.d/vsftpd start
Starting vsftpd for vsftpd: [ OK ]
[root@server4 html]# cd /var/ftp
[root@server4 ftp]# touch server4
[root@server5 html]# yum install vsftpd -y
[root@server5 html]# /etc/init.d/vsftpd start
Starting vsftpd for vsftpd: [ OK ]
[root@server5 html]# touch /var/ftp/server5
[root@server1 keepalived]# vim keepalived.conf
[root@server2 keepalived]# /etc/init.d/keepalived restart
Stopping keepalived: [ OK ]
Starting keepalived: [ OK ]
测试:
[root@foundation30 mnt]# lftp 172.25.30.100
[root@server1 keepalived]# mail
[root@server1 keepalived]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.30.100:ftp rr persistent 50
-> server4.example.com:ftp Route 1 0 0
-> server5.example.com:ftp Route 1 0 0
TCP 172.25.30.100:http rr
-> server4.example.com:http Route 1 0 0
-> server5.example.com:http Route 1 0 0
加n是为了不要解析。
[root@server1 keepalived]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.25.30.100:21 rr persistent 50
-> 172.25.30.4:21 Route 1 0 0
-> 172.25.30.5:21 Route 1 0 0
TCP 172.25.30.100:80 rr
-> 172.25.30.4:80 Route 1 0 0
-> 172.25.30.5:80 Route 1 0 0
You have mail in /var/spool/mail/root
[root@server2 keepalived]# mail