redis cluster && Redis 作 mysql 的缓存服务器

系统运维 waitig 513℃ 百度已收录 0评论

一、redis cluster

本文示例的redis源码目录为/redis-4.0.1
所有的redis实例(总共8个)均在一台主机上开启,所以务必加大内存
因为安装cluster需要用到ruby,所以请确保系统中有ruby
这里写图片描述

1. 安装ruby redis 扩展包

[root@rhel65-lockey1 ~]# yum install rubygems-1.3.7-1.el6.noarch.rpm -y

[root@rhel65-lockey1 ~]# gem install –local redis-3.3.1.gem
[root@rhel65-lockey1 redis-4.0.1]# gem list

*** LOCAL GEMS ***

redis (3.3.1)

2. 了解redis-trib.rb脚本
该脚本在redis源码包位置:/redis-4.0.1/src/redis-trib.rb
为了方便使用执行以下命令:

cp /redis-4.0.1/src/redis-trib.rb /usr/local/sbin

用法查看:
[root@rhel65-lockey1 ~]# redis-trib.rb

Usage: redis-trib <command> <options> <arguments ...>

  fix             host:port
                  --timeout <arg>
  call            host:port command arg arg .. arg
  reshard         host:port
                  --slots <arg>
                  --yes
                  --from <arg>
                  --pipeline <arg>
                  --timeout <arg>
                  --to <arg>
  del-node        host:port node_id
  check           host:port
  rebalance       host:port
                  --threshold <arg>
                  --simulate
                  --pipeline <arg>
                  --use-empty-masters
                  --auto-weights
                  --weight <arg>
                  --timeout <arg>
  info            host:port
  help            (show this help)
  set-timeout     host:port milliseconds
  add-node        new_host:new_port existing_host:existing_port
                  --master-id <arg>
                  --slave
  create          host1:port1 ... hostN:portN
                  --replicas <arg>
  import          host:port
                  --copy
                  --from <arg>
                  --replace

3. 创建实例目录并编写配置文件:

[root@rhel65-lockey1 redis_cluster]# mkdir -p /usr/local/redis_cluster/3000{1..8}
[root@rhel65-lockey1 redis_cluster]# vim 3000{1..8}/redis.conf

daemonize yes
pidfile /usr/local/redis_cluster/3000{1..8}/redis.pid
logfile /usr/local/redis_cluster/3000{1..8}/redis.log
port 3000{1..8}
dir /usr/local/redis_cluster/3000{1..8}
cluster-enabled yes
cluster-config-file cluster.conf
cluster-node-timeout 10000
appendonly yes

[root@rhel65-lockey1 redis_cluster]# redis-server 3000{1..6}/redis.conf

创建集群

[root@rhel65-lockey1 redis_cluster]# redis-trib.rb create –replicas 1 127.0.0.1:30001 127.0.0.1:30002 127.0.0.1:30003 127.0.0.1:30004 127.0.0.1:30005 127.0.0.1:30006

这里写图片描述
这里写图片描述

查看集群信息
[root@rhel65-lockey1 redis_cluster]# redis-trib.rb info 127.0.0.1:30001
这里写图片描述
16383槽位必须完整,要不然集群就会down掉(知道什么意思马)

连接到实例进行操作
redis-cli -c -p 30001
这里写图片描述
redis-trib.rb check 127.0.0.1:30001
这里写图片描述
添加实例
[root@rhel65-lockey1 redis_cluster]# redis-trib.rb add-node 127.0.0.1:30007 127.0.0.1:30006

#均衡槽位 需注意use-empty-masters参数
#刚加入的节点槽位为0,需要重新分配槽位

[root@rhel65-lockey1 redis_cluster]# redis-trib.rb rebalance --threshold 1 --use-empty-masters 127.0.0.1:30001

这里写图片描述

添加实例并且设置master

[root@rhel65-lockey1 redis_cluster]# redis-trib.rb add-node --slave --master-id 55395a73776b1a3f3fab441d4139e271611d95a1 127.0.0.1:30008 127.0.0.1:30001

16383槽位必须完整,要不然集群就会down掉,可以试着干掉集群中的一些master,只要所有master的slot值加起来不够16383则连接到集群进行操作后会提示服务DOWN掉了,无法进行操作

二、redis作为mysql的缓存

主机环境(rhel65 x86_64bit):

172.25.5.91 LNMP
172.25.5.92 安装好redis之后基本不用进行其他操作,配置参数设置bind:0.0.0.0
 CONFIG GET *
172.25.5.93 mysql

本实验各软件版本:

nginx-1.12.1.tar.gz
php-5.3.3-38.el6.x86_64
redis-4.0.1
mysql-server-5.1.71-1.el6.x86_64

1.mysql(172.25.5.93)端加好测试数据并做好授权
mysql> grant all on test.* to redis@”%” identified by “lockey23”;

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');

2.php的redis扩展模块添加
172.25.5.91,首先确保lnmp架构已经OK了

https://github.com/owlient/phpredis

[root@rhel65-lockey1 ~]# unzip phpredis-master.zip

[root@rhel65-lockey1 ~]# cd phpredis-master

[root@rhel65-lockey1 phpredis-master]# phpize

[root@rhel65-lockey1 phpredis-master]# ./configure
[root@rhel65-lockey1 phpredis-master]# make && make install

[root@rhel65-lockey1 phpredis-master]# cp /etc/php.d/mysql.ini redis.ini
[root@rhel65-lockey1 phpredis-master]# cd /usr/lib64/php/modules/

[root@rhel65-lockey1 php.d]# cat redis.ini
; Enable mysql extension module
extension=redis.so

或者:

# vim /etc/php.ini
#添加以下行
extension=redis.so

重新启动php-fpm加载新加模块
[root@rhel65-lockey1 php.d]# /etc/init.d/php-fpm restart

vim /usr/local/nginx/html/test.php#数据测试页

<?php
        $redis = new Redis();
        $redis->connect('172.25.5.92',6379) or die ("could net connect redis server");
  #      $query = "select * from test limit 9";
        $query = "select * from test";
        for ($key = 1; $key < 10; $key++)
        {
                if (!$redis->get($key))
                {
                        $connect = mysql_connect('172.25.5.93','redis','lockey23');
                        mysql_select_db(test);
                        $result = mysql_query($query);
                        //如果没有找到$key,就将该查询sql的结果缓存到redis
                        while ($row = mysql_fetch_assoc($result))
                        {
                                $redis->set($row['id'],$row['name']);
                        }
                        $myserver = 'mysql';
                        break;
                }
else
                {
                        $myserver = "redis";
                        $data[$key] = $redis->get($key);
                }
        }

        echo $myserver;
        echo "<br>";
        for ($key = 1; $key < 10; $key++)
        {
                echo "number is <b><font color=#FF0000>$key</font></b>";

                echo "<br>";

                echo "name is <b><font color=#FF0000>$data[$key]</font></b>";

                echo "<br>";
        }
?>

访问页面可以看到测试数据:
这里写图片描述

以上操作只是通过redis做了一个缓存,而且数据不会自动更新,很显然这样是有问题的,那么下来
数据库触发器同步redis和mysql数据

172.25.5.91

安装 gearman 软件包:

[root@rhel65-lockey1 ] yum install gearman*  libevent* libgearman-* -y

装 php 的 gearman 扩展

[root@rhel65-lockey1 ]  tar zxf gearman-1.1.2.tgz 
[root@rhel65-lockey1 ]  cd gearman-1.1.2
[root@rhel65-lockey1 ]   phpize 
[root@rhel65-lockey1 ]   ./configure 
[root@rhel65-lockey1 ]   make && make install
[root@rhel65-lockey1 redis-lamp]# cat /etc/php.ini | grep gearman#添加扩展
extension=gearman.so
[root@rhel65-lockey1 redis-lamp]# /etc/init.d/php-fpm restart
[root@rhel65-lockey1 redis-lamp]# vim worker.php 

这里写图片描述
这里写图片描述
[root@rhel65-lockey1 redis-lamp]# nohup php worker.php &

172.25.5.93

安装 lib_mysqludf_json

yum install -y mysql-devel
unzip lib_mysqludf_json-master.zip

mysql> show global variables like ‘plugin_dir’;
CREATE FUNCTION json_object RETURNS STRING SONAME ‘lib_mysqludf_json.so’;

# cd lib_mysqludf_json-master
gcc $(mysql_config –cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c

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;

安装 gearman-mysql-udf
先解决依赖:
yum install libgearman-devel-1.1.8-2.el6.x86_64.rpm libevent* libgearman-1.1.8-2.el6.x86_64.rpm -y

20 tar -zxvf gearman-mysql-udf-0.6.tar.gz
21 cd gearman-mysql-udf-0.6

24 ./configure –with-mysql –libdir=/usr/lib64/mysql/plugin/

[root@rhel65-lockey3 ~]#

cd gearman-mysql-udf-0.6
35 ./configure –with-mysql –libdir=/usr/lib64/mysql/plugin/
36 make && make install

注册 UDF 函数
CREATE FUNCTION gman_do_background RETURNS STRING SONAME ‘libgearman_mysql_udf.so’;

CREATE FUNCTION gman_servers_set RETURNS STRING SONAME ‘libgearman_mysql_udf.so’;

指定 gearman 的服务信息
mysql> select gman_servers_set(‘172.25.5.91:4730’);
+————————————–+
| gman_servers_set(‘172.25.5.91:4730’) |
+————————————–+
| 172.25.5.91:4730 |
+————————————–+
1 row in set (0.00 sec)

编写 mysql 触发器

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> SHOW TRIGGERS FROM test;
这里写图片描述

往数据库中插入数据然后刷新页面查看
这里写图片描述


本文由【waitig】发表在等英博客
本文固定链接:redis cluster && Redis 作 mysql 的缓存服务器
欢迎关注本站官方公众号,每日都有干货分享!
等英博客官方公众号
点赞 (0)分享 (0)