1) Keepalived 主从配置环境
135与136的机器上安装了Nginx与Keepalived
137与138的机器上安装了JDK1.8与Tomcat环境
2) Nginx 代理, 实现负载均衡
2.1 ) 通过 conf/nginx.conf 配置实现#注意: proxy_temp_path和proxy_cache_path指定的路径必须在同一分区
#keys_zone=cache_one:200m 表示zone名称为cache_one, 分配的内存大小为200MB
#levels=1:2 表示缓存目录的第一级目录1个字符, 第二级目录是2个字符, 即/data/proxy_cache_dir/
#inactive=1d 表示这个zone中的缓存文件如果在1天内都没有被访问, 那么文件会被cache_manager进程删除掉
#max_size=30g 表示zone的硬盘容量为30GB
2.2) 在conf/nginx.conf文件内容的server{.....}上面加上以下代码实现负载
upstream backend_server { // Name: backend_server
server 192.168.73.137:8080 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.73.138:8080 weight=1 max_fails=2 fail_timeout=30s;
}
server {
location {
.....
.....
proxy_pass http://backend_server; // Name: 即上面的节点名称
.....
.....
}
}
3) Nginx + keepalived 实现高可用HA方法原理
3.1) 下载keepalived
-- #wget http://www.keepalived.org/software/keepalived-1.3.5.tar.gz
-- keepalived 1.3.x 我试过n次, 发现安装后, 在/usr/local/keepalived/etc目录下找不到rc.d目录, 所以后继文档记录, 以1.2.x版本介绍
#wget http://www.keepalived.org/software/keepalived-1.2.24.tar.gz
3.2) 安装keepalived, 前提很在/usr/local目录下创建好keepalive目录
#./configure --prefix=/usr/local/keepalived
如果安装出现以下错误提示:
!!! OpenSSL is not properly installed on your system. !!!
!!! Can not include OpenSSL headers files. !!!
请执行:
#yum -y install openssl-devel
3.3) 编译
#make 编译 (make的过程是把各种语言写的源码文件,变成可执行文件和各种库文件)
#make install 安装 (make install是把这些编译出来的可执行文件和库文件复制到合适的地方)
也可以
#make; make install
3.4) 复制文件
拷贝执行文件
#cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
将init.d文件拷贝到etc下,加入开机启动项
#cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/keepalived
将keepalived文件拷贝到etc下
#cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
创建keepalived文件夹
#mkdir -p /etc/keepalived
将keepalived配置文件拷贝到etc下
#cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
添加可执行权限
#chmod +x /etc/init.d/keepalived
3.5) 设置keepalived服务开机启动
#chkconfig keepalived on
#service keepalived start #启动服务
#service keepalived stop #停止服务
#service keepalived restart #重启服务
另外需要注意的一点是,keepalived启动时不会检查配置文件的语法是否正确,所以我们在编写配置文件时要特别小心,别写错了,否则会出现一些意想不到的现象。
使用service keepalived start命令启动服务时,默认会将/etc/sysconfig/keepalived文件中KEEPALIVED_OPTIONS参数作为keepalived服务启动时的参数,并从/etc/keepalived/目录下加载keepalived.conf配置文件,或用-f参数指定配置文件的位置。
# Options for keepalived. See `keepalived --help' output and keepalived(8) and
# keepalived.conf(5) man pages for a list of all options. Here are the most
# common ones :
#
# --vrrp -P Only run with VRRP subsystem.
# --check -C Only run with Health-checker subsystem.
# --dont-release-vrrp -V Dont remove VRRP VIPs & VROUTEs on daemon stop.
# --dont-release-ipvs -I Dont remove IPVS topology on daemon stop.
# --dump-conf -d Dump the configuration data.
# --log-detail -D Detailed log messages.日志默认输出在/var/log/message文件中
# --log-facility -S 0-7 Set local syslog facility (default=LOG_DAEMON)
#
KEEPALIVED_OPTIONS="-D"
运行keepalived --help可以查看启动时的可选参数,这些可选参数都可以配置在/etc/sysconfig/keepalived文件中的KEEPALIVED_OPTIONS选项中,作为服务启动时的参数。
keepalived正常运行后,会启动3个进程,其中一个是父进程,负责监控其子进程。一个是vrrp子进程,另外一个是checkers子进程。
#ps -ef | grep keepalived
root 831 1 0 11:22 ? 00:00:00 keepalived -D
root 840 831 0 11:22 ? 00:00:00 keepalived -D
root 841 831 0 11:22 ? 00:00:00 keepalived -D
到此keepalived就安装完成了。
3.6) 卸载keepalived程序
1) 进入keepalived的源码包
#cd /usr/local/src/keepalived #源码所在目录(根据实际情况进入对应目录)
2) 执行卸载程序
#make uninstall
3) 删除相关文件
#rm -f /usr/local/sbin/keepalived
#rm -f /usr/local/etc/rc.d/init.d/keepalived
#rm -f /usr/local/etc/sysconfig/keepalived
#rm -rf /usr/local/etc/keepalived
#rm -f /usr/local/bin/genhash
3.7) keepalived.conf配置文件说明
keepalived服务安装完成之后,后面的主要工作就是在keepalived.conf文件中配置HA和负载均衡。一个功能比较完整的常用的keepalived配置文件,主要包含三块:全局定义块、VRRP实例定义块和虚拟服务器定义块。全局定义块是必须的,如果keepalived只用来做ha,虚拟服务器是可选的。下面是一个功能比较完整的配置文件模板:
#全局定义块
global_defs {
# 邮件通知配置
notification_email {
email1
email2
}
notification_email_from email
smtp_server host
smtp_connect_timeout num
lvs_id string
router_id string ## 标识本节点的字条串,通常为hostname
}
#VRRP 实例定义块
vrrp_sync_group string {
group {
string
string
}
}
vrrp_instance string {
state MASTER|BACKUP
virtual_router_id num
interface string
mcast_src_ip @IP
priority num
advert_int num
nopreempt
smtp_alert
lvs_sync_daemon_interface string
authentication {
auth_type PASS|AH
auth_pass string
}
virtual_ipaddress { # Block limited to 20 IP addresses @IP
@IP
@IP
}
}
#虚拟服务器定义块
virtual_server (@IP PORT)|(fwmark num) {
delay_loop num
lb_algo rr|wrr|lc|wlc|sh|dh|lblc
lb_kind NAT|DR|TUN
persistence_timeout num
protocol TCP|UDP
real_server @IP PORT {
weight num
notify_down /path/script.sh
TCP_CHECK {
connect_port num
connect_timeout num
}
}
real_server @IP PORT {
weight num
MISC_CHECK {
misc_path /path_to_script/script.sh(or misc_path “/path_to_script/script.sh <arg_list>”)
}
}
real_server @IP PORT {
weight num
HTTP_GET|SSL_GET {
url {
# You can add multiple url block path alphanum
digest alphanum
}
connect_port num
connect_timeout num
nb_get_retry num
delay_before_retry num
}
}
}
3.8) 全局定义块
1、email通知(notification_email、smtp_server、smtp_connect_timeout):用于服务有故障时发送邮件报警,可选项,不建议用。需要系统开启sendmail服务,建议用第三独立监控服务,如用nagios全面监控代替。
2、lvs_id:lvs负载均衡器标识,在一个网络内,它的值应该是唯一的。
3、router_id:用户标识本节点的名称,通常为hostname
4、花括号{}:用来分隔定义块,必须成对出现。如果写漏了,keepalived运行时不会得到预期的结果。由于定义块存在嵌套关系,因此很容易遗漏结尾处的花括号,这点需要特别注意。
3.9) VRRP实例定义块
1) vrrp_sync_group:同步vrrp级,用于确定失败切换(FailOver)包含的路由实例个数。即在有2个负载均衡器的场景,一旦某个负载均衡器失效,需要自动切换到另外一个负载均衡器的实例是哪
2) group:至少要包含一个vrrp实例,vrrp实例名称必须和vrrp_instance定义的一致
3) vrrp_instance:vrrp实例名
A) state:实例状态,只有MASTER 和 BACKUP两种状态,并且需要全部大写。抢占模式下,其中MASTER为工作状态,BACKUP为备用状态。当MASTER所在的服务器失效时,BACKUP所在的服务会自动把它的状态由BACKUP切换到MASTER状态。当失效的MASTER所在的服务恢复时,BACKUP从MASTER恢复到BACKUP状态。
B) interface:对外提供服务的网卡接口,即VIP绑定的网卡接口。如:eth0,eth1。当前主流的服务器都有2个或2个以上的接口(分别对应外网和内网),在选择网卡接口时,一定要核实清楚。
C) mcast_src_ip:本机IP地址
D) virtual_router_id:虚拟路由的ID号,每个节点设置必须一样,可选择IP最后一段使用,相同的 VRID 为一个组,他将决定多播的 MAC 地址。
E) priority:节点优先级,取值范围0~254,MASTER要比BACKUP高
F) advert_int:MASTER与BACKUP节点间同步检查的时间间隔,单位为秒
G) lvs_sync_daemon_inteface:负载均衡器之间的监控接口,类似于 HA HeartBeat 的心跳线。但它的机制优于 Heartbeat,因为它没有“裂脑”这个问题,它是以优先级这个机制来规避这个麻烦的。在 DR 模式中,lvs_sync_daemon_inteface与服务接口interface使用同一个网络接口
H) authentication:验证类型和验证密码。类型主要有 PASS、AH 两种,通常使用PASS类型,据说AH使用时有问题。验证密码为明文,同一vrrp 实例MASTER与BACKUP使用相同的密码才能正常通信。
I) smtp_alert:有故障时是否激活邮件通知
G) nopreempt:禁止抢占服务。默认情况,当MASTER服务挂掉之后,BACKUP自动升级为MASTER并接替它的任务,当MASTER服务恢复后,升级为MASTER的BACKUP服务又自动降为BACKUP,把工作权交给原MASTER。当配置了nopreempt,MASTER从挂掉到恢复,不再将服务抢占过来。
H) virtual_ipaddress:虚拟IP地址池,可以有多个IP,每个IP占一行,不需要指定子网掩码。注意:这个IP必须与我们的设定的vip保持一致。
3.10) 虚拟服务器virtual_server定义块
1.virtual_server:定义一个虚拟服务器,这个ip是virtual_ipaddress中定义的其中一个,后面一个空格,然后加上虚拟服务的端口号。
A) delay_loop:健康检查时间间隔,单位:秒
B) lb_algo:负载均衡调度算法,互联网应用常用方式为wlc或rr
C) lb_kind:负载均衡转发规则。包括DR、NAT、TUN 3种,一般使用路由(DR)转发规则。
D) persistence_timeout:http服务会话保持时间,单位:秒
E) protocol:转发协议,分为TCP和UDP两种
2.real_server:真实服务器IP和端口,可以定义多个
A) weight:负载权重,值越大,转发的优先级越高
B) notify_down:服务停止后执行的脚本
C) TCP_CHECK:服务有效性检测
* connect_port:服务连接端口
* connect_timeout:服务连接超时时长,单位:秒
* nb_get_retry:服务连接失败重试次数
* delay_before_retry:重试连接间隔,单位:秒
4) Nginx + keepalived 动手练习
基于上面的拓扑图练习, Nginx1(别名Master1)与Nginx2(别名Master2)。
在Master1与Master2两台Linux机器上,都要配置好 /etc/keepalived/keepalived.conf 文件与 /data/sh/check_nginx.sh 两个文件, 在Master1上写好这些配置文件,可通过scp /etc/keepalived/keepalived.conf root@192.168.73.136:/etc/keepalived 跨Linux电脑拷贝。
4.1) 在Master1与Master2机器上创建并修改文件: /etc/keepalived/keepalived.conf
#全局定义块
global_defs {
# 邮件通知配置
notification_email {
1349594420@qq.com
}
notification_email_from 1349594420@qq.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL ## 标识本节点的字条串,通常为hostname
}
vrrp_script chk_nginx {
script "/data/sh/check_nginx.sh" ## 检查Nginx是否存活的一个角本
interval 2 ## 重试两次
weight 2 ## 权重
}
#VIP 1
vrrp_instance VI_1 {
state BACKUP ## 状态,表示开机启动的状态
interface eth0 ## 网卡(注意, 去CentOS系统中看一下网卡名称是多少, CentOS安装默认叫Auto eth1, 用#ip addr list命令查看一下)
lvs_sync_daemon_interface eth0 ## 互联通讯的网卡
virtual_router_id 151 ## 路由ID, 局域网内的路由ID,必须唯一性
priority 100 ## 优先级(Master1机器如设置为100, Master2机器得设置为90)
advert_int 5
nopreempt ## 不抢占
authentication { ## 认证
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.73.100 ## 前调用户访问就是这个IP (在Master1与Master2两台电脑的eth0网卡上虚拟一个IP地址)
}
track_script {
chk_nginx
}
}
4.2) 配置Nginx的运行信号进程检查check_nginx.sh
#mkdir -p /data/sh/
#vi check_nginx.sh
##!/bin/bash
##auto check nginx process
##2017-08-20 Tobin
killall -0 nginx ##不是杀掉,而是检测nginx信号是否正常运行中
if
[[ $? -ne 0 ]];then
/etc/init.d/keepalived stop ## 注意:这里千万不要用pkill或其它方式杀,因为用keepalived停止它会先检查一下信号进程,如果是pkill他的信号进程来不急检查, 就会造成它的VIP来不急推掉. 这时就导致两台服务器都有相同的VIP地址, 结果会造成客户端无法访问.
fi
#chmod o+x check_nginx.sh
4.3) 过程的测试常用命命令
#/etc/init.d/keepalived restart -- 启动 keepalived
#tail -fn 100 /var/log/messages -- 查看 keepalived 状态日志
Aug 20 20:49:13 localhost Keepalived_healthcheckers[3922]: Registering Kernel netlink command channel
Aug 20 20:49:13 localhost Keepalived_vrrp[3923]: VRRP_Instance(VI_1) removing protocol VIPs.
Aug 20 20:49:13 localhost Keepalived_healthcheckers[3922]: Opening file '/etc/keepalived/keepalived.conf'.
Aug 20 20:49:13 localhost Keepalived_vrrp[3923]: Using LinkWatch kernel netlink reflector...
Aug 20 20:49:13 localhost Keepalived_vrrp[3923]: IPVS: Protocol not available
Aug 20 20:49:13 localhost Keepalived_vrrp[3923]: VRRP_Instance(VI_1) Entering BACKUP STATE
Aug 20 20:49:13 localhost Keepalived_vrrp[3923]: VRRP sockpool: [ifindex(2), proto(112), unicast(0), fd(11,12)]
Aug 20 20:49:13 localhost Keepalived_healthcheckers[3922]: Using LinkWatch kernel netlink reflector...
Aug 20 20:49:13 localhost Keepalived_vrrp[3923]: VRRP_Script(chk_nginx) succeeded
Aug 20 20:49:18 localhost Keepalived_vrrp[3923]: VRRP_Instance(VI_1) Effective priority = 102
Aug 20 20:49:28 localhost Keepalived_vrrp[3923]: VRRP_Instance(VI_1) Transition to MASTER STATE
Aug 20 20:49:33 localhost Keepalived_vrrp[3923]: VRRP_Instance(VI_1) Entering MASTER STATE
Aug 20 20:49:33 localhost Keepalived_vrrp[3923]: VRRP_Instance(VI_1) setting protocol VIPs.
Aug 20 20:49:33 localhost Keepalived_vrrp[3923]: Sending gratuitous ARP on eth1 for 192.168.73.100
Aug 20 20:49:33 localhost Keepalived_healthcheckers[3922]: Netlink reflector reports IP 192.168.73.100 added