分布式部署
- 将系统拆分到多台服务器上进行分布式部署:一台服务器做 Nginx 负载均衡,两台服务器部署应用程序,还有一台服务器作为数据库服务器。
- 部署后通过 Jmeter 工具进行压测,设置的是 1000 个线程循环 20 次。分布式部署前:平均耗时500ms左右,TPS 在1500左右,Mysql 服务器的 CPU 占用率在 80% 左右。分布式部署后:平均耗时也是500ms左右,TPS 在1600左右,Mysql 服务器的 CPU 占用率在 10% 左右,明显降低了。提高了系统性能。
为什么选用 Nginx 作为反向代理服务器?
Nginx 主要提供反向代理、负载均衡、动静分离功能。
选用 Nginx 是因为它性能好:
-
基于epoll多路复用机制实现: 如果基于 select 实现(Apache服务器使用的是 select 模型),假设有一个服务器监听100个客户端连接是否有变化,如果变化了就唤醒自己,然后循环遍历这100个连接,找出发生变化的位置,执行 read 操作。这种模式的缺点是采用的是轮询的方式进行遍历,效率低,而且监听数量有上限,最多为1024个。而 epoll 模型,在监听的同时设置了回调函数,事件触发时,直接执行回调函数,而不需要去遍历这100个连接,并且没有了监听数量的限制,所以效率较高。
-
采用的 master-worker 进程模型: master 进程管理多个 worker 进程,负责分配事件,多个worker进程负责处理客户端连接。可以通过 reload 命令进行平滑的重启,重启时不会断开与客户端的连接。
-
使用协程机制实现了同步调用的开发: 协程是一种依附于线程的内存模型,比线程的切换开销小,因为它不像线程那样有CPU时间片的切换开销;不需要加锁,是一个串行执行的过程;nginx中,当协程遇到阻塞时,比如 socket 的 read 方法,它会通过 epoll 多路复用来切换协程,而不需要去关心 read 方法什么时候会返回,因为 read 完成时,epoll 会执行回调函数,epoll 将就绪的 fd 放在一个 readyList 中顺序的进行操作,实现了同步调用的开发。
Nginx 有哪几种负载均衡调度算法?
- 普通轮询:每个请求按时间顺序逐一分配到不同的后端服务器,如果某台服务器宕机,Nginx能自动剔除该服务器。
- 加权轮询:给不同的后端服务器设置了一个权重值,权重越大,分配到请求的几率就越大,权重值根据后端服务器的硬件情况来设置。(默认)
- ip_hash:每个请求按 ip 的 hash 结果进行分配,这样每个访客固定访问一个后端服务器,在一定程度上解决了集群部署环境下 Session 共享的问题。
- url_hash:按访问的 URL 的 hash 结果进行分配,使每个请求的 URL 定向到同一个后端服务器,在 Nginx 作为静态服务器的情况下可以提高缓存效率。
- fair:按后端服务器的响应时间来分配请求,响应时间短的服务器分配到请求的概率高。