目录
一、redis结合mysql
(1)流程图
用户端访问时,请求直接发送给redis,假如redis有数据就可以直接返给用户,假如redis没有,他就会调取数据库上的数据,用户写入的时候是直接写到了数据库上
(2)实验环境
本次实验一共需要三个节点,在这里选取server2,server3和server4,其中server2作为redis节点,必须是master;
server3是作为lamp架构,在这里一定要注意选取一个干净的server节点去重新安装lamp架构,因为之前安装server1的lamp架构修改过好多参数,直接会影响实验结果;
Server四作为mysql节点,直接安装系统自带的数据库,不需要自行编译。
server2: vim /etc/redis/6379.conf
注销replicaof 172.25.73.1 6379
加入server2本来就是master,这部忽略
redis-cli
info查看server2是否为master
server4:
yum install -y mariadb-server.x86_64
systemctl start mariadb.service
宿主机:scp -r /home/westos/Desktop/aaaalinux\ file/docs/redis/rhel7/ root@server3:~
scp -r /home/westos/Desktop/aaaalinux\ file/docs/lamp/nginx-1.20.2.tar.gz root@server3:~
server3: /etc/init.d/redis_6379 stop 如果redis是运行状态,要停掉redis
chkconfig redis_6379 off 取消redis的开机自启动
cd rhel7/ #######server3要求没有安装过php和nginx
server3安装nginx:
yum install gcc pcre-devel openssl-devel -y 安装依赖性软件
[root@server3 nginx-1.20.2]# ./configure --with-http_ssl_module
[root@server3 nginx-1.20.2]# make && make install
安装好之后,创建软连接
ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/
vim /usr/local/nginx/conf/nginx.conf 如下图
nginx
nginx -s reload 重新加载nginx
sever3安装php: 在 /root/rhel7下安装
yum install -y php-fpm-5.4.16-46.el7.x86_64.rpm
yum install -y php
yum install -y php-mysql
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 -m |grep mysql
php -m |grep redis 查看安装是否成功
systemctl start php-fpm 开启php
netstat -antlp 查看服务开启情况
(3)mysql+redis部署
server3上先安排一个默认发布目录
cp test.php /usr/local/nginx/html/
vim /usr/local/nginx/html/test.php
3 $redis->connect('172.25.73.2',6379) or die ("could net connect redis server");
10 $connect = mysql_connect('172.25.73.4','redis','west os');
把数据库的备份文件发给server4,节省时间,不需要自己新建
[root@server3 rhel7]# scp test.sql root@server4:~
server4:
登陆数据库。先在数据库新建用户,授予远程登录权力并修改密码
grant all on test.* to redis@'%' identified by 'westos';
导入数据库的备份文件
mysql < test.sql
server4登陆数据库查看导入效果
mysql
use test
show tables
select * from test;
(4)效果测试
浏览器输入http://172.25.73.3/test.php
刚开始出现access denied
修改server3上的test.php的权限 chmod +r test.php
出现下图
此时由于是第一次读取,所以读取的是数据库的内容,刷新一次,redis中就有了缓存,此时由mysql变成了redis
但是这一结构的缺陷是redis中由于已经有了所需要的缓存,所以哪怕数据库端做了更新,redis段也不会实时更新过去,接下来我们要研究如何解决这个问题
二、配置 gearman 实现数据同步
(1)gearman原理
大致流程:编写 mysql 触发器trigger,就相当于 Gearman 的客户端。修改表,插入表就相当于直接下发任务。然后通过 lib_mysqludf_json UDF 库函数将关系数据映射为 JSON 格式,然后在通过 gearman-mysql-udf 插件将任务加入到 Gearman 的任务队列中,最后通过redis_worker.php,也就是 Gearman 的 worker 端来完成 redis 数据库的更新。
在本实验中germand的服务器安装在server3上
(2)gaerman服务部署
首先要在server4上安装utf函数
宿主机:
scp /home/westos/Desktop/aaaalinux\ file/docs/redis/lib_mysqludf_json-master.zip root@server4:~
server4:解压
yum install -y unzip
unzip lib_mysqludf_json-master.zip
server4:安装gcc用于编译,安装maria插件
yum install -y gcc
yum install -y mariadb-devel
server4:
gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c
编译,并将数据映射到lib_mysqludf_json.c
登陆mysql,
show global variables like 'plugin_dir'; 查看一下数据目录,后边的命令需要
退出mysql。
cp lib_mysqludf_json.so /usr/lib64/mysql/plugin/
直接把影射文件扔到数据目录下,这样数据库能读到
ls /usr/lib64/mysql/plugin/ 查看一下复制是否成功
server4上,登陆数据库,注册udf函数:
CREATE FUNCTION json_object RETURNS STRING SONAME 'lib_mysqludf_json.so';
select * from mysql.func; 查看函数
server4:安装gearman服务
宿主机:scp /home/westos/Desktop/aaaalinux\ file/docs/redis/gearman-mysql-udf-0.6.tar.gz root@server4:~
scp /home/westos/Desktop/aaaalinux\ file/docs/redis/rhel7/libgearman-1.1.12-18.el7.x86_64.rpm root@server4:~
scp /home/westos/Desktop/aaaalinux\ file/docs/redis/rhel7/libgearman-devel-1.1.12-18.el7.x86_64.rpm root@server4:~
scp /home/westos/Desktop/aaaalinux\ file/docs/redis/rhel7/libevent-devel-2.0.21-4.el7.x86_64.rpm root@server4:~
serve4:
先安装依赖性软件再configure
yum install -y libgearman-devel-1.1.12-18.el7.x86_64.rpm libgearman-1.1.12-18.el7.x86_64.rpm libevent-devel-2.0.21-4.el7.x86_64.rpm
tar zxf gearman-mysql-udf-0.6.tar.gz
cd gearman-mysql-udf-0.6/./configure --libdir=/usr/lib64/mysql/plugin/
make && make install
cd /usr/lib64/mysql/plugin/
出现以下插件表示安装成功
在server4上登陆数据库, 注册 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';select * from mysql.func; 查看函数
接下来选择一个节点作为gearman的服务器,在这里选择server3
server3: 安装包均在rhel7目录下
yum install -y gearmand-1.1.12-18.el7.x86_64.rpm libgearman-1.1.12-18.el7.x86_64.rpm
systemctl start gearmand.service 安装成功后开启服务
netstat -antlp 查看端口,一会编辑配置文件要用到
在server4上指定 gearman 的服务信息
SELECT gman_servers_set('172.25.73.3:4730');
server4:
创建触发器,在这里已经有了一个写好的test.sql,可以直接使用
vim test.sql 只留下原来加了注释那部分
server4:
mysql < test.sql 导入触发器命令
mysql> SHOW TRIGGERS FROM test; 查看触发器
server3:把worker文件配置好
cp worker.php /usr/local/
vim /usr/local/worker.php修改对应行的redis节点信息,redis安装在那个节点就写那个
此时在server3上查询 php -m |grep gearman
发现依然没有,需要再安装一个插件。
yum install -y php-pecl-gearman-1.1.2-1.el7.x86_64.rpm
server3再次查询就发现有了
php -m |grep gearman
systemctl reload php-fpm.service 重新加在服务
ll /etc/php.ini 确保文件的权限可读
nohup php /usr/local/worker.php & 后边按一下回车。打入后台
ps ax 查看
(3)gearman同步效果测试
server4上修改信息
MariaDB [test]> update test set name='hello' where id=1;
redis 节点端:
redis-cli
127.0.0.1:6379> get 1 可以看到获取到了hello
浏览器端:
原来的信息如图一
刷新后如图二
假如没有gearman服务,无论怎么刷新,id=1的信息都不会变化