Keepalived实现服务器的高可用

Keepalived实现服务器的高可用

## 拓扑图

下载安装软件

下载

官网 下载软件

我这里使用的是 keepalived-2.1.3.tar.gz

安装

1.解压

tar -zxvf keepalived-2.1.3.tar.gz

2.配置

cd keepalived-2.1.3

./configure --prefix=/opt/keepalived

3.编译和安装

make && make install

服务及配置文件

移动配置文件位置

将安装包下的服务文件移动到/etc/init.d目录下

cp /opt/keepalived-2.1.3/keepalived/etc/init.d/keepalived /etc/init.d

mkdir /etc/keepalived

在安装目录下,将配置文件移动到上面创建的配置文件

cp /opt/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

cp /opt/keepalived/etc/sysconfig/keepalived /etc/sysconfig/

修改配置文件

vi /etc/keepalived/keepalived.conf

global_defs {

router_id 41 #服务器的路由标识,每台机器不同不要重复

}

vrrp_instance VI_1 {

state BACKUP #路由状态,主服务器为MASTER,备份服务器为BACKUP

interface enp0s3 #服务器绑定的网卡,查看本机的网卡 ip a

mcast_src_ip 10.150.132.100 #广播源ip,就是服务器的实际ip地址

virtual_router_id 43 #虚拟路由标识,两台服务器必须一样,而且得是0~255之间的数字

priority 90 #优先级,数字越大优先级越高,根据这个在N个备份服务器里选举谁来临时当主服务器

advert_int 5 #集群监控时间,单位为秒,默认1秒. 当超过这个时间如果收不到MASTER还活着的消息,那么就要选举一个新的MSATER

authentication {

auth_type PASS #集群间通信用来验证身份的,配置成一样即可

auth_pass 1111

}

virtual_ipaddress {

10.150.132.102 #统一对外提供的虚拟地址,即外部通过这个虚拟ip来访问实际ip的服务器

10.150.132.101

}

}

启动服务

systemctl start keepalived.service

查看服务

ps -ef| grep keep*

测试

使用虚拟IP就可以访问到实际服务器的服务

其他配置

端口

keepalived使用 112 端口

日志配置

centos6

修改/etc/sysconfig/keepalived 文件

#KEEPALIVED_OPTIONS="-D"

KEEPALIVED_OPTIONS="-D -d -S 0"

修改/etc/rsyslog.conf 文件

local0.* /opt/keepalived/log/keepalived.log

这里要注意,在keepalived目录下创建log目录

centos7

除了以上修改,还需要在/lib/systemd/system/keepalived.service 修改配置信息

将里面的:

EnvironmentFile=-/usr/local/keepalived/etc/sysconfig/keepalived

ExecStart=/usr/local/keepalived/sbin/keepalived $KEEPALIVED_OPTIONS

修改成:

EnvironmentFile=/etc/sysconfig/keepalived

ExecStart=/sbin/keepalived $KEEPALIVED_OPTIONS

然后重新加载service:

systemctl daemon-reload

如果没有配置日志,可以使用 tail -f /var/log/message 查看日志

邮件配置

1.安装

yum install mailx -y

2.配置邮件

vim /etc/mail.rc

set from=youremail@sina.com #发件人邮箱地址(sina设置在sina邮箱中开启允许代理)

set smtp=smtp.sina.com #smtp地址

set smtp-auth-user=youremail@sina.com #邮箱用户名,不用加域名

set smtp-auth-password=****** #邮箱密码(邮件密码是smtp代理授权码)

set smtp-auth=login #邮箱验证方式

3.测试发送邮件

echo "hello world" | mail -s "hello" test@qq.com

4.编写脚本

vim /etc/keepalived/mail_notify.sh

#!/bin/bash

echo "192.168.1.203 $1 状态被激活,请确认keepalived服务运行状态"|mail -s "keepalived状态切换警告" youreamil@qq.com

5.授权

chmod 777 /etc/keepalived/mail_notify.sh

6.修改keepalived配置

vim /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {

state MASTER

interface enp0s3

virtual_router_id 51

priority 100

advert_int 1

#Keepalived进入MASTER状态执行脚本

notify_master "/etc/keepalived/mail_notify.sh master"

#Keepalived进入BACKUP状态执行脚本

notify_backup "/etc/keepalived/mail_notify.sh backup"

#Keepalived进入FAULT状态执行脚本

notify_fault "/etc/keepalived/mail_notify.sh fault"

authentication {

auth_type PASS

auth_pass 1111

}

track_script {

chk_http_port

}

virtual_ipaddress {

192.168.200.203

}

}

7.重启服务

systemctl restart keepalived.service

服务高可用

编写服务检测脚本,交给keepalived定时执行即可。详情见最后的配置。

多组keepalived在同一个局域网内

此时的解决办法是,在同组的Keepalived服务器所有的配置文件里指定独一无二的多播地址

global_defs { #全局配置

router_id LVS_19 #服务标识

vrrp_mcast_group4 224.0.0.19 #这个就是指定多播地址的配置

}

#提示:

1)不同实例的通信认证密码也最好不同,以确保接管正常。

2)另一款高可用软件Heartbeat,如果采用多播方式实现主备通信,同样会有多播地址冲突问题。

检测脑裂

在备节点上执行脚本,如果可以ping通主节点并且备节点有VIP就报警,让人员介入检查是否裂脑

#!/bin/bash

lb01_vip=192.168.0.240

lb01_ip=192.168.0.221

while true

do

ping -c 2 -W 3 $lb01_ip &>/dev/null

if [ $? -eq 0 -a `ip a | grep "$lb01_vip" | wc -l` -eq 1 ];then

echo "ha is split brain.warning."

else

echo "ha is OK"

fi

sleep 5

done

宕机服务重启

在主VIP漂移到备份服务器后,处理完问题之后,重启主服务器,漂移到备份服务器的连接重新转移到主服务器上。这里要注意,最后启动keepalived,先启动相关服务。

服务器切换时,执行脚本没有执行

chcon -t keepalived_unconfined_script_exec_t /opt/keepalived/shell/mail_notify.sh

给文件添加selinux权限

备注

! Configuration File for keepalived

global_defs { #全局定义部分

notification_email { #设置警报邮箱

acassen@firewall.loc #邮箱

failover@firewall.loc

sysadmin@firewall.loc

}

notification_email_from Alexandre.Cassen@firewall.loc #设置发件人地址

smtp_server 192.168.50.1 #设置smtp server地址

smtp_connect_timeout 30 #设置smtp超时连接时间 以上参数可以不配置

router_id LVS_DEVEL #是Keepalived服务器的路由标识在一个局域网内,这个标识(router_id)是唯一的

}

## keepalived 会定时执行脚本并对脚本执行的结果进行分析,动态调整 vrrp_instance 的优先级。如果脚本执行结果为 0,并且 weight 配置的值大于 0,则优先级相应的增加。如果脚本执行结果非 0,并且 weight配置的值小于 0,则优先级相应的减少。其他情况,维持原本配置的优先级,即配置文件中 priority 对应的值。

vrrp_script chk_nginx {

script "/etc/keepalived/nginx_check.sh" ## 检测 nginx 状态的脚本路径

interval 2 ## 检测时间间隔

weight -20 ## 如果条件成立,权重-20

}

vrrp_script check_redis {

script "

interval 2 #检查脚本的频率,单位(秒)

weight -30 #端口检查失败,优先级减少30,默认减少2[注意:两台主机配置的weight相同时候必须保证weight的值大于priority差值]

}

vrrp_instance VI_1 { #VRRP实例定义区块名字是VI_1

state MASTER #表示当前实例VI_1的角色状态这个状态只能有MASTER和BACKUP两种状态,并且需要大写这些字符ASTER为正式工作的状态,BACKUP为备用的状态

interface eth0

virtual_router_id 51 #虚拟路由ID标识,这个标识最好是一个数字,在一个keepalived.conf配置中是唯一的, MASTER和BACKUP配置中相同实例的virtual_router_id必须是一致的.

priority 100 #priority为优先级 越大越优先

advert_int 1 #为同步通知间隔。MASTER与BACKUP之间通信检查的时间间隔,单位为秒,默认为1.

authentication { #authentication为权限认证配置不要改动,同一vrrp实例的MASTER与BACKUP使用相同的密码才能正常通信。

auth_type PASS

auth_pass 1111

}

## 将 track_script 块加入 instance 配置块

track_script {

chk_nginx ## 执行 Nginx 监控的服务

} #

virtual_ipaddress { #设置虚拟IP地址

192.168.50.16 #此格式ip a显示 ifconfig不显示

192.168.50.17/24 dev eth0 label eth0:1 #绑定接口为eth0,别名为eth0:1

}

#至此为止以上为实现高可用配置,如只需使用高可用功能下边配置可删除

#以下为虚拟服务器定义部分

virtual_server 192.168.50.16 80 { #设置虚拟服务器,指定虚拟IP和端口

delay_loop 6 #健康检查时间为6秒

lb_algo rr #设置负载调度算法 rr算法

lb_kind NAT #设置负载均衡机制 #有NAT,TUN和DR三种模式可选

nat_mask 255.255.255.0 #非NAT模式注释掉此行 注释用!号

persistence_timeout 50 #连接保留时间,50秒无响应则重新分配节点

protocol TCP #指定转发协议为TCP

real_server 192.168.5.150 80 { #RS节点1

weight 1 #权重

TCP_CHECK { #节点健康检查

connect_timeout 8 #延迟超时时间

nb_get_retry 3 #重试次数

delay_before_retry 3 #延迟重试次数

connect_port 80 #利用80端口检查

}

}

real_server 192.168.50.149 80 { #RS节点2

weight 1

TCP_CHECK {

connect_timeout 8

nb_get_retry 3

delay_before_retry 3

connect_port 80

}

}

}

vi /etc/keepalived/nginx_check.sh

# vi /etc/keepalived/nginx_check.sh

#!/bin/bash

A=`ps -C nginx –no-header |wc -l`

if [ $A -eq 0 ];then

/usr/local/nginx/sbin/nginx

sleep 2

if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then

killall keepalived

fi

fi

#或者

#!/bin/bash

set -e

if [ `ps -ef | grep nginx | wc -l` -lt 2 ];then

systemctl stop keepalived

echo "nginx is down"

exit 0

fi

更多配置参考官网说明

参考网址:

https://www.codercto.com/a/33207.html

https://blog.csdn.net/xianghanscce/article/details/88794346

https://www.cnblogs.com/ywrj/p/9483427.html

https://blog.csdn.net/l1028386804/article/details/72801492

相关推荐

篮球世界杯视频
Bet体育365app下载

篮球世界杯视频

📅 06-27 👁️ 9983
长期没有啪啪啪,到底会发生什么事……
Bet体育365app下载

长期没有啪啪啪,到底会发生什么事……

📅 06-28 👁️ 480
ps怎么恢复初始设置(ps怎么把软件初始化)
365bet亚洲娱乐场

ps怎么恢复初始设置(ps怎么把软件初始化)

📅 07-01 👁️ 6969
模特走秀时为什么会摔倒呢?
Bet体育365app下载

模特走秀时为什么会摔倒呢?

📅 07-01 👁️ 4650
小米MIX和夏普aquos Crystal有什么区别?小米MIX和夏普aquos Crystal全面对比评测
德国Z级驱逐舰
Bet体育365app下载

德国Z级驱逐舰

📅 07-04 👁️ 1209