34.memcached原理及部署、作为缓存及session会话共享
1.memcached说明与应用场景
(1)memcached说明
http://www.cnblogs.com/Csir/p/6711305.html
缓存:将数据存储在内存中,只有当磁盘胜任不了的时候,才会启用缓存。
缺点:断电数据丢失(双电),用缓存存储数据的目的只是为了应付大并发的业务,至于数据存储及可靠性不要找他了。
数据库:mysql(关系型数据库,能够保证数据一致性,保证数据不丢失,但是因为功能太多,导致性能不高)====》数据仓库
缓存数据库:memcache、redis(非关系型数据库,性能极高,但是不保证数据完整)===》业务的数据提供者
//一台服务器中CPU最快,内存次之,磁盘最慢。网站中数据库最慢,网站并发高时尽量将数据放在内存,该内存利用软件实现,叫memcache,一般工作在内存中,在数据库前加缓存,一般为memcache或redis,为数据库做缓存用,增加访问速度。
(2)缓存数据库应用场景
a.作为数据库的缓存
当数据库(mysql)承受不了大并发的请求时,可以将数据缓存到内存中(缓存数据库),然后就可以解决。
b.会话共享
场景:只要登录了网站,以后访问这个网站任何页面都不要登录了。
//例如:电商网站中,某用户第一次访问到web01服务器有了购物车信息将会放在web01本地,过会该用户又访问网站被分配到web02服务器上,刚才购物车的信息可能会消失,难道让用户还重新登录吗?
我么可以将用户名密码等敏感信息放到缓存服务器上(会话服务器),这些登录信息叫会话。
为什么服务器知道你是谁?
2.memcache作为缓存服务器的工作原理
(1)memcached简介
memcached是一款开源的、高性能的纯内存缓存服务软件。Mem是内存的意思,cache是缓存的意思,d是daemon的意思。
memcache是项目的名字,诞生于2003年。
(2)
memcache服务分为客户端和服务端两部分,C/S架构。
客户端软件memcache-2.25.tar.gz
服务端软件memcached-1.4.13.tar.gz
(3)memcached原理及优点
在启动memcached时,根据指定的内存大小参数,会被分配一个内存空间。当我们读取数据库的各类业务数据后,数据会同时放入memcached缓存中,当下一次用户请求同样的数据,程序直接去memcached取数据返回给用户。
优点:
a.对于用户来讲,用户访问网站更快了,体验更好了。
b.对网站来说,数据库压力降低了。只有当内存没有数据时才会去请求数据库。第一次写入的数据也会请求数据库。一般公司没有预热,只有当用户读取过数据库才会放到memcached中。
c.提升了网站的并发访问,减少服务器数量。

//命令内置的一个功能。
(4)企业案例:当机房断电,如何开启web服务器、memcached缓存服务器、数据库服务器的?
开机顺序:先开启数据库,再开启缓存,然后预热缓存数据库,最后开启web服务器。如果不预热缓存数据库,当开启web后大量的访问流入MySQL,造成的结果是MySQL启动不了,一开就挂。
如何正确关闭网站集群服务器:从前端往后端依次关闭。
如何正确开启网站集群服务器:从后端依次往前端开启,缓存服务器要预热。
//接客。
从memcache中读写是开发的php语言实现的。
3.部署安装memcached软件及常用操作
安装memcached软件:
[root@backup ~]# yum install -y memcached
[root@backup ~]# rpm -ql memcached
/etc/rc.d/init.d/memcached
/etc/sysconfig/memcached
/usr/bin/memcached
/usr/bin/memcached-tool
[root@backup ~]# memcached -h
-p <num> 指定监听端口 TCP port number to listen on (default: 11211)
-l <addr> 绑定监听的网卡 interface to listen on (default: INADDR_ANY, all addresses)
-d run as a daemon # 后台运行
-u <username> assume identity of <username> (only when run as root) #指定用户
-m <num> 分配内存大小 max memory to use for items in megabytes (default: 64 MB)
-c <num> max simultaneous connections (default: 1024) #并发访问连接数
-P <file> 指定pid文件存放路径save PID in <file>, only used with -d option
启动memcached服务:
[root@backup ~]# /etc/init.d/memcached start
Starting memcached: [ OK ]
[root@backup ~]# ss -lntup|grep memcached
udp UNCONN 0 0 *:11211 *:* users:(("memcached",11839,28))
udp UNCONN 0 0 :::11211 :::* users:(("memcached",11839,29))
tcp LISTEN 0 1024 :::11211 :::* users:(("memcached",11839,27))
tcp LISTEN 0 1024 *:11211 *:* users:(("memcached",11839,26))
怎样使用和访问?一般开发是通过php程序实现,这里通过命令实现测试:
[root@backup ~]# yum install -y nc
使用:
向Memcached添加数据:键值对
key1-->values1
key2-->values2
写入数据:
[root@backup ~]# printf "set key001 0 0 10\r\noldboy1234\r\n"|nc 127.0.0.1 11211
STORED
读取(查看)数据:
[root@backup ~]# printf "get key001\r\n"|nc 127.0.0.1 11211
VALUE key001 0 10
oldboy1234
END
删除数据:
[root@backup ~]# printf "delete key001\r\n"|nc 127.0.0.1 11211
DELETED
[root@backup ~]# printf "get key001\r\n"|nc 127.0.0.1 11211
END
说明:运维通过memcached的写入数据、读取(查看)数据功能来测试、判断memcached是否可以正常使用。只是查看端口、进程不一定能判断其是否可用。
存储数据长度要一致:
[root@backup ~]# printf "set key001 0 0 6\r\noldboy1234\r\n"|nc 127.0.0.1 11211
CLIENT_ERROR bad data chunk
ERROR
[root@backup ~]# printf "get key001\r\n"|nc 127.0.0.1 11211
END
数据有限期:
[root@backup ~]# printf "set key001 0 9 10\r\noldboy1234\r\n"|nc 127.0.0.1 11211
STORED
[root@backup ~]# printf "get key001\r\n"|nc 127.0.0.1 11211
VALUE key001 0 10
oldboy1234
END
[root@backup ~]# printf "get key001\r\n"|nc 127.0.0.1 11211
END
4.php支持memcached客户端
memcache官网找插件memcache-2.2.7.tgz,给web01的php添加相应功能,不必重新安装php。
[root@web01 ~]# ll /application/
[root@web01 opt]# ll memcache-2.2.7.tgz
-rw-r--r-- 1 root root 36459 Mar 5 15:15 memcache-2.2.7.tgz
[root@web01 opt]# tar xf memcache-2.2.7.tgz
[root@web01 opt]# cd memcache-2.2.7
得按照php的规则来,运行phpize:
[root@web01 memcache-2.2.7]# ln -s /application/php-5.5.32/ /application/php
[root@web01 memcache-2.2.7]# /application/php/bin/phpize
Configuring for:
PHP Api Version: 20121113
Zend Module Api No: 20121212
Zend Extension Api No: 220121212
[root@web01 memcache-2.2.7]# ./configure --enable-memcache --with-php-config=/application/php/bin/php-config --with-zlib-dir
[root@web01 memcache-2.2.7]# make ;make install
[root@web01 memcache-2.2.7]# echo $?
0
[root@web01 memcache-2.2.7]# sed -i.ori '$a extension=memcache.so' /application/php/lib/php.ini
重启,配置生效:
[root@web01 memcache-2.2.7]# killall php_fpm
php_fpm: no process killed
[root@web01 memcache-2.2.7]# ps -ef|grep php
root 29791 27176 0 18:16 pts/1 00:00:00 grep php
[root@web01 memcache-2.2.7]# /application/php/sbin/php-fpm -t
[08-Mar-2018 18:17:11] NOTICE: configuration file /application/php-5.5.32/etc/php-fpm.conf test is successful
[root@web01 memcache-2.2.7]# /application/php/sbin/php-fpm
[root@web01 memcache-2.2.7]# ps -ef|grep php
root 29793 1 0 18:16 ? 00:00:00 php-fpm: master process (/application/php-5.5.32/etc/php-fpm.conf)
www 29794 29793 0 18:16 ? 00:00:00 php-fpm: pool www
www 29795 29793 0 18:16 ? 00:00:00 php-fpm: pool www
root 29797 27176 0 18:16 pts/1 00:00:00 grep php
[root@web01 memcache-2.2.7]# /application/php/bin/php -m|grep memcache //模块装好
memcache
测试是否php支持memcached客户端:
backup:172.16.1.41; web01:172.16.1.8
[root@web01 memcache-2.2.7]# printf "set key001 0 0 10\r\noldboy1234\r\n"|nc 172.16.1.41 11211
STORED
[root@web01 memcache-2.2.7]# printf "get key001\r\n" |nc 172.16.1.41 11211
VALUE key001 0 10
oldboy1234
END
生成测试页面:
cat >>/application/nginx/html/blog/mc.php<<'EOF'
<?php
$memcache = new Memcache;
$memcache->connect('172.16.1.41', 11211) or die ("Could not connect");
$memcache->set('key20171017', 'oldboy0326');
$get_value = $memcache->get('key20171017');
echo $get_value;
?>
EOF
[root@web01 memcache-2.2.7]# cat >>/application/nginx/html/blog/mc.php<<'EOF'
> <?php
> $memcache = new Memcache;
> $memcache->connect('172.16.1.41', 11211) or die ("Could not connect");
> $memcache->set('key20171017', 'oldboy0326');
> $get_value = $memcache->get('key20171017');
> echo $get_value;
> ?>
> EOF
[root@web01 memcache-2.2.7]# vim /application/nginx/conf/nginx.conf
添加:
15 server {
16 listen 80;
17 server_name blog.etiantian.org;
18 location / {
19 root html/blog;
20 index index.html index.htm;
21 }
22 #添加:
23 location ~ .*\.(php|php5)?$ {
24 fastcgi_pass 127.0.0.1:9000;
25 fastcgi_index index.php;
26 include fastcgi.conf;
27 }
28 access_log logs/access_blog.log main;
29 }
######status#########
#server {
#listen status.etiantian.org;
#stub_status on;
#access_log off;
#}
[root@web01 memcache-2.2.7]# cat /application/nginx/conf/extra/blog.conf
server {
listen 80;
server_name blog.etiantian.org;
root html/blog;
index index.php index.html index.htm;
location ~ .*\.(php|php5)?$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
}
[root@web01 memcache-2.2.7]# /application/nginx/sbin/nginx -t
[root@web01 memcache-2.2.7]# /application/nginx/sbin/nginx -s reload
[root@web01 memcache-2.2.7]# curl 10.0.0.8/mc.php
File not found. //应该是oldboy0326
[root@web01 memcache-2.2.7]# curl 10.0.0.8/blog/mc.php
oldboy0326[root@web01 memcache-2.2.7]#
表明php可以正常解析并使用memcached功能。

浙公网安备 33010602011771号