一、 缓存数据库
关系型数据库 mysql oracle
非关系型数据库(NOsql)memcached reids MongoDB
固态硬盘是机械硬盘速度的10倍以上
Memcached是开源的、高性能的纯内存缓存服务软件。
缓存:将数据存储在内存中,只有当磁盘不能正常完成工作时,才会启用缓存。
优点:速度快
缺点:断电数据丢失(双电),用缓存存储数据的目的只是为了应付大并发的业务,至于数据存储及可靠性会丢失。
mysql:关系型数据库
最大特点:保证数据不丟失
缓存数据库:(非关系型数据库,性能极高,但是不保证数据完整)====》业务数据提供者。
代表者:memache redis
1.1 缓存数据库使用场景
mysql:磁盘上的数据库,数据写入读取相对较慢
memcached:内存中的数据库,数据读写快,数据易丢失。
数据存储,数据仓库,选择mysql数据库
高并发,业务大的应用选择memcache这种内存数据库
memcachedb 会将内存中的数据写入到磁盘中
redis 主要工作场景也是所在内存中,但是定期备份到内存数据到磁盘
工作中,mysql+redis(memcached)搭配使用
下面是我画的访问流程图
用户首次访问时响应流程
用户第二次访问相同资源响应流程
1.2 作为数据库的缓存
当数据库(mysql)承受不了大并发的请求时,可以将数据缓存到内存中(缓存数据库),然后就可以解决了
1.3 session会话共享
场景:只要登录了网站,以后访问这个网站任何页面都不要登录了。
cookies 是一个文件,类似身份信息
网站开发
判断用户信息,最开始技术方法:服务器在你的浏览器中写一个cookie,这个cookie包含了你的用户名
直接将个人数据存储在cookies不安全,所以要将个人数据存储在服务端的文件,这个文件就是session文件
浏览器Cookie:存储sessionid
服务器Session: session id 返回个人信息(session值)
使用场景:cookie+session
session存放在磁盘的文件中,2台web同时提供访问,会出现session文件找不到时的情况
解决方案:session共享
a. session文件通过NFS共享
b. session文件通过RSync、SCP共享
c. 将session的内容存放在数据库(mysql)中,所有机器都可以通过ip:port读取
好处:利用断电、重启丢失数据的特性定时清理数据:提高并发
二、安装memached
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。
2.1 memcache不支持分布式集群
补救方法:通过写程序实现分布式集群
常规的取余方法实现分布式:会导致血崩效应
2.2 安装memcached
1 [root@cache01 ~]# yum install -y memcached
2.3 查看配置memcached文件
1 vim /etc/init.d/memcached 2 PORT=11211 3 #memcache默认端口为11211 4 USER=memcached 5 #默认用户 6 MAXCONN=1024 7 #最大连接数 8 CACHESIZE=64 9 #缓存大小64M
2.4 启动memcache
1 [root@cache01 init.d]# systemctl start memcached.service 2 [root@cache01 init.d]# systemctl status memcached.service 3 ● memcached.service - Memcached 4 Loaded: loaded (/usr/lib/systemd/system/memcached.service; disabled; vendor preset: disabled) 5 Active: active (running) since Thu 2017-11-16 21:02:06 CST; 6s ago 6 Main PID: 2841 (memcached) 7 CGroup: /system.slice/memcached.service 8 └─2841 /usr/bin/memcached -u memcached -p 11211 -m 64 -c 1024 9 10 Nov 16 21:02:06 cache01 systemd[1]: Started Memcached. 11 Nov 16 21:02:06 cache01 systemd[1]: Starting Memcached...
2.5 插入数据
预测试插入数据
请保持插入数据长度与数据长度相同,否则会出现错误如下图
上面说数据大太了,无法写入 |
1 [root@cache01 ~]# printf "set key008 0 0 6\r\n123456\r\n" 2 set key008 0 0 6 3 123456
set 设置键值对
key008 设置键名
0 flag 默认不变
0 不过期
10 字符长度
123456 插入的字符
真正插入数据
1 [root@cache01 ~]# printf "set key008 0 0 6\r\n123456\r\n"|nc 127.0.0.1 11211 2 STORED
获取数据
1 [root@cache01 ~]# printf "get key008\r\n"|nc 127.0.0.1 11211 2 VALUE key008 0 6 3 123456 4 END
删除数据
1 [root@cache01 ~]# printf "delete key008\r\n"|nc 127.0.0.1 11211 2 DELETED
再次查看数据,发现已经没有了
1 [root@cache01 ~]# printf "get key008\r\n"|nc 127.0.0.1 11211 2 END
2.6 服务端memcached监控
1 [root@cache01 init.d]# printf "stats\r\n"|nc 127.0.0.1 11211 2 STAT pid 2841 3 STAT uptime 2012 4 STAT time 1510839336 5 ……… 6 STAT incr_hits 0 7 STAT decr_misses 0 8 STAT decr_hits 0 #命令中数 为0 这是两个最重要的选项 9 STAT cas_misses 0 #丢失数 为0 10 ……… 11 STAT cas_hits 0 12 STAT cas_badval 0 13 STAT touch_hits 0 14 STAT touch_misses 0 15 STAT auth_cmds 0 16 END
1. 监控port或进程
2. 可以模拟用户先set后get,比对get内容是不是set的。crond nagios zabbix
3. 监控命令中率
4. 监控响应时间及需要的状态
三、PHP的memcache客户端
1 tar xf memcache-2.2.7.tgz 2 cd memcache-2.2.7 3 /application/php/bin/phpize #扩展php需要的命令 4 ./configure --enable-memcache --with-php-config=/application/php/bin/php-config --with-zlib-dir 5 make && make install
1 下面生成memcache.so是客户端与服务端通信的
3.1 添加php扩展
1 [root@web01 memcache-2.2.7]# sed -i.ori '$a\extension=memcache.so' /application/php/lib/php.ini 2 [root@web01 memcache-2.2.7]# tail -1 /application/php/lib/php.ini 3 extension=memcache.so
1 [root@web01 memcache-2.2.7]# ps -ef | grep php-fpm 2 root 53723 1 0 17:14 ? 00:00:01 php-fpm: master process (/application/php-5.5.32/etc/php-fpm.conf) 3 nginx 53724 53723 0 17:14 ? 00:00:07 php-fpm: pool www 4 nginx 53725 53723 0 17:14 ? 00:00:06 php-fpm: pool www 5 nginx 54358 53723 0 18:30 ? 00:00:06 php-fpm: pool www 6 root 57977 1747 0 22:07 pts/2 00:00:00 grep --color=auto php-fpm 7 [root@web01 memcache-2.2.7]# kill 53723 8 [root@web01 memcache-2.2.7]# kill 53723 9 -bash: kill: (53723) - No such process 10 [root@web01 memcache-2.2.7]# /application/php/sbin/php-fpm -t 11 [16-Nov-2017 22:07:48] NOTICE: configuration file /application/php-5.5.32/etc/php-fpm.conf test is successful 12 13 [root@web01 memcache-2.2.7]# /application/php/sbin/php-fpm 14 [root@web01 memcache-2.2.7]# /application/php/bin/php -m | grep memcache 15 memcache
3.2 测试php
1 <?php 2 $memcache= new Memcache; 3 $memcache->connect('10.0.0.21',11211) or die ( "could not cnnect"); 4 $memcache->set('1','3306'); 5 $get_value=$memcache->get('1'); 6 echo $get_value; 7 ?>
下面为显示结果 显示内容,测试成功 |
3.3 memcache web界面管理工具
下载memcacheweb界面管理工具
http://www.junopen.com/memadmin/ 下载地址
下面为memadmin管理工具的使用
3.4 session共享
方法1:通过程序实现,web01只需要往memcahce写session,web02从memcahce读session(更具有通用性)
方法2:通过php的配置文件,让php默认将session存储在文件中,修改为存储在memcached中
需要运维和开发协同
运维:准备环境
开发:用环境
1 sed -i 's#session.save_handler = files#session.save_handler = memache#;$a session.save_path = "tcp://10.0.0.21:11211"' /application/php/lib/php.ini 2 kill php 3 [root@web01 memcache-2.2.7]# /application/php/sbin/php-fpm -t 4 [16-Nov-2017 22:07:48] NOTICE: configuration file /application/php-5.5.32/etc/php-fpm.conf test is successful 5 6 [root@web01 memcache-2.2.7]# /application/php/sbin/php-fpm
如果集群中有负载均衡,可以通过wireshark 查看ip,登陆后,查看验证结果。