redis集群PHP解决方案
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
- <?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 集群解决方案比较
调研比较了三个Redis集群的解决方案: 系统 贡献者 是否官方Redis实现 编程语言 Twemproxy Twitter 是 C Redis Cluster Redis官方 是 C Codis 豌 ...
- 为什么Redis集群要使用反向代理?
为什么要使用反向代理? 如果没有方向代理,一台Redis可能需要跟很多个客户端连接: 看着是不是很慌?看没关系,主要是连接需要消耗线程资源,没有代理的话,Redis要将很大一部分的资源用在与客户端建立 ...
- Linux 下Redis集群安装部署及使用详解(在线和离线两种安装+相关错误解决方案)
一.应用场景介绍 本文主要是介绍Redis集群在Linux环境下的安装讲解,其中主要包括在联网的Linux环境和脱机的Linux环境下是如何安装的.因为大多数时候,公司的生产环境是在内网环境下,无外网 ...
- 记录redis集群连接超时问题及解决方案
下午同事反馈,某业务场景性能测试过程中,出现异常,提供日志报: Redis command timed out 1. 先看下日志 org.springframework.dao.QueryTimeou ...
- Redis Sentinel:集群Failover解决方案(转载)
本文转载自:http://shift-alt-ctrl.iteye.com/blog/1884370 文中的配置例子,还有failover过程中触发的订阅事件具有很好的参考价值. Redis sent ...
- Redis-Sentinel(Redis集群监控管理)
Redis的高可用方案的实现:主从切换以及虚拟IP或客户端 从Redis 2.8开始加入对Sentinel机制从而实现了服务器端的主从切换,但目前尚未发现实现虚拟IP或客户端切换方案 Redis-Se ...
- Redis集群最佳实践
今天我们来聊一聊Redis集群.先看看集群的特点,我对它的理解是要需要同时满足高可用性以及可扩展性,即任何时候对外的接口都要是基本可用的并具备一定的灾备能力,同时节点的数量能够根据业务量级的大小动态的 ...
- 就publish/subscribe功能看redis集群模式下的队列技术(一)
Redis 简介 Redis 是完全开源免费的,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中 ...
- Redis集群部署
1.1.1redis简介 Redis 是一个开源的使用 ANSI C 语言编写.支持网络.可基于内存亦可持久化的日志 型. Key-Value数据库 1.1.2redis常见使用场景 1.会话缓存(S ...
随机推荐
- Kali2017 Metasploit连接postgresql数据库
msfdb:msf数据库管理命令 1.查看msf数据库连接状态 msf > db_status [*] postgresql selected, no connection //未连接 2.ms ...
- Enhacing the content with JavaScript
What not to do : In theory , you could use JavaScript to add important content to a web page. Howev ...
- ionic2升级到ionic3并打包APK
通过IONIC2升级到3的时候,经过我一系列的测试,以及网上各种办法,现将新测有效的方法记录如下,本人按如下方法,对多个项目升级后,都能正常打包成APK IONIC 2到3的升级: 1.拷贝ionic ...
- 开启虚拟机所报的错误:VMware Workstation cannot connect to the virtual machine. Make sure you have rights to run the program, access all directories the program uses, and access all directories for temporary fil
当我们开启虚拟机时出现错误: VMware Workstation cannot connect to the virtual machine. Make sure you have rights t ...
- 【活动】参加葡萄城控件主办的“谁是报表达人”知识评测活动,赢取iPad Mini2
一.参与资格 从事报表开发的博客园用户 二.活动时间 4月1日-4月30日 三. 活动形式 在活动期间,活动参与者只要回答从题库中随机抽出的与报表相关的六道题,就可以知道自己的报表知识等级.同时活动主 ...
- PyCharm 解决有些库(函数)没有代码提示
问题描述: 如图,当输入 im. 没有智能提示第三库相应的函数或其他提示. 解决方案: python是动态强类型语言,IDE无法判断Image.open("panda.png")的 ...
- Python 3基础教程7-if语句
前面文章介绍的循环语句,这里开始介绍控制语句.直接看下面的demo.py例子 # 这里介绍 if语句 x = 5y = 8z = 4s = 5 if x < y: print('x is les ...
- Lua3
Lua中的table不是一种简单的数据结构,它可以作为其它数据结构的基础.如数组.记录.线性表.队列和集合等,在Lua中都可以通过table来表示. 1.数组 使用整数来索引table即可在Lua中实 ...
- Code Blocks中配置OpenGL方法
关于在Code Blocks中配置OpenGL的方法,在网上一直没有找到实用的方法,后来在马龙师兄的帮助下终于配置成功了,现把配置过程记录如下. (1)下载codeblocks,最好是带mingw的版 ...
- [Leetcode/Javascript] 461.Hamming Distance
[Leetcode/Javascript] 461.Hamming Distance 题目 The Hamming distance between two integers is the numbe ...