环境准备
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
情况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
在/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 fi fi
安装编译:./configure --prefix=/usr/app/keepalived && make && make install
安装好了之后,你就会看到如下的内容,那就恭喜你,安装成功了。
Keepalived configuration ------------------------ Keepalived version : 1.4.2 Compiler : gcc Preprocessor flags : Compiler flags : -Wall -Wunused -Wstrict-prototypes -Wextra -g -O2 -fPIE -D_GNU_SOURCE Linker flags : -pie Extra Lib : -lcrypto -lssl Use IPVS Framework : Yes IPVS use libnl : No IPVS syncd attributes : No IPVS 64 bit stats : No fwmark socket support : Yes Use VRRP Framework : Yes Use VRRP VMAC : Yes Use VRRP authentication : Yes With ip rules/routes : Yes SNMP vrrp support : No SNMP checker support : No SNMP RFCv2 support : No SNMP RFCv3 support : No DBUS support : No SHA1 support : No Use Debug flags : No smtp-alert debugging : No Use Json output : No Stacktrace support : No Memory alloc check : No libnl version : None Use IPv4 devconf : No Use libiptc : No Use libipset : No init type : systemd Build genhash : Yes Build documentation : No
安装好了之后,在/home/hadoop/apps/keepalived/etc/keepalived目录下有一个keepalived.conf文件,现在你要做的事情就是
将它copy到/etc/keepalived文件夹下就可以了。
mkdir -p /etc/keepalived cp /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/ [email protected]:/home/hadoop/apps/
scp /etc/keepalived/keepalived.conf [email protected]:/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请求
原文地址:https://www.cnblogs.com/h-kang/p/11018751.html