redis 集群讲解 (一 )安装 运行 基本 操作

2018-01-11  本文已影响0人  Gxgeek

redis cluster

redis cluster vs. replication + sentinal

redis cluster

(1)自动将数据进行分片,每个master上放一部分数据
(2)提供内置的高可用支持,部分master不可用时,还是可以继续工作的

在redis cluster架构下,每个redis要放开两个端口号,比如一个是6379,另外一个就是加10000的端口号,比如16379

16379端口号是用来进行节点间通信的,也就是cluster bus的东西,集群总线。cluster bus的通信,用来进行故障检测,配置更新,故障转移授权

cluster bus用了另外一种二进制的协议,主要用于节点间进行高效的数据交换,占用更少的网络带宽和处理时间

哈希算法

redis cluster有固定的16384个hash slot,对每个key计算CRC16值,然后对16384取模,可以获取key对应的hash slot

redis cluster中每个master都会持有部分slot,比如有3个master,那么可能每个master持有5000多个hash slot

hash slot让node的增加和移除很简单,增加一个master,就将其他master的hash slot移动部分过去,减少一个master,就将它的hash slot移动到其他master上去

移动hash slot的成本是非常低的

客户端的api,可以对指定的数据,让他们走同一个hash slot,通过hash tag来实现

redis cluster 搭建

单机集群

#创建redis 日志目录
 mkdir -p /var/log/redis/7001
 mkdir -p /var/log/redis/7002
 mkdir -p /var/log/redis/7003
 mkdir -p /var/log/redis/7004
 mkdir -p /var/log/redis/7005
 mkdir -p /var/log/redis/7006

#创建redis 集群 配置 目录
 mkdir -p /etc/redis-cluster
# redis目录
mkdir -p mkdir -p /var/redis/7001
mkdir -p mkdir -p /var/redis/7002
mkdir -p mkdir -p /var/redis/7003
mkdir -p mkdir -p /var/redis/7004
mkdir -p mkdir -p /var/redis/7005
mkdir -p mkdir -p /var/redis/7006

配置文件 主要配置 其他几分类似

port 7001
cluster-enabled yes
cluster-config-file /etc/redis-cluster/node-7001.conf
cluster-node-timeout 15000
daemonize   yes                         
pidfile     /var/run/redis_7001.pid                         
dir         /var/redis/7001 
logfile /var/log/redis/7001.log
bind 0.0.0.0        
appendonly yes

安装必备软件

启动集群

```shell
redis-trib.rb create --replicas 1  127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006
out:
>>> 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: 5f7f1ff4582dcd1a6cc66a9e636fe18bcacc7d4c 127.0.0.1:7001
   slots:0-5460,5999,12706,14559 (5464 slots) master
M: 63035068bbbc1ee1df40a050d5d47b7779f86043 127.0.0.1:7002
   slots:5461-10922 (5462 slots) master
M: be557259c0ea02517557931251df7120c00cd4c2 127.0.0.1:7003
   slots:10923-16383 (5461 slots) master
S: 210ae237bb73aa3c876eb9933a9926c575fba0cd 127.0.0.1:7004
   replicates 5f7f1ff4582dcd1a6cc66a9e636fe18bcacc7d4c
S: 3cb4215cb614950f9e68be6a995bf98ea81d52a6 127.0.0.1:7005
   replicates 63035068bbbc1ee1df40a050d5d47b7779f86043
S: 65e578ed3fe7d5947a4f9c621c8157ab6c1251b5 127.0.0.1:7006
   replicates be557259c0ea02517557931251df7120c00cd4c2
Can I set the above configuration? (type 'yes' to accept):

简单解释一下这个命令:调用 ruby 命令来进行创建集群,--replicas 1 表示主从复制比例为 1:1,即一个主节点对应一个从节点;然后,默认给我们分配好了每个主节点和对应从节点服务,以及 solt 的大小,因为在 Redis 集群中有且仅有 16383 个 solt ,默认情况会给我们平均分配,当然你可以指定,后续的增减节点也可以重新分配。

目前来看,7001-7003 为主节点,7004-7006 为从节点,并向你确认是否同意这么配置。输入 yes 后,会开始集群创建。

集群搭建成功之后

验证一下:
依然是通过客户端命令连接上,通过集群命令看一下状态和节点信息等。

redis-cli -c -p 7001
cluster info
cluster nodes

可以看到

127.0.0.1:7001> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_sent:372
cluster_stats_messages_received:372
127.0.0.1:7001> cluster nodes
65e578ed3fe7d5947a4f9c621c8157ab6c1251b5 127.0.0.1:7006 slave be557259c0ea02517557931251df7120c00cd4c2 0 1515656195286 6 connected
3cb4215cb614950f9e68be6a995bf98ea81d52a6 127.0.0.1:7005 slave 63035068bbbc1ee1df40a050d5d47b7779f86043 0 1515656197299 5 connected
5f7f1ff4582dcd1a6cc66a9e636fe18bcacc7d4c 127.0.0.1:7001 myself,master - 0 0 1 connected 0-5460
210ae237bb73aa3c876eb9933a9926c575fba0cd 127.0.0.1:7004 slave 5f7f1ff4582dcd1a6cc66a9e636fe18bcacc7d4c 0 1515656193268 4 connected
63035068bbbc1ee1df40a050d5d47b7779f86043 127.0.0.1:7002 master - 0 1515656194275 2 connected 5461-10922
be557259c0ea02517557931251df7120c00cd4c2 127.0.0.1:7003 master - 0 1515656196295 3 connected 10923-16383

设置一个key

127.0.0.1:7001> set name mafly
-> Redirected to slot [5798] located at 127.0.0.1:7002
OK
127.0.0.1:7002>

你会发现,当我们 set name mafly 时,出现了 Redirected to slot 信息并自动连接到了7002节点。这也是集群的一个数据分配特性,这里不详细说了。

出现问题

1. 使用 ruby 创建集群 yes 之后 出现 in `call': ERR Slot 8579 is already busy (Redis::CommandError)

      用redis-cli 登录到每个节点执行  flushall  和 cluster reset  就可以了。
上一篇 下一篇

猜你喜欢

热点阅读