文章目录
一 、redis结合lnmp架构做mysql的缓存服务器实现读写分离
读写分离:用户读的时候访问redis,用户写的时候访问mysql。
原理:server1做web服务器,通过nginx访问redis(使用server2做redis),如果有则直接访问,如果没有,则使用server3做mysql
实验环境
主机名(ip) | 角色 |
---|---|
server1 (172.25.1.1) | 前端服务器nginx |
server2 (172.25.1.2) | redis数据缓存 |
server3(172.25.1.3) | mysql数据库 |
(一)在server1中配置nginx和php
1、首先将server1中的其他服务都关闭并删除,关闭redis服务及所有的redis-server
- 注意:如果做过ssl服务,可能在安装php时会有影响<php安装时会安装最新的openssl,而之前mysql使用的是旧的openssl,会导致php安装失败>,可以用
yum remove
移除。
[root@server1 ~]# /etc/init.d/redis_6379 stop
[root@server1 ~]# killall -9 redis-server
##没有命令killall,
[root@server1 ~]# yum whatprovides /usr/bin/killall ##查找
[root@server1 ~]# yum install psmisc-22.20-11.el7.x86_64 -y ##安装
- 补充:如果要删除相关服务的模块,可以使用以下命令:
[root@server1 ~]# rpm -qa | grep mysql
[root@server1 ~]# rpm -e `rpm -qa | grep mysql`
#强行删除
[root@server1 ~]# rpm -e `rpm -qa | grep mysql` --nodeps
2、配置nginx
[root@server1 ~]# ls
[root@server1 ~]# tar zxf nginx-1.14.0.tar.gz
[root@server1 ~]# cd nginx-1.14.0
[root@server1 nginx-1.14.0]# vim src/core/nginx.h
#在此文件下将debug注释
[root@server1 nginx-1.14.0]# vim auto/cc/gcc
#下载nginx编译和安装时所需要的依赖性
[root@server1 nginx-1.14.0]# yum install -y gcc pcre-devel zlib-devel -y
#由于此实验只是简单的做一个web服务器,所以不需要添加别的模块,编译时只写安装到的路径即可
[root@server1 nginx-1.14.0]# ./configure --prefix=/usr/local/nginx
[root@server1 nginx-1.14.0]# make && make install
[root@server1 nginx-1.14.0]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
3、编辑配置文件/usr/local/nginx/conf/nginx.conf
[root@server1 nginx-1.14.0]# vim /usr/local/nginx/conf/nginx.conf
user nginx nginx; #指定登陆用户 登陆组
[root@server1 nginx-1.14.0]# useradd nginx
[root@server1 nginx-1.14.0]# vim /usr/local/nginx/conf/nginx.conf
location / {
root html;
index index.php index.html index.htm;
}
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
#fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi.conf;
}
4、检测配置文件语法nginx -t
,此时会出现报错:
[root@server1 nginx-1.14.0]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: [emerg] mkdir() “/var/temp/nginx/client” failed (2: No such file or directory)
nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed
解决: 创建目录
[root@server1 nginx-1.14.0]# mkdir -p /var/temp/nginx/client
5、启动nginx
[root@server1 nginx-1.14.0]# nginx
[root@server1 nginx-1.14.0]# ps ax | grep nginx
6、安装php,在网上下载安装包,并启动
[root@server1 ~]# cd rhel7/
[root@server1 rhel7]# ls
gearmand-1.1.12-18.el7.x86_64.rpm
libevent-devel-2.0.21-4.el7.x86_64.rpm
libgearman-1.1.12-18.el7.x86_64.rpm
libgearman-devel-1.1.12-18.el7.x86_64.rpm
libzip-0.10.1-8.el7.x86_64.rpm
openssl-1.0.2k-16.el7.x86_64.rpm
openssl-libs-1.0.2k-16.el7.x86_64.rpm
php-cli-5.4.16-46.el7.x86_64.rpm
php-common-5.4.16-46.el7.x86_64.rpm
php-fpm-5.4.16-46.el7.x86_64.rpm
php-mysql-5.4.16-46.el7.x86_64.rpm
php-pdo-5.4.16-46.el7.x86_64.rpm
php-pecl-gearman-1.1.2-1.el7.x86_64.rpm
php-pecl-igbinary-1.2.1-1.el7.x86_64.rpm
php-pecl-redis-2.2.8-1.el7.x86_64.rpm
php-process-5.4.16-46.el7.x86_64.rpm
php-xml-5.4.16-46.el7.x86_64.rpm
[root@server1 rhel7]# yum install -y *
[root@server1 rhel7]# systemctl start php-fpm
出现了错误:
Error: Package: 1:openssl-devel-1.0.1e-60.el7.x86_64 (@rhel7.3)
Requires: openssl-libs(x86-64) = 1:1.0.1e-60.el7
Removing: 1:openssl-libs-1.0.1e-60.el7.x86_64 (@anaconda/7.3)
openssl-libs(x86-64) = 1:1.0.1e-60.el7
Updated By: 1:openssl-libs-1.0.2k-16.el7.x86_64 (/openssl-libs-1.0.2k-16.el7.x86_64)
openssl-libs(x86-64) = 1:1.0.2k-16.el7
You could try using --skip-broken to work around the problem
You could try running: rpm -Va --nofiles --nodigest
这就是因为安装了旧版本的openssl-devel,解决办法:yum remove openssl-devel-1.0.1e-60.el7.x86_64 -y
即可。
再次安装,便成功。
开启php服务并查看其9000端口是否成功开启
此时,server1的nginx和php就安装完成了。
(二)在server2中配置redis
之前我们已经配置过redis,这里只需要修改即可
1、编辑配置文件(如果之前做过redis主从复制,则需要将之前在配置文件中的内容删除)
[root@server2 ~]# cd /etc/redis/
[root@server2 redis]# ls
6379.conf sentinel.conf
[root@server2 redis]# vim 6379.conf
70 bind 0.0.0.0 #确认监听端口
[root@server2 redis]# /etc/init.d/redis_6379 restart
[root@server2 redis]# netstat -antlp
2、
redis-cli
127.0.0.1:6379> info
(三)在server3上安装mysql
1、安装mariadb:
[root@server3 ~]# yum install mariadb-server -y
2、打开数据库并进行安全初始化
[root@server3 ~]# cd /var/lib/mysql/
[root@server3 mysql]# rm -rf *
##如果有之前的数据库数据,删除
[root@server3 mysql]# systemctl start mariadb
[root@server3 mysql]# mysql_secure_installation
3、以超级用户登录mysql后,设置redis用户有所有的权限
[root@server3 mysql]# mysql -uroot -predhat
MariaDB [(none)]> show databases;
MariaDB [(none)]> create database test;
MariaDB [(none)]> grant all on test.* to redis@'%' identified by 'redhat';
MariaDB [(none)]> flush privileges;
4、将tset.sql(是一些数据)导入数据库test中
[root@server3 ~]# mysql -uroot -predhat < test.sql
5、测试是否将test.sql成功导入
[root@server3 ~]# mysql -p
MariaDB [(none)]> show databases;
MariaDB [(none)]> use test;
MariaDB [test]> show tables;
MariaDB [test]> select * from test;
(四)建立php和redis,mysql的连接
在这里插入图片描述
编写test.php文件,重启nginx
<?php
$redis = new Redis();
$redis->connect('172.25.2.2',6379) or die ("could net connect redis server");
# $query = "select * from test limit 9";
$query = "select * from test";
for ($key = 1; $key < 10; $key++)
{
if (!$redis->get($key))
{
$connect = mysql_connect('172.25.2.3','redis','redhat');
mysql_select_db(test);
$result = mysql_query($query);
//如果没有找到$key,就将该查询sql的结果缓存到redis
while ($row = mysql_fetch_assoc($result))
{
$redis->set($row['id'],$row['name']);
}
$myserver = 'mysql';
break;
}
else
{
$myserver = "redis";
$data[$key] = $redis->get($key);
}
}
echo $myserver;
echo "<br>";
for ($key = 1; $key < 10; $key++)
{
echo "number is <b><font color=#FF0000>$key</font></b>";
echo "<br>";
echo "name is <b><font color=#FF0000>$data[$key]</font></b>";
echo "<br>";
}
(五)浏览器访问测试
1.在浏览器中输入172.25.2.1,此时显示的数据是从mysql中获取的
2、再次刷新一下浏览器,发现显示的数据发生了改变,此时的数据是从redis中获取的(因为从测试页中可以看出来,从mysql中或从redis中获取的数据是不一样的),之后无论怎么刷新,此时的数据都是从redis中获取的
此时在server2上也可以查看到
此时就需要考虑一个问题:如果此时mysql数据发生变更,redis会同步吗?
3、测试redis是否会随mysql数据更新而更新,在server3上,更新数据:
MariaDB [test]> update test set name='westos' where id=1;
在server2上查看:发现数据没有变。
从浏览器访问:数据没变,说明redis不会随mysql数据更新而更新。
此时,我们就出现了 新的问题:如果在mysql中更新数据,发现redis中仍然会有对应的key,数据不会更新,此时就会出现mysql和redis数据不一致的情况。
那么我们如何将mysql端修改的数据及时更新到redis端呢?我们在下一篇博客中,解决此问题。
来源:CSDN
作者:草莓啾啾啾
链接:https://blog.csdn.net/ranrancc_/article/details/104309558