LAMP架构之12——Redis和mysql之间的整合

目录

一、Redis持久化:

二、CDN内容发布网络

三、redis和mysql之间的整合

四、测试redis和mysql之间数据同步

1、实验环境:

 2、在server4中创建发布页面

3、在server3上设置纯净的LAMP架构

4、在网页测试

五、mysql和redis数据的自动更新

在mysql数据库(server4)端:

1、在mysql服务器中安装插件

2、注册UDF函数

 3、安装 gearman-mysql-udf

4、指定gearmand的服务器端

在server3中安装gearmand的服务器端。软件包名为,依赖包名为

5、指定gearmand的服务端地址

 6、打开脚本中的触发器并导入

在gearman的worker(server3)端:

1、编写server3的php文件

 2、令php支持gearman模块

 3、令worker.php文件后台运行

 4、测试:

 分布式分发框架的基本逻辑:

本章总结:


一、Redis持久化:

REDIS persistence -- Redis中国用户组(CRUG)redishttp://redis.cn/topics/persistence.html

RDB 快照存储(默认)

AOF 以追加的方式保存所有写操作

</etc/redis/6379.conf>配置文件中的特殊内容如下:

save 900 1当有一条Keys数据被改变时,900秒刷新到Disk一次
save 300 10当有10条Keys数据被改变时,300秒刷新到Disk一次
save 60 10000当有10000条Keys数据被改变时,60秒刷新到Disk一次
appendonly yes启用AOF持久化方式
appendfsync everysec 每秒钟强制写入磁盘一次

二、CDN内容发布网络

三、redis和mysql之间的整合

一般redis作为mysql的缓存,mysql的数据提前加载到redis中。用户写入数据的时候直接写入到mysql中,用户读取数据的时候从redis中读取,实现了读写分离。但是这样还存在一个问题,就是mysql和redis的数据结构不同,数据无法通用。

基本结构如下图所示:

改进的结构图如下所示:

 但是上述结构仍有缺陷,再次改进:

四、测试redis和mysql之间数据同步

本次实验为了测试redis和mysql之间数据同步,以第一种结构为例进行测试:

1、实验环境:

server3:纯净的LAMP架构

nginx和php。

srever2:做redis的master端

因为redis的slave端只读不写,所以要更改配置文件<vim /etc/redis/6379.conf >,注释掉其“replicaof”,然后重启redis,将作为master端使用。

server4:安装低版本的数据库

由于server1/2/3上都安装了mysql5.7版本,进行这个实验时会造成不兼容的问题。因此在server4上有一个干净的系统环境,安装系统默认的地版本<mariadb>数据库,可以完成这个实验。

yum install -y mariadb-server.x86_64            #安装mariadb
systemctl start mariadb                         #启动mariadb服务

 2、在server4中创建发布页面

要求读时在redis中读,写时在mysql中写;当redis中没有的时候,需要从数据库中进行加载。

 第一步:在server4中创建一个mysql脚本,并直接导入到数据库中。

进入数据库测试:

 第二步:在server4中添加授权(作为客户端访问的数据库授权)

MariaDB [(none)]> grant all on test.* to redis@'%' identified by 'westos';

3、在server3上设置纯净的LAMP架构

第一步:编译nginx

更改配置文件(启用php):

第二步:安装php(需要mysql和redis模块)

yum install -y php                    #安装系统自带的php(内含依赖性)
yum install -y php-fpm-5.4.16-46.el7.x86_64.rpm        #安装编译好的php包

 mysql模块:

yum install -y php-mysql              #安装系统自带的php-mysql

redis模块:

yum install -y php-pecl-redis-2.2.8-1.el7.x86_64.rpm php-pecl-igbinary-1.2.1-1.el7.x86_64.rpm

安装完成后,启动<php-fpm>服务,查看端口,已经启用。

第三步:在server3中的nginx发布目录中放个网页

页面内容中关键的两部分如下所示:

(1)先会连接<172.25.254.2>主机上的redis,如果没有找到数据或者无法连接redis则进行下一步判断语句。

(2)连接<172.25.254.4>上的mysql,以“redis”的身份和“westos”的密码访问“test”表。mysql数据库的授权在第一步中已经完成。

4、在网页测试

可以看到客户端访问数据库时,是从redis中读取的数据。而不是直接从后端的mysql中读取,这样一来会极大的减小mysql服务器的压力。

但是这样仍有一个问题(如下图所示):就是客户端访问的时候是从redis读取的数据,当后端的mysql数据发生变更时,并不会同步到redis中;同时,网页访问也不会刷新。这就是接下来要解决的问题。

 更新完server4中的mysql后,server2中的redis并没有更新。导致用户在浏览器中看到的数据还是未更新前的。

从redis中把未更新的数据删掉,浏览器重新访问,将会从mysql中重新加载一遍,这时在浏览器和redis中测试,数据都同步过来了。

这证明mysql中更新后,无法自动触发对redis中数据的更新。

因此要做的就是更新完mysql后,数据自动同步到redis中。

五、mysql和redis数据的自动更新

在mysql数据库(server4)端:

1、在mysql服务器中安装插件<lib_mysqludf_json>

插件名为<lib_mysqludf_json-master.zip>,是一种udf模式同步mysql和redis数据。

1 yum install -y gcc mariadb-devel            #安装gcc和mariadb编译的依赖

2 unzip lib_mysqludf_json-master.zip          #解压lib_mysqludf_json-master

3 cd lib_mysqludf_json-master                 #进入解压的目录后编译

4 gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c

2、注册UDF函数

注册完以后只是建立了mysql和udf之间的映射,还不能直接使用。还需要安装一个分布式插件。

mysql> show global variables like 'plugin_dir';        #查看 mysql 的模块目录

cp lib_mysqludf_json.so /usr/lib64/mysql/plugin/       #拷贝 lib_mysqludf_json.so 模块

mysql> CREATE FUNCTION json_object RETURNS STRING SONAME 'lib_mysqludf_json.so';
                                                       #注册 UDF 映射函数

mysql> select * from mysql.func;                       #查看函数

 3、安装 gearman-mysql-udf

这个插件是用来管理调用 Gearman 的分布式的队列。
官网地址: https://launchpad.net/gearman-mysql-udf

1 tar zxf gearman-mysql-udf-0.6.tar.gz                #解压gearman-mysql-udf

2 cd gearman-mysql-udf-0.6                            #进入gearman-mysql-udf目录

3 ./configure --with-mysql=/usr/bin/mysql_config --libdir=/usr/lib64/mysql/plugin/
                                                      #检查依赖性

4 make && make install                                #安装

注意:校验gearman的依赖性时,会显示gearman的依赖性包没有,因此需要手动安装。

编译完成后,< /usr/lib64/mysql/plugin/>目录下会出现这两个文件。

#注册UDF函数
mysql> CREATE FUNCTION gman_do_background RETURNS STRING SONAME 
'libgearman_mysql_udf.so';
                #表示把数据发送给谁
mysql> CREATE FUNCTION gman_servers_set RETURNS STRING SONAME 'libgearman_mysql_udf.so';
                #发送给谁由这个函数定义

#查看函数
mysql> select * from mysql.func;

给mysql增加了三个用户自定义函数,如下所示:

4、指定gearmand的服务器端

在server3中安装gearmand的服务器端。软件包名为<gearmand-1.1.12-18.el7.x86_64.rpm>,依赖包名为<libgearman-1.1.12-18.el7.x86_64.rpm>

安装完成后启动<gearmand>服务,其端口为4730端口。 

5、指定gearmand的服务端地址

mysql> SELECT gman_servers_set('127.0.0.1:4730');        #指定gearmand的服务器端口

 6、打开<test.sql>脚本中的触发器并导入

5 DELIMITER $$
6 CREATE TRIGGER datatoredis AFTER UPDATE ON test FOR EACH ROW BEGIN
7     SET @RECV=gman_do_background('syncToRedis', json_object(NEW.id as `id`, NEW.name as `name`));
8   END$$
9 DELIMITER ;

#第6行表示触发器datatoredis在test数据更新之后调用第7行的两个函数将更新的数据发送到gearmand服务器(server3)

导入并查看触发器:

#mysql < test.sql                     #上一步修改完成后将test.sql文件导入到msyql中

mysql> SHOW TRIGGERS FROM test;       #查看触发器

在gearman的worker(server3)端:

1、编写server3的php文件

表示一端连接GearmanWorker,一端连接Redis,redis的目的地址和端口为<172.25.254.2>

 2、令php支持gearman模块

用到的软件包为<php-pecl-gearman-1.1.2-1.el7.x86_64.rpm>。

安装完成后php即可支持gearman

更改完成后,重新导入php的配置

systemctl reload php-fpm            #平滑加载php的配置

 3、令worker.php文件后台运行

nohup php /usr/local/worker.php &

 4、测试:

在mysql端(server4)更改数据,在redis端(server2)查看数据已实时同步过来。在浏览器端访问,刷新一下数据也会更新到。

 分布式分发框架的基本逻辑:

基本逻辑是:mysql(server4)中数据更新后,会通过udf函数配合触发器将数据发送给worker(server3)中的4730端口,gearmand管理程序会控制worker转发;再由gearmand分发给worker中的redis。由此形成了一个分布式的分发框架。

本章总结:

1、Redis持久化中RDB和AOF两种模式的优缺点!!!

2、redis关闭开机自启动

chkconfig redis_6379 off

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值