高可用有两种方式:
先关闭selinux,开通vvrp协议
1、Nginx+keepalived 主从配置
这种方案,使用一个vip地址,前端使用2台机器,一台做主,一台做备,但同时只有一台机器工作,另一台备份机器在主机器不出现故障的时候,永远处于浪费状态,对于服务器不多的网站,该方案不经济实惠。
2、Nginx+keepalived 双主配置
这种方案,使用两个vip地址,前端使用2台机器,互为主备,同时有两台机器工作,当其中一台机器出现故障,两台机器的请求转移到一台机器负担,非常适合于当前架构环境。
Nginx+keepalived 主从配置
环境如下:
lb-01:192.168.96.130 nginx+keepalived-master
lb-02:192.168.96.131 nginx+keepalived-backup
VIP:192.168.96.138
两台机器都要安装nginx 配置文件相同
upstream myServer{
server 192.168.96.130:8080; #要确实存在
server 192.168.96.131:8080;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://myServer;
}
nginx结合keepalived高可用
为什么使用keepalived呢?使用keepalived就用来做高可用的,提供虚拟VIP
分别在2台机子上安装keepalived
# yum install keepalived -y
查看keepalived版本
# keepalived -v
Keepalived v1.2.13 (11/20,2015)
关于2台keepalived配置文件/etc/keepalived
在130master keepalived配置文件内容如下:
global_defs {
notification_email { #设置报警通知邮件地址,可以设置多个
root@localhost
}
notification_email_from admin@stu31.com #设置邮件的发送地址
smtp_server 127.0.0.1 #设置smtp server的地址,该地址必须是存在的
smtp_connect_timeout 30 #设置连接smtp server的超时时间
router_id LVS_DEVEL #运行Keepalived服务器的标识,发邮件时显示在邮件标题中的信息
}
发送邮件设置一般使用脚本来写,后面介绍
vrrp_script chk_http_port {
script "/usr/local/src/check_nginx.sh" 后面介绍此脚本
interval 2 #(检测脚本执行的间隔)
weight 2
}
vrrp_instance VI_1 {
state MASTER # 备份服务器上将 MASTER 改为 BACKUP
interface eno16777736 //网卡
virtual_router_id 51 # 主、备机的virtual_router_id必须相同
priority 100 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.96.138 // VRRP H虚拟地址
}
}
在131-backup 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.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL 一般是自己的主机名
}
vrrp_script chk_http_port {
script "/usr/local/src/check_nginx.sh"
interval 2 #(检测脚本执行的间隔)
weight 2
}
vrrp_instance VI_1 {
state BACKUP
interface eno16777736
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.96.138
}
}
然后分别启动2台keepalived服务
[root@lb-01 ~]# systemctl start keepalived.service
[root@lb-02 ~]# systemctl start keepalived.service
查看虚拟VIP
- master机器查看
从上面可以看到虚拟VIP地址192.168.96.138
- backup机器查看
从上面可以看到没有虚拟VIP地址
测试访问虚拟VIP
打开浏览器访问 http://192.168.96.138
再F5刷新可以看到变化
此时虚拟VIP可以轮询访问了
模拟故障:
把130-master nginx和keepalived停止查看是否还能正常提供服务
[root@lb-01 sbin]# ./nginx -s stop
[root@lb-01 sbin]# systemctl stop keepalived.service
此时虚拟VIP已经不再master上了
再访问http://192.168.96.138可以发现
130nginx和keepalived挂了也不影响服务
此时查看131backup机器VIP情况,虚拟VIP 已经在131机器上
实现nginx+keepalived双主模式设置:
需要更改下keepalived配置文件即可,增加新的VIP192.168.96.139配置到131机器上,在原配置文件后添加新配置:
130的keepalived配置文件内容如下:
vrrp_instance VI_2 {
state BACKUP
interface eno16777736
virtual_router_id 52
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.96.139
}
}
131的keepalived配置文件内容如下:
vrrp_instance VI_2 {
state MASTER
interface eno16777736
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.96.139
}
}
分别启动2台lb上nginx和keepalived服务
[root@lb-01 sbin]# ./nginx
[root@lb-01 sbin]# systemctl start keepalived.service
下面的查看ip及模拟故障和上面相似,不过原文档显示每个服务器分配一个VIP。测试刚开始是,但是一会儿会显示都获取了所分配两个VIP
keepalived.conf配置详解:
! Configuration File for keepalived
global_defs {
#标识本节点的名称
router_id master
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
#每2秒检测一次nginx的运行状态
interval 2
#失败一次,将自己的优先级调整为-20
weight -20
}
vrrp_instance VI_1 {
#状态,主节点为MASTER
state MASTER
#绑定VIP的网络接口
interface ens33
#虚拟路由的ID号,两个节点设置必须一样
virtual_router_id 51
#节点优先级,值范围0~254,MASTER>BACKUP
priority 100
#组播信息发送时间间隔,两个节点必须设置一样,默认为1秒
advert_int 1
#设置验证信息,两个节点必须一致
authentication {
auth_type PASS
auth_pass 1111
}
#虚拟IP,两个节点设置必须一致,可以设置多个
virtual_ipaddress {
192.168.1.106
}
#nginx存活状态检测脚本
track_script {
chk_nginx
}
}
其中调用的/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
pkill keepalived
fi
fi
如果是主备模式在备机设置上会有个检测主挂了发邮件的设置
#节点变为master时执行
notify_master /etc/keepalived/send_mail.sh
#虚拟IP,两个节点设置必须一致,可以设置多个
virtual_ipaddress {
192.168.1.106
}
里边调用的send_mail.sh脚本为使用Perl编写的,需要安装环境:
yum -y install perl-CPAN
cpan Net::SMTP_auth
send_mail.sh脚本内容为:
#!/usr/bin/perl -w
use Net::SMTP_auth;
use strict;
#smtp服务器
my $mailhost = 'smtp.exmail.qq.com';
#发送邮件的邮箱
my $mailfrom = 'from@qq.com';
#接收邮件的邮箱
my @mailto = ('to@qq.com');
#邮件主题
my $subject = 'keepalived up on backup';
#邮件正文
my $text = "正文\n nginx-1服务器宕机!!nginx-2变为master!!!";
#发送邮件的用户名
my $user = 'from@qq.com';
#发送邮件的邮箱密码
my $passwd = '123456';&SendMail();
##############################
# Send notice mail
##############################
sub SendMail() {
my $smtp = Net::SMTP_auth->new( $mailhost, Timeout => 120, Debug => 1 )
or die "Error.\n";
$smtp->auth( 'LOGIN', $user, $passwd );
foreach my $mailto (@mailto) {
$smtp->mail($mailfrom);
$smtp->to($mailto);
$smtp->data();
$smtp->datasend("To: $mailto\n");
$smtp->datasend("From:$mailfrom\n");
$smtp->datasend("Subject: $subject\n");
$smtp->datasend("\n");
$smtp->datasend("$text\n\n");
$smtp->dataend();
}
$smtp->quit;
}