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

来源:互联网 发布:linux中sed命令详解 编辑:程序博客网 时间:2024/06/15 00:42

一、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 yespidfile /usr/local/redis_cluster/3000{1..8}/redis.pidlogfile /usr/local/redis_cluster/3000{1..8}/redis.logport 3000{1..8}dir /usr/local/redis_cluster/3000{1..8}cluster-enabled yescluster-config-file cluster.confcluster-node-timeout 10000appendonly 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 LNMP172.25.5.92 安装好redis之后基本不用进行其他操作,配置参数设置bind:0.0.0.0 CONFIG GET *172.25.5.93 mysql

本实验各软件版本:

nginx-1.12.1.tar.gzphp-5.3.3-38.el6.x86_64redis-4.0.1mysql-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;
这里写图片描述

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

阅读全文
0 0