192.168.8.102 | 安装nginx 和 keepalived (主) |
192.168.8.103 | 安装nginx 和 keepalived (备) |
192.168.8.104 | 启动2个tomcat , 端口为8080 、8081 |
192.168.8.90 | VIP 虚拟IP(一般为外网IP,域名解析到此IP) |
1、安装nginx和keepalived
参考:https://blog.csdn.net/u013792404/article/details/93863306
https://blog.csdn.net/u013792404/article/details/98634073
2、nginx配置
192.168.8.102 和 192.168.8.103 配置只有server->server_name 不同。
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
upstream myserver{ #负载均衡
server 192.168.8.104:8080 weight=1;
server 192.168.8.104:8081 weight=1;
}
gzip on;
server {
listen 80;
server_name 192.168.8.102; #本机IP
#charset koi8-r;
#access_log logs/host.access.log main;
#location / {
# root html;
# index index.html index.htm;
#}
location / {
proxy_pass http://myserver;
#root html;
#index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
启动nginx : /usr/local/nginx/sbin/nginx
重启nginx : /usr/local/nginx/sbin/nginx -s reload
停止nginx : /usr/local/nginx/sbin/nginx -s stop
测试nginx:
访问 http://192.168.8.102
访问 http://192.168.8.103
3、配置keepalived
vim /etc/keepalived/keepalived.conf
192.168.8.102, 主keepalived
! Configuration File for keepalived
global_defs {
router_id 102id #标识节点的字符串,通常为hostname
}
## keepalived 会定时执行脚本并且对脚本的执行结果进行分析,动态调整vrrp_instance的优先级。这里的权重weight 是与下面的优先级priority有关,如果执行了一次检查脚本成功,则权重会-20,也就是由100 - 20 变成了80,Master 的优先级为80 就低于了Backup的优先级90,那么会进行自动的主备切换。
如果脚本执行结果为0并且weight配置的值大于0,则优先级会相应增加。
如果脚本执行结果不为0 并且weight配置的值小于0,则优先级会相应减少。
vrrp_script check_nginx_alive {
script "/usr/local/nginx/check_nginx_alive.sh" ##执行脚本位置
interval 2 ##检测时间间隔
weight -20 ## 如果条件成立则权重减20(-20)
}
## 定义虚拟路由 VI_1为自定义标识
vrrp_instance VI_1 {
state MASTER ## 主节点为MASTER,备份节点为BACKUP
interface eth0 ## 绑定虚拟IP的网络网卡,与本机IP地址所在的网络接口相同
virtual_router_id 51 ## 虚拟路由ID号 ,主从需要配置相同
mcast_src_ip 192.168.8.102 ## 本机ip地址
priority 100 ##优先级配置(0-254的值)
#nopreempt ##通常如果master服务死掉后backup会变成master,但是当master服务又好了的时候 master此时会抢占VIP,这样就会发生两次切换对业务繁忙的网站来说是不好的。所以我们要在配置文件加入 nopreempt 非抢占,但是这个参数只能用于state 为backup,故我们在用HA的时候最好master 和backup的state都设置成backup 让其通过priority来竞争。
advert_int 1 ## 组播信息发送间隔,俩个节点必须配置一致,默认1s
authentication {
auth_type PASS
auth_pass 1111 ## 真实生产环境下对密码进行匹配
}
virtual_ipaddress {
192.168.8.90 ## 虚拟ip(vip),可以指定多个
}
track_script {
check_nginx_alive ##上面定义vrrp_script的名称
}
}
192.168.8.103, 备keepalived , router_id、virtual_router_id、mcast_src_ip 和主配置不同,适当修改即可。state值为“BACKUP” , priority 优先级要比主配置中的优先级低。
! Configuration File for keepalived
vrrp_script check_nginx_alive {
script "/usr/local/nginx/check_nginx_alive.sh"
interval 2
weight -20
}
global_defs {
router_id backup103
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
mcast_src_ip 192.168.8.103
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.8.90
}
track_script{
check_nginx_alive
}
}
check_nginx_alive.sh脚本 , 如果nginx挂了,重新启动nginx , 复制到102和103适当位置。
#!/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
killall keepalived
fi
fi
启动keepalived ; service keepalived restart
测试keepalived:
http://192.168.8.90 ( 192.168.8.102的nginx有访问日志。经测试,哪个keepalived后启动,就访问同台机器的nginx。也不知道为啥), 此时负载均衡也不太明显,刷很多次才会到另一个端口。
192.168.8.102 停止keepalived和nginx后, 访问http://192.168.8.90/ 时会“卡”几秒, 然后192.168.8.103的nginx就有日志了,访问正常。
nginx高可用感觉貌似是没问题了,存在的问题:
1、负载均衡效果不好,不知道是哪里缓存还是怎么滴了。
2、当主keepalived和主nginx正常运行时,请求有时候会跳到另外一台上。
哪位大神看到后请指点下