环境准备

172.16.119.100:nginx keepalived   master

172.16.119.101:nginx keepalived   backup

172.16.119.102:tomcat

172.16.119.103:tomcat

虚拟ip(VIP):172.16.119.200,对外提供服务的ip,也可称作浮动ip

各个组件之间的关系图如下:

tomcat做应用服务器

将172.16.119.102、172.16.119.103上的tomcat启动起来

上传apache-tomcat-8.5.23.tar.gz到172.16.119.102

解压:tar -zxf apache-tomcat-8.5.23.tar.gz

扫描二维码关注公众号,回复: 6648632 查看本文章

情况webapp文件夹:rm -rf *

上传ROOT项目

访问:http://172.16.119.102:8080/

修改index.jsp页面内容为当前服务器IP

JSP不需要编译直接刷新页面看效果

现在直接复制tomcat文件夹到172.16.119.103服务器

执行:scp -r apache-tomcat-8.5.23/ [email protected]:/usr/local/

修改index.jsp页面内容启动

启动:./startup.sh

172.16.119.102安装nginx服务

准备nginx-1.8.1.tar.gz,并解压到当前目录,命令tar -zxf nginx-1.8.1.tar.gz

nginx依赖包安装

nginx安装有环境要求,nginx依赖下面3个包

a. gzip 模块需要 zlib 库 ( 下载: http://www.zlib.net/ )

b. rewrite 模块需要 pcre 库 ( 下载: http://www.pcre.org/ )

c. ssl 功能需要 openssl 库 ( 下载: http://www.openssl.org/ )

这里我就不用源码包方式来安装了,直接一键式安装:yum -y install zlib zlib-devel openssl openssl--devel pcre pcre-devel

nginx安装

cd nginx-1.8.1     ./configure --prefix=/home/hadoop/apps/nginx     make    make install    安装完成之后,检查nginx的配置文件是否正确    cd /home/hadoop/apps/nginx/sbin/    ./nginx -t

说明配置文件正确,那么nginx安装成功!

nginx启动

cd /home/hadoop/apps/nginx/sbin/

./nginx

注意如果访问是403解决:修改cd /home/hadoop/apps/nginx/conf   vi nginx.conf


nginx负载均衡

修改:vim /home/hadoop/apps/nginx/conf/nginx.conf

172.16.119.100配置

user nobody;worker_processes 2;events{ worker_connections 1024;}http{ #设置默认类型为二进制流 default_type application/octet-stream; server_names_hash_bucket_size 128; #指定来自client请求头的headerbuffer大小。设置为32KB client_header_buffer_size 32k; #指定client请求中较大的消息头的缓存最大数量和大小,这里是4个32KB large_client_header_buffers 4 32k; #上传文件大小 client_max_body_size 356m; #nginx的HttpLog模块指定,指定nginx日志的输出格式,输出格式为access log_format access '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; #access日志存在未知 access_log /home/hadoop/apps/nginx/logs/access.log access; #开启高效模式文件传输模式,将tcp_nopush和tcp_nodelay两个指另设置为on,用于防止网络堵塞。 sendfile on; tcp_nopush on; tcp_nodelay on; #设置client连接保持活动的超时时间 keepalive_timeout 65; server_tokens off; #client请求主体读取缓存 client_body_buffer_size 512k; proxy_connect_timeout 5; proxy_send_timeout 60; proxy_read_timeout 5; proxy_buffer_size 16k; proxy_buffers 4 64k; proxy_busy_buffers_size 128k; proxy_temp_file_write_size 128k; #fastcgi_connect_timeout 300; #fastcgi_send_timeout 300; #fastcgi_read_timeout 300; #fastcgi_buffer_timeout 300; #fastcgi_buffers 4 64k; #fastcgi_busy_buffers_size 128k; #fastcgi_temp_file_write_size 128k; #开启gzip gzip on; #同意压缩的最小字节数 gzip_min_length 1k; #4个单位为16k的内存作为压缩结果流缓存 gzip_buffers 4 16k; #设置识别HTTP协议版本号,默认是1.1 gzip_http_version 1.1; #gzip压缩比,可在1~9中设置,1压缩比最小,速度最快。9压缩比最大。速度最慢,消耗CPU gzip_comp_level 2; #压缩的类型 gzip_types text/plain application/x-javascript text/css application/xml; #让前端的缓存server混村经过的gzip压缩的页面 gzip_vary on; upstream mycluster{ server 172.16.119.102:8080 weight=1; server 172.16.119.103:8080 weight=1; } server{ listen 8089; server_name 172.16.119.100; charset utf-8; #设置编码为utf-8 #root html; #location / { # root html; # index index.html index.htm; #} #location ~ .*\.(jsp|do|action)$ location / { proxy_next_upstream http_502 http_504 error timeout invalid_header; proxy_pass http://mycluster; # 真实的clientIP proxy_set_header X-Real-IP $remote_addr; # 请求头中Host信息 proxy_set_header Host $host; # 代理路由信息。此处取IP有安全隐患 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 真实的用户訪问协议 proxy_set_header X-Forwarded-Proto $scheme; } #静态文件交给nginx处理 location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ { root /usr/local/apache-tomcat-8.5.23/webapps; expires 30d; } #静态文件交给nginx处理 location ~ .*\.(js|css)? { root /usr/local/apache-tomcat-8.5.23/webapps; expires 1h; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }

172.16.119.101配置

user nobody;worker_processes 2;events{ worker_connections 1024;}http{ #设置默认类型为二进制流 default_type application/octet-stream; server_names_hash_bucket_size 128; #指定来自client请求头的headerbuffer大小。设置为32KB client_header_buffer_size 32k; #指定client请求中较大的消息头的缓存最大数量和大小,这里是4个32KB large_client_header_buffers 4 32k; #上传文件大小 client_max_body_size 356m; #nginx的HttpLog模块指定,指定nginx日志的输出格式,输出格式为access log_format access '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; #access日志存在未知 access_log /home/hadoop/apps/nginx/logs/access.log access; #开启高效模式文件传输模式,将tcp_nopush和tcp_nodelay两个指另设置为on,用于防止网络堵塞。 sendfile on; tcp_nopush on; tcp_nodelay on; #设置client连接保持活动的超时时间 keepalive_timeout 65; server_tokens off; #client请求主体读取缓存 client_body_buffer_size 512k; proxy_connect_timeout 5; proxy_send_timeout 60; proxy_read_timeout 5; proxy_buffer_size 16k; proxy_buffers 4 64k; proxy_busy_buffers_size 128k; proxy_temp_file_write_size 128k; #fastcgi_connect_timeout 300; #fastcgi_send_timeout 300; #fastcgi_read_timeout 300; #fastcgi_buffer_timeout 300; #fastcgi_buffers 4 64k; #fastcgi_busy_buffers_size 128k; #fastcgi_temp_file_write_size 128k; #开启gzip gzip on; #同意压缩的最小字节数 gzip_min_length 1k; #4个单位为16k的内存作为压缩结果流缓存 gzip_buffers 4 16k; #设置识别HTTP协议版本号,默认是1.1 gzip_http_version 1.1; #gzip压缩比,可在1~9中设置,1压缩比最小,速度最快。9压缩比最大。速度最慢,消耗CPU gzip_comp_level 2; #压缩的类型 gzip_types text/plain application/x-javascript text/css application/xml; #让前端的缓存server混村经过的gzip压缩的页面 gzip_vary on; upstream mycluster{ server 172.16.119.102:8080 weight=1; server 172.16.119.103:8080 weight=1; } server{ listen 8089; server_name 172.16.119.101; charset utf-8; #设置编码为utf-8 #root html; #location / { # root html; # index index.html index.htm; #} #location ~ .*\.(jsp|do|action)$ location / { proxy_next_upstream http_502 http_504 error timeout invalid_header; proxy_pass http://mycluster; # 真实的clientIP proxy_set_header X-Real-IP $remote_addr; # 请求头中Host信息 proxy_set_header Host $host; # 代理路由信息。此处取IP有安全隐患 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 真实的用户訪问协议 proxy_set_header X-Forwarded-Proto $scheme; } #静态文件交给nginx处理 location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ { root /usr/local/apache-tomcat-8.5.23/webapps; expires 30d; } #静态文件交给nginx处理 location ~ .*\.(js|css)? { root /usr/local/apache-tomcat-8.5.23/webapps; expires 1h; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }

启动:访问http://172.16.119.100:8089/测试



安装Keepalived

下载keepalived-1.4.5.tar.gz

在/home/hadoop/apps/keepalived-1.4.5目录下,添加check_nginx.sh(检查nginx存活的shell脚本)和keepalived.conf(keepalived配置文件)

check_nginx.sh

#!/bin/bash#代码一定注意空格,逻辑就是:如果nginx进程不存在则启动nginx,如果nginx无法启动则kill掉keepalived所有进程A=`ps -C nginx --no-header |wc -l`if [ $A -eq 0 ];then /etc/init.d/nginx start sleep 3 if [ `ps -C nginx --no-header |wc -l`-eq 0 ];then killall keepalived fifi

安装编译:./configure --prefix=/usr/app/keepalived && make && make install

安装好了之后,你就会看到如下的内容,那就恭喜你,安装成功了。

Keepalived configuration------------------------Keepalived version : 1.4.2Compiler : gccPreprocessor flags : Compiler flags : -Wall -Wunused -Wstrict-prototypes -Wextra -g -O2 -fPIE -D_GNU_SOURCELinker flags : -pieExtra Lib : -lcrypto -lssl Use IPVS Framework : YesIPVS use libnl : NoIPVS syncd attributes : NoIPVS 64 bit stats : Nofwmark socket support : YesUse VRRP Framework : YesUse VRRP VMAC : YesUse VRRP authentication : YesWith ip rules/routes : YesSNMP vrrp support : NoSNMP checker support : NoSNMP RFCv2 support : NoSNMP RFCv3 support : NoDBUS support : NoSHA1 support : NoUse Debug flags : Nosmtp-alert debugging : NoUse Json output : NoStacktrace support : NoMemory alloc check : Nolibnl version : NoneUse IPv4 devconf : NoUse libiptc : NoUse libipset : Noinit type : systemdBuild genhash : YesBuild documentation : No

安装好了之后,在/home/hadoop/apps/keepalived/etc/keepalived目录下有一个keepalived.conf文件,现在你要做的事情就是

将它copy到/etc/keepalived文件夹下就可以了。

mkdir -p /etc/keepalivedcp /home/hadoop/apps/keepalived/etc/keepalived/keepalived.conf /etc/keepalived

接下来我们改一下配置文件。

172.16.119.100

机器中的配置文件,修改如下:

vim /etc/keepalived/keepalived.conf

Master(172.16.119.100)中的keepalived.conf配置如下

vrrp_script chk_nginx { script "/home/hadoop/apps/keepalived-1.4.5/check_nginx.sh" //检测nginx进程的脚本 interval 2 weight -20 } global_defs { notification_email { //可以添加邮件提醒 } } vrrp_instance VI_1 { state MASTER //主服务器 interface et virtual_router_id 51 mcast_src_ip 172.16.119.100 priority 250 advert_int 1 authentication { auth_type PASS auth_pass 123456 } track_script { chk_nginx } virtual_ipaddress { 172.16.119.200 } }

关于keepalived配置的几点说明

- state - 主服务器需配成MASTER,从服务器需配成BACKUP

- interface - 这个是网卡名,可以通过ifconfig查询到

- mcast_src_ip - 配置各自的实际IP地址

- priority - 主服务器的优先级必须比从服务器的高,这里主服务器配置成250,从服务器配置成240

- virtual_ipaddress - 配置虚拟IP(172.16.119.200)

- authentication - auth_pass主从服务器必须一致,keepalived靠这个来通信

- virtual_router_id - 主从服务器必须保持一致

执行pkill keepalived来关闭keepalived

启动:命令

cd /home/hadoop/apps/keepalived/sbin./keepalived -D

查询进程:

如果查不到进程查看启动日志:tail -f  /var/log/messages

查看虚拟IP:



部署172.16.119.101

scp -r /home/hadoop/apps/keepalived/ root@hadoop2:/home/hadoop/apps/

scp /etc/keepalived/keepalived.conf root@hadoop2:/etc/keepalived/

修改配置

Backup(172.16.119.101)中的keepalived.conf配置如下

vrrp_script chk_nginx { script "/home/hadoop/apps/keepalived-1.4.5/check_nginx.sh" //检测nginx进程的脚本 interval 2 weight -20 } global_defs { notification_email { //可以添加邮件提醒 } } vrrp_instance VI_1 { state BACKUP //从服务器 interface eth1 virtual_router_id 51 mcast_src_ip 172.16.119.101 priority 240 advert_int 1 authentication { auth_type PASS auth_pass 123456 } track_script { chk_nginx } virtual_ipaddress { 172.16.119.200 } }

配置完启动

这个时候发现虚拟IP并没有绑定在101服务器上,现在关闭100服务器看虚拟IP会不会偏移到101服务器

现在再查看101服务器的虚拟IP

访问网站也是没有问题的

现在Master恢复正常后,Master继续提供服务,Backup停止服务,并继续等待Master出现故障



重新启动100会发现虚拟IP会重新被100抢占

Keepalived抢占模式和非抢占模式

keepalived的HA分为抢占模式和非抢占模式,抢占模式即MASTER从故障中恢复后,会将VIP从BACKUP节点中抢占过来。非抢占模式即MASTER恢复后不抢占BACKUP升级为MASTER后的VIP。

前面的例子中,我们实际上配置的是抢占模式,下面我们再来看看非抢占模式

Master(100)中的keepalived.conf配置如下

vrrp_script chk_nginx { script "/home/hadoop/apps/keepalived-1.4.5/check_nginx.sh"//检测nginx进程的脚本 interval 2 weight -20 } global_defs { notification_email { //可以添加邮件提醒 } } vrrp_instance VI_1 { state BACKUP //主服务器(非抢占模式需要配置成BACKUP) interface eth0 virtual_router_id 51 mcast_src_ip 172.16.119.100 priority 250 advert_int 1 nopreempt //非抢占模式 authentication { auth_type PASS auth_pass 123456 } track_script { chk_nginx } virtual_ipaddress { 172.16.119.200 } }

Master(101)中的keepalived.conf配置如下

vrrp_script chk_nginx { script "/home/hadoop/apps/keepalived-1.4.5/check_nginx.sh"//检测nginx进程的脚本 interval 2 weight -20 } global_defs { notification_email { //可以添加邮件提醒 } } vrrp_instance VI_1 { state BACKUP //主服务器(非抢占模式需要配置成BACKUP) interface eth1 virtual_router_id 51 mcast_src_ip 172.16.119.100 priority 240 advert_int 1 nopreempt //非抢占模式 authentication { auth_type PASS auth_pass 123456 } track_script { chk_nginx } virtual_ipaddress { 172.16.119.200 } }

抢占模式配置说明

和非抢占模式的配置相比,只改了两个地方:

1> 在vrrp_instance块下两个节点各增加了nopreempt指令,表示不争抢vip

2> 节点的state都为BACKUP

两个keepalived节点都启动后,默认都是BACKUP状态,双方在发送组播信息后,会根据优先级来选举一个MASTER出来。由于两者都配置了nopreempt,所以MASTER从故障中恢复后,不会抢占vip。这样会避免VIP切换可能造成的服务延迟。

(非抢占模式)Step-1 Master,Backup都正常,只有Master对外提供服务

配置完成后,先启动Master(100)机器的keepalived和nginx,查看Master的IP信息,可以看到VIP已经被绑定到100机器上了,再启动Backup(101)机器的keepalived和nginx,查看Backup的IP信息,可以看到VIP没有被绑定到101机器上了

浏览器多次刷新并访问 http://172.16.119.200:8089/

可以看到页面上IP交替显式102和103,并且显示NGINX-1,则表明是Master(100)在转发web请求

(非抢占模式)Step-2 Master挂了,Backup接替Master对外提供服务

接着,我们在Master(100)机器上关闭keepalived和nginx进程来模拟Master服务器挂掉,查看Backup(101)的VIP,发现VIP已经绑定到了Backup(101)

浏览器多次刷新并访问http://172.16.119.200:8089/

可以看到页面上IP交替显式102和103,并且显示NGINX-2,则表明是Backup(101)在转发web请求,也就是说Master挂掉后,Backup继续接管Master的服务。

(非抢占模式)Step-3 Master恢复正常后,Backup继续对外提供服务,Master不会抢占VIP,而是继续等待Backup出现故障

我们再启动Master(100)机器的keepalived和nginx,查看VIP,发现VIP已经被Master“夺回”了使用权限

浏览器多次刷新并访问http://172.16.119.200:8089/

可以看到页面上IP交替显式102和102,并且显示NGINX-2,则表明是Backup(101)在转发web请求,也就是说Master恢复后,并未接管Backup的服务。

(非抢占模式)Step-4 Backup挂了,Master重新绑定VIP,接替Backup对外提供服务

我们在Backup(101)机器上关闭keepalived和nginx进程来模拟Backup服务器挂掉,查看Master(100)的VIP,发现VIP已经绑定到了Master(100)

浏览器多次刷新并访问http://172.16.119.200:8089/

可以看到页面上IP交替显式102和103,并且显示NGINX-1,则表明是Master(100)在转发web请求

品略图书馆 http://www.pinlue.com/