使用集群是网站解决高并发、海量数据问题的常用手段。当一台服务器的处理能力、存储空间不足时,不要企图去换更强大的服务器,对大型网站而言,不管多么强大的服务器,都满足不了网站持续增长的业务需求。这种情况下,更恰当的做法是增加一台服务器分担原有服务器的访问及存储压力。通过负载均衡调度服务器,将来自浏览器的访问请求分发到应用服务器集群中的任何一台服务器上,如果有更多的用户,就在集群中加入更多的应用服务器,使应用服务器的负载压力不再成为整个网站的瓶颈。 摘自《大型网站技术架构_核心原理与案例分析》
一,环境准备
127.12.19.121 : nginx+keepalived master
127.12.19.131 : nginx+keepalived backup
127.12.89.23 : 虚拟ip(VIP) 对外提供服务的IP,也可称做浮动IP.
127.17.124.13 : 后端服务A
127.17.124.14 : 后端服务B
二,流程架构
三,Nginx主要实现及配置
1,通过反向代理,实现用户对后台服务器的访问,并且也可以实现对一些静态文件的缓存,提搞性能。
nginx-master的 nginx.conf配置如下:
user root; #运行用户 worker_processes 1; #启动进程,通常设置成和cpu的数量相等 #全局错误日志及PID文件 error_log /usr/local/nginx/logs/error.log; error_log /usr/local/nginx/logs/error.log notice; error_log /usr/local/nginx/logs/error.log info; pid /usr/local/nginx/logs/nginx.pid; # 工作模式及连接数上线 events { use epoll; #epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能 worker_connections 1024; #单个后台worker process进程的最大并发链接数 } #设定http服务器,利用它的反向代理功能提供负载均衡支持 http { include mime.types; default_type application/octet-stream; #设定请求缓冲 server_names_hash_bucket_size 128; client_header_buffer_size 32K; large_client_header_buffers 4 32k; # client_max_body_size 8m; #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用, #必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime. sendfile on; tcp_nopush on; tcp_nodelay on; #连接超时时间 keepalive_timeout 65; #开启gzip压缩,降低传输流量 gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.1; gzip_comp_level 2; gzip_types text/plain application/x-javascript text/css application/xml; gzip_vary on; #添加tomcat列表,真实应用服务器都放在这 upstream tomcat_pool { #server tomcat地址:端口号 weight表示权值,权值越大,被分配的几率越大; server 127.17.124.13:8080 weight=4 max_fails=2 fail_timeout=30s; server 127.17.124.14:8080 weight=4 max_fails=2 fail_timeout=30s; } server { listen 80; #监听端口 server_name localhost; #默认请求设置 location / { proxy_pass http://tomcat_pool; #转向tomcat处理 } #所有的jsp页面均由tomcat处理 location ~ \.(jsp|jspx|dp)?$ { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_pass http://tomcat_pool; #转向tomcat处理 } #所有的静态文件直接读取不经过tomcat,nginx自己处理 location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ { expires 30d; } location ~ .*\.(js|css)?$ { expires 1h; } #定义错误提示页面 error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
注:nginx-back 的配置同上。
四,Keepalived 实现及配置
1、实现VIP本地映射,即VIP配置在keepalived中。
2、检测nginx的状态,即如果主机宕机,会自动切换到备机。
service keepalived stop #执行此命令,可以验证主备切换。
3、keepalived.conf配置如下:
global_defs { notification_email { 365788843@qq.com } notification_email_from sns-lvs@gmail.com smtp_server 127.12.19.121 smtp_connection_timeout 30 router_id nginx_backup # 设置nginx backup的id,在一个网络应该是唯一的 } vrrp_script chk_http_port { script "/usr/local/src/check_nginx_pid.sh" interval 2 #(检测脚本执行的间隔) weight 2 } vrrp_instance VI_1 { state BACKUP # 指定keepalived的角色,MASTER为主,BACKUP为备 interface eth0 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) virtual_router_id 66 # 虚拟路由编号,主从要一直 priority 99 # 优先级,数值越大,获取处理请求的优先级越高 advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数) authentication { auth_type PASS auth_pass 1111 } track_script { chk_http_port #(调用检测脚本) } virtual_ipaddress { 127.12.89.23 # 定义虚拟ip(VIP),可多设,每行一个 } }
注:nginx-backup的keepalived配置同上,不同点为 smtp_server为:127.12.19.131。
五,浮动IP
浮动IP相当于一个动态的IP,通过Keepalived分别绑定在不同的主备节点(nginx master,nginx backup),如果其中一台节点挂掉,浮动IP通过keepalived自动绑定到另外一个节点,而用户是没有感知的。
浮动IP可以是动态生成的,也可以是固定写死的。
六,nginx支持https
如上图的流程架构中体现了nginx支持https,但是在nginx.conf配置中还没有实现,这个后续另设章节专门讲解。
以上内容算是抛砖引玉,如有不妥,敬请指正。