目录
在server3中安装gearmand的服务器端。软件包名为,依赖包名为
一、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