一、主体架构图:
①大的静态资源全部部署在全国各地的CDN服务器上,提高静态资源的访问速度,减少主业务服务的带宽消耗;
②用keepalived实现高可能,两台机器都需部署keepalived,依靠keepalived对Nginx节点的监控及两个keepalived相互之间的监控,实现对虚拟IP(服务对外的统一入口)的绑定转移。
③用Nginx的反向代理实现对action层的负载均衡。同时一些静态资源也可以部署在其他的Nginx节点上,达到动静分离。
④将每个service服务独立部署并部署多份,将所有service注册到DUBBO,使action通过访问DUBBO用RPC的socket方式来实现service层的负载均衡。
⑤在数据库入口与service之间,部署多个redis缓存服务,提高查询效率。
⑥依靠mycat的一致性哈希算法,实现分库分表,及对数据库的动态扩展。
⑦如果有进一步提高效率的需求,还可对数据库做读写分离。
二、Nginx反向代理配置
1.修改Nginx配置文件
①启动Nginx
cd usr/local/nginx/sbin
./nginx
②修改配置文件
server {
listen 80;
server_name nginx-01.cn; #nginx所在服务器的主机名
#反向代理的配置
location / { #拦截所有请求
root html;
proxy_pass http://192.168.0.21:8080; #这里是代理走向的目标服务器:tomcat
}
}
③重启
kill -HUP 主进程号或进程号文件路径
或者使用
cd /usr/local/nginx/sbin
./nginx -s reload
判断配置文件是否正确
nginx -t -c /usr/local/nginx/conf/nginx.conf
或者
cd /usr/local/nginx/sbin
./nginx -t
④关闭
查询nginx主进程号 ps -ef | grep nginx
从容停止 kill -QUIT 主进程号
快速停止 kill -TERM 主进程号
强制停止 kill -9 nginx
若nginx.conf配置了pid文件路径,如果没有,则在logs目录下
kill -信号类型 '/usr/local/nginx/logs/nginx.pid'
2.动静分离
#动态资源 index.jsp
location ~ .*\.(jsp|do|action)$ {
proxy_pass http://tomcat-01.cn:8080;
}
#静态资源
location ~ .*\.(html|js|css|gif|jpg|jpeg|png)$ {
#所有静态文件直接读取硬盘
root /var/lib/tomcat7/webapps/JieLiERP/WEB-INF ;
expires 30d; #缓存30天
}
3.负载均衡
在http这个节下面配置一个叫upstream的,后面的名字可以随意取,但是要和location下的proxy_pass http://后的保持一致。
http {
**是在http里面的, 已有http, 不是在server里,在server外面**
upstream tomcats {
server zekun02:8080 weight=1;#weight表示多少个
server zekun03:8080 weight=1;
server zekun04:8080 weight=1;
}
#写在server里
location ~ .*\.(jsp|do|action) { # ~ 代表着大小写敏感
proxy_pass http://tomcats; #tomcats是后面的tomcat服务器组的逻辑组号
}
}
三、配置keepalived
1.配置keepalived虚拟IP
修改配置文件: /etc/keepalived/keepalived.conf
#MASTER节点
global_defs {
}
vrrp_instance VI_1 {
state MASTER **#指定A节点为主节点 备用节点上设置为BACKUP即可**
interface eth0 #绑定虚拟IP的网络接口
virtual_router_id 51 #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组
priority 100 **#主节点的优先级(1-254之间),备用节点必须比主节点优先级低**
advert_int 1 **#组播信息发送间隔,两个节点设置必须一样**
authentication { #设置验证信息,两个节点必须一致
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #指定虚拟IP, 两个节点设置必须一样
192.168.33.60/24 **#如果两个nginx的ip分别是192.168.33.61,,...62,则此处的虚拟ip跟它俩同一个网段即可**
}
}
#BACKUP节点
global_defs {
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.33.60/24
}
}
杀掉master上的keepalived进程,你会发现,在slave机器上的eth0网卡多了一个ip地址
查看ip地址的命令: ip addr
2.配置keepalived心跳检查
原理:
Keepalived并不跟nginx耦合,它俩完全不是一家人,但是keepalived提供一个机制:让用户自定义一个shell脚本去检测用户自己的程序,返回状态给keepalived就可以了
#MASTER节点
global_defs {
}
###重点配置
vrrp_script chk_health {
script "[[ `ps -ef | grep nginx | grep -v grep | wc -l` -ge 2 ]] && exit 0 || exit 1"
interval 1 #每隔1秒执行上述的脚本,去检查用户的程序ngnix
weight -2 #服务每停一次就减小优先级的权重
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 1
priority 100
advert_int 2
authentication {
auth_type PASS
auth_pass 1111
}
###重点配置
track_script {
chk_health
}
virtual_ipaddress {
10.0.0.10/24
}
###重点配置
notify_master "/usr/local/keepalived/sbin/notify.sh master"
notify_backup "/usr/local/keepalived/sbin/notify.sh backup"
notify_fault "/usr/local/keepalived/sbin/notify.sh fault"
}
#添加切换通知脚本
vi /usr/local/keepalived/sbin/notify.sh
#!/bin/bash
case "$1" in
master)
/usr/local/nginx/sbin/nginx
exit 0
;;
backup)
/usr/local/nginx/sbin/nginx -s stop
/usr/local/nginx/sbin/nginx
exit 0
;;
fault)
/usr/local/nginx/sbin/nginx -s stop
exit 0
;;
*)
echo 'Usage: notify.sh {master|backup|fault}'
exit 1
;;
esac
#添加执行权限
chmod +x /usr/local/keepalived/sbin/notify.sh
#BACKUP节点
global_defs {
}
vrrp_script chk_health {
script "[[ `ps -ef | grep nginx | grep -v grep | wc -l` -ge 2 ]] && exit 0 || exit 1"
interval 1
weight -2
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 1
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_health
}
virtual_ipaddress {
10.0.0.10/24
}
notify_master "/usr/local/keepalived/sbin/notify.sh master"
notify_backup "/usr/local/keepalived/sbin/notify.sh backup"
notify_fault "/usr/local/keepalived/sbin/notify.sh fault"
}
notify的用法:
notify_master:当当前节点成为master时,通知脚本执行任务(一般用于启动某服务,比如nginx,haproxy等)
notify_backup:当当前节点成为backup时,通知脚本执行任务(一般用于关闭某服务,比如nginx,haproxy等)
notify_fault:当当前节点出现故障,执行的任务;
例:当成为master时启动haproxy,当成为backup时关闭haproxy
notify_master “/etc/keepalived/start_haproxy.sh start”
notify_backup “/etc/keepalived/start_haproxy.sh stop”
一个完整的实例:
MASTER:初始priority为100
BACKUP:初始priority为90
模拟MASTER产生故障:
当检测到/etc/keepalived目录下有down文件时,priority减少20,变为80;低于BACKUP的priority;
此时MASTER变成BACKUP,同时执行notify_backup的脚本文件(关闭haproxy);
同时BACKUP变成MASTER,同时执行notify_master的脚本文件(启动haproxy);
模拟MASTER故障恢复:
当删除/etc/keepalived目录下的down文件时,原MASTER的优先级又变为100,高于原BACKUP的priority;
此时原MASTER由BACKUP又抢占成了MASTER,同时执行notify_master的脚本文件(启动haproxy);
同时原BACKUP由MASTER又变了BACKUP,同时执行notify_backup的脚本文件(关闭haproxy);