Redis3.2.4 Cluster集群搭建

服务器环境:
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

  1. <?php
  2. require 'predis/autoload.php';//引入predis相关包
  3. //redis实例
  4. $servers = array(
  5. 'tcp://192.168.3.229:7000',
  6. 'tcp://192.168.3.229:7001',
  7. 'tcp://192.168.3.229:7002',
  8. 'tcp://192.168.3.193:7003',
  9. 'tcp://192.168.3.193:7004',
  10. 'tcp://192.168.3.193:7005',
  11. );
  12. $client = new Predis\Client($servers, array('cluster' => 'redis'));
  13. $client->set("name1", "11");
  14. $client->set("name2", "22");
  15. $client->set("name3", "33");
  16. $name1 = $client->get('name1');
  17. $name2 = $client->get('name2');
  18. $name3 = $client->get('name3');
  19. var_dump($name1, $name2, $name3);die;
  20. ?>

name1,name2,name3是3个key,按照算法分配到3个slot上,有可能分到3台服务器上

首先运行predis.php查看结果:

然后登录到redis客户端进行集群验证:

server1

  1. [root@localhost src]# redis-cli -c -p 7000
  2. 127.0.0.1:7000> get name1
  3. -> Redirected to slot [12933] located at 192.168.1.199:7004
  4. "11"
  5. 192.168.1.199:7004> get name2
  6. -> Redirected to slot [742] located at 192.168.1.199:7003
  7. "22"
  8. 192.168.1.199:7003> get name3
  9. "33"
  10. 192.168.1.199:7003>

server2

  1. [root@localhost src]# redis-cli -c -p 7003
  2. 127.0.0.1:7003> get name1
  3. -> Redirected to slot [12933] located at 192.168.1.199:7004
  4. "11"
  5. 192.168.1.199:7004> get name2
  6. -> Redirected to slot [742] located at 192.168.1.199:7003
  7. "22"
  8. 192.168.1.199:7003> get name3
  9. "33"
  10. 192.168.1.199:7003>

可以看到数据分布在各个服务器上,可以根据ps -ef | grep redis,杀掉其中几个redis实例,再看效果

参考文献: redis集群教程   、php操作redis cluster集群成功实例

redis集群PHP解决方案的更多相关文章

  1. Redis 集群解决方案比较

    调研比较了三个Redis集群的解决方案: 系统 贡献者 是否官方Redis实现 编程语言 Twemproxy Twitter 是 C Redis Cluster Redis官方 是 C Codis 豌 ...

  2. 为什么Redis集群要使用反向代理?

    为什么要使用反向代理? 如果没有方向代理,一台Redis可能需要跟很多个客户端连接: 看着是不是很慌?看没关系,主要是连接需要消耗线程资源,没有代理的话,Redis要将很大一部分的资源用在与客户端建立 ...

  3. Linux 下Redis集群安装部署及使用详解(在线和离线两种安装+相关错误解决方案)

    一.应用场景介绍 本文主要是介绍Redis集群在Linux环境下的安装讲解,其中主要包括在联网的Linux环境和脱机的Linux环境下是如何安装的.因为大多数时候,公司的生产环境是在内网环境下,无外网 ...

  4. 记录redis集群连接超时问题及解决方案

    下午同事反馈,某业务场景性能测试过程中,出现异常,提供日志报: Redis command timed out 1. 先看下日志 org.springframework.dao.QueryTimeou ...

  5. Redis Sentinel:集群Failover解决方案(转载)

    本文转载自:http://shift-alt-ctrl.iteye.com/blog/1884370 文中的配置例子,还有failover过程中触发的订阅事件具有很好的参考价值. Redis sent ...

  6. Redis-Sentinel(Redis集群监控管理)

    Redis的高可用方案的实现:主从切换以及虚拟IP或客户端 从Redis 2.8开始加入对Sentinel机制从而实现了服务器端的主从切换,但目前尚未发现实现虚拟IP或客户端切换方案 Redis-Se ...

  7. Redis集群最佳实践

    今天我们来聊一聊Redis集群.先看看集群的特点,我对它的理解是要需要同时满足高可用性以及可扩展性,即任何时候对外的接口都要是基本可用的并具备一定的灾备能力,同时节点的数量能够根据业务量级的大小动态的 ...

  8. 就publish/subscribe功能看redis集群模式下的队列技术(一)

    Redis 简介 Redis 是完全开源免费的,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中 ...

  9. Redis集群部署

    1.1.1redis简介 Redis 是一个开源的使用 ANSI C 语言编写.支持网络.可基于内存亦可持久化的日志 型. Key-Value数据库 1.1.2redis常见使用场景 1.会话缓存(S ...

随机推荐

  1. 17 rest-framework框架的基本组件

    序列化 创建一个序列化类 简单使用 开发我们的Web API的第一件事是为我们的Web API提供一种将代码片段实例序列化和反序列化为诸如json之类的表示形式的方式.我们可以通过声明与Django ...

  2. 9.5web service基础知识

    Web服务基础 用户访问网站的基本流程 我们每天都会用web客户端上网,浏览器就是一个web客户端,例如谷歌浏览器,以及火狐浏览器等. 当我们输入www.oldboyedu.com/时候,很快就能看到 ...

  3. 从库函数操作RCC的流程来理解偏移变量

    下面是库函数操作RCC流程,看完后有我的疑问:偏移地址的理解 1,库函数直接操作:RCC库函数操作  RCC_APB2PeriphClockCmd ()RCC->APB2ENR |= RCC_A ...

  4. 分别用反射、编程接口的方式创建DataFrame

    1.通过反射的方式 使用反射来推断包含特定数据类型的RDD,这种方式代码比较少,简洁,只要你会知道元数据信息时什么样,就可以使用了 代码如下: import org.apache.spark.sql. ...

  5. 《Cracking the Coding Interview》——第4章:树和图——题目6

    2014-03-19 04:16 题目:找出一棵二叉搜索树中的中序遍历后继节点,每个节点都有指针指向其父节点. 解法1:分两种情况:向下走时,先右后左:向上走时,先左后右.如果目标节点有右子树,就向右 ...

  6. 玩转Openstack之Nova中的协同并发(二)

    玩转Openstack之Nova中的协同并发(二) 昨天介绍了Python中的并发处理,主要介绍了Eventlet,今天就接着谈谈Openstack中Nova对其的应用. eventlet 在nova ...

  7. Pacemaker、corosync

    pacemaker详细介绍: http://blog.51cto.com/freeloda/1274533 corosync详细介绍: http://blog.51cto.com/freeloda/1 ...

  8. Mysql DISTINCT问题

    问题描述 因为要设计一个数据库表,进行一个倒序去重的操作. 例如: id Name 1 B 2 A 3 A 4 C 5 C 6 B 场景:例如说我们需要得到一个用户的搜索记录,那么肯定不会仅仅根据时间 ...

  9. java的四种内部类(转)

    一般来说,有4中内部类:常规内部类.静态内部类.局部内部类.匿名内部类. 一.常规内部类:常规内部类没有用static修饰且定义在在外部类类体中.  1.常规内部类中的方法可以直接使用外部类的实例变量 ...

  10. linux 出错 “INFO: task xxxxxx: 634 blocked for more than 120 seconds.”的3种解决方案(转)

    linux 出错 “INFO: task xxxxxx: 634 blocked for more than 120 seconds.”的3种解决方案 1 问题描述 服务器内存满了,ssh登录失败 , ...