高并发网站架构CDN+ Nginx+ keepalived + DUBBO + redis + mycat

一、主体架构图:
高并发网站架构CDN+ Nginx+ keepalived + DUBBO + redis + mycat_第1张图片
①大的静态资源全部部署在全国各地的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);

你可能感兴趣的:(架构演进)