1.分布式系统中的缓存
a.CDN:缓存一些静态资源,距离用户最近的网络提供商提供。
b.反向代理:缓存静态资源,访问网站数据中心前访问。
c.本地缓存:缓存在本地的访问内容,常用的本地缓存开源框架有JCache,LocalCache。
d.分布式缓存:缓存在分布式缓存集群中,常用的分布式缓存开源框架有redis,memcache。
2.缓存和DB的数据不一致
a.更新DB后需要同步更新缓存,如果更新缓存失败,会导致数据不一致,可以加入retry机制,如果一直不成功,缓存服务器可能出问题了。
b.设置缓存过期时间,对于一些业务允许出现短期不一致的情况可以这样做。
3.缓存扩容:一致性Hash算法
缓存扩容需要满足两个需求:
a.命中率不能变低,比如原来有三台缓存服务器,需要增加一台,增加一台后,在以前的服务器上都找不到以前存的缓存了,这样肯定不行。
b.各个缓存的压力需要保持一致,缓存需要分散在每个缓存服务器上。
从网上找了个图,看下面的hash环,区间是0到2的32次方,node1至node4代表四台服务器,我们先计算数据Key的hash值,看这个hash值离哪个node节点要近一些就存放在那台机器上。如果添加一个node5只要放在hash环上就行了。比如我们放在node1和node2之间,则只会影响node1和node2之间的缓存命中率。但有一个问题,缓存压力没有分散在各个缓存服务器上。
改进的一致性hash算法:加入虚拟节点的概念,node1的虚拟节点有V0-V10,node2的虚拟节点有V10-V20以此类推,把虚拟节点分散到hash环上,先计算Key的hash值在离哪个虚拟节点近,然后通过虚拟节点找到真实的缓存服务器。新加的服务器同样把它对应的虚拟节点分散在Hash环上,这样可以同时保证命中率和各个服务器缓存压力一致。
4.分布式下的Session问题
a.Session复制:对于少量服务器可以这样做。
b.Session绑定:同一IP或者同一用户的请求发送到同一个服务器。
c.Session服务器:专门的服务器基础来管理Session,最好采用这种方案,除了管理Session,当然可以在Session中加入SSO(单点登录),用户服务等功能。
5.数据库读写分离,数据复制延迟。
首先我们要知道,主从数据库由于网络原因等其它原因,一定会出现主从数据库短时间的数据不一致的情况。对于某些业务需要强调强一致的,我们可以让他从主数据库读取(我发了一篇文章,我需要马上看到),对于对一致性要求不高的,我们可以从从数据库读取(我发了一篇文章,别人看)。
7.负载均衡算法实现
a.轮询
b.加权轮询
c.随机
d.最少连接
e.源地址散列