集群介绍
就是有很多台计算机在干同一件事,原来一台的电脑压力太大,干不完一件事情的时候,让多台来干同一件事,能分散压力,组合在一起叫做集群,那么集群能力组合绝对超过单一的 相加。
左边是普通用户 ,右边是运维人员 ,用户首先它通过Internet到了公司,这个时候它到公司的网关,通过防火墙跳转到主的负载均衡上,旁边是个备份的,根据算法扔到web服务器了,web服务器lnmp,动态的网页php会去找数据库,找数据库的主库,(主库也是单点),旁边是备份的,写找主服务器,读找从服务器前面的从库读的负载均衡器(负载均衡器也是单点,所以旁边也有一个备份),一般情况下我们搭建好主从复制之后,给开发一个读和写的账号,开发自己写代码来实现读写分离(这是开发写的,开发写一个脚本指名写的时候找那个ip地址,读的时候找那个ip地址),这样就能实现读写分离。
如果主库写数据的时候承受不住压力的话,那么数据库缓存(memcached缓存),比如读一个数据开发可以不先找负载均衡器先找memcached缓存,如果在缓存找不着,读的数据找不到,开发再找LVS(写一个if判断),从mysql读出来的数据,往写一份到memcached缓存里,然后在交给nginx,nginx在返回给用户,如果下一次用户访问的是同一个数据,那么php先默认会找缓存,不找后面了,然后就缓解数据库的从压力,一般memcached缓存的是从库的读压力。(memcached缓存现在快用不到了)。
右边得到备份的数据库写了一个定时全备及增量备份到备份服务器(backup)
NFS服务器实时同步。
运维人员通过vpn公网条过去,秘密通道的后面有个跳板机,然后跳到管理服务器,通过管理服务器能够操作里面的服务器
集群架构功能和结构可以分为以下几类:
- 负载均衡集群,简称LBC或者LB
- 高可用性集群,简称HAC (预防单点)
- 高性能计算集群,简称HPC
- 网格计算集群
负载均衡器的作用:
用户的请求去找负载均衡器,负载均衡器按照一定的机制,将用户的请求分发给多台web服务器,用户的访问让多台web分担压力了(负载均衡器是单点的,所以我们要做个备份,做备份用keeplived软件
互联网企业常用的开源集群软件有:Nginx,LVS,Haproxy,Keepalived,heartbeat。
(后面俩个是高可用的)
互联网企业常用的商业集群硬件有:F5,Netscaler,Radware,A10等(他们是收费的)
集群硬件Netscaler
集群硬件F5
集群硬件Radware
集群硬件A10
nginx反向代理
nginx是用反向代理来实现七层的负载均衡,所以一个是LVS和Nginx都有负载均衡的功能
nginx:通过http协议的http是OSI模型中七层的负载均衡,实现的功能多 ,nginx收到用户请求就断了,nginx代替用户发起请求,发起一个全新请求的url,跟用户没啥关系,url的源ip和源mac都是nginx自己,web的日志记录的ip都是nginx自己的,解决web日志记录自己的ip如何让显示用户的真实ip地址,nginx反向代理实现分业务,通过过滤location(static、upload、/)找不同的池子,池子与池子的内容是不一样的
lvs:是OSI模型中4层的负载均衡,uri的请求通过转发数据包(通过修改MAC头部是速度最快的),tcp三次握手是和web服务器握的,lvs但是效率好,实现功能小
注意:
一句话,LVS等的负载均衡是转发用户请求的数据包,而Nginx反向代理是接收用户的请求然后重新发起请求去请求其后面的节点。
部署nginx服务
[root@localhost conf]# yum -y install openssl openssl-devel pcre pcre-devel
[root@localhost conf]# tar xf nginx-1.10.2.tar.gz -C /usr/src/
[root@localhost conf]# cd /usr/src/nginx-1.10.2/
[root@localhost conf]# useradd -M -s /sbin/nologin nginx
[root@localhost conf]# ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module && make && make install
[root@localhost conf]# ln -s /usr/local/nginx/sbin/* /usr/local/sbin/
[root@localhost conf]# cd /usr/local/nginx/conf/
[root@localhost conf]# egrep -v "#|^$" nginx.conf.default > nginx.conf
-----------------------------------------------------
###########分别在web01 和 web02 做俩个一样的模板
[root@localhost conf]# cat nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name bbs.yunjisuan.com;
location / {
root html/bbs;
index index.html index.htm;
}
}
server {
listen 80;
server_name www.yunjisuan.com;Nginx负载均衡配置
location / {
root html/www;
index index.html index.htm;
}
}
}
nginx负载均衡配置
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream www_server_pools { ###这里是服务器池(服务器池的名字www_server_pools) 前面是服务器池的关键字
server 192.168.233.140 weight=1; #服务器的ip地址 ; weight:权重
负载均衡是按照权重比分配的 ,upstream有自动健康检测功能
server 192.168.233.141 weight=1; #服务器的IP地址;weight:权重
}
server {
listen 80;
server_name www.yunjisuan.com;
location / {
proxy_pass http://www_server_pools; #proxy_pass:反向代理推送到上面的server。
}
}
}
搭建的反向代理现在有俩个问题:
第一个是:访问不到我想看的页面,老是看第一个server
第二个是:日志记录的是反向代理的ip地址,记录的不是用户的真实ip地址,无法做分析
如果在工作中不解决这俩个问题,那么你搭建的反向代理是失败的,出问题无法做分析
引流:把nginx配置文件导入给更多的upstream
重点:
问题一:解决nginx反向代理web日志记录的是反向代理的ip不记录用户的真实ip地址
#上图解释
由于是负载均衡过来的,web服务器的访问日志只能查看来源ip是负载均衡服务器的ip,这样就获取不了真正的用户ip,在企业中要避免
#####在nginx反向代理服务器中添加内容
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream www_server_pools {
server 192.168.233.140 weight=1;
server 192.168.233.141 weight=1;
}
server {
listen 80;
server_name www.yunjisuan.com;
location / {
proxy_pass http://www_server_pools;
proxy_set_header x-Forwarded-For $remote_addr; #把客户端的ip付给请求头部中的-Forwarded-For,节点服务器获取用户的真实ip地址的必要功能配置
}
}
}
-----------------------------------------------------------------------------------
### 特别注意,虽然反向代理已经配好了,但是节点服务器需要的访问日志如果要记录用户的真实IP,还必须进行日志格式配置,这样才能把代理传过来的X-Forwarded-For头信息记录下来
#web01其中一台服务器的配置
[root@www conf]# vim nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
log_format main '"$http_x_forwarded_for"$remote_addr-$remote_user[$time_local]"$request"'
'$status $body_bytes_sent "$http_referer"' #日志格式 main是日志格式,写日志路径的时候写上
'"$http_user_agent"';
server {
listen 80;
server_name bbs.yunjisuan.com;
location / {
root html/bbs;
index index.html index.htm;
}
access_log logs/access_bbs.log main; #这里都的写
}
server {
listen 80;
server_name www.yunjisuan.com;
location / {
root html/www;
index index.html index.htm;
}
access_log logs/access_www.log main; ##这里都的写
}
}
问题二:nginx反向代理收到了用户的请求之后,知道了用户请求的域名,但是nginx没有记录这个域名到发起的请求中,而是直接发起一个全新的请求后去找后面的web节点服务器,但是web服务器不知道你要找那个server,于是默认第一个了
解决方式 只需要在请求头部加入proxy_set_header host $host;
vim /etc/hosts
下图是反向代理总要参数
Nginx反向代理总要参数 | 解释说明 |
---|---|
proxy_pass http://www_server_pools; | 通过proxy_pass功能把用户的请求转发到反向代理定义的upstream服务器池 |
proxy_set_header host $host; | 在代理向后端服务器发送的http请求头部中加入host字段信息,用于当后端服务器配置有多个虚拟主机的时候,可以识别代理的是哪个虚拟主机,这是节点服务器多虚拟机时的关键配置 |
proxy_set_header X-Forwarded-For $remote_addr; | 在代理向后端服务器发送的http请求头部中加入X-Forwarded-For字段信息,用于后端服务器程序、日志等接受记录用户的真实ip地址,而不是代理服务器的ip,这个是反向代理时,节点服务器获取用户的真实ip地址的重要配置 |
Nginx负载均衡核心组件
1 Nginx upstream模块
ngx_http_upstream_module模块允许Nginx定义一组或多组节点服务器组,使用时可以通过proxy_pass代理方式把网站的请求发送到事先定义好的对应Upstream组的名字上,具体写法为“proxy_pass http:// www_server_pools”,其中www_server_pools就是一个Upstream节点服务器组名字。ngx_http_upstream_module模块官方地址为:http://nginx.org/en/docs/http/ngx_http_upstream_module.html
upstream是按照什么算法来进行负载均衡的
权重轮询
least_conn(最小连接):那台连接的用户最少,优先给谁