Redis Cluster集群
1.传统Redis集群存在那些问题
Redis哨兵集群模式,每个节点都保存全量同步数据,冗余的数据比较多;而在Redis Cluster模式中集群中采用分片集群模式,可以减少冗余数据,缺点就是构建该集群模式成本非常高。
2.传统Redis Cluster集群的原理
Redis3.0开始官方推出了集群模式 RedisCluster,原理采用hash槽的概念,预先分配16384个卡槽,并且将该卡槽分配给具体服务的节点;通过key进行crc16(key)%16384 获取余数,余数就是对应的卡槽的位置,一个卡槽可以存放多个不同的key,从而将读或者写转发到该卡槽的服务的节点。 最大的有点:动态扩容、缩容。
3.Redis Cluster集群模式环境搭建
3.1搭建集群环境
一般大型的都是多个服务器,每个服务器安装一个redis,这里测试所有采用伪集群,一个服务器安装多个端口号不同的redis服务。
mkdir -p /usr/local/rediscluster
cd /usr/local/rediscluster
mkdir redis7000 redis7001 redis7002 redis7003 redis7004 redis7005
# 每个配置 redis.conf 文件内容修改如下,
daemonize yes #后台启动
protected-mode no ## 允许外部访问
bind 192.168.1.10 # 设置为本机的ip
port 7000 #修改端口号,从7000到7005区分
# masterauth "redis123" #密码,后面集群命令要添加密码,如无密码可不用添加
cluster-enabled yes #开启cluster,去掉注释
dpfilename "7000dump.rdb" #从7000到7005区分
cluster-config-file 7000nodes.conf #从7000到7005区分
cluster-node-timeout 15000 #节点通信时间
logfile /usr/rediscluster/redis7005/redis.log #从7000到7005区分
pidfile "/var/run/redis_7005.pid" #从7000到7005区分
3.2 启动集群
#启动我们的redis
/usr/local/redis/bin/redis-server /usr/local/rediscluster/redis7000/redis.conf
/usr/local/redis/bin/redis-server /usr/local/rediscluster/redis7001/redis.conf
/usr/local/redis/bin/redis-server /usr/local/rediscluster/redis7002/redis.conf
/usr/local/redis/bin/redis-server /usr/local/rediscluster/redis7003/redis.conf
/usr/local/redis/bin/redis-server /usr/local/rediscluster/redis7004/redis.conf
/usr/local/redis/bin/redis-server /usr/local/rediscluster/redis7005/redis.conf
这里表示所有的redis通过已经启动了,但是还没有分配卡槽,无法使用
3.3连接并分配卡槽
连接一个redis
/usr/redis/bin/redis-cli -h 192.168.1.10 -p 7000
# 出现如下错误说明没有分配hash槽,如下图
(error) CLUSTERDOWN Hash slot not served
/usr/redis/bin/redis-cli --cluster create 192.168.1.10:7000 192.168.1.10:7001 192.168.1.10:7002 192.168.1.10:7003 192.168.1.10:7004 192.168.1.10:7005 --cluster-replicas 1
(建议最好使用服务器的ip地址搭建)
分配hash操作
# 我们连接时需要采用集群连接的方式
/usr/redis/bin/redis-cli -h 192.168.1.10 -p 7000 –c
4.Redis Cluster集群模式动态扩容节点
4.1新增节点主-7006,从-7007
# 与上面一样安装不同端口号的redis服务7006和7007,然后启动服务
/usr/local/redis/bin/redis-server /usr/local/rediscluster/redis7006/redis.conf
/usr/local/redis/bin/redis-server /usr/local/rediscluster/redis7007/redis.conf
#为集群新增一个主节点
/usr/redis/bin/redis-cli --cluster add-node 192.168.1.10:7006 192.168.1.10:7000
#为集群新增从节点,将从节点7007只想新增的主节点7006(cluster-master-id)
/usr/redis/bin/redis-cli --cluster add-node 192.168.1.10:7007 192.168.1.10:7000 --cluster-slave --cluster-master-id 5d94171eb34ed4396bf5b9db8efaab4d96d0cf10
4.2对新增节点分配卡槽
通过上面操作,7006和7007已经添加到集群了,但是还没有添加卡槽,接下来添加卡槽
/usr/local/redis/bin/redis-cli --cluster reshard 192.168.1.10:7000
执行命令后会提示你要到多少个卡槽我们一共是4个master所以每个应该是4096个。
然后将7006中集群id复制过来即可。接着提示是所有的平均分配还是指定ID分配,一般选择平均分配即可。
4.3Redis卡槽缩容
如果要将7006和7007回收,也要将相应的卡槽重新分配回去。如下命令是将7006所有的卡槽迁移到7000上。
#语法格式:
#/usr/redis/bin/redis-cli --cluster reshard 192.168.1.10:7000 --cluster-from 7006ID --cluster-to 7000ID --cluster-slots
/usr/redis/bin/redis-cli --cluster reshard 192.168.1.10:7000 --cluster-from 5d94171eb34ed4396bf5b9db8efaab4d96d0cf10 --cluster-to 511058958a3b80dd600e060c2500050c6c5a02ab --cluster-slots
执行命令后,里面的数据也会跟着迁移到7000中。
参考:蚂蚁课堂