Memcache

  • 介绍
  • 安装
  • 环境准备
  • 数据库部署
  • web01部署站点
  • 访问web页面测试
  • web02 部署
  • windows系统配置hosts
  • 数据库主机部署Memcached
  • web01、web02 主机安装PHP memcache扩展插件


介绍

分布式的高速缓存数据库

	Memcache是一套分布式的高速缓存系统,由LiveJournal的Brad Fitzpatrick开发,但目前被许多网站使用以提升网站的访问速度,尤其对于一些大型的、需要频繁访问数据库的网站访问速度提升效果十分显著。这是一套开放源代码软件,以BSD license授权发布。

	MemCache的工作流程如下:先检查客户端的请求数据是否在memcached中,如有,直接把请求数据返回,不再对数据库进行任何操作;如果请求的数据不在memcached中,就去查数据库,把从数据库中获取的数据返回给客户端,同时把数据缓存一份到memcached中;每次更新数据库的同时更新memcached中的数据,保证一致性;当分配给memcached内存空间用完之后,会使用LRU(Least Recently Used,最近最少使用)策略加上到期失效策略,失效数据首先被替换,然后再替换掉最近未使用的数据。
    
	Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。

Session与Cookie介绍

Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;

Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。

session主要用于服务端存储用户会话信息,cookie用于浏览器存储用户会话信息。

应用场景:
	1. 如果需要持久化方面的要求,建议使用Redis         企业主流
	2. 如果你的存储数据只是k-v结构,建议使用Memcache   电商公司

安装

环境准备

主机				IP			软件			用户
两台Web服务器	7、8		Nginx+php	使用www用户管理
一台数据库		51			Mariadb
一台负载均衡		6			Nginx		使用www用户管理

数据库部署

#下载安装 Mariadb 数据库
[root@db01 ~]# yum -y install mariadb-server

#启动Mariadb数据库, 并加入开机自动
systemctl start mariadb
systemctl enable mariadb

#给 Mariadb 配置登陆密码,并用新密码进行登录数据库
[root@db01 ~]# mysqladmin password '123456'
[root@db01 ~]# mysql -uroot -p123456
#创建一个可以远程连接的用户
MariaDB [(none)]> grant all privileges on *.* to qls@'10.0.0.%' identified by '123456';

web01部署站点

1、#配置nginx官方源
[root@web01 ~]# cat >/tmp/nginx.repo<<EOF
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
EOF

2、#安装nginx
[root@web01 ~]# yum -y install nginx

3、#设置统一用户
groupadd -g666 www
useradd -g666 -u666 -Ms /sbin/nologin www
sed -i '/^user/cuser  www;' /etc/nginx/nginx.conf

4、#启动Nginx,并将Nginx加入开机自启
systemctl start nginx
systemctl enable nginx

5、#如果有PHP旧版本清除默认的版本,再安装PHP
[root@web01 ~]# yum -y remove php-mysql-5.4 php php-fpm php-common
[root@web01 ~]# yum -y install php71w php71w-cli php71w-common php71w-devel php71w-embedded php71w-gd php71w-mcrypt php71w-mbstring php71w-pdo php71w-xml php71w-fpm php71w-mysqlnd php71w-opcache php71w-pecl-memcached php71w-pecl-redis php71w-pecl-mongodb

6、#配置php-fpm用户与Nginx的运行用户保持一致
sed -i '/^user/cuser = www' /etc/php-fpm.d/www.conf
sed -i '/^group/cgroup = www' /etc/php-fpm.d/www.conf 

7、#启动php-fpm,并将其加入开机自启
systemctl start php-fpm
systemctl enable php-fpm

8、#编辑站点 nginx 配置文件
[root@web01 ~]# vim /etc/nginx/conf.d/phpmyadmin.conf
server {
    listen       80;
    server_name  qls.phpmyadmin.com;
    location / {
        root   /code/phpmyadmin;
        index  index.php index.html;
    }
    location ~ \.php$ {
        root           /code/phpmyadmin;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}
#检查 nginx 语法无错后重启 nginx 服务
[root@web01 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web01 ~]# systemctl restart nginx

9、#创建站点目录
[root@web01 ~]# mkdir /code
[root@web01 ~]# cd /code
10、#下载软件 phpmyadmin
[root@web01 ~]# wget https://files.phpmyadmin.net/phpMyAdmin/5.0.0-rc1/phpMyAdmin-5.0.0-rc1-all-languages.zip
#进行解压
[root@web01 ~]# unzip phpMyAdmin-5.0.0-rc1-all-languages.zip
#移动到指定的站点目录中
[root@web01 ~]# mv phpMyAdmin-5.0.0-rc1-all-languages /code/phpmyadmin
#配置 phpmyadmin 配置文件
[root@web01 ~]# cd /code/phpmyadmin/
[root@web01 /code/phpmyadmin]# cp config.sample.inc.php config.inc.php
[root@web01 /code/phpmyadmin]# vim config.inc.php
$cfg['Servers'][$i]['host'] = '10.0.0.51';
#为站点目录授权 www 用户
[root@web01 code]# chown -R www.www /code
#session目录权限不足,添加权限
[root@web01 ~]# chown -R www.www /var/lib/php/session/

windows系统配置hosts
	C:\Windows\System32\drivers\etc\hosts
	10.0.0.7 discuz.qls.com									#增加此行

访问web页面测试

qls.phpmyadmin.com
账号密码是数据库中设置的 qls 123456

memory error怎么解决linux_nginx

web02 部署

按web01的设置1-9步操作一遍

#将 web01 主机的站点目录打包进行传输给 web02 的 IP
[root@web01 ~]# tar zcf phpmyadmin.tar.gz /code/phpmyadmin
[root@web01 ~]# scp -rp phpmyadmin.tar.gz root@10.0.0.8:/root
[root@web01 ~]# scp -rp /etc/nginx/conf.d/phpmyadmin.com.conf root@10.0.0.8:/etc/nginx/conf.d/

#解压站点目录
[root@web02 ~]# tar xf phpmyadmin.tar.gz -C /
#检查 nginx 语法并重启 nginx
[root@web02 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web02 ~]# systemctl reload nginx

#为站点目录授权 www 用户
[root@web02 ~]# chown -R www.www /code
#session目录权限不足,添加权限
[root@web01 ~]# chown -R www.www /var/lib/php/session/

修改windows系统配置 hosts 文件进行测试
	C:\Windows\System32\drivers\etc\hosts
	10.0.0.8 discuz.qls.com									#修改此行

访问web页面测试
	qls.phpmyadmin.com
	账号密码是数据库中设置的 qls 123456

memory error怎么解决linux_php_02

windows系统配置hosts

C:\Windows\System32\drivers\etc\hosts
10.0.0.6 discuz.qls.com									#修改此行
这时候再访问域名时走的是负载均衡。你会发现,在你用户和密码都正确的情况下,你是登录不成功的。
所以,接下来要做的就是session会话共享。

数据库主机部署Memcached

#安装依赖
[root@db01 ~]# yum -y install libevent libevent-devel nc

#安装Memcached 
[root@db01 ~]# yum -y install memcached

#启动memcached 
[root@db01 ~]# systemctl start memcached
[root@db01 ~]# systemctl enable memcached

#查看是否启动成功
[root@db01 ~]# netstat -lntp |grep 11211
tcp  0 0 0.0.0.0:11211	0.0.0.0:*	LISTEN 9072/memcached
tcp6 0 0 :::11211		:::*		LISTEN 9072/memcached

#登陆 memcached 查看其中 session 和网页中对比会发现是的一样
[root@db01 ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
stats items
......
stats cachedump 16 0
ITEM a58d6136c0e488b438b9db24062bf170 [2622 b; 1585813410 s]
END
quit

web01、web02 主机安装PHP memcache扩展插件

下面的步骤web01、web02都各自执行一遍
#web01 主机安装PHP memcache扩展插件
[root@web01 ~]# yum -y install git
[root@web01 ~]# git clone https://github.com/websupport-sk/pecl-memcache.git
[root@web01 ~]# cd pecl-memcache/

#安装扩展库
[root@web01 ~/pecl-memcache]# phpize
Configuring for:
PHP Api Version: 20100412
Zend Module Api No: 20100525
Zend Extension Api No: 220100525

#安装依赖
[root@web01 ~/pecl-memcache]# yum install -y zlib-devel
#初始化和编译安装
[root@web01 ~/pecl-memcache]# ./configure
[root@web01 ~/pecl-memcache]# make
[root@web01 ~/pecl-memcache]# make install
Installing shared extensions: /usr/lib64/php/modules/

#配置memcache客户端使其生效【增加2行】
[root@web01 ~/pecl-memcache]# vim /etc/php.ini
extension_dir = "/usr/lib64/php/modules/"
extension = memcache.so

#重启php
[root@web01 ~/pecl-memcache]# systemctl restart php-fpm.service

#查看PHP的web界面配置信息
[root@web01 ~/pecl-memcache]# vim /code/phpmyadmin/info.php
<?php
    phpinfo();
?>
#给文件授权
[root@web01 ~/pecl-memcache]# chown www.www /code/phpmyadmin/info.php
#浏览器访问 10.0.0.7 查看

#编写测试memcache文件
[root@web01 ~]# cat>/code/phpmyadmin/test_memcache.php<<EOF
<?php
$memcache = new Memcache;
$memcache->connect('172.16.1.51', 11211) or die ("Could not connect server");
$memcache->set('key', 'Memcache connect OK');
$get = $memcache->get('key');
echo $get;
?>
EOF

[root@web01 ~]# php /code/phpmyadmin/test_memcache.php
 Memcache connect OK

#修改php配置(设置session共享) 
[root@web01 ~]# vim /etc/php.ini
session.save_handler = memcache
session.save_path = "tcp://172.16.1.51:11211"
#注释掉默认的 session 存放文件和路径
[root@web01 ~]# vim /etc/php-fpm.d/www.conf
;php_value[session.save_handler] = files
;php_value[session.save_path] = /var/lib/php/session

#重启php
[root@web01 ~]# systemctl restart php-fpm

#给 phpmyadmin 页面增加一个填写数据库IP地址的接口
[root@web01 ~]# cd /codephpmyadmin/
[root@web01 phpmyadmin]# vim libraries/config.default.php
$cfg['AllowArbitraryServer'] = true;

页面访问就正常了,每次刷新都会访问不同的web主机

memory error怎么解决linux_数据库_03


memory error怎么解决linux_php_04

#登陆 memcached 查看其中 session 和网页中对比会发现是的一样
[root@db01 ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
stats items							#查看命令
......
stats cachedump 16 0				#查看命令
ITEM df6842c69fc906a60b6b9df955b44ab7 [2668 b; 1585837417 s]
END
quit								#退出命令

这就表示我们在访问 phpmyadmin 页面时使用的 session 是保存在db01 主机的 memcache 中的

memory error怎么解决linux_数据库_05