Memcached的内存管理与删除机制(2)

答:由于单台memcache的服务能力有限(单台服务器的内存大小是有限的),可以使用多台memcache来提供缓存的功能,这种架构就叫做memcache的分布式缓存系统。

如何实现?

答:在客户端实现分布式(就是在php程序端实现对数据进行分布式保存,php程序决定数据保存众多分布式服务器中的其中一台),在数据保存之前,根据一定的算法,将数据保存到那台memcache服务器上,在获取数据的时候,按照前面相同的算法去对应的memcache服务器上获取数据

分布式算法

取摸算法

将key的值对服务器的台数取模,然后将对应的value值保存到对应的余数的那台memcache服务器上,一般这个hash函数 crc32( key ) % 3

crc32()这个函数可以使得一个字符串变成一个32位的整数

坏处:当某一台服务器宕机或者需要增加一台服务器的时候,这个时候缓存数据基本全部失效,因为除数变了。 不严格的公式, 命中率 = 取到数据/总数 1/N N代表服务器的台数

引发出来的问题:当memcache宕机之后,缓存数据失效,这个时候MySQL的压力会骤增,

这个时候,MySQL会宕机,然后在重启MySQL,MySQL会在短时期内再次宕机,然后,稍微延迟一点(缓存已经重新建立了一部分),又宕机。随着时间的慢慢推移,MySQL基本上趋于稳定,缓存系统成功建立。

因为缓存数据不存在,所有的请求全部要转向MySQL来提供,这种现象就叫做memcache的雪崩现象

概图:

Memcached的内存管理与删除机制

实操:

使用分布式缓存

Memcached的内存管理与删除机制

从分布式获取

Memcached的内存管理与删除机制

效果

Memcached的内存管理与删除机制

一致性hash实现分布式

Memcached的内存管理与删除机制

设置一个 0 - 2^32次方的圆环

将服务器的IP通过某种hash函数(crc32)映射为圆环上点(服务器的位置)

将数据的key也安装hash函数运算,从起点0 开始,按照圆环顺时针方向旋转,将对应的值保存到不比自己小的一个服务器位置上。

好处:当某一台服务器宕机之后,数据的影响是最小的,只影响当前这一台服务器上的数据。

缓存雪崩现象

由于某个memcache节点的缓存数据失效,导致其他memcache节点的缓存命中率下降,缓存中缺失的数据会去MySQL数据库中查询,短时期内,造成了MySQL服务器压力巨大,���成宕机,就叫做缓存雪崩现象

雪崩造成的原因?

由于算法不当,取摸算法,造成大量缓存失效,会引发雪崩

解决方案:一致性hash算法

缓存时间都是同一时间,缓存系统会在同一时间全部失效,这个也会造成雪崩

解决方案:缓存时间设置成一个范围内的随机时间(3-9小时)

memcache如何做高可用

使用repcached实现,全称 replication cached是由日本人发明的memcached的高可用性技术,简称复制缓冲区技术。

MemcacheDB是一个分布式、key-value形式的持久存储系统由sina人员开发。它不是一个缓存组件,而是一个基于对象存取的、可靠的、快速的持久存储引擎。协议跟memcache一致(不完整),所以很多memcached客户端都可以跟它连接。MemcacheDB采用Berkeley DB作为持久存储组件,故很多Berkeley DB的特性的他都支持。

扩展

如何在Linux下给一个php添加一个扩展,说出通用步骤(redis)

答:

下载对应扩展源码

上传放入/usr/local/src/

解压 并进入文件夹内

在文件夹内执行 绝对路径下的 phpize /usr/local/php/bin/phpize

执行configure ./configure --with-php-config=/usr/local/php/bin/php-config

make && make install

生成一个目录文件,文件下面有一个.so 结尾的文件

修改php.ini文件

增加 extension_dir = 目录 extension= .so文件

重启Apache

添加 phpinfo()

浏览器查看

memcache的安全性如何解决?

答:

由于memcache的本身设计就是极为简洁的,根本没有设置权限方面的限制。为什么不设置权限? 只提供缓存功能,为了精简

放在内网 192.168.1.110 内网IP外网无法访问

写一个防火墙验证规则,只允许自己规定IP的包可以转进来,其他的全部丢弃

3. 当使用文件保存session文件时候,如果文件过多,如何处理?

一般来说,超过65535个session文件的时候,这个时候session的获取就会变得异常缓慢,意味php代码执行很慢,如何解决?

答:

分层处理: 一个文件夹下建立A-Z开头的文件夹 然后A_Z在建立

使用memcache处理: 单台memcache处理能力有限,就使用分布式memcache来处理

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/bf71dcdc46d560d16c4aef09258f81b1.html