巨型网站优化-memcache技术

特大型网站优化-memcache技术

memory+cache 内存缓存

memcache简介

memcache是一套分布式的高速缓存系统,由LiveJournal的布拉德Fitzpatrick开发,近来被过多网站使用以进步网站的访问速度,越发对于一些特大型的、需求频仍造访数据库的网站访问速度升高功用极度尽人皆知
。那是一套开放源代码软件,以BSD
license授权发表。【摘取自百度百科】

官网:http://memcached.org/

 

分布式:多台Memcache服务器来保管数据的架构。

缓存系统:将用户查询的多寡缓存到内存之中,方便下次直接从内存中获取。裁减了磁盘IO的开支。

图片 1

怎么是nosql?(sql 关系型数据库)

答:MySQL
叫做关系型数据库(主要的性状是都是一个二维表结构(表中的行和列),表与表之间是由关系的)(oracle(Java)、db2、sqlserver

非关系型数据:就是不拔取sql语句作为查询的数据库(保存数据的系统),并且没有严刻意义上的二维表的定义。它的数据结构全体是一张高大的hash表(key-value)

hash表好处: 时间复杂度是
0(1):随着数据的充实,查询时间不会存在数据级(1s)的变通。

hash表坏处: hash碰撞 分裂 key
对应同一个值

 

key1 ===MD5(sql)

Asion

key2

12

key3

shenzhen

key4

iphone

 

  1. 使用原理

    在选用的时候,先从nosql数据库里面拿到,有的话一向重返,没有的话就先从MySQL获取,然后缓存到memcache里面,下次直接从memcache里面重临。

     

  2. memcache与MySQL的区别

  3. 尚无使用SQL语句

  4. memcache没有MySQL中的表的概念,都是应用key-value来保存的

  5. memcache的数额是保存到内存中的,断电即丢失(怎么着保存数据的持久性?)

    1. MemcacheDB可以持久化保存数据。2.
      repcached也可以达成多少的持久化

     

    注意:NoSQL是不是可以取到MySQL(关系型数据库)?

    答:
    nosql的存在永远不是为着替代MySQL(关系型数据),是关系型数据的一个补偿。因为关系型数据库有它独特的地方(事务,存储进度)。

     

    Nosql紧要使用的风貌:社交型网站(人人、校内、豆瓣)

     

    课下打探:什么是C10K问题?C100K

    答:c10k 代表的意思就是当网站的并发数达到 1w
    时候网站的完整架构会全体的立异,就叫做c10k,方今曾经被NoSQL数据库完美的解决。可是又有
    c100k 的标题?

    架构网站:

    http://www.infoq.com/

     

    memcache安装(使用端口11211)

  6. Windows下安装

    1.1
    直接将memcached文件放置到某一文本夹下(千万不要拔取粤语命名的文件夹
    | 空格)

    图片 2

    1.2 在cmd下举办如下命令(不可以关闭)可以动用Ctrl+c 终止

    memcache的端口 11211

    图片 3

    1.3 查看是不是启动(新开一个窗口),执行如下命令

    # netstat -an

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160408232546140-1810342695.png)

 

 
  1. Linux下安装

    1. putty–》远程连接Linux的一个客户端工具
    1.  注意:一般连接不上(防火墙)


        1.  关闭防火墙


        ![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160408232546843-313394531.png)

2.  selinux没有关闭

    ![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160408232547281-654431301.png)

    ![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160408232547843-956965795.png)    

    让selinux立即生效

    ![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160408232548609-87704201.png)

     

2.1 环境准备

在Linux环境下,需要gcc、g-c++、make(makefile)、cmake、autoconfig(configure)、libtool等工具

在Linux下**联网**的情况下,使用如下命令

\# yum install
**-y** gcc make cmake autoconfig libtool 

-y
不需要使用确认交互式 

 

2.2 编译安装memcached

memcached依赖于 **libevent**库,因此需要先安装,分别到各自的官网下载稳定版

libevetnt官网:<http://libevent.org/>

memcache官网:<http://memcached.org/>

 

先编译安装libevent,在编译安装memcached,同时在安装memcached需要指定libevent的安装路径

**具体步骤:**

**上传**

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160408232549250-88596570.png)
  1. 先下载libevent,解压,并设置(一般Linux下软件安装都是坐落
    /usr/local/src目录下,安装的软件一般放在/usr/local/NAME)

    # ./configure
    –prefix=/usr/local/libevent && make && make install

    图片 4

    图片 5

    图片 6

    b. 安装memcache,解压、编译、安装

    # ./configure
    –prefix=/usr/local/memcached –with-libevent=/usr/local/libevent &&
    make && make install

    图片 7

    图片 8

    图片 9

     

    2.3 memcached的启动

    #
    /usr/local/memcached/bin/memcached -m 64 -p 11211 -u nobody
    -vv

    图片 10

    注意:此时memcached成功启动,但把音讯输出到控制台。

    一经想让memcached作为劳务在后台启动,只须求充足-d选项(daemon 后台)

    #
    /usr/local/memcached/bin/memcached -m 64 -p 11211 -u nobody -d

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160408232557000-1748099917.png)

 

如何查看服务器是否正常启动?

\# ps axu | grep memcached

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160408232557687-1990148779.png)

 

如果需要查看参数信息,使用 memcached -h 查看帮助:

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160408232558890-1816688575.png)

操作memcache
------------

memcached的客户端与服务器端的通信很简单,基于文本的协议,类似http协议,可以直接使用Telnet来做交互

 

**使用Telnet操作(quit退出)**

\# telent
服务器的IP 11211
  1. Windows下

    图片 11

    连年之后 使用 ctrl + ] 打开Telnet的回显

  2. Linux下

    图片 12

     

    2. 着力命令:

    读书memcache的增删改查命令:

    add key flag expire length

    key: 名称

    flag: 1 memcache依照字符串的点子保存

    expire:过期时光,memcache时间

    length:数据长度(B)

    ※add 增加

    # add name 1 0
    2 # 在memcache服务器上添加一个key为的name值
    长度为2个字节,有效期长时间有效

    图片 13

     

    怎么样掌握expire

    安装缓存的有效期,有二种格式

  3. 安装秒数,从设置开始,n秒后失效

  4. 时光戳,到指定时间戳后失效

  5. 安装为0,不自行失效(更加注意,不是永恒有效。a.
    在memcache安装时候,指定了一个最长的实用时间,默许是30天(源代码) b.
    可能不到30天,就会被挤出去)

    近日起码使用条件

     

    ※delete 删除

    # delete key

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160408232602109-1345678204.png)

 

**※replace 替换**

\# replace key
flag expire length 

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160408232603828-1483165818.png)

 

**※get 获取**

\# get key


![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160408232604906-1948175421.png)

 

**※set 如果数据有 replace ,没有则 add**

\# set key flag
expire length 

**name存在:**

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160408232605406-707446910.png)

**age不存在:**

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160408232605922-812519692.png)

 

**※incr 增加**

\# incr age
NUMBER 

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160408232606312-408008006.png)

 

**※decr 减少**

\# decr age
NUMBER 

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160408232606797-327477345.png)

 

**※stats 统计memcache服务器信息**

\# stats


![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160408232608109-1222516508.png)

 

**※flush\_all 清空所有数据**

\# flush\_all


![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160408232608734-146636671.png)

使用php操作memcache
-------------------
  1. Windows下

  2. 到(http://downloads.php.net/pierre/)下载扩展dll文件

  3. 将该文件放到php的extension_dir 对应的目录下

  4. 修改php.ini文件,加入 extension=php_memcache.dll,引入该文件

  5. 重启Apache

     

  6. Linux下 (在Linux下何以为php开启一个恢宏,说一下通用方案)

    1. 到(http://pecl.php.net/package/memcache)去下载扩展源码

    beta
    :测试版:一般都有一对小bug,不过急需用户去行使发现,如果有标题,可以给合法反馈。然后在做修复

    alpha:内部测试版:内部在支付的时候,使用的本子,一般这些版本bug众多。不过那个版本往往有新的作用进入。(一般也是新公司才试行)alpha版本有一对补偿。

    stable:稳定版:基本无bug,可以稳定的运作。

 

**ftp使用的注意事项:**
  1. vsftpd 是不是正规的打开 service vsftpd status

  2. 一般都不得不利用普通用户连接ftp(无法root来屡次三番ftp)获取使用 sudo

  3. 自己家目录的深浅空间不够(上传文件成功,不过来得的轻重为0)

  4. 防火墙是或不是关闭(iptables -F 关闭)(iptables -L)

     

     

    # cls

    # cd

    # vim .bashrc

    图片 14

     

    Linux下载末行格局下

    # 😡 小写 退出 wq

    linux在编制情势下

    # Z 大写

     

     

    1. 相似下载到 /usr/local/src 目录下,解压,并进入该公文夹内

    图片 15

    1. 拔取当前php的phpize命令创立configure文件(必须在伸张目录内

    #
    /usr/local/php/bin/phpize 绝对路径phpize

    图片 16

    图片 17

    d. 利用方面生成的configure文件,收集系统新闻 不必要指虞升卿装路径

    # ./configure
    –with-php-config=/usr/local/php/bin/php-config
    告诉它怎样去找php配置文件

    图片 18

    e. 执行编译、安装

    # make && make
    install

    图片 19

    图片 20

    留神:可以查看上述命令执行到位未来的社团

    # ls
    /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/

    图片 21

    1. 修改php.ini配置文件,重启Apache

     

    在意:在Linux下,如何查看php.ini配置文件的职位?

    解决:phpinfo();

    图片 22

     

    瞩目:在Linux下,修改配置文件此前,一定要备份

    php.ini-backup-2016-1-12

     

    注意:.so是什么样文件?

    .so是Linux下的共享对象,类型Windows下的.dll文件

     

    图片 23

     

     

    瞩目:Linux下,关闭一个劳务 可以动用

    # pkill -9 httpd

    # ps aux | grep httpd

    #ps uax | grep httpd

     

    将上边生成的地址增添到php.ini配置文件,如下

    extension_dir=/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/

extension=memcacahe.so


![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160408232616234-35290154.png)

1.  测试

建立一个test.php文件,测试php是否有memcache的一个模块

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160408232616656-1669193633.png)

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160408232617422-1866712804.png)

php操作memcache,保存并获取值

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160408232618312-1534022616.png)

memcached的内存管理与删除机制
-----------------------------

 

注意:Memcache最大的value也只能是1M的空间。

 

注意:内存碎片化永远都存在,只是哪一种方式可以使得内存碎片最小。

 

1. 什么是内存碎片化?

在使用这种内存缓存系统的时候,由于不断的申请,释放,就会形成一些很小的内存片段,无法被利用,这种现象就叫做,内存的碎片化。这个小红块就是操作系统无法使用的空间。

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160408232619281-1672436711.png)

 
  1. 怎样解决?

    memcache利用slab allocator的法子来治本(每个slab class大小为1M

    小小的单元叫做 chunk(小块):存放数据的堆栈

    八个小单元构成一个chunks:三个小块组成(所有的小块的轻重全体一模一样)

    每个 slab class的大小为1M

    图片 24

     

  2. memcache怎么样选拔恰当的大大小小?

    图片 25

    注意:如若122Bytes的slab装满了,现在有一个100Bytes的数额来了,存到哪儿去?

    答:肯定不会存在144,依然存在122这一个chunk里面,利用LRU算法来促成数量存储。

     

  3. 固定chunk带来的内存浪费,22B

    图片 26

     

  4. factor调优

    memcached在启动的时候,会按照一定的大小来公司slab class,可以经过-f
    来指定

    默许是1.25,相邻chunk之间的比值就是充实因子。可以依照自己网站的作业调整缓存因子的大大小小。

    是因为每个事情差距,所急需的小小的chunk是不等同的。那一个参数使得大家的系列变得进一步适应自己的业务,因为数量可以自己设定大小。

     

  5. memcache的惰性删除

    memcached内部不会监视记录是不是过期,而是在get时翻看记录的时刻戳,检查笔录是或不是过期。那种行为被称作lazy(惰性)expiration。由此,好处是memcached不会在逾期监视上开支CPU时间。

    例如:有 set(name, asion, 0, 3600)
    过了3600秒就失效,失效后,并不会自行删除,唯有当get查询时,检测是或不是过期,倘诺过期则删除。

    例如 # add name 1 8 2 当8s后,是失效,依然不存在?通过stats分析

    剖析:是失效你,而不是不存在,唯有在下两回去赢得时候,memcache才会去检测它是或不是过期,过期了就删除

     

  6. memcache的LRU算法

    memcached会优先使用已超时的记录的半空中,但尽管如此,也会暴发大增新记录时空中不足的动静,此时就要动用名为
    Least Recently Used(LRU)机制来分配空间。

    顾名思义,那是去除”如今起码使用”的笔录的建制。因而,当memcached的内存空间不足时(无法从slab
    class 获取到新的半空中时),就从近日未被接纳的笔录中搜寻,并将其空

    间分配给新的笔录。从缓存的实用角度来看,该模型格外好好。

     

    当mecache里面的数据空间(默认是64M)已经占满了,再持续存储数据能如故不能存储吗?

    答:能积存,要删减过期的多少,如若都尚未过期,则删除最不活跃的多寡,腾出空间给前面添加数据。

    譬如说:以122Bytes的slab举例,当数码装满后,即使来了一个100Bytes数目,怎样处理?(固然永久有效,也会被踢)

    浅析:内存的管理 LRU算法
    、FIFO算法

     

  7. memcache的局地参数 Ctrl+C

    瞩目:在vim下即使输入了 ctrl+s 可以选择 ctrl+q 退出

    -p 监听的端口

    -l 连接的IP地址, 默许是本机

    -d start 启动memcached服务

    -d restart 重起memcached服务

    -d stop|shutdown 关闭正在运转的memcached服务

    -d install 安装memcached服务

    -d uninstall 卸载memcached服务

    -u 以的身份运行
    (仅在以root运行的时候使得)

    -m
    最大内存使用,单位MB。默许64MB

    瞩目:如若系统是32位的,则最大范围为2G,如果系统是64位,则无界定。

    -M 内存耗尽时回来错误,而不是剔除项

    -c 最大并且连接数,默认是1024

    -f
    块大小增加因子,默认是1.25

    -n 最小分配空间,key+value+flags默许是48

    -h 呈现帮忙

    -v 输出警告和错误信息

    -vv 打印客户端的呼吁和再次回到音信

    -i 打印memcached和libevent的版权音讯

     

    其实应用处境

    保存:1. 文件 2. mysql

    题材:假使一个文件夹下session文件过多,检索变慢,怎样处理?

    答:分层处理

    使用Memcache来保存,Memcache使用分布式来保存(拿多台Memcache做存储)

     

    使用memcache保存session

     

    1. 修改php.ini文件,配置新闻如下

        session.save_handler = memcache
    #代表选择memcache保存session

        session.save_path =”tcp://127.0.0.1:11211″ #
    指定memcache服务器的地方和端口

  8. 测试

    1. 开启session,保存session

    图片 27

  9. 从Memcache获取session

    图片 28

    高等特性

    ### 分布式memcache配置

    怎么是分布式?

    由于单台memcache的劳务力量简单,可以行使多台memcache来提供缓存的法力,那种架构就叫做memcache的分布式缓(集群)存系统

     

    怎么兑现?

    可以那样通晓,怎么样将数据分散答各台Memcache服务器上。

     

    在客户端完结分布式,在多郎中存在此之前,依照早晚的算法,将数据保存到那台memcache服务器上,在获取数据的时候,依照后面相同的算法去相应的memcache服务器上获取数据

     

    分布式算法

  10. 取摸算法

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

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

     

    弊病:当某一台服务器宕机或者须要充实一台服务器的时候,那些时候缓存数据基本所有失效,因为除数变了。
    不严苛的公式, 命中率 = 取到数量/总数 1/N N代表服务器的台数

     

    掀起出来的标题:当memcache宕机之后,缓存数据失效,那个时候MySQL的压力会陡增,

    那一个时候,MySQL会宕机,然后在重启MySQL,MySQL会在长时期内再一次宕机,然后,稍微延迟一点(缓存已经重新确立了一局地),又宕机。随着岁月的日渐推移,MySQL基本上趋于稳定,缓存系统成功建立。因为缓存数据不设有,所有的央浼全体要转化MySQL来提供,那种情况就称为memcache的雪崩现象。

     

    概图:

    图片 29

     

     

  11. 一致性hash完结分布式

    图片 30

     

  12. 假想有一个圆环,分布着从 0 到 2^32 这么四个正整数

     

  13. 接下来在将服务器的节点数通过hash函数(crc32())运算后,依照顺时针的可行性映射到地点的圆环上

     

  14. 将须求仓储的数额的key也遵守地方的hash函数运算后,依照顺时针的趋向保留到一个不比自己小的节点上

     

    注意:假如是memcache宕机,就自然会有多少的散失。但是要想办法让多少丢失的最少,使用一致性hash,固然有一台服务器宕机,也只是熏陶一台服务器上的数据。

     

    编造节点:分担职责

    ### 缓存雪崩现象

    雪崩造成的原因?

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

    解决方案:一致性hash算法

     

  16. 缓存时间都是同一时间,缓存系统会在同一时间全体失效,这一个也会导致雪崩

    化解方案:缓存时间设置成一个限制内的任意时间(3-9钟头)

     

    出于某个memcache节点的缓存数据失效,导致其余memcache节点的缓存命中率下落,缓存中缺失的数量会去MySQL数据库中询问,长时间间内,造成了MySQL服务器压力巨大,造成宕机,就叫做缓存雪崩现象。

     

    当重启MySQL之后,长期内重新宕机,但缓存数据已经建立了一片段,在MySQL反复很多次开行未来,缓存全体重建已毕,MySQL不再宕机趋于稳定。

     

    解决方案:把缓存的大运设置成一个限制内的随机值(3-9钟头),那样就在分歧的年月段失效,把重建的干活分派到区其余岁月上。

    ### memcache怎么做高可用

  17. 使用repcached贯彻,全称
    replication
    cached是由东瀛人发明的memcached的高可用性技术,简称复制缓冲区技术。

     

  18. MemcacheDB是一个分布式、key-value情势的从始至终存储系统由sina人士付出。它不是一个缓存组件,而是一个基于对象存取的、可依赖的、飞速的坚忍不拔存储引擎。协议跟memcache一致(不完全),所以重重memcached客户端都足以跟它连接。MemcacheDB选取BerkeleyDB作为持久存储组件,故很多Berkeley DB的特征的他都匡助。扩充

  19. 如何在Linux下给一个php添加一个扩大,说出通用步骤?

    答:

    1. 下载对应扩展源码

    2. 上传放入/usr/local/src/

    3. 解压 并进入文件夹内

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

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

    6. make && make install

    7. 变更一个目录文件,文件上面有一个.so 结尾的文书

    8. 修改php.ini文件

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

    10. 重启Apache

    11. 添加 phpinfo()

    12. 浏览器查看

     

  20. memcache的安全性怎样化解?

    答:

    是因为memcache的自己设计就是极为简洁的,根本未曾设置权限方面的界定。为何不安装权限?
    只提供缓存作用,为了精简

  21. 位居内网 192.168.1.110 内网IP外网无法访问

  22. 写一个防火墙验证规则,只允许自己确定IP的包可以转进去,其余的全方位屏弃

    192.168.1.221 —224

    1. 当使用文件保留session文件时候,如果文件过多,怎么样处理?

    诚如的话,超越65535个session文件的时候,那么些时候session的获取就会变得极度缓慢,意味php代码执行很慢,怎么样化解?

    答:

    支行处理: 一个文件夹下建立A-Z初始的文书夹 然后A_Z在建立

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

  23. 哪些精晓负载均衡集群也是高可用集群,但有不是?

    答:负载均衡集群提供了高可用的力量,借使某一台宕机之后,仍是可以提供正常的劳动,只是服务提供的有点吃力而已。

    因为负载均衡集群不提供keepalive的体制。监控机制

 

案例:
======

在项目中如何使用Memcache?

Memcache存在的意义就是缓存数据,减轻MySQL的压力。

 
  1. 挥洒一个列表页

    图片 31

  2. 详情页

    图片 32

    图片 33

     

    扩展

  3. Linux下安装一个php的恢弘的通用方法

    答:

  4. 下载对应的扩充的源码 http://pecl.php.net/package/memcache

  5. 将对于的扩张上传到Linux服务器上,放在(/usr/local/src/下)

  6. 执行 tar -zxvf NAME.tar.gz

  7. cd NAME

  8. 施行相对路径下的phpize命名
    (/usr/local/php/bin/phpize)必须在伸张包的目录内

  9. 推行 ./configure –with-php-config=/usr/local/php/bin/php-config
    (–with-php-config=相对路径下的php-config的路子,并且不须求指虞诩装的不二法门)

  10. make && make install

  11. 会生成一个目录,在个目录里面有对于的NAME.so文件

  12. 去修改php.ini的布局文件,增添两行新闻

    extension_dir=’上边生成的目录’

    extension=’NAME.so’

  13. 重启Apache,然后使用phpinfo()函数测试一下,在浏览器输入地方查看,搜索如果有Memcache,代表增添成功的打开。

     

网站地图xml地图