keepalived nginx 双机热备实战精讲
在试验之前先贴张图上来,大致说下具体的需求及环境(注:实验所用到的脚本在文章末尾,如果在过程中遇到可以先看脚本)
环境:
VIP(漂移地址):192.168.1.60-192.168.1.61
nginx-1:192.168.1.50
nginx-2:192.168.1.51
关闭 iptables、关闭selinux 并且打通ssh配置,使得192.168.1.50和192.168.1.51可以免密码登录(主要同于同步 nginx 配置和 reload, 公钥验证文件:authorized_keys)
需求:
两只 nginx web 服务器分别提供相同的访问,当一只主机无法提供服务(keepalived 、nginx 或者说主机宕机)后,另一只马上转换为MASTER状态,并且继承VIP,继续向用户提供服务。
1、如果 keepalived 状态转换为 MASTER,则发送邮件进行通知运维人员(由下面 keepalived_check.sh 脚本实现)
2、需要nginx两台服务器提供的服务是完全一致的,并且当一台 nginx 的配置改变,则另一台立刻变为相同的配置,并且 reload 。(由 rsync+inotify 实时同步脚本 nginx_rsync.sh 脚本实现)
3、如果keepalived 挂掉,则检测并且重启keepalived;如果nginx 挂掉,则关闭keepalived,且让VIP转移到 keepalived-slave上面(由 nginx_check.sh脚本实现)
下面开始实验:
一、nginx-1(master 主机配置)
1、时间校准
ntpdate ntp.api.bz
2、安装依赖软件
yum -y install openssl openssl-devel kernel-devel
3、使用inotify机制,还需要安装inotify-tools工具,以便提供inotifywait,inotifywatch辅助工具,用来监控,汇总改动情况
yum -y install inotify-tools
4、准备 keepalived 和 nginx 包(keepalived 包可以去 keepalived.org 下载,nginx 包则去 tengine 官方下载)
5、解包、编译安装
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
6、拷贝配置文件
mkdir -p /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
7、创建脚本文件及目录(脚本我会在尾部添加)
三个脚本,分别为 keepalived 脚本脚本、nginx 检测脚本、nginx 同步脚本
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
8、安装 mailx 包,用于发送邮件
yum -y install mailx
编辑 /etc/mail.rc 文件,在尾部添加两行:邮箱密码为邮箱授权码
9、keepalived 配置文件:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
10、nginx 配置
安装nginx依赖
yum -y install pcre-devel pcre openssl-devel openssl
解包,编译安装
tar zxf tengine-2.1.2.tar.gz -C /usr/local/src/
cd /usr/local/src/tengine-2.1.2/
./configure –prefix=/usr/local/nginx
make && make istall
11、启动nginx、启动脚本分别为:nginx_check.sh nginx_rsync.sh(可以看到,nginx 和 两个脚本都已经启动)
12、启动 keepalived
13、查看日志(可以看到,keepalived已经启动,并且成功绑定了 VIP 192.168.1.60和61)
14、查看网卡 IP 地址(除了自身IP地址以外、VIP也已经绑定)
15、通过VIP访问nginx
二、nginx-2(slave 主机配置)
1、前1-8步骤 nginx-1 和 nginx-2 是一样的,照着以前做就行,这里主要帖下 nginx-2 的 keepalived.conf 配置
2、keepalived 配置文件
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
3、nginx 配置
安装nginx依赖
yum -y install pcre-devel pcre openssl-devel openssl
解包,编译安装
tar zxf tengine-2.1.2.tar.gz -C /usr/local/src/
cd /usr/local/src/tengine-2.1.2/
./configure –prefix=/usr/local/nginx
make && make istall
4、启动nginx、启动 nginx_check.sh(nginx_rsync.sh 不必启动,因为只需配置一个nginx,则另一个也会自动同步并且 reload)
5、启动 keepalived 并查看日志
三、故障及需求演练
1、当 keepalived 挂掉,那么理论上说 keepalived 服务会重新启动起来(通过nginx_check.sh 脚本实现)
在下图中可以看到,我第一次 status 之后 keepalived 的状态是 running的,当我执行 stop 之后 keepalived 马上变为 stopped 状态,可过会之后 keepalived 状态又变为 running
2、当 nginx 挂掉后,那么理论上说 keepalived 服务也会关闭(通过nginx_check.sh 脚本实现)
在下图中可以看到,第一次我 status 的时候 keepalived 的状态是 running… 的,nginx 进程也在,当我 killall 掉 nginx 之后,前三秒 keepalived 的状态还是 running… 接着马上停止该服务(脚本检测时间为10秒一次)
3、当 keepalived 状态变为 Master 之后,发送邮件(通过 keepalived_check.sh 脚本实现)
在第一个问题中,我停止 keepalived 服务,那么这时候 slave 就会将状态转换为 master,则相应的,我也会收到报警邮件或者短信
4、当 nginx-1 配置改动之后,nginx-2 的配置也会相应的更改,并且 reload (通过 nginx_rsync.sh 脚本实现)
我在nginx-1上面执行下列命令,接着我们查看nginx-1和nginx-2的 /usr/local/nginx/html/index.html的配置信息和改动时间
由下图可以发现 nginx-1 的 index.html 和 nginx-2 的 index.html 改动时间完全相同,并且配置也完全相同。
四、实验脚本
1、keepalived_check.sh 脚本(执行方式:keepalived.conf 中配置)
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
2、nginx_check.sh 脚本(执行方式:后台,nohup sh nginx_check.sh &)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
3、nginx_rsync.sh 脚本(执行方式:后台,nohup sh nginx_rsync.sh 该脚本只有一只主机在后台执行)