集群简单概念
1 Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施。
2 Redis 集群不支持那些需要同时处理多个键的 Redis 命令, 因为执行这些命令需要在多个 Redis 节点之间移动数据, 并且在高负载的情况下, 这些命令将降低 Redis 集群的性能, 并导致不可预测的行为。
3 Redis 集群通过分区来提供一定程度的可用性: 即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求。
Redis 集群提供了以下两个好处:
1 将数据自动切分到多个节点的能力。
2 当集群中的一部分节点失效或者无法进行通讯时, 仍然可以继续处理命令请求的能力
Redis 集群使用数据分片而非一致性哈希来实现:一个 Redis 集群包含 16384 个哈希槽(hash slot), 数据库中的每个键都属于这 16384 个哈希槽的其中一个, 集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽, 其中 CRC16(key) 语句用于计算键 key 的 CRC16 校验和 。
集群中的每个节点负责处理一部分哈希槽。 举个例子, 一个集群可以有三个哈希槽, 其中:
节点 A 负责处理 0 号至 5500 号哈希槽。
节点 B 负责处理 5501 号至 11000 号哈希槽。
节点 C 负责处理 11001 号至 16384 号哈希槽。
这种将哈希槽分布到不同节点的做法使得用户可以很容易地向集群中添加或者删除节点。 比如说:
如果用户将新节点 D 添加到集群中, 那么集群只需要将节点 A 、B 、 C 中的某些槽移动到节点 D 就可以了。
与此类似, 如果用户要从集群中移除节点 A , 那么集群只需要将节点 A 中的所有哈希槽移动到节点 B 和节点 C , 然后再移除空白(不包含任何哈希槽)的节点 A 就可以了。
因为将一个哈希槽从一个节点移动到另一个节点不会造成节点阻塞, 所以无论是添加新节点还是移除已存在节点, 又或者改变某个节点包含的哈希槽数量, 都不会造成集群下线。
为了使得集群在一部分节点下线或者无法与集群的大多数节点进行通讯的情况下, 仍然可以正常运作, Redis 集群对节点使用了主从复制功能: 集群中的每个节点都有 1 个至 N 个复制品, 其中一个复制品为主节点(master), 而其余的 N-1 个复制品为从节点(slave)。
在之前列举的节点 A 、B 、C 的例子中, 如果节点 B 下线了, 那么集群将无法正常运行, 因为集群找不到节点来处理 5501 号至 11000号的哈希槽。
另一方面, 假如在创建集群的时候(或者至少在节点 B 下线之前), 我们为主节点 B 添加了从节点 B1 , 那么当主节点 B 下线的时候, 集群就会将 B1 设置为新的主节点, 并让它代替下线的主节点 B , 继续处理 5501 号至 11000 号的哈希槽, 这样集群就不会因为主节点 B 的下线而无法正常运作了。
不过如果节点 B 和 B1 都下线的话, Redis 集群还是会停止运作。
集群最好3主3从
redis命令参考 中文手册 http://redisdoc.com/
redis集群四种方案
1客户端分片
优点:灵活 取余 一致性哈希
缺点:添加redis节点困难 数据迁移困难
2代理proxy :twemproxy
缺点:加减节点困难 数据迁移困难 性能瓶颈是proxy服务器
3redsis Cluster 无中心管理 3.0版本之后增加 案例少 需要单独的客户端
4Codis 案例多 dashboard 迁移工具
cluster搭建
yum -y install ruby rubygems
下载gem源码包 redis cluster搭建及群需要依赖的包
下载地址: https://rubygems.global.ssl.fastly.net/gems/redis-3.2.2.gem
gem install --local redis-3.2.2.gem
cp /tools/redis-3.0.3/src/redis-trib.rb /usr/local/bin/redis-trib
cd /opt
mkdir seq 7001 7008
拷贝一个母版
cp /etc/redis/6379.conf .
编辑母版配置文件
vim 6379.conf
port 6379
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
注:修改是6379的字段
pidfile /var/run/redis_6379.pid
port 6379
logfile “/var/log/redis_6379.log”
dbfilename dump_6379.rdb
dir /opt/6379
[root@web01 opt]# sed ‘s/6379/7001/g’ 6379.conf >>/opt/7001/redis.conf
[root@web01 opt]# sed ‘s/6379/7002/g’ 6379.conf >>/opt/7002/redis.conf
[root@web01 opt]# sed ‘s/7002/7003/g’ 6379.conf >>/opt/7003/redis.conf
[root@web01 opt]# sed ‘s/7002/7004/g’ 6379.conf >>/opt/7004/redis.conf
[root@web01 opt]# sed ‘s/7002/7005/g’ 6379.conf >>/opt/7005/redis.conf
[root@web01 opt]# sed ‘s/7002/7006/g’ 6379.conf >>/opt/7006/redis.conf
[root@web01 opt]# sed ‘s/7002/7007/g’ 6379.conf >>/opt/7007/redis.conf
[root@web01 opt]# sed ‘s/7002/7008/g’ 6379.conf >>/opt/7008/redis.conf
启动多实例
for i in seq 7001 7008
;do cd /opt/$i && /usr/local/redis/bin/redis-server redis.conf;done
netstat -lnpt|grep 700
tcp 0 0 0.0.0.0:7001 0.0.0.0:* LISTEN 16175/redis-server
tcp 0 0 0.0.0.0:7002 0.0.0.0:* LISTEN 16177/redis-server
tcp 0 0 0.0.0.0:7003 0.0.0.0:* LISTEN 16183/redis-server
tcp 0 0 0.0.0.0:7004 0.0.0.0:* LISTEN 16185/redis-server
tcp 0 0 0.0.0.0:7005 0.0.0.0:* LISTEN 16191/redis-server
tcp 0 0 0.0.0.0:7006 0.0.0.0:* LISTEN 16193/redis-server
tcp 0 0 0.0.0.0:7007 0.0.0.0:* LISTEN 16200/redis-server
tcp 0 0 0.0.0.0:7008 0.0.0.0:* LISTEN 16202/redis-server
创建主从
格式:前三个为主节点 后三个为从节点
[root@web01 src]# redis-trib create --replicas 1 10.125.192.50:7001 10.125.192.50:7002 10.125.192.50:7003 10.125.192.50:7004 10.125.192.50:7005 10.125.192.50:7006
Creating cluster
Connecting to node 10.125.192.50:7001: OK
Connecting to node 10.125.192.50:7002: OK
Connecting to node 10.125.192.50:7003: OK
Connecting to node 10.125.192.50:7004: OK
Connecting to node 10.125.192.50:7005: OK
Connecting to node 10.125.192.50:7006: OKPerforming hash slots allocation on 6 nodes…
Using 3 masters:
10.125.192.50:7001
10.125.192.50:7002
10.125.192.50:7003
Adding replica 10.125.192.50:7004 to 10.125.192.50:7001
Adding replica 10.125.192.50:7005 to 10.125.192.50:7002
Adding replica 10.125.192.50:7006 to 10.125.192.50:7003
M: 96d8e7d7001b9dae9cbbf1fc0d6e0366968dcf05 10.125.192.50:7001
slots:0-5460 (5461 slots) master
M: 944276d25037a41a8755b95a8823f7448432c90b 10.125.192.50:7002
slots:5461-10922 (5462 slots) master
M: c3c2de75dec9fa177cd84c315da44d4eb5523951 10.125.192.50:7003
slots:10923-16383 (5461 slots) master
S: 2523197bf946f32bdcfd67d642b9c0fdbb42ff52 10.125.192.50:7004
replicates 96d8e7d7001b9dae9cbbf1fc0d6e0366968dcf05
S: 22793e4e77cd8663a7da36526743f9c297b1e7fb 10.125.192.50:7005
replicates 944276d25037a41a8755b95a8823f7448432c90b
S: 6aaf244da2ddfda57d85091f0309a2fd2731777c 10.125.192.50:7006
replicates c3c2de75dec9fa177cd84c315da44d4eb5523951
Can I set the above configuration? (type ‘yes’ to accept):
如果同意输入yes
注:–replicas 1 (代表每一个主创建一个从)前三个为主 后三个为从
我们这里可以看到 7001 5461个槽位 7002 5462个槽位 7003 5461个槽位 加起来正好16384个槽位
连接节点
[root@web01 src]# redis-cli -c -h 10.125.192.50 -p 7001
注:-c连接集群结点时使用,此选项可防止moved和ask异常
查看集群节点
10.125.192.50:7002> cluster nodes
查看集群状态
10.125.192.50:7002> cluster info
添加节点
[root@web01 ~]# redis-trib add-node 10.125.192.50:7007 10.125.192.50:7001
格式:10.125.192.50:7007是要添加的新节点 10.125.192.50:7001为现有集群中的任意一个节点即可 添加的新节点默认就是master节点
新加入的节点上是没有可写入槽位的
35e10f74c0d00007d27b81fbe433a914dac0bd06 10.125.192.50:7007 master - 0 1507872220860 0 connected
给新添加节点划分槽位
[root@web01 ~]# redis-trib reshard 10.125.192.50:7007
How many slots do you want to move (from 1 to 16384)? 要分配的槽位位置
What is the receiving node ID? 要分配节点的ID 查出新加入节点7007的id
Source node #1: 输入all 全部执行
Performing Cluster Check (using node 10.125.192.50:7007)
M: 35e10f74c0d00007d27b81fbe433a914dac0bd06 10.125.192.50:7007
slots: (0 slots) master
0 additional replica(s)
S: 6aaf244da2ddfda57d85091f0309a2fd2731777c 10.125.192.50:7006
slots: (0 slots) slave
replicates c3c2de75dec9fa177cd84c315da44d4eb5523951
M: c3c2de75dec9fa177cd84c315da44d4eb5523951 10.125.192.50:7003
slots:10923-16383 (5461 slots) master
1 additional replica(s)
M: 944276d25037a41a8755b95a8823f7448432c90b 10.125.192.50:7002
slots:5461-10922 (5462 slots) master
1 additional replica(s)
M: 96d8e7d7001b9dae9cbbf1fc0d6e0366968dcf05 10.125.192.50:7001
slots:0-5460 (5461 slots) master
1 additional replica(s)
S: 22793e4e77cd8663a7da36526743f9c297b1e7fb 10.125.192.50:7005
slots: (0 slots) slave
replicates 944276d25037a41a8755b95a8823f7448432c90b
S: 2523197bf946f32bdcfd67d642b9c0fdbb42ff52 10.125.192.50:7004
slots: (0 slots) slave
replicates 96d8e7d7001b9dae9cbbf1fc0d6e0366968dcf05
[OK] All nodes agree about slots configuration.Check for open slots…
Check slots coverage…
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 500
What is the receiving node ID? 35e10f74c0d00007d27b81fbe433a914dac0bd06
Please enter all the source node IDs.
Type ‘all’ to use all the nodes as source nodes for the hash slots.
Type ‘done’ once you entered all the source nodes IDs.
Source node #1:all
加入7008作为7007的从
[root@web01 ~]# redis-trib add-node 10.125.192.50:7008 10.125.192.50:7001
10.125.192.50:7001为现有集群中的任意一个节点即可
[root@web01 7008]# redis-cli -c -p 7008 首先要连接到7008上
127.0.0.1:7008> cluster replicate 35e10f74c0d00007d27b81fbe433a914dac0bd06 为7007ID
OK