redis集群部署
连接集群的时候一定要加-c
即:redis-cli -h 192.168.139.30 -p 7002 -c
1.创建存放redis文件夹: mkdir softwar
2.上传redis包到刚创建softwar中 rz
如果没有rz命令安装
yum
install
-y lrzsz
3.解压redis包 tar -zxvf
redis-3.2.4.
tar
.gz
4.编译安装
cd redis-3.2.4
make
make install(安装到/usr/local/bin/)
5.在redis-3.2.4下创建redis_cluster 目录mkdir redis_cluster
6.在 redis_cluster 目录下,创建名为7000、7001、7002的目录,并将 redis.conf 拷贝到这三个目录中
mkdir 7000 7001 7002
cp redis.conf redis_cluster/7000 cp redis.conf redis_cluster/7001 cp redis.conf redis_cluster/7002
7.分别修改配置文件
port 7000 //端口7000,7002,7003
bind 本机ip //必须绑定本机ip,否则集群无法访问 daemonize yes //redis后台运行 pidfile /var/run/redis_7000.pid //pidfile文件对应7000,7001,7002 cluster-enabled yes //开启集群 把注释#去掉 cluster-config-file nodes_7000.conf //集群的配置 配置文件首次启动自动生成 7000,7001,7002 cluster-node-timeout 15000 //请求超时 默认15秒,可自行设置 appendonly yes //aof日志开启 有需要就开启,它会每次写操作都记录一条日志
8.然后分别在7000,7001,7002启动redis服务
redis-server /software/redis-3.2.4/redis_cluster/7000/redis.conf
redis-server /software/redis-3.2.4/redis_cluster/7001/redis.conf
redis-server /software/redis-3.2.4/redis_cluster/7002/redis.conf
用ps -ef|grep redis 查看三个redis节点都起来了。
9.虽然三个redis节点都以redis-cluster运行了,但是不会自动构建集群的。三者属于“你不认识我,我不认识你”的状态。
此时用redis-cli连接一个redis服务器
redis-cli -h 127.0.0.1 -p 7001
cluster meet:连通其他节点,让彼此认识。
cluster meet 127.0.0.1 7000
cluster meet 127.0.0.1 7002
然后用cluster nodes 查看集群节点已经都connected的。
然后用cluster info 查看集群状态cluster_state:fail 还是失败。
因为redis集群需要设置hash slot
Redis Cluster通过hash slot将数据根据主键来分区,所以一条key-value数据会根据算法自动映射到一个hash slot,但是一个hash slot存储在哪个Redis节点上并不是自动映射的,是需要集群管理者自行分配的。那么我们需要为多少个hash slot分配Redis节点呢?根据源码可知是16384个
10.每个redis节点设置hash slot槽
但是另一个问题又出现了,对于16384个hash slot来说,我们总不能用cluster addslots一个个去分配吧?幸运的是,我们还有另外一种方法来分配hash slot,那就是通过集群配置文件,也就是我们在第三步中配置的cluster-config-file参数,来完成hash slot的分段配置。此时,我们在执行Redis服务器启动的目录下找到名字为nodes-6379.conf的配置文件
nodes-7000.conf 设置0-5000
nodes-7001.conf 设置5001-10000
nodes-7002.conf 设置10001-16383
只在myself的节点上设置自己的槽位。
11.配置完hash slot槽位完,redis服务全部重启,然后通过cluster info查看集群状态是否ok。
12.如果经过以上步骤之后集群状态依然是fail的话,可以重新修改一下三个节点的nodes-6379.conf,将其中所有除myself那一行以外的所有配置行都删除,然后再保存重启服务器即可。
测试下:set foo bar 提示error 说明让去127.0.0.1:7002上去创建,不是redis集群问题,因为redis集群是根据key来计算槽位,然后根据槽位配置来选择存储到那个redis服务器上的。
cluster nodes:查看集群节点
cluster info:查看集群状态
参考的文章:
问题:
1.异常:Too many Cluster redirections?
bind绑定的ip和你代码访问的ip不一致。
bind 一定要绑定这个ip。192.168.139.30
Set<HostAndPort> nodes = new HashSet<HostAndPort>();
HostAndPort hostAndPort = new HostAndPort("192.168.139.30", 7000);
HostAndPort hostAndPort1 = new HostAndPort("192.168.139.30", 7001);
HostAndPort hostAndPort2 = new HostAndPort("192.168.139.30", 7002);
nodes.add(hostAndPort);
nodes.add(hostAndPort1);
nodes.add(hostAndPort2);
JedisCluster jedisCluster = new JedisCluster(nodes);//JedisCluster中默认分装好了连接池.
// 这东西 可以直接看到key 的分片数,就能知道放哪个 节点
System.out.println(JedisClusterCRC16.getSlot("foo"));
//redis内部会创建连接池,从连接池中获取连接使用,然后再把连接返回给连接池
String string = jedisCluster.get("foo");
for (int i = 1; i <= 3; i++) {
long start = System.currentTimeMillis();
jedisCluster.set("k:" + i, "v" + i);
System.out.print("set " + i +"th value in " + (System.currentTimeMillis() - start) + " ms");
start = System.currentTimeMillis();
jedisCluster.get("k:" + i);
System.out.println(", get " + i +"th value in " + (System.currentTimeMillis() - start) + " ms");
}
System.out.println(string);
第二种方式集群:
按照上边的1~8的步骤操作完,已经启动了3个redis节点了,下面创建集群操作:
redis-trib.rb create 192.168.139.30:7000 192.168.139.30:7001 192.168.139.30:7002
这个工具是用 ruby 实现的,所以需要安装 ruby。安装命令如下:
yum -y install ruby ruby-devel rubygems rpm-build
gem install redis
安装完在执行上面的命令。
此时集群已经搭建成功。
遇到的问题:
第一个错误:
解决方法:
1.删除每个节点下的aof,rdb文件
2.flushdb 清空当前数据库
3.在执行redis-trib命令就可以了。
第二个错误:
解决方法:
只要把redis.conf中定义的 cluster-config-file 所在的文件删除,重新启动redis-server及运行redis-trib即可。
redis-trib.rb的命令:
http://blog.csdn.net/huwei2003/article/details/50973967
附件列表