设为首页 收藏本站
查看: 3873|回复: 0

[经验分享] redis缓存mysql数据

[复制链接]
累计签到:2 天
连续签到:1 天
发表于 2018-11-5 06:07:56 | 显示全部楼层 |阅读模式
  redis (Remote Dictionary Server)是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。
  MySQL和Redis,自身都带有数据同步的机制,像比较常用的MySQL的Master/Slave模式,就是由Slave端分析Master的binlog来实现的,这样的数据复制其实还是一个异步过程,只不过当服务器都在同一内网时,异步的延迟几乎可以忽略。那么理论上我们也可以用同样方式,分析MySQL的binlog文件并将数据插入Redis。但是这需要对binlog文件以及MySQL有非常深入的理解,同时由于binlog存在Statement/Row/Mixedlevel多种形式,分析binlog实现同步的工作量是非常大的。因此这里选择了一种开发成本更加低廉的方式,借用已经比较成熟的MySQL
UDF,将MySQL数据首先放入Gearman中,然后通过一个自己编写的PHP Gearman
Worker,将数据同步到Redis。比分析binlog的方式增加了不少流程,但是实现成本更低,更容易操作。
  Gearman是一个支持分布式的任务分发框架:
  Gearman Job Server:Gearman核心程序,需要编译安装并以守护进程形式运行在后台。
  Gearman Client:可以理解为任务的请求者。
  Gearman Worker:任务的真正执行者,一般需要自己编写具体逻辑并通过守护进程方式运行,Gearman Worker接收到Gearman Client传递的任务内容后,会按顺序处理.
  大致流程:
  mysql触发器,就相当于Gearman的客户端。修改表,插入表就相当于直接下发任务。然后通过lib_mysqludf_json UDF库函数将关系数据映射为JSON格式,然后在通过gearman-mysql-udf插件将任务加入到Gearman的任务队列中,最后通过redis_worker.php,也就是Gearman的worker端来完成redis数据库的更新。
  使用lib_mysqludf_json的原因是因为Gearman只接受字符串作为入口参数,可以通过lib_mysqludf_json将MySQL中的数据编码为JSON字符串.
  lib_mysqludf_json UDF库函数将关系数据映射为JSON格式。通常,数据库中的数据映射为JSON格式,是通过程序来转换的。
  1. server2:
  配置redis:
  yum install -y mysql-server
  /etc/init.d/mysqld start
  netstat -antlpe        ##mysql端口3306已开
DSC0000.png

  tar zxf redis-3.0.2.tar.gz
  cd redis-3.0.2
  yum install -y gcc
  make
  make install
  cd /root/redis-3.0.2/utils
  ./install_server.sh          ##安装服务器启动程序
DSC0001.png

  /etc/init.d/redis_6379 start
  redis-cli monitor    ##监控数据,okshi表示监控正常
  redis-cli            ##临时设定redis的一些数据
DSC0002.png

  redis作为mysql缓存服务器:
  cd /root
  yum install nginx-1.8.0-1.el6.ngx.x86_64.rpm   php-5.3.3-38.el6.x86_64.rpm
  php-cli-5.3.3-38.el6.x86_64.rpm    php-common-5.3.3-38.el6.x86_64.rpm         php-devel-5.3.3-38.el6.x86_64.rpm    php-fpm-5.3.3-38.el6.x86_64.rpm
  php-gd-5.3.3-38.el6.x86_64.rpm   php-mbstring-5.3.3-38.el6.x86_64.rpm
  php-mysql-5.3.3-38.el6.x86_64.rpm    php-pdo-5.3.3-38.el6.x86_64.rpm
  php -m        ##看到支持的软件
  vim /etc/php.ini
date.timezone = Asia/Shanghai  cat /etc/passwd
  vim /etc/php-fpm.d/www.conf
user = nginx  
group = nginx
  /etc/init.d/php-fpm restart
  配置nginx:
  vim /etc/nginx/conf.d/default.conf
location / {  
        root   /usr/share/nginx/html;
  
        index    index.html index.htm  index.php;
  
  }
  
location ~ \.php$ {
  
        root           html;
  
        fastcgi_pass   127.0.0.1:9000;   ##fastcgi通信
  
        fastcgi_index  index.php;        ##fastcgi主文件
  
        fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;
  
        include        fastcgi_params;
  
    }
  cd /usr/share/nginx/html/
  vim index.php

  /etc/init.d/nginx start
  网页访问http://172.25.85.2
  nginx上运行php:
  yum install -y unzip
  unzip phpredis-master.zip
  cd phpredis-master
  phpize
  ./configure
  make
  make install
  cd /usr/lib64/php/modules/
  ls
  cd /etc/php.d
  cp mysql.ini redis.ini
  vim redis.ini
  将内容修改为以下:
  extension=redis.so
  /etc/init.d/php-fpm>  php -m | grep redis
  mysql
  mysql> show databases;        ##查看有无test数据库,没有则创建一个。
  mysql> quit
  cd /root/redis
  mysql  < test.sql
  cat test.sql
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 BEGINmysql
  
< test.sql
  
    SET @RECV=gman_do_background('syncToRedis',
  
    json_object(NEW.id as `id`, NEW.name as `name`));
  
  END$$
  
#DELIMITER ;
  mysql
  mysql> use test;
  mysql> select * from test;

  mysql> grant all on *.* to redis@localhost>  mysql> quit
  mysql -uredis -pwestos
  mysql> use test;
  mysql> select * from test;
DSC0003.png

  mysql> quit
  cp /root/test.php /usr/share/nginx/html/
  cd /usr/share/nginx/html/
  rm -rf index.php
  mv test.php index.php
  检测:
  网页访问http://172.25.85.2   ##已经完成redis对mysql的缓存
DSC0004.png

  redis-cli
  127.0.0.1:6379> get 1
  "test1"
  127.0.0.1:6379> get 2
  "test2"
  127.0.0.1:6379> quit
  mysql
  mysql> use test;

  mysql> update test set name='westos' where>  mysql> quit
  网页访问http://172.25.85.2     ##更新了mysql中的数据,但是redis中的数据不会自动更新
redis-cli  
127.0.0.1:6379> get 1
  
"test1"
  
redis-cli
  
127.0.0.1:6379> del 1
  
网页访问http://172.25.85.2
  

  
redis-cli
  
127.0.0.1:6379> set 1 westos
  
网页访问http://172.25.85。2
  Gearman是一个支持分布式的任务分发框架:
  Gearman Job Server:Gearman核心程序,需要编译安装并以守护进程形式运行在后台。
  Gearman Client:可以理解为任务的请求者。
  Gearman Worker:任务的真正执行者,一般需要自己编写具体逻辑并通过守护进程方式运行,Gearman Worker接收到Gearman Client传递的任务内容后,会按顺序处理
  大致流程:
  下面要编写的mysql触发器,就相当于Gearman的客户端。修改表,插入表就相当于直接下发任务。然后通过lib_mysqludf_json UDF库函数将关系数据映射为JSON格式,然后在通过gearman-mysql-udf插件将任务加入到Gearman的任务队列中,最后通过redis_worker.php,也就是Gearman的worker端来完成redis数据库的更新。
  2.配置gearman自动更新redis中的数据:
  cd /root/redis
  yum install -y gearmand-1.1.8-2.el6.x86_64.rpm libgearman-1.1.8-2.el6.x86_64.rpm
  /etc/init.d/gearmand start
  netstat -antlpe
  tar zxf gearman-1.1.2.tgz
  cd gearman-1.1.2
  phpize
  ./configure
  cd ..
  yum install -y libgearman-devel-1.1.8-2.el6.x86_64.rpm
  libevent-devel-1.4.13-4.el6.x86_64.rpm
  libevent-doc-1.4.13-4.el6.noarch.rpm
  libevent-headers-1.4.13-4.el6.noarch.rpm
  cd gearman-1.1.2
  ./configure
DSC0005.png

  make
  make install
  cd /etc/php.d
  cp redis.ini gearman.ini
  vim gearman.ini
  将内容修改为以下:
extension=gearman.so
  /etc/init.d/php-fpm>  php -m |grep gearman
  yum install -y mysql-devel
  cd /root/redis
  lib_mysqludf_json UDF库函数将关系数据映射为JSON格式。通常,数据库中的数据映射为JSON格式,是通过程序来转换的
  unzip lib_mysqludf_json-master.zip
  cd lib_mysqludf_json-master
  gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c
  ls
  mysql
  mysql> show global variables like 'plugin_dir';
DSC0006.png

  mysql> quit
  cd /root/lib_mysqludf_json-master
  cp lib_mysqludf_json.so /usr/lib64/mysql/plugin
  #注册UDF函数  
  mysql
  mysql> create function json_object returns string soname 'lib_mysqludf_json.so';
  mysql> select * from mysql.func;
DSC0007.png

  mysql> quit
  #安装gearman-mysql-udf
  这个插件是用来管理调用 Gearman 的分布式的队列。
  cd /root/redis
  tar zxf gearman-mysql-udf-0.6.tar.gz
  cd gearman-mysql-udf-0.6
  yum install -y gcc-c++
  ./configure --libdir=/usr/lib64/mysql/plugin/
  make
  make install
  cd /usr/lib64/mysql/plugin/
  mysql -p
  #注册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;
DSC0008.png

  mysql> quit
  netstat -antlpe
  #指定gearman的服务信息
  mysql
  mysql> select gman_servers_set('127.0.0.1:4730');
  mysql> quit
  #编写mysql触发器(根据实际情况编写)
  cd /root/redis
  vim test.sql
  将触发器的注释取消,在建表和插入数据语句前加上注释
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 ;
  mysql  < test.sql
  mysql
  mysql> show triggers from test;
  mysql> quit
  cp worker.php /usr/local/bin/
  cd /usr/local/bin/
  vim worker.php
  nohup php worker.php  &
  ps ax
  mysql
  mysql> use test;

  mysql> update test set name='redhat' where>  mysql> quit
  网页访问http://172.25.19.1(刷新)    ##更新     (待验证)
  redis-cli
  127.0.0.1:6379> get 1
  "redhat"
  3.redis的主从复制
  如果设置了一个slave,不管是在第一次链接还是重新链接master的时候,slave会发送一个同步命令 然后master开始后台保存,收集所有对修改数据的命令。当后台保存完成,master会将这个数据文件传送到slave,然后保存在磁盘,加载到内存中;master接着发送收集到的所有的修改数据的命令,这好比一个流命令,是redis协议本身来实现的。
  在server3和server4上:
  vim /etc/redis/6379.conf
  slaveof 172.25.85.2 6379
  /etc/init.d/redis_6379 restart
  server2:
  vim /root/redis-3.0.2/sentinel.conf    ##配置sentinel
sentinel monitor mymaster 172.25.85.2  6379 2  ##Sentinel 去监视一个名为 mymaster 的主服务器, 这个主服务器的 IP 地址为 127.0.0.1 , 端口号为 6379 , 而将这个主服务器判断为失效至少需要 2 个 Sentinel 同意 (只要同意 Sentinel 的数量不达标,自动故障迁移就不会执行)。
sentinel down-after-milliseconds mymaster 10000  ##Sentinel 认为服务器已经断线所需的毫秒数。
sentinel failover-timeout mymaster 60000  grep -v ^#  sentinel.conf >/etc/sentinel.conf
  redis-sentinel /etc/sentinel.conf
  tu
  scp /etc/sentinel.conf root@172.25.45.4:/etc/
  scp /etc/sentinel.conf root@172.25.45.3:/etc/
  redis-cli  -h 172.25.45.7 -p 26379 info
  tu
  server4:
  vim /etc/sentinel.conf
  port 26379
  dir "/tmp"
  .
  sentinel monitor mymaster 172.25. 6379 2
  sentinel down-after-milliseconds mymaster 10000
  sentinel failover-timeout mymaster 60000
  sentinel parallel-syncs mymaster 1           ##选项指定了在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步, 这个数字越小, 完成故障转移所需的时间就越长。
  scp /etc/sentinel.conf root@172.25.85.4:/etc/
  然后再server7查看:redis-cli  -h 172.25.85.2 -p 26379 info
  tu



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-630772-1-1.html 上篇帖子: Redis protected-mode 下篇帖子: redis演练(1) 搭建redis服务
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表