Nginx

Nginx

  Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好。
  事实上,Nginx是一种实现负载均衡的手段,当用户访问网站时,Nginx拦截到这个访问请求,并通过轮询的方式均匀的分配到不同的服务器上。并且,在Nginx中有一种ip_hash策略,它可以获取到用户的真实IP,计算出hash值来选择服务器,这也是一种优秀的负载均衡方式。
  我们一般说的正向代理和反向代理,正向代理就是客户端请求率先发给代理服务器,代理服务器将请求转给服务器,正向代理相当于代理了客户端;反向代理则与之不同,反向代理代理了服务器端,在有多态服务器分布的情况下,为了能让客户端访问到的IP都为同一个网站,就需要使用反向代理,这样子在使用的时候尽管服务器的端口号会各不相同,但是我们可以通过反向代理将端口号都设置为80,也就是http的默认端口。反向代理的工作机制是使用Nginx学习的关键。
  使用Nginx首先按照官网的流程完成工具的配置和安装,之后更改conf文件在一个location参数中添加proxy_pass字段,并填写需要反向代理的服务器地址与端口号,如果有多态服务器就使用upstream服务器组配置服务器不同的端口,这样就完成了Nginx的基本配置。

负载均衡

  由于不同服务器的配置不同,为了让性能高的服务器分配到更多的请求,便引入了负载均衡的概念。
  前面提到过,Nginx的负载均衡方式可以有很多种,如加权轮询(默认)、IP哈希、url哈希等等,就比如加权轮询,是通过给服务器添加各自的权重值,Nginx通过权重来进行请求的分配,权重越高,接收的请求数量越多,反之越少,配置的话也是通过在conf文件中进行配置,在upstream块中添加weight参数分配权值。

缓存一致性

  在服务器中一般引入了缓存就需要考虑缓存和数据库的数据一致性的问题,是因为在数据更新时,不仅要更新数据库,而且要更新缓存,这样两个更新就存在了先后的问题,这时当两个请求并发更新同一条数据时,会出现缓存和数据库不一致的现象。解决方法可以是cache aside策略,中文名是旁路缓存策略,就是不更新缓存而是删除缓存中的数据,这样读取数据时,缓存中就没有数据了,就要再从数据库中读取数据,更新到缓存中。在这里分为两部分分别是写策略和读策略,执行写策略时需要更新数据库中的数据,删除缓存中的数据;执行读策略时,如果读取的数据命中了缓存就直接返回数据,如果读取数据没有命中缓存就从数据库中读取数据,将数据写入到缓存,返回给用户(因为缓存写入通常要快于数据库的写入,所以先更新数据库+再删除缓存可以很大程度上保证数据一致性)。但是因为这毕竟是两个操作,通常可能会在删除缓存中出现问题,导致删除失败,解决这个问题的方法有两种分别是重试机制和订阅MySQL binlog再操作缓存。
  重试机制:可以使用消息队列来将要删除的缓存加入到消息队列,让消费者来操作数据,如果删除缓存失败,就从消息队列中重新读取数据,然后再次删除缓存,这就是重试机制,如果重试超过一定的次数还是没有成功,就要向业务层发送报错信息;如果删除成功,就要把数据从消息队列中移除,避免重复操作。
  MySQL binlog:在更新完数据库后就会产生一条变更日志,记录在binlog里,可以通过订阅binlog日志,拿到具体要操作的数据,然后执行缓存删除,阿里巴巴开源的Canal中间件就是基于这个原理实现的。这个的实现过程主要如下:Canal 模拟 MySQL 主从复制的交互协议,把自己伪装成一个 MySQL 的从节点,向 MySQL 主节点发送 dump 请求,MySQL 收到请求后,就会开始推送 Binlog 给 Canal,Canal 解析 Binlog 字节流之后,转换为便于读取的结构化数据,供下游程序订阅使用。上述这两种方法都是有一个共同的特点就是采用了异步操作缓存。
  一般业务中选择删除一个缓存而不是更新一个缓存,这是因为相比更新一个数据删除更加轻量级,出问题的概率更小,这也是基于一种系统设计思想叫lazy loading,主要适用于那些加载代价很大的操作,删除缓存而不是更新缓存,这是一个懒加载思想的应用。

参考文献:Nginx入门教程数据库如何保持一致性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值