web集群时代
随着业务的不断增加,我们的单台服务器承受不住需求,那么我们就需要对此进行伸缩,有两种维度,一种是纵向的也就是增大该台服务器的硬件,再者就是加新服务器与之前的机器组成集群对外提供服务,我们都知道前者是有瓶颈的,so,集群技术是对web架构极其重要的!
集群的定义,我萌百度下就可以了:集群是一组相互独立的、通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理。一个客户与集群相互作用时,集群像是一个独立的服务器
集群的作用:提高可用性和可缩放性
集群的种类:高可用、负载均衡、高性能
可缩放性我们很容易理解,高可用性其实也不难,因为我提供同一服务的机器多了,那么其中一台机器挂了其他机器撑住就可以了。由此可以看出,作为集群的机器的可用性不需要十分的高(是服务器都会有保证的,不会自己没事就坏),所以我们在硬件采购时就可以节约一些成本,比如购买单电源的插头,网卡也不需要太多,双网卡就好等等,能节约成本老板一定会很开心的~
PS技术不好,23333333。我们可以看出应用服务器变多了,前面还加了一个负载均衡调度器,只画了一个,其实这是存在单点故障的,它的高可用性也是必需的!so,我们从它入手,常用的高可用集群软件有heartbeat、keepalived、rhcs,最简单常用大家都喜欢的是keepalived,它的安装非常简单,直接yum就可以,如果对版本有需求用编译也还是那三步,这个不介绍了,我们来看配置文件,默认是在/etc/keepalived/keepalived.conf,编译的自然就在你设置的目录下了,如果你想看参数的意义,请搜索keepalived权威指南,这书很短,10分钟就够了,但是是绝对权威的~
主机:
! Configuration File for keepalived
global_defs {
notification_email {
bfmq@example.com
}
notification_email_from keepalived@example.com
smtp_server 127.0.0.1
smtp_connect_timeout
router_id haproxy_ha
} vrrp_instance haproxy_ha {
state MASTER
interface eth0
virtual_router_id
priority
advert_int
authentication {
auth_type PASS
auth_pass
}
virtual_ipaddress {
192.168.56.21
}
}
备机:
! Configuration File for keepalived
global_defs {
notification_email {
bfmq@example.com
}
notification_email_from keepalived@example.com
smtp_server 127.0.0.1
smtp_connect_timeout
router_id haproxy_ha
} vrrp_instance haproxy_ha {
state BACKUP
interface eth0
virtual_router_id
priority
advert_int
authentication {
auth_type PASS
auth_pass
}
virtual_ipaddress {
192.168.56.21
}
}
我们启动后会发现主机成功备机失败,wtf,这是什么情况?那是因为我们需要更改一个内核保护参数,/proc/sys/net/ipv4/ip_nonlocal_bind,顾名思义,是否需要绑定非本地ip,因为我们的虚拟ip不是本地ip嘛,默认是0我们改成1,就可以了,此时主备机之间就建立了不可描述的关系~~~,停掉主机,备机会即可接管虚拟ip,速度极快我们根本感觉不到,如果你一直ping虚拟ip的话你可能会看到会顿上很小的毫秒数,我们的负载均衡器实现了高可用,这个虚拟ip是干嘛的?其实这个虚拟ip有两个作用,为负载均衡集群准备,再者它就是你的整个对外的ip了,也就是用户只需要访问此ip就可以了,后面的他不需要知道
再说负载均衡集群,注意是集群,实现负载均衡的方式有很多,网卡,dns,链路算,但是我们这里讨论服务器集群,组建服务器集群有软硬件两种方式,硬件使用F5跟Array,然而都不便宜,尤其是F5,价格真是顶小北方几年工资了,so,我们还是整软件吧~软件也分为两种
四层负载:转发,维护一条tcp连接
七层负载:代理,维护两条独立的tcp连接
四层负载的lvs是很有名气的,它有四种模式,十多种算法,几乎支持任何场景,我们列举四种模式需要注意的点就好了
NAT:他的瓶颈在于后端主机的路由必须为调度器,这样才能保证回包时再通回调度器,因此进出都需要调度器来进行转发,网卡流量扛不住。它比dr慢,但是这并不是致命缺点,其实这个所谓的“慢”几乎可以忽略不计的
TUN:几乎没人用了,还得打专线...
DR:后端服务器都要绑定VIP并拒收VIP的访问包,需要调度器与真机在一个vlan段内
FULL-NAT:你需要会跟ospf结合,并且编译阿里的内核
我所知道的10种算法
.轮叫调度(Round Robin)(简称rr)
调度器通过“轮叫”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。
.加权轮叫(Weighted Round Robin)(简称wrr)
调度器通过“加权轮叫”调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器能处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
.最少链接(Least Connections)(LC)
调度器通过“最少连接”调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用“最小连接”调度算法可以较好地均衡负载。
.加权最少链接(Weighted Least Connections)(WLC)
在集群系统中的服务器性能差异较大的情况下,调度器采用“加权最少链接”调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
.基于局部性的最少链接(Locality-Based Least Connections)(LBLC)
“基于局部性的最少链接”调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近 使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接” 的原则选出一个可用的服务器,将请求发送到该服务器。
.带复制的基于局部性最少链接(Locality-Based Least Connections with Replication)(LBLCR)
“带复制的基于局部性最少链接”调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个 目标 IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器 组,按“最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中选出一台 服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程 度。
.目标地址散列(Destination Hashing)(DH)
“目标地址散列”调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
.源地址散列(Source Hashing)(SH)
“源地址散列”调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
.最短的期望的延迟(Shortest Expected Delay Scheduling SED)(SED)
基于wlc算法。这个必须举例来说了
ABC三台机器分别权重123 ,连接数也分别是123。那么如果使用WLC算法的话一个新请求进入时它可能会分给ABC中的任意一个。使用sed算法后会进行这样一个运算
A(+)/
B(+)/
C(+)/
根据运算结果,把连接交给C
.最少队列调度(Never Queue Scheduling NQ)(NQ)
无需队列。如果有台 realserver的连接数=0就直接分配过去,不需要在进行sed运算
再来七层负载haproxy,它的配置文件在/etc/haproxy/haproxy.cfg
主机备机
global
maxconn
chroot /var/lib/haproxy
user haproxy
group haproxy
daemon
nbproc
pidfile /var/run/haproxy.pid
stats socket /var/lib/haproxy.sock mode level admin
log 127.0.0.1 local3 info defaults
option http-keep-alive
maxconn
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms listen stats
mode http
bind 0.0.0.0:
stats enable
stats uri /haproxy-status
stats auth haproxy:bfmq frontend frontend_www_example_com
bind 192.168.56.21:
mode http
option httplog
log global
default_backend backend_www_example_com backend backend_www_example_com
option forwardfor header X-REAL-IP
option httpchk HEAD / HTTP/1.0
balance roundrobin
server web-node1 192.168.56.11: check inter rise fall
server web-node2 192.168.56.12: check inter rise fall
很明显我们监听的就是刚才虚拟ip192.168.56.21并将关于它80端口的访问转发到了两台web机器上,这两台机器的ip是真实存在的,并且也是提供了相应的端口服务
haproxy的算法(百度的~):
① roundrobin,表示简单的轮询,这个不多说,这个是负载均衡基本都具备的;
② static-rr,表示根据权重,建议关注;
③ leastconn,表示最少连接者先处理,建议关注;
④ source,表示根据请求源IP,这个跟Nginx的IP_hash机制类似,我们用其作为解决session问题的一种方法,建议关注;
⑤ ri,表示根据请求的URI;
⑥ rl_param,表示根据请求的URl参数’balance url_param’ requires an URL parameter name;
⑦ hdr(name),表示根据HTTP请求头来锁定每一次HTTP请求;
⑧ rdp-cookie(name),表示根据据cookie(name)来锁定并哈希每一次TCP请求。
关于haproxy如何动态的启用禁用配置那就需要我们配置的/var/lib/haproxy.sock了,我们直接对sock进行通信需要用到socat这个包
echo "disable server backend_www_example_com / web-node1" | socat /usr/local/haproxy/haproxy.sock stdio
echo "enable server backend_www_example_com / web-node1" | socat /usr/local/haproxy/haproxy.sock stdio
当然他还有其它的功能echo "help"| socat stdio /usr/local/haproxy/haproxy.sock可以自行查看,十分实用!
好了,haproxy的基本安装就这样,我们该对他进行优化了,在此之前我们还是要先把单机上本身该做的事情都做了哦,这样其实就已经优化的不错了。但是我们记得不论如何优化端口范围是死的。
But,haproxy是专业的反向代理负载均衡调度器,它可以扩展多个IP以充分利用以扩大我们的端口范围
server web-node1 192.168.56.11: check source 192.168.56.100:-
server web-node2 192.168.56.11: check source 192.168.56.101:-
这样我们就的端口范围就直接扩展了一倍,当然,我们可以继续添加ip扩展
web集群时代的更多相关文章
- Web集群缓存一致性的思考
共享cache+数据库实现缓存一致性: 1.1 memcache + mongo+定时器 1.1.1 memcache 优点:web集群共享数据 缺点:数据生命周期的不可预估性 1.1.2 mongo ...
- 【转】web集群时session同步的3种方法
转载请注明作者:海底苍鹰地址:http://blog.51yip.com/server/922.html 在做了web集群后,你肯定会首先考虑session同步问题,因为通过负载均衡后,同一个IP访问 ...
- 使用ARM和VMSS创建自动扩展的web集群
在很多的商业场景中,用户的访问,峰值时间都是很难预测的,尤其是做一些市场推广活动和促销的时候,到底部署什么规模的web集群合适,这一直是个问题,部署过量会造成高成本和资源不必要的浪费,部署过少,如果到 ...
- Apache shiro集群实现 (八) web集群时session同步的3种方法
Apache shiro集群实现 (一) shiro入门介绍 Apache shiro集群实现 (二) shiro 的INI配置 Apache shiro集群实现 (三)shiro身份认证(Shiro ...
- web集群时session同步的3种方法[转]
在做了web集群后,你肯定会首先考虑session同步问题,因为通过负载均衡后,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,一个登录用户,一会是登录状态,一会又不是 ...
- WEB 集群与负载均衡(一)基本概念-上
Web集群是由多个同时运行同一个web应用的服务器组成,在外界看来就像一个服务器一样,这多台服务器共同来为客户提供更高性能的服务.集群更标准的定义是:一组相互独立的服务器在网络中表现为单一的系统,并以 ...
- 《跟老男孩学Linux运维:Web集群实战》读书笔记
Linux 介绍 Linux 安装 Linux 调优 Web 基础 Nginx 应用 LNMP 应用 PHP 缓存加速 Nginx 调优 MySQL 应用 NFS 网络文件共享 Nginx 反向代理与 ...
- 阿里云小规模web集群分享(电商)
计算基础资源使用阿里云ECS.OSS.RDS.mysql中间件.CDN 原则是尽量少改动代码来实现web集群 1.负载均衡器: a)负责处理所有请求 b)http动态请求分配到后端web服务器 c)维 ...
- 关于WEB集群中文件服务器的讨论
原文地址: http://blog.itpub.net/29806344/viewspace-1364778/ 在WEB集群中一般都要上传和删除图片.小规模的时候,图片放在本地,再通过同步方式来保持一 ...
随机推荐
- LinearLayout具体解释三:LayoutInflater创建View过程分析
上次讲到以下这么一段代码,这段代码的作用就是解析xml文件成为view并显示到屏幕上的. @Override //设置contentview,也就是activity或fragment载入视图,即vie ...
- Linux基础(3)- 正文处理命令及tar命令、vi编辑器、硬盘分区、格式化及文件系统的管理和软连接、硬连接
一.正文处理命令及tar命令 1) 将用户信息数据库文件和组信息数据库文件纵向合并为一个文件1.txt(覆盖) 2) 将用户信息数据库文件和用户密码数据库文件纵向合并为一个文件2.txt(追加) ...
- C#给指定doc文件写入宏
private void InsertMacro() { Word.Application oWord; Word.Document oDoc; VBIDE.VBComponent oModule; ...
- 利用反射快速给Model实体赋值 使用 Task 简化异步编程 Guid ToString 格式知多少?(GUID 格式) Parallel Programming-实现并行操作的流水线(生产者、消费者) c# 无损高质量压缩图片代码 8种主要排序算法的C#实现 (一) 8种主要排序算法的C#实现 (二)
试想这样一个业务需求:有一张合同表,由于合同涉及内容比较多所以此表比较庞大,大概有120多个字段.现在合同每一次变更时都需要对合同原始信息进行归档一次,版本号依次递增.那么我们就要新建一张合同历史表, ...
- 今天遇到一个git码云同步的问题
一开始是因为eclipse编码不同意导致乱码,所以我和师弟就想统一都用UTF-8的,师弟统一好了,让我pull一下,pull的时候有冲突,因为我和师弟都修改了其中一个文件,然后我这边就删除了那个文件再 ...
- Caffe学习系列(12):训练和测试自己的图片--linux平台
Caffe学习系列(12):训练和测试自己的图片 学习caffe的目的,不是简单的做几个练习,最终还是要用到自己的实际项目或科研中.因此,本文介绍一下,从自己的原始图片到lmdb数据,再到训练和测 ...
- live555 RTSP推送到Darwin出现404错误的解决
我们将Darwin部署到公网,接收live555 RTSP/RTP推送的时候,经常会出现在SETUP步骤Darwin返回404错误,经过查找原因,主要是Darwin对live555推送的sdp信息中的 ...
- java手写单例模式
1 懒汉模式 public class Singleton { private Singleton singleton = null; private Singleton() { } public S ...
- Maximum Memory and CPU Limitations for Linux Server
grep NR_CPUS /boot/config-`uname -r` [webdev@test apache-flume-1.8.0-bin]$ grep NR_CPUS /boot/config ...
- 区块链+AI将给区块链带来怎样的改变?
区块链和人工智能技术都是互联网时代最新.最热的技术,不仅可以改变我们生活,还能产生巨大的财富,为此国家大力支持发展,科技巨头们也纷纷布局.那区块链与人工智能结合,对区块链技术而言会产生什么样的化学反应 ...