巨型网站优化-memcache技术

特大型网站优化-memcache技术

memory+cache 内存缓存

memcache简介

memcache是一套分布式的高速缓存系统,由LiveJournal的BradFitzpatrick开发,近年来被众多网站使用以提高网站的访问速度,越发对于部分特大型的、必要频仍造访数据库的网站访问速度提高功效相当显眼
。那是一套开放源代码软件,以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选择伯克利DB作为持久存储组件,故很多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地图