Redis
集群部署指南
一、 Redis集群方案
Redis集群方案采用Redis3.0支持的redis-cluster集群架构:
架构方案:
1. 所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽;
2. 节点的fail是通过集群中超过半数的节点检测失效时才生效;
3. 客户端与redis节点直连,不需要中间proxy层,客户端不需要连接集群所有的节点,连接集群中任何一个可用的节点即可。
4. redis-cluster把所有的物理节点映射到[0~16383]slot上,cluster负责维护node<->slot<->value。
容错机制:
1. redis-cluster的容错机制是通过选举产生master,选择过程是集群中所有的master参与,如果半数以上的master节点与master节点的通信超时(cluster-node-timeout),则认为当前master节点挂掉。
什么时候整个集群不可用(cluster_state:fail),当集群不可用时,所有对集群的操作均不可用,收到ERRORQ错误。
二、 环境准备
1 服务器
2 服务器设置
Step1. 将6379端口在防火墙看开启:
[root@redis1 ~]# vi /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp--dport 6379 -j ACCEPT
注:必须加在REJECT前面。
Step 2. 修改Selinux参数:
[root@redis1 ~]# vi /etc/selinux/config
SELINUX=disabled
注:分别在其它几个节点上同样配置防火墙和SELINUX。
三、 软件准备
注:本文中演示的Redis版本为Redis 3.2.6(生产上实际使用3.2.8),通用于Redis 3.x的所有版本,如果Redis版本为2.x的,则有所不同。
PS: 开发和生产环境,分别有HTTP服务,目前已经将安装包部署在该HTTP服务器上,可以直接从HTTP服务器上下载:
生产环境:
wget
http://download.cloud.pub/redis/redis-3.2.8.tar.gz
开发(测试)环境:
wget http://portal-doc.paic.com.cn/redis/redis-3.2.8.tar.gz
四、 安装Redis
1 安装系统组件
Step 1. 安装gcc
[root@redis1 ~]# yum install –y gcc-c++
Step 2. 安装tcl
[root@redis1 ~]# yum install –y tcl
2 安装Redis
Step 1. 解压Redis到/usr/local目录下
[root@redis1 ~]# tar -zxvf/root/software/redis-3.2.6.tar.gz -C /usr/local/
Step 2. 在解压后的目录中进行make和make test
[root@redis1 ~]# cd /usr/local/redis-3.2.6
[root@redis1 redis-3.2.6]# make
[root@redis1 redis-3.2.6]# make test
注:要检查make和make test的结果是否都正确,如果报错,针对性检查并安装系统缺少的组件。
Step 3. 复制redis-server和redis-cli到/usr/local/bin目录下:
[root@redis1 redis-3.2.6]# cd src
[root@redis1 src]# cp redis-server/usr/local/bin/
[root@redis1 src]# cp redis-cli/usr/local/bin/
Step 3. 验证Redis安装是否成功:
[root@redis1 ~]# redis-server
[root@redis1 ~]# redis-cli
注:安装其它5台服务器,重复本章节的4.1~4.2。
五、 配置集群模式
1 配置redis.conf
Step 1. 配置redis.conf
[root@redis1 ~]# mkdir /etc/redis
[root@redis1 ~]# cd /etc/redis
[root@redis ~]# vi redis.conf
port 6379
daemonize yes
cluster-enabledyes
cluster-config-file/etc/redis/nodes.conf
cluster-node-timeout 5000
appendonly yes
requirepass Ab123456
注1:cluster-node-timeout是集群中各节点相互通讯时,允许“失联”的最大毫秒数,本演示中配置的为5秒,如果超过5秒某个节点没有向其它节点汇报成功,认为该节点挂了。
注2:requirepass是Redis访问密码,为了安全起见,该参数建议必须配置,从但客户端Jedis版本必须使用2.8.x以上的版本,否则需要通过扩展JedisCluster来实现对密码访问的支持。此外几个Redis节点的密码应该设置为相同的。
注3:分别在其它几个节点上创建与上面相同的redis.conf文件,内容也相同。
注4:重启/重建Redis集群时,必须删除去/etc/redis/nodes.conf文件。
Step 2. 以次启动所有节点
[root@redis1 ~]# redis-server/etc/redis/redis.conf
[root@redis2 ~]# redis-server/etc/redis/redis.conf
[root@redis3 ~]# redis-server/etc/redis/redis.conf
[root@redis4 ~]# redis-server/etc/redis/redis.conf
[root@redis5 ~]# redis-server/etc/redis/redis.conf
[root@redis6 ~]# redis-server/etc/redis/redis.conf
2 安装Redis集群所需的Ruby工具
Step 1. 安装Ruby工具:
Redis集群需要借助其它工具将相关节点加入到Cluster中,而这个工具是由Redis提供一个名为redis-trib.rb的ruby脚本,否则接下来创建cluster会失败。
[root@redis1 ~]# cd /usr/local/redis-3.2.6/src
[root@redis1 src]# yum install –y ruby
[root@redis1 src]# yum install -y rubygems
[root@redis1 src]# gem install redis--version 3.0.0
[root@redis1 src]# gem list
Step 2. 设置Ruby连接Redis的密码:
[root@redis1 ~]# vi /usr/lib/ruby/gems/1.8/gems/redis-3.0.0/lib/redis/client.rb
:password => "Ab123456"
注:分别在其它几个节点上用同样的方式安装好Ruby工具。
3 利用redis-trib.rb创建Redis集群
Step 1. 在src目录下运行以下脚本:
[root@redis1 ~]# cd /usr/local/redis-3.2.6/src
[root@redis1 src]# ./redis-trib.rb create --replicas1 10.50.130.101:6379 10.50.130.102:6379 10.50.130.103:6379 10.50.130.104:637910.50.130.105:6379 10.50.130.106:6379
注1:只需在其中某个个节点执行以上脚本(本例在第一个节点执行)。
注2:利用redis-trib创建Cluster,只需要操作一次即可,假设系统关机、重启,把所有的节点全部关闭之后,下次重启后,即自动进入Cluster模式,不用现次执行redis-trib.rb cteate命令。
Step 2. 查看Cluster进程:
[root@redis1 ~]# ps -ef|grep redis
[root@redis2 ~]# ps -ef|grep redis
[root@redis3 ~]# ps -ef|grep redis
[root@redis4 ~]# ps -ef|grep redis
[root@redis5 ~]# ps -ef|grep redis
[root@redis6 ~]# ps -ef|grep redis
Step 3. 查看节点属性(Master/Slave)
[root@redis1 ~]# cd/usr/local/redis-3.2.6/src
[root@redis1 src]# ./redis-trib.rb check10.50.130.101:6379
[root@redis1 src]# ./redis-trib.rb check10.50.130.102:6379
[root@redis1 src]# ./redis-trib.rb check10.50.130.103:6379
[root@redis1 src]# ./redis-trib.rb check10.50.130.104:6379
[root@redis1 src]# ./redis-trib.rb check10.50.130.105:6379
[root@redis1 src]# ./redis-trib.rb check10.50.130.106:6379
Step 4. 查看节点/集群信息
redis-cli客户端登录到任一个节点,查看:
六、 Jedis测试Redis集群
package com.pingan.cloud.redis;
import java.util.HashSet;
import java.util.Set;
importorg.apache.commons.pool2.impl.GenericObjectPoolConfig;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
/**
*@author Simon.Hoo
*@version v1.0.0
*@since JDK1.7
*/
public class RedisTest {
privatestatic JedisCluster cluster;
/**
* @param args
*/
publicstatic void main(String[] args) {
HostAndPorthost1 = new HostAndPort("10.50.130.101", 6379);
HostAndPorthost2 = new HostAndPort("10.50.130.102", 6379);
HostAndPorthost3 = new HostAndPort("10.50.130.103", 6379);
HostAndPorthost4 = new HostAndPort("10.50.130.104", 6379);
HostAndPorthost5 = new HostAndPort("10.50.130.105", 6379);
HostAndPorthost6 = new HostAndPort("10.50.130.106", 6379);
SetjedisClusterNode = new HashSet();
jedisClusterNode.add(host1);
jedisClusterNode.add(host2);
jedisClusterNode.add(host3);
jedisClusterNode.add(host4);
jedisClusterNode.add(host5);
jedisClusterNode.add(host6);
GenericObjectPoolConfigpoolConfig = new GenericObjectPoolConfig();
poolConfig.setMaxWaitMillis(-1);
poolConfig.setMaxTotal(1000);
poolConfig.setMinIdle(8);
poolConfig.setMaxIdle(100);
intconnectionTimeout=10;
intsoTimeout=10;
int maxAttempts = 10;
String password="Ab123456";
cluster= new JedisCluster(jedisClusterNode,connectionTimeout,soTimeout,maxAttempts,password,poolConfig);
cluster.set("abcdefg","1234567890");
System.out.println(cluster.get("abcdefg"));
}
}