一.redis结合lnmp架构做mysql的缓存服务器
原理:server1做web服务器,通过nginx访问redis(使用server2做redis),如果有则直接访问,如果没有,则使用server3做mysql
(一)在server1中配置nginx和php
1.首先将server中的其他服务都关闭并删除(如果有mysql,建议将快照删除,重现建立,因为其如果做过ssl服务,可能在安装php时会有影响<php安装时会安装最新的openssl,而之前mysql使用的是旧的openssl,无法直接删除旧的openssl,新的也无法通过直接安装覆盖或升级,如果强行删除,可能会导致系统崩溃>,所以最好删除)
#此时只是关闭redis服务,并不是关闭集群节点
[root@server1 ~]# /etc/init.d/redis_6379 stop
#为了将所有的redis-server直接关闭,可以使用killall命令进行删除,但是会发现没有killall命令
[root@server1 ~]# killall -9 redis-server
[root@server1 ~]# yum whatprovides /usr/bin/killall
[root@server1 ~]# yum install psmisc-22.20-11.el7.x86_64 -y
#查看进程中是否有redis-server
[root@server1 ~]# ps ax
[root@server1 ~]# ls
#将之前的redis的安装包及配置全部删除
[root@server1 ~]# rm -rf *
补充:
如果要删除相关服务的模块,可以使用以下命令:
[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
#对nginx安装包进行解压
[root@server1 ~]# ls
[root@server1 ~]# tar zxf nginx-1.16.0.tar.gz
[root@server1 ~]# cd nginx-1.16.0
#在此文件下将debug注释
[root@server1 nginx-1.16.0]# vim auto/cc/gcc
#下载nginx编译和安装时所需要的依赖性
[root@server1 nginx-1.16.0]# yum install -y gcc pcre-devel zlib-devel -y
#由于此实验只是简单的做一个web服务器,所以不需要添加别的模块,编译时只写安装到的路径即可
[root@server1 nginx-1.16.0]# ./configure --prefix=/usr/local/nginx
[root@server1 nginx-1.16.0]# make && make install
[root@server1 nginx-1.16.0]# cd /usr/local/nginx/
[root@server1 nginx]# cd conf/
#编辑配置文件,因为此实验需要用到php,所以这里将php相关的内容都打开并将nginx默认访问路径进行更改(之后会导入一个测试页,测试页连接了mysql和redis)
[root@server1 conf]# vim nginx.conf
#检测nginx配置文件的正确性并重新启动nginx服务
[root@server1 conf]# ../sbin/nginx -t
[root@server1 conf]# ../sbin/nginx
nginx配置文件中更改的内容如下:
location / {
root html;
index index,php index.html index.htm; #将其nginx默认访问页面设置成index.php
}
……
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;
}
3.配置php
(1)将rhel7目录中的内容全部进行安装(rhel7目录下是关于php的安装包
[root@server1 ~]# cd rhel7/
[root@server1 rhel7]# ls
[root@server1 rhel7]# yum install * -y
(2)开启php服务并查看其9000端口是否成功开启
[root@server1 rhel7]# systemctl start php-fpm
[root@server1 rhel7]# netstat -tnlp
(二)配置redis(因为之前已经在server2中配置过redis,这里只进行修改即可)
(1)编辑配置文件(如果之前做过redis主从复制,则需要将之前在配置文件中的内容删除)
[root@server2 utils]# cd /etc/redis/
[root@server2 redis]# ls
[root@server2 redis]# vim 6379.conf
(2)使用redis-cli查看之前是否写过内容,如果有,则删除(DEL name)
[root@server2 redis]# redis-cli
127.0.0.1:6379> get name
127.0.0.1:6379> DEL name
127.0.0.1:6379> get name
127.0.0.1:6379> exit
(3)重启redis服务
[root@server2 redis]# /etc/init.d/redis_6379 restart
/etc/init.d/redis_6379 restart
(三)在server3中配置数据库(因为mysql的内容配置较多,这里只是简单的做测试,使用mariadb即可)
(1)安装mariadb
[root@server3 ~]# yum install mariadb-server -y
(2)查看是否有之前的数据库数据,如果有,则删除
[root@server3 ~]# cd /var/lib/mysql/
[root@server3 mysql]# ls
[root@server3 mysql]# rm -rf *
(3)打开数据库并进行安全初始化
[root@server3 mysql]# systemctl start mariadb
[root@server3 mysql]# mysql_secure_installation
(4)以超级用户登录mysql后,设置redis用户有所有的权限
[root@server3 mysql]# mysql -p
MariaDB [(none)]> show databases;
MariaDB [(none)]> create database test;
MariaDB [(none)]> grant all on test.* to redis@'%' identified by 'redhat';
MariaDB [(none)]> flush privileges;
(5)进入server1中,将测试页(已经上传到server1中)的名称更改成index.php并重新启动nginx服务
[root@server1 rhel7]# cd /usr/local/nginx/html/
[root@server1 html]# ls
[root@server1 html]# mv test.php index.php
[root@server1 html]# /usr/local/nginx/sbin/nginx -s reload
(6)根据server2中的信息和server3中的数据库信息,对server1下的测试页进行修改
[root@server1 html]# vim index.php
配置中更改的内容如下:
#注意:这里是server2的ip
$redis->connect('172.25.66.2',6379) or die ("could net connect redis server");
#注意:这里是表名
$query = "select * from test";
#注意:这里是server3的ip和数据库中的用户已经密码
$connect = mysql_connect('172.25.66.3','redis','redhat');
(7)将tset.sql(是一些数据)导入数据库中
[root@server3 mysql]# cd
[root@server3 ~]# ls
[root@server3 ~]# mysql -predhat < test.sql
(8)测试是否将test.sql成功导入
[root@server3 ~]# mysql -p
MariaDB [(none)]> show databases;
MariaDB [(none)]> use test;
MariaDB [test]> show tables;
MariaDB [test]> select * from test;
(四)测试:
1.在浏览器中输入172.25.66.1,如果显示的是之前的内容,说明可能有缓存,删除一下缓存即可,此时显示的数据是从mysql中获取的
2.再次刷新一下浏览器,发现显示的数据发生了改变,此时的数据是从redis中获取的(因为从测试页中可以看出来,从mysql中或从redis中获取的数据是不一样的),之后无论怎么刷新,此时的数据都是从redis中获取的
二.配置gearman实现数据同步:
我们会发现一个问题,就是如果在mysql中更新数据,发现redis中仍然会有对应的key,数据不会更新,此时就会出现mysql和redis数据不一致的情况。
那么我们如何将mysql端修改的数据及时更新到rdis端呢?接下来就要通过mysql触发端将改变的数据同步到redis中
原理:mysql->update->trigger->json_map->mysql plugin->gearman(server:接收请求的)->worker(php-gearman/php-redis处:处理请求)->redis
(一)出现的问题
1.在server3中将表中的id为2的数据更改为redhat并查看,此时在server3中已经成功更改
MariaDB [test]> select * from test;
MariaDB [test]> update test set name='redhat' where id=2;
MariaDB [test]> select * from test;
2.在server2中获取server3中id为2的信息,发现获取的还是之前的数据
[root@server2 redis]# redis-cli
127.0.0.1:6379> get 2
3.在浏览器中不断刷新,甚至可以清除浏览器,发现依旧无法显示server3中更改的数据信息,说明在mysql中更改的数据是无法生效的(在server2中更改数据信息,是可以发生改变的)
实验开始:
(二)[mysql端]
1.在server3中解压lib_mysqludf_json-master.zip
[root@server3 ~]# yum install unzip -y
[root@server3 ~]# ls
[root@server3 ~]# unzip lib_mysqludf_json-master.zip
[root@server3 ~]# cd lib_mysqludf_json-master
[root@server3 lib_mysqludf_json-master]# yum install gcc -y
[root@server3 lib_mysqludf_json-master]# yum install mariadb-devel -y
注意:
mariadb-devel和gcc不能同时安装,同时安装只会安装其中一个
2.用gcc进行编译模块
[root@server3 lib_mysqludf_json-master]# gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c
3.将lib_mysqludf_json-master/lib_mysqludf_json.so模块拷贝到/usr/lib64/mysql/plugin/插件目录下
[root@server3 lib_mysqludf_json-master]# cd
[root@server3 ~]# cp lib_mysqludf_json-master/lib_mysqludf_json.so /usr/lib64/mysql/plugin/
4.查看mysql的模块目录并注册UDF函数,查看函数
[root@server3 ~]# mysql -p
#查看mysql的模块目录
MariaDB [(none)]> show global variables like 'plugin_dir';
#注册UDF函数,并查看函数
MariaDB [(none)]> create FUNCTION json_object returns string soname 'lib_mysqludf_json.so';
MariaDB [(none)]> select * from mysql.func;
5.安装geaman安装包,并安装其geaman的扩展,进行编译和安装
[root@server3 ~]# yum install libgearman-* libevent-devel-2.0.21-4.el7.x86_64.rpm -y
[root@server3 ~]# tar zxf gearman-mysql-udf-0.6.tar.gz
[root@server3 ~]# cd gearman-mysql-udf-0.6
[root@server3 gearman-mysql-udf-0.6]# ls
[root@server3 gearman-mysql-udf-0.6]# ./configure -libdir=/usr/lib64/mysql/plugin/ --with-mysql
[root@server3 gearman-mysql-udf-0.6]# make && make install
6.注册另外两个UDF函数并进行查看
[root@server3 gearman-mysql-udf-0.6]# mysql -p
MariaDB [(none)]> create function gman_do_background returns string soname 'libgearman_mysql_udf.so';
MariaDB [(none)]> create function gman_servers_set returns string soname 'libgearman_mysql_udf.so';
MariaDB [(none)]> select * from mysql.func;
7.指定gearman的服务信息
MariaDB [(none)]> select gman_servers_set('172.25.66.1:4730');
8.编写mysql触发器
#编写test.sql内容并导入数据库(此处需要更改test.sql中的内容)
[root@server3 ~]# vim test.sql
[root@server3 ~]# mysql -predhat < test.sql
[root@server3 ~]# mysql -p
#查看触发器,发现其中的内容与文件中的内容相同
MariaDB [(none)]> show triggers from test;
文件内的内容如(#将文件内的内容进行更改,将之前的注释掉,下面的取消注释下):
use test;
#CREATE TABLE `test` (`id` int(7) NOT NULL AUTO_INCREMENT, `name` char(8) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
#INSERT INTO `test` VALUES (1,'test1'),(2,'test2'),(3,'test3'),(4,'test4'),(5,'test5'),(6,'test6'),(7,'test7'),(8,'test8'),(9,'test9');
DELIMITER $$
CREATE TRIGGER datatoredis AFTER UPDATE ON test FOR EACH ROW BEGIN
SET @RECV=gman_do_background('syncToRedis', json_object(NEW.id as `id`, NEW.name as `name`));
END$$
DELIMITER ;
(三)[worker]
1.开启gearmand服务并查看其端口号4730是否开启
[root@server1 ~]# systemctl start gearmand
[root@server1 ~]# netstat -tnlp
2.编写gearman的woeker端,注意在文件内需要更改ip
[root@server1 ~]# ls
[root@server1 ~]# vim worker.php
文件内更改的内容如下:
$redis->connect('172.25.66.2', 6379);
3.在后台运行worker
[root@server1 ~]# cp worker.php /usr/lcoal/
#执行此命令后才生效,执行此命令前不生效
[root@server1 ~]# nohup php /usr/local/worker.php &> /dev/null &
(四)[测试]
1.在server3更新数据并查看(注意:其中id=2的因为是之前更改的,所以不生效)
MariaDB [(none)]> use test;
MariaDB [test]> update test set name='redhat' where id=4;
MariaDB [test]> select * from test;
2.在server4尝试获取
[root@server2 redis-5.0.3]# redis-cli
127.0.0.1:6379> get 1
127.0.0.1:6379> get 4
3.在浏览器中查看,此时可以发生改变
总结:
1.要编译udf函数,安装mariadb-devel
2.Makefile中的内容是如何将.c文件进行嗯编译,对mysql内部的一些变量
补充:
php支持以下插件
php -m | grep mysql
php -m | grep redis
php -m | grep gearman