目录
1.MySQL简述
2.MySQL数据库存在的问题
3.redis非关系型数据库
4.Nginx的工作方式
5.Epull使用场景
6.nginx内部模块
七.小结
1.MySQL简述
MySQL的三种架构:MHA高可用,主从复制,读写分离。
MySQL关系型数据库,依靠的是表和表之间的关联性来组成的,主要存储形式是,以字段位列,以记录为行,汇聚为表格的形式来存储的。LAMP中MySQL的定位方式。
但是在生活中,电商企业并发量特别大,需要写入的数据和读取的数据量特别大,单个MySQL扛不住,需要通过多台MySQL建立集群,共同的classname和不同的serverid来进行关联的。以changemaster和在配置文件中allow的update,slave这种方式,changemaster指向主服务器来进行同步,这种方式组成了一个主从复制集群,单台master扛不住,需要多台MySQL组合才能提高整体的抗压性。
2.MySQL数据库存在的问题
公司的业务读和写的需求量不是一致的,某些场景下读写是不一样的,需要拆分下来完成,就是所说的读写分离。
(单点故障)master还是单台,master不仅负责主从复制还负责写,如果这个master挂掉了,整个集群就没有使用的意义,同步和主之间需要做一个冗余备份或者高可用架构。
如果MHA再扛不住的话,可以加redis或者考虑主从复制是一主两从,可以扩展机器(扩展master,此时不叫MHA架构,叫MM架构所使用的是keepalived做的双主双备(双主双备又称为热备))
keepalived原理:keepalived采用VRRP热备份协议来实现Linux服务器的多机热备的一个功能,所谓VRRP又称为虚拟路由冗余协议,这是一种针对路由器的备份解决方法。一个热备份组由多台路由器组成,通过共同的虚拟IP地址对外提供服务。需要的就是一个rsync同步来完成keepalived。
Haproxy的一种分流算法就是RR算法是最简单最常用的─种算法,即轮询调度(轮询调度就是第一个用户访问的时候会被指派到A节点上,第二个用户访问会指派到B节点上,第三个用户访问会被指派到C上,第四个用户访问会被指派到A的节点上)。
3.redis非关系型数据库
在这需要了解的是存储数据的格式:nosql的存储格式是key,value形式、文档形式、图片形式等等,而关系型数据库则只支持基础类型。
redis和MySQL不是固定搭配的组合!!
4.Nginx的工作方式
优化的时候可以优化压缩之后保存到TMP缓存文件的大小。
ps:为什么将压缩好的图片保存到tmp临时缓存文件?
原因1:保存到tmp临时缓存文件,追加到缓冲区再到内存里,再从内存加载到客户端此时速度很快。
原因2:NGINX有会话保持机制,下载的图片突然不见了,再访问的时候有几小时之前访问的记录,不需要再来一次访问的操作,减轻对NGINX服务器的压力。
nginx中有个location模块,可以根据匹配的根域或者匹配的正则,可以具体匹配到想要看的文件,不需要遍历消耗资源。
nginx抗高并发的原理是什么?
nginx中有一个叫做Epull的机制(事件处理驱动):为了提高抗并发处理能力,节省系统资源。
什么是事件(events):事件就是一个文件创建修改重命名移动删除各种操作,(有涉及到源信息变更的操作)在代码里面都可以定义为一种事件。
(优化的本质是:基础资源优化)
五大基础资源:
1.cpu---》进程,线程资源
2.I/O---》管理的是磁盘,内存输入/输出的速率/性能
3.内存---》提供了内存/缓存空间(虚拟内存) gzip压缩属于内存和I/O资源
4.磁盘---》持久化的block(快)存储资源
5.网络---》主机之间通讯,服务之间通讯,协议之间通讯
ps:API之间通讯:1webservice 2http 3TCPsocket
+6.内核:inrode号+数据本身构成文件本身 fd(文件描述符) socket(套接字) |(管道)
举例:find / -type f --name “nginx.conf” -mtime +30 | xargx rm -rf {}
find / -type f --name “nginx.conf” -mtime +30 -exec rm -rf \:
第一个|是将前面所查找的文件通过管道符传到第二个线程,第二个线程在第一个基础上执行删除操作。(线程与线程之间的通讯)类似于并行的方式处理的需要相互通讯。效率更高。
第二个是一个线程完成前面一段处理的是find后面一段处理的是rm删除。类似于穿行处理。资源消耗更少。
5.Epull使用场景
业务量在基层的情况下,nginx通过worker进程所产生的子线程去接待访问请求,因为自己系统中资源的限制,导致最大只有65535个可以使用,为了扩展瓶颈,为了能让nginx更合理的处理这个并发量。而产生的Epull(I/O多路复用机制)。
先通过内核给每一个socket分配一个fd(文件描述符类似于索引每个索引指向的是一个socket文件,还可以监听socket的活跃性),没活跃的socket只是一个就绪状态的,只有点击连接时候才是一个活跃状态的,不可能是实时的数据传输。再通过任务事件分发器,交给每一个模块处理。
早期时候使用的是数组封装,出现一个问题不知道哪一个是活跃状态,需要遍历才知道哪个活跃,伴随socket的数量越来越多,遍历会越来越慢。
6.nginx内部模块
(模块化的方式封装功能的)
全局模块所有都能生效
http模块:中有个include加载子模块
server1模块:进行配置的是虚拟主机(基于端口基于IP基于域名)
server2模块:进行配置的是虚拟主机(基于端口基于IP基于域名)
server的用法:本身在架构中定位是反向代理和负载均衡,一个作为门户网站,一个作为业务集群,风别由两个server进行管理。
server服务端配置文件中有一个状态码:
4**代表客户端
5**代表服务端
需要记住几个常见的状态码:
400 | Bad Request | 客户端请求的语法错误,服务器无法理解 |
401 | Unauthorized | 请求要求用户的身份认证 |
402 | Payment Required | 保留,将来使用 |
403 | Forbidden | 服务器理解请求客户端的请求,但是拒绝执行此请求 |
404 | Not Found | 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面 |
500 | Internal Server Error | 服务器内部错误,无法完成请求 |
501 | Not Implemented | 服务器不支持请求的功能,无法完成请求 |
location模块:
1)精确匹配=
2)前缀匹配^~
3)按文件中顺序的正则匹配:如果/bbs/abc 和/bbs/cde 优先匹配abc是按照顺序来
4)匹配不带任何修饰的匹配
5)交给/通用匹配
location中有几个小的模块
访问一个微服务时候会出现白屏,访问失败或者页面找不到,或者页面只能展示一半。
占用线程资源允许同一个IP只能访问60次,限制流量,点进去时候限制流量在60次之外,所以显示白屏
我们知道nginx中只能展示一个页面,对于一个it行业划分,前端开服,后端和前端需要进行对接。由于对接的过程中中间的所谓的文件打开数短时间不够,入口卡的很死,会出现容纳的200个socket不够访问使用的,会出现访问失败页面找不到的情况。
线程会在MySQL中寻找数据,传输过程中因为网络因素,导致的数据丢失,只能在页面上展示一半。
面试官会问这样的问题:
使用nginx维护的过程中有没有遇到过什么事故或者故障,让你映像深刻的?
答:故障处理能力,数据流向这两种。
nginx最大连接数的两大影响:worker connections=1024,内核中最大文件打开数(每有一个socket进来后处理一个任务,就是给与一个打开数)
top查看一下有一个配置load average 叫平均负载量0.37,0.45,0.23 。有两种说法一个是过去1.5.10分钟的负载量,另外一种说法是未来1.5.10分钟的负载量。都是cpu利用的趋势。一个系统在运行起来的时候,需要分配资源,才能支持跑起来。负载量最多可以用到90%就不能再利用了,就可能会出事了。cpu如果有个4个,nginx里面load average是cpu的两倍时候,就能发现是高负载状态,nginx在高并发的时候才能调成两倍,临时救急。预示着未来系统会可能达到一个非常高负载的情况,可以考虑加cpu,加内存,加磁盘等方式。
(1)nginx里面手工编译安装时候,会去使用哪些模块?
全局,http,server,location(if,rewrite,proxy_pass,upstream)
(2)动态的更新upstream池,不要去重载nginx情况下,有什么办法?
dyups扩展模块(ngx_http_dyups_module lvs_upstream_nginx_module)
HTTPS server 加密模块:使用的是证书进行性加密的(只有证书加密的才是合法的)。
jsp结尾的由web容器中的index.jsp这种类型处理的,意味着交给后端处理,要先到地址池配置后端节点信息,怎么让tomcat接收到请求时候,是clent客户端的i地址。有些场景下不适合使用nginx的IP地址,需要配置内置变量来完成。
先将客户端的IP定义成一个变量,赋值给一个变量比如$remote_addr,然后定义转发的报文包含源IP和目标IP,把变量remote覆盖为原本的源IP这个变量值,发送给tomcat时候变成了客户端到tomcat。
七.小结
多台MySQL没有所谓的冗余性需要加上主从,读和写的压力不均衡时候需要读写分离,还有MySQL单点故障时候需要做高可用,如果高可用压力还大时候,可以扩展master和slave的规模或者放置前置的缓冲数据库(例如redis)。