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
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
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主机
#登陆 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 中的