一、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;
往数据库中插入数据然后刷新页面查看