服务器环境:
192.168.3.229
192.168.3.193
每台服务器搭建3个节点,组成3个主节点,3个从节点的redis集群。
注意:防火墙一定要开放监听的redis端口,否则会创建失败。
一、redis cluster安装
1、下载和编译安装
cd /usr/local/src wget http://download.redis.io/releases/redis-3.2.4.tar.gz tar -zxvf redis-3.2.4.tar.gz cd redis-3.2.4/ make && make install
2、创建redis节点
选择2台服务器,分别为:192.168.3.229,192.168.3.193,每台服务器有3个节点,组成3个主节点,3个从节点的redis集群。
a、首先在192.168.3.229创建3个节点:
cd /usr/local/src mkdir redis_cluster #创建集群目录 cd redis_cluster/ mkdir 7000 7001 7002 #分别代表三个节点,对应端口分别为7000、7001、7002 #redis.conf拷贝到7000目录 cp redis-3.2.4/redis.conf redis_cluster/7000/ #redis.conf拷贝到7001目录 cp redis-3.2.4/redis.conf redis_cluster/7001/ #redis.conf拷贝到7002目录 cp redis-3.2.4/redis.conf redis_cluster/7002/
b、分别对7000、7001,7002文件夹中的3个redis.conf文件修改对应的配置:
daemonize yes #redis后台运行 pidfile /var/run/redis_7000.pid #pidfile文件对应7000, 7001, 7002 port 7000 #端口7000, 7001, 7002 cluster-enabled yes #开启集群 把注释#去掉 cluster-config-file nodes_7000.conf #集群的配置 配置文件首次启动自动生成 7000,7001,7002,存在/usr/local/src/redis-3.2.4/src目录 cluster-node-timeout 5000 #请求超时,设置5秒即可 appendonly yes #aof日志开启,有需要就开启,它会每次写操作都记录一条日志 logfile "/home/xm6f/dev/redis_cluster/7000/logs/redis.log" bind 192.168.1.105 #绑定当前服务器的IP,否则的话在集群通信的时候会出现:[ERR] Sorry, can't connect to node 192.168.200.140:7001
dbfilename dump_7000.rdb #存在/home/xm6f/dev/redis-3.2.4/src目录
appendfilename "appendonly_7000.aof" #存在/home/xm6f/dev/redis-3.2.4/src目录
requirepass 123456 #设置密码,每个节点的密码都必须一致的
masterauth 123456
在192.168.3.193创建3个节点:对应的端口改为7003,7004,7005.配置对应的改一下就可以了。
3、两台机器启动各节点(两台服务器方式一样)
cd /usr/local/src/ redis-server /usr/local/src/redis-3.2.4/redis_cluster/7000/redis.conf redis-server /usr/local/src/redis-3.2.4/redis_cluster/7001/redis.conf redis-server /usr/local/src/redis-3.2.4/redis_cluster/7002/redis.conf redis-server /usr/local/src/redis-3.2.4/redis_cluster/7003/redis.conf redis-server /usr/local/src/redis-3.2.4/redis_cluster/7004/redis.conf redis-server /usr/local/src/redis-3.2.4/redis_cluster/7005/redis.conf
4、查看服务
ps -ef | grep redis #查看是否启动成功 netstat -tnlp | grep redis #可以看到redis监听端口
5、杀死所有redis进程
pkill -9 redis
二、创建集群
前面已经准备好了搭建集群的redis节点,接下来我们要把这些节点都串连起来搭建集群。官方提供了一个工具:redis-trib.rb(/home/xm6f/dev/redis-3.2.4/src/redis-trib.rb) 看后缀就知道这东西不能直接执行,它是用ruby写的一个程序,所以我们还得安装ruby.
yum -y install ruby ruby-devel rubygems rpm-build
再用 gem 这个命令来安装 redis 接口,gem是ruby的一个工具包。
gem install redis //等一会儿就好了
当然,方便操作,两台Server都要安装。
注意:在执行gem install redis时,报ERROR:Error installing redis:redis requires Ruby version >= 2.2.2异常。
点击此处查看解决方案
上面的步骤完事了,接下来运行一下redis-trib.rb
redis-trib.rb
确认所有的节点都启动,接下来使用参数 create 创建 (在192.168.1.160中来创建)
redis-trib.rb create --replicas 1 192.168.3.229:7000 192.168.3.229:7001 192.168.3.229:7002 192.168.3.193:7003 192.168.3.193:7004 192.168.3.193:7005
注意:
a、--replicas 1参数表示为每个主节点创建一个从节点,其他参数是实例的地址集合。
b、防火墙一定要开放监听的端口,否则会创建失败。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
[root@localhost redis-cluster]
redis-trib.rb create --replicas 1 192.168.3.229:7000 192.168.3.229:7001 192.168.3.229:7002 192.168.3.193:7003 192.168.3.193:7004 192.168.3.193:7005 >>> Creating cluster
>>> Performing
hash
slots allocation on 6 nodes...
Using 3 masters:
127.0.0.1:7001
127.0.0.1:7002
127.0.0.1:7003
Adding replica 127.0.0.1:7004 to 127.0.0.1:7001
Adding replica 127.0.0.1:7005 to 127.0.0.1:7002
Adding replica 127.0.0.1:7006 to 127.0.0.1:7003
M: dfd510594da614469a93a0a70767ec9145aefb1a 127.0.0.1:7001
slots:0-5460 (5461 slots) master
M: e02eac35110bbf44c61ff90175e04d55cca097ff 127.0.0.1:7002
slots:5461-10922 (5462 slots) master
M: 4385809e6f4952ecb122dbfedbee29109d6bb234 127.0.0.1:7003
slots:10923-16383 (5461 slots) master
S: ec02c9ef3acee069e8849f143a492db18d4bb06c 127.0.0.1:7004
replicates dfd510594da614469a93a0a70767ec9145aefb1a
S: 83e5a8bb94fb5aaa892cd2f6216604e03e4a6c75 127.0.0.1:7005
replicates e02eac35110bbf44c61ff90175e04d55cca097ff
S: 10c097c429ca24f8720986c6b66f0688bfb901ee 127.0.0.1:7006
replicates 4385809e6f4952ecb122dbfedbee29109d6bb234
Can I
set
the above configuration? (
type
'yes'
to accept):
yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to
join
the cluster
Waiting
for
the cluster to
join
......
>>> Performing Cluster Check (using node 127.0.0.1:7001)
M: dfd510594da614469a93a0a70767ec9145aefb1a 127.0.0.1:7001
slots:0-5460 (5461 slots) master
M: e02eac35110bbf44c61ff90175e04d55cca097ff 127.0.0.1:7002
slots:5461-10922 (5462 slots) master
M: 4385809e6f4952ecb122dbfedbee29109d6bb234 127.0.0.1:7003
slots:10923-16383 (5461 slots) master
M: ec02c9ef3acee069e8849f143a492db18d4bb06c 127.0.0.1:7004
slots: (0 slots) master
replicates dfd510594da614469a93a0a70767ec9145aefb1a
M: 83e5a8bb94fb5aaa892cd2f6216604e03e4a6c75 127.0.0.1:7005
slots: (0 slots) master
replicates e02eac35110bbf44c61ff90175e04d55cca097ff
M: 10c097c429ca24f8720986c6b66f0688bfb901ee 127.0.0.1:7006
slots: (0 slots) master
replicates 4385809e6f4952ecb122dbfedbee29109d6bb234
[OK] All nodes agree about slots configuration.
>>> Check
for
open
slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
|
上面显示创建成功,有3个主节点,3个从节点,每个节点都是成功连接状态。
php操作redis cluster集群成功实例
PHP要操作redis cluster集群有两种方式:
1、使用phpredis扩展,这是个c扩展,性能更高,但是phpredis2.x扩展不行,需升级phpredis到3.0,但这个方案参考资料很少
2、使用predis,纯php开发,使用了命名空间,需要php5.3+,灵活性高
我用的是predis,下载地址https://github.com/nrk/predis/zipball/master
下载好后重命名为predis,
server1:192.168.3.229
server2:192.168.3.193
predis.php
- <?php
- require 'predis/autoload.php';//引入predis相关包
- //redis实例
- $servers = array(
- 'tcp://192.168.3.229:7000',
- 'tcp://192.168.3.229:7001',
- 'tcp://192.168.3.229:7002',
- 'tcp://192.168.3.193:7003',
- 'tcp://192.168.3.193:7004',
- 'tcp://192.168.3.193:7005',
- );
- $client = new Predis\Client($servers, array('cluster' => 'redis'));
- $client->set("name1", "11");
- $client->set("name2", "22");
- $client->set("name3", "33");
- $name1 = $client->get('name1');
- $name2 = $client->get('name2');
- $name3 = $client->get('name3');
- var_dump($name1, $name2, $name3);die;
- ?>
name1,name2,name3是3个key,按照算法分配到3个slot上,有可能分到3台服务器上
首先运行predis.php查看结果:
然后登录到redis客户端进行集群验证:
server1
- [root@localhost src]# redis-cli -c -p 7000
- 127.0.0.1:7000> get name1
- -> Redirected to slot [12933] located at 192.168.1.199:7004
- "11"
- 192.168.1.199:7004> get name2
- -> Redirected to slot [742] located at 192.168.1.199:7003
- "22"
- 192.168.1.199:7003> get name3
- "33"
- 192.168.1.199:7003>
server2
- [root@localhost src]# redis-cli -c -p 7003
- 127.0.0.1:7003> get name1
- -> Redirected to slot [12933] located at 192.168.1.199:7004
- "11"
- 192.168.1.199:7004> get name2
- -> Redirected to slot [742] located at 192.168.1.199:7003
- "22"
- 192.168.1.199:7003> get name3
- "33"
- 192.168.1.199:7003>
可以看到数据分布在各个服务器上,可以根据ps -ef | grep redis,杀掉其中几个redis实例,再看效果
参考文献: redis集群教程 、php操作redis cluster集群成功实例