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

[经验分享] 键值存储之redis-linux札记

[复制链接]

尚未签到

发表于 2018-11-5 08:25:16 | 显示全部楼层 |阅读模式
  MySQL通过Memcached将热点数据加载到cache,加速访问,但随着业务数据量的不断增加,和访问量的持续增长会遇到很多问题:
  1.MySQL需要不断进行拆库拆表,Memcached也需不断跟着扩容,扩容和维护工作占据大量开发时间。
  2.Memcached与MySQL数据库数据一致性问题。
  3.Memcached数据命中率低或down机,大量访问直接穿透到DB,MySQL无法支撑。
  4.跨机房cache同步问题。
  如果简单地比较Redis与Memcached的区别,redis会有如下优点:
  1  Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
  2  Redis支持数据的备份,即master-slave模式的数据备份。
  3  Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
  下面简单的对redis进行实验,参考“www.runoob.com/redis”
  安装:
  #tar zxf redis-3.0.2.tar.gz
  #cd redis-3.0.2
  #yum install jemalloc-3.6.0-1.el6 jemalloc-devel-3.6.0-1.el6 gcc -y  //安装插件
  #make && make install
  #cd utils/
  #./install_server_sh   //配置redis,选择默认即可
  #service redis_6379 start   //启动redis服务
  #redis-cli     //客户端命令行工具,可以对数据库和各种数据类型进行操作
  set myKey abc   //设置键值对
  get myKey      //取出键值对
  config get loglevel  //查看配置项loglevel
DSC0000.png

  将redis作为mysql 的缓存服务器
  安装lnmp环境
  #yum install -y nginx-1.8.0.1.el6.ngx.x86_64.rpm php-5.3.3-38.el6.x86_64 php-cli-5.3.3-38.el6 php-common php-devel php-fpm php-gd php-mbstring php-mysql  php-pdo   //安装nginx,php,在web上显示redis缓存的mysql数据。
  #vim /etc/php.ini
  修改时区为亚洲上海
  #vim /etc/php-fpm.d/www.conf
  设置uer与group为nginx。
  #/etc/init.d/php-fpm start      //启动phpfastcgi
  #cd /usr/share/nginx/html
  #vim index.php

  #vim /etc/nginx/conf.d/default.conf
  将fastcgi_param 后面的/scripts改为/usr/share/nginx/html   //修改首页路径
  在locatin / 模块的index行添加index.php   //添加php首页
  启动nginx服务
  添加php的redis控件
  #cd ~/redis
  #unzip phpredis-master.zip
  #cd phpredis-master
  #phpize   //建立php扩展模块,生成configure文件
  #./configure
  #make && make install
  #cd /etc/php.d
  #cp mysql.ini redis.ini   //建立redis.ini
  #vim redis.ini
  内容为extension=redis.so
  #/etc/init.d/php-fpm reload
  #php -m | grep redis
  显示redis表示php添加redis插件成功
DSC0001.png

  编辑测试用的数据库文件test.sql
DSC0002.png

  #mysqluse test
  >select * from test;
DSC0003.png

  >grant all on test.* to redis@localhost identified by ‘redhat’;  //mysql绑定redis
  这时在web上能看到对应数据
DSC0004.png

  #redis-cli
  >get 1
  test1
  Web上的数据即为redis缓存的mysql的数据。
  Gearman
  如果更新了 mysql,redis中仍然会有之前对应的 KEY,数据就不会更新,此时就会出现 mysql 和 redis 数据不一致的情况。所以接下来就要通过 mysql 触发器(gearman)将改变的数据同步到 redis 中。
  一个Gearman请求的处理过程涉及三个角色:Client -> Job -> Worker。
  Client:请求的发起者,可以是 C,PHP,Perl,MySQL UDF 等等。
  Job:请求的调度者,用来负责协调把 Client 发出的请求转发给合适的 Worker。
  Worker:请求的处理者,可以是 C,PHP,Perl 等等。
  下面要编写的 mysql 触发器,就相当于 Gearman 的客户端;
  修改表,插入表就相当于直接下发任务;
  通过 lib_mysqludf_json UDF 库函数将关系数据映射为 JSON 格式,然后在通过 gearman-mysql-udf 插件将任务加入到 Gearman 的任务队列中;
  最后通过redis_worker.php,也就是 Gearman 的 worker 端来完成 redis 数据库的更新。
  注:适合mysql7之前的版本。
  #yum install gearmand libgearman -y
  #/etc/init.d/gearmand start    //启动gearman服务
  Netsat可看出它是4730端口
  集成gearman到php
  #tar zxf gearman-1.1.2.tgz
  #cd gearman-1.1.2
  #phpize
  #yum install libevent-devel libevent-doc libevent-headers libgearman-devel   //安装相应组件
  #./configure
  #make && make install
  #cd /etc/php.d
  #cp redis.ini gearman.ini   //建立gearman.ini
  #vim gearman.ini
  内容为extension=gearman.so
  #/etc/init.d/php-fpm reload     //重载phpfastcgi
  #php -m | grep gearman
  显示gearman表示gearman以集成到php
  安装lib_mysqludf_json
  #yum install mysql-devel
  #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
  查看 mysql 的模块目录:
  mysql> show global variables like 'plugin_dir'
DSC0005.png

  拷贝 lib_mysqludf_json.so 模块到mysql的plugin目录中
  # cp lib_mysqludf_json.so /usr/lib64/mysql/plugin/
  注册 UDF 函数
  mysql> CREATE FUNCTION json_object RETURNS STRING SONAME
  'lib_mysqludf_json.so';
  查看函数
  mysql> select * from mysql.func;
DSC0006.png

  安装 gearman-mysql-udf
  这个插件是用来管理调用 Gearman 的分布式的队列。(https://launchpad.net/gearman-mysql-udf)
  # tar zxf gearman-mysql-udf-0.6.tar.gz
  # cd gearman-mysql-udf-0.6
  # ./configure --with-mysql=/usr/bin/mysql_config --libdir=/usr/lib64/mysql/plugin/
  # make& make install
  注册 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;
DSC0007.png

  指定 gearman 的服务信息
  mysql> SELECT gman_servers_set('127.0.0.1:4730');
DSC0008.png

  编写 mysql 触发器(根据实际情况编写)
  # vim test.sql
  use test;
  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> SHOW TRIGGERS FROM test;
DSC0009.png

  可以看到“syncToRedis” ,即mysql中的数据同步到redis中。
  编写 gearman 的 worker 端
  # vim worker.php
DSC00010.png

  文件中的$redis->set($work->id, $work->name);  这条语句就是将 id 作 KEY 和
  name 作 VALUE 分开存储,需要和前面写的 php 测试代码的存取一致。
  # nohup php worker.php &     //后台运行 worker
  更新 mysql 中的数据
  mysql> update test set name=‘redhat' where id=1;
  查看 redis
  # redis-cli
  > get 1
  "redhat"
  刷新测试页面数据同步
DSC00011.png

  Redis的主从同步和“哨兵”机制
  主从同步:
  令server4为主机,server5和server6为从机,都安装redis
  在主机上
  #vim /etc/redis/6379.conf
  在slaveof 下面添加主机ip+端口
  Slaveof 172.25.0.4 6379
  #/etc/init.d/redis_6379 restart
  在从机上执行一样的操作
  然后,在Server6上
  #redis-cli
  >get 1
DSC00012.png

  表明Server4的redis数据同步到servef6上
  Redis的sentinel(哨兵)
  sentinel哨兵是集群管理工具,主要负责主从切换
  Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端)都没有实现自动进行主备切换,而Redis-sentinel本身也是一个独立运行的进程,它能监控多个master-slave集群,发现master宕机后能进行自懂切换。
  Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务:
  ·监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
  ·提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
  ·自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。
  Redis Sentinel 是一个分布式系统, 你可以在一个架构中运行多个 Sentinel 进程(progress), 这些进程使用流言协议(gossip protocols)来接收关于主服务器是否下线的信息, 并使用投票协议(agreement protocols)来决定是否执行自动故障迁移, 以及选择哪个从服务器作为新的主服务器。
  虽然 Redis Sentinel 释出为一个单独的可执行文件 redis-sentinel , 但实际上它只是一个运行在特殊模式下的 Redis 服务器, 你可以在启动一个普通 Redis 服务器时通过给定 --sentinel 选项来启动 Redis Sentinel 。
  在server4上,
  #cd redis-3.0.2
  #vim sentinel.conf
  添加下列配置:
  sentinel monitor mymaster 172.25.0.4 6379 2  (2表示2个从机)
  sentinel down-after-milliseconds resque 10000      // 指定了 Sentinel 认为服务器已经断线所需的毫秒数(判定为主观下线SDOWN)。
  sentinel parallel-syncs mymaster 1  //指定了在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步, 这个数字越小, 完成故障转移所需的时间就越长,但越大就意味着越多的从服务器因为复制而不可用。可以通过将这个值设为 1 来保证每次只有一个从服务器处于不能处理命令请求的状态。
  sentinel failover-timeout mymaster 3000  //故障转移延迟,单位ms
  这里有两个对服务器下线的判断:
  主观下线(Subjectively Down, 简称 SDOWN)指的是单个 Sentinel 实例对服务器做出的下线判断。
  客观下线(Objectively Down, 简称 ODOWN)指的是多个 Sentinel 实例在对同一个服务器做出 SDOWN 判断, 并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后, 得出的服务器下线判断。
  客观下线条件只适用于主服务器: 对于任何其他类型的 Redis 实例, Sentinel 在将它们判断为下线前不需要进行协商, 所以从服务器或者其他 Sentinel 永远不会达到客观下线条件。
  只要一个 Sentinel 发现某个主服务器进入了客观下线状态, 这个 Sentinel 就可能会被其他 Sentinel 推选出, 并对失效的主服务器执行自动故障迁移操作。
  #grep -v ^# sentinel.conf  //显示内容,过滤开头的#
DSC00013.png

  可看出sentinel的端口为26379.
  #grep -v ^# sentinel.conf > /etc/sentinel.conf    //生成etc下的sentinel.conf
  将该文件发送给两从机,从机并都启动redis服务
  在从机上
  #/etc/init.d/redis_6379 start
  #redis-sentinel /etc/sentinel.conf
  #redis-cli -h 172.25.0.4 -p 26379 info      //显示redis详细信息
DSC00014.png

  停掉主机server4的redis服务,sentinel会自动从从机中选出新的主机
DSC00015.png

  由图可看出,sentinel通过投票机制选出server6为新的主机。



运维网声明 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.iyunv.com/thread-630876-1-1.html 上篇帖子: nginx+tomcat+redis实现负载均衡、动静分离、session共享 下篇帖子: (二十)企业部分之redis-Linux整理
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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