本文示例的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
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掉了,无法进行操作
主机环境(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
../201807/~0,-4%.html
[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#数据测试页
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 " "; for ($key = 1; $key < 10; $key++) { echo "number is $key"; echo " "; echo "name is $data[$key]"; echo " "; } ?>
访问页面可以看到测试数据:
以上操作只是通过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
../201807/~0,-4%.html
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;
往数据库中插入数据然后刷新页面查看