赞
踩
高并发:
高并发通常是指通过设计保证系统能够同时并行处理很多请求。简单来说,高并发就是在同一个时间点,有很多的用户同时访问同一的API接口或者URL地址。
高并发带来的问题:
高并发的解决——负载均衡
将请求/数据【均匀】分摊到多个操作单元上执行,负载均衡的关键在于【均匀】
代理服务器:
使用代理服务器的原因
代理服务器的分类
节点\角色 | Nginx | Tomcat | JDK |
---|---|---|---|
basenode | √ | √ | |
node01 | √ | √ | |
node02 | √ | √ | |
node03 | √ | √ |
BaseNode修改配置文件
#user nobody; worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 0; upstream bdp { server 192.168.88.101:8080; server 192.168.88.102:8080; server 192.168.88.103:8080; } server { listen 80; server_name localhost; location / { proxy_pass http://bdp; } } }
Tomcat配置信息
<%@ page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>斗鱼直播</title> <link href="favicon.ico" rel="icon" type="image/x-icon" /> <link href="favicon.ico" rel="shortcut icon" type="image/x-icon" /> </head> <body> <h1>welcome to 斗鱼直播</h1> <h2>Server:<%=request.getLocalAddr() %></h2> <h2>Port:<%=request.getLocalPort() %></h2> <h2>Client:<%=request.getRemoteAddr() %></h2> <h2>Session:<%=session.getId() %></h2> <hr/> <img src="/static/img/qbl.jpg" height="200px" /> </body> </html>
启动Tomcat和Nginx
访问Nginx,会依次将Tomcat页面显示到也面
使用服务器权重,就可以进一步的影响Nginx的负载均衡算法,谁的权重大,分发到的请求就越多
upstream bdpweight {
server 192.168.88.101:8080 weight=2;
server 192.168.88.103:8080 weight=1;
}
把请求转发给连接数较少的服务器,避免服务器过载
upstream bdpleast {
least_conn;
server 192.168.88.101:8080;
server 192.168.88.103:8080;
}
负载均衡器按照客户端IP地址的分配方式,可以确保相同客户端的请求一直发送到相同的服务器,以保证session会话。
这样每个访客都固定访问一个后端服务器,可以解决session不能跨服务器的问题。
upstream bdphash {
ip_hash;
server 192.168.88.101:8080;
server 192.168.88.103:8080;
}
由外部服务器统一管理图片
常见的一些图床
<body>
<h1> welcome to cluster</h1>
<h1> 服务器地址: <%= request.getLocalAddr() %> </h1>
<h1> 客户端地址: <%= request.getRemoteAddr() %> </h1>
<h1> Session的ID : <%= session.getId() %> </h1>
<img width="200px" src="/static/qbl.jpg" />
</body>
location ^~ /static/ {
root html;
}
#tomcat8080
export CATALINA_HOME=/opt/bdp/apache-tomcat-8080
export CATALINA_BASE=/opt/bdp/apache-tomcat-8080
export TOMCAT_HOME=/opt/bdp/apache-tomcat-8080
#tomcat18080
export CATALINA_HOME18080=/opt/bdp/apache-tomcat-18080
export CATALINA_BASE18080=/opt/bdp/apache-tomcat-18080
export TOMCAT_HOME18080=/opt/bdp/apache-tomcat-18080
修改后执行 source /etc/profile
只需要修改tomcat18080即可,8080保持不变
vim apache-tomcat-18080/conf/server.xml
22--默认为8005--》修改为18005
<Server port="18005" shutdown="SHUTDOWN">
69--默认为8080--》修改为18080
<Connector port="18080" protocol="HTTP/1.1" connectionTimeout="20000"
redirectPort="8443" />
116-默认为8009--》修改为18009
<Connector port="18009" protocol="AJP/1.3" redirectPort="8443" />
只需要修改Tomcat18080即可,修改catalina.sh
vim apache-tomcat-18080/bin/catalina.sh
####################113行开始添加
export CATALINA_BASE=$CATALINA_BASE18080
export CATALINA_HOME=$CATALINA_HOME18080
export TOMCAT_HOME=$TOMCAT_HOME18080
./apache-tomcat-8080/bin/startup.sh
./apache-tomcat-18080/bin/startup.sh
这是Nginx比较常用的配置,通过修改Windows系统下的host文件来模拟DNS服务器
修改Window的 C:\Windows\System32\drivers\etchosts 文件,添加ip 域名映射关系,用来模拟DNS服务器
192.168.88.100 www.aaa8080.com
192.168.88.100 www.bbb18080.com
修改Nginx配置文件
http { upstream miaosha { server 192.168.88.101:8080; server 192.168.88.102:8080; server 192.168.88.103:8080; } upstream fxhh { server 192.168.88.101:18080; server 192.168.88.102:18080; server 192.168.88.103:18080; } server { listen 80; server_name www.miaosha.bdp.com; location / { proxy_pass http://miaosha; } } server { listen 80; server_name www.fxhh.bdp.com; location / { proxy_pass http://fxhh; } } }
修改Window的 C:\Windows\System32\drivers\etchosts 文件
192.168.88.100 www.bdp.com
修改Nginx配置文件
http { upstream port12345 { server 192.168.88.101:8080; server 192.168.88.102:8080; server 192.168.88.103:8080; } upstream port54321 { server 192.168.88.101:18080; server 192.168.88.102:18080; server 192.168.88.103:18080; } server { listen 12345; server_name www.bdp.com; location / { proxy_pass http://port12345; } } server { listen 54321; server_name www.bdp.com; location / { proxy_pass http://port54321; } } }
解决高并发的问题要从容量、读写性能和安全性这三个方面来考虑
解决高并发的容量问题
Raid介绍
条带化
定义:
条带化出现的原因
大多数磁盘系统都对访问次数(每秒的 I/O 操作,IOPS)和数据传输率(每秒传输的数据量,TPS)有限制
当达到这些限制时,后面需要访问磁盘的进程就需要等待,这时就是所谓的磁盘冲突。
解决方案:条带化技术
Raid的分类及作用
参考资料:RAID技术详解 - EFFOREFFOR - 博客园 (cnblogs.com)
最常用的是0、1、3、5四个级别
定义:
CAP原则又称CAP定理,指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼。
对CAP的理解
一致性与可用性的抉择(分区容忍性是必须要实现的)
CAP理论就是说在分布式存储系统中,最多只能实现上面的两点。而由于当前的网络硬件肯定会出现延迟丢包等问题,所以分区容忍性是我们必须需要实现的。所以我们只能在一致性和可用性之间进行权衡,没有NoSQL系统能同时保证这三点。
定义:
一致性分类
最终一致性的5种分类
因果一致性
读己之所写一致性
会话一致性:
单调读一致性:
单调写一致性:
提出原因:
分布式拍卖案例理解Paxo算法
在传统拍卖场景中,价高者先得,这些拍卖者都是在同一个房间,彼此能够直接看得到对方的报价,如果我们假设分布式拍卖是将这些拍卖者分离到不同的地方,这样我们可以用拍卖者之间的联系模拟分布式计算机之间的通讯。
假设拍卖者各自在自己家里拍卖,通过邮局信件发出自己的拍卖信息,拍卖者之间除非等到邮局投递人告诉他们彼此之间的报价,否则是无法知道对方报价的。如果邮局信件投递这个环节出了问题,投递速度慢了甚至无法投递了,那么整个拍卖程序就无法继续进行下去。
Paxos算法的解决的问题描述
假设有一组可以提出(propose)value(value在提案Proposal里)的进程集合。一个一致性算法需要保证提出的这么多value中,只有一个value被选定(chosen)。如果没有value被提出,就不应该有value被选定。如果一个value被选定,那么所有进程都应该能学习(learn)到这个被选定的value。对于一致性算法,安全性(safaty)要求如下:
只有被提出的value才能被选定。
只有一个value被选定,并且如果某个进程认为某个value被选定了,那么这个value必须是真的被选定的那个。
Paxos的目标:保证最终有一个value会被选定,当value被选定后,进程最终也能获取到被选定的value
Paxos算法的过程(算法描述)
Paxos算法类似于两阶段提提交,其算法执行过程分为两个阶段。具体如下:
无主集群模型
有主集群模型(总统议员)
参考资料:分布式系统Paxos算法 - 下里巴人or知己 - 博客园 (cnblogs.com)
Paxos算法原理和过程解析_小诚信驿站的博客-CSDN博客_paxos算法
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。