目录

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数据库存在的问题

go mysql 高并发 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的工作方式

go mysql 高并发 mysql 高并发写_架构_02

优化的时候可以优化压缩之后保存到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 \:

go mysql 高并发 mysql 高并发写_go mysql 高并发_03

第一个|是将前面所查找的文件通过管道符传到第二个线程,第二个线程在第一个基础上执行删除操作。(线程与线程之间的通讯)类似于并行的方式处理的需要相互通讯。效率更高。

第二个是一个线程完成前面一段处理的是find后面一段处理的是rm删除。类似于穿行处理。资源消耗更少。

5.Epull使用场景

业务量在基层的情况下,nginx通过worker进程所产生的子线程去接待访问请求,因为自己系统中资源的限制,导致最大只有65535个可以使用,为了扩展瓶颈,为了能让nginx更合理的处理这个并发量。而产生的Epull(I/O多路复用机制)。

go mysql 高并发 mysql 高并发写_mysql_04

         先通过内核给每一个socket分配一个fd(文件描述符类似于索引每个索引指向的是一个socket文件,还可以监听socket的活跃性),没活跃的socket只是一个就绪状态的,只有点击连接时候才是一个活跃状态的,不可能是实时的数据传输。再通过任务事件分发器,交给每一个模块处理。

        早期时候使用的是数组封装,出现一个问题不知道哪一个是活跃状态,需要遍历才知道哪个活跃,伴随socket的数量越来越多,遍历会越来越慢。

6.nginx内部模块

(模块化的方式封装功能的)

go mysql 高并发 mysql 高并发写_go mysql 高并发_05

 全局模块所有都能生效

http模块:中有个include加载子模块

server1模块:进行配置的是虚拟主机(基于端口基于IP基于域名)

server2模块:进行配置的是虚拟主机(基于端口基于IP基于域名)

server的用法:本身在架构中定位是反向代理和负载均衡,一个作为门户网站,一个作为业务集群,风别由两个server进行管理。

go mysql 高并发 mysql 高并发写_nginx_06

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 加密模块:使用的是证书进行性加密的(只有证书加密的才是合法的)。

go mysql 高并发 mysql 高并发写_nginx_07

 jsp结尾的由web容器中的index.jsp这种类型处理的,意味着交给后端处理,要先到地址池配置后端节点信息,怎么让tomcat接收到请求时候,是clent客户端的i地址。有些场景下不适合使用nginx的IP地址,需要配置内置变量来完成。

先将客户端的IP定义成一个变量,赋值给一个变量比如$remote_addr,然后定义转发的报文包含源IP和目标IP,把变量remote覆盖为原本的源IP这个变量值,发送给tomcat时候变成了客户端到tomcat。

七.小结

        多台MySQL没有所谓的冗余性需要加上主从,读和写的压力不均衡时候需要读写分离,还有MySQL单点故障时候需要做高可用,如果高可用压力还大时候,可以扩展master和slave的规模或者放置前置的缓冲数据库(例如redis)。