redis-cli --cluster 方式搭建集群
Redis集群
集群简介
现状问题:业务发展过程中遇到的峰值瓶颈
- Redis提供的服务OPS可以达到10万/秒,当前业务OPS已经达到20万/秒
- 内存单机容量达到256G,当前业务需求内存容量1T
使用集群的方式可以快速解决上述问题
集群架构
集群就是使用网络将若干台计算机联通起来,并提供统一的管理方式,使其对外呈现单机的服务效果
集群作用
- 分散单台服务器的访问压力,实现负载均衡
- 分散单台服务器的存储压力,实现可扩展性
- 降低单台服务器宕机带来的业务灾难
Redis集群结构设计
数据存储设计
- 通过算法设计,计算出key应该保存的位置
- 将所有的存储空间计划切割成16384份,每台主机保存一部分
- 每份代表的是一个存储空间,不是一个key的保存空间
- 将key按照计算出的结果放到对应的存储空间
- 增强可扩展性
集群内部通讯设计
- 各个数据库相互通信,保存各个库中槽的编号数据
- 一次命中,直接返回
- 一次未命中,告知具体位置
Cluster集群结构搭建
搭建方式
- 原生安装(单条命令)
- 配置服务器(3主3从)
- 建立通信(Meet)
- 分槽(Slot)
- 搭建主从(master-slave)
- 工具安装(批处理)
Cluster配置
- 添加节点
# 启用redis-cluster集群 cluster-enabled yes|no
- cluster配置文件名,该文件属于自动生成,仅用于快速查找文件并查询文件内容
# 集群节点配置文件 # 该文件无需手工修改,由redis自动维护(创建和更新) # 需要注意,单机运行多实例时,确保该文件没有被其他实例覆盖(不允许重名) cluster-config-file <filename>
- 节点服务响应超时时间,用于判定该节点是否下线或切换为从节点
# 节点超时时长(毫秒) cluster-node-timeout <milliseconds>
- master连接的slave最小数量
cluster-migration-barrier <count>
Cluster节点操作命令
- 查看集群节点信息
cluster nodes
- 进入一个从节点 redis,切换其主节点
cluster replicate <master-id>
- 发现一个新节点,新增主节点
cluster meet ip:port
- 忽略一个没有solt的节点
cluster forget <id>
- 手动故障转移
cluster failover
redis-cli --cluster 命令
- 添加节点
redis-cli --cluster add-node new_host:new_port existing_host:existing_port --cluster-slav --cluster-master-id <arg>
- 删除节点
redis-cli --cluster del-node host:port node_id
- 重新分片
redis-cli --cluster reshard host:port --cluster-from <arg> --cluster-to <arg> --cluster-slots <arg> --cluster-yes --cluster-timeout <arg> --cluster-pipeline <arg> --cluster-replace
- 更多的命令可通过如下命令查看
redis-cli --cluster help
Cluster集群结构搭建具体步骤
1、在服务器配置文件中配置cluster。
2、配置好cluster以后对应修改端口和配置文件名复制多个配置文件
sed "s/6379/6380/g" redis-6379.conf > redis-6380.conf
3、将服务器6379到6384全部启动。
4、通过如下命令来搭建cluster集群
redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 --cluster-replicas 1
–cluster-replicas 1 后面是1代表一个master连一个slave
–cluster-replicas 2 后面是2代表一个master连两个slave
5、测试集群搭建是否成功,搭建集群后连接服务器需要加上 -c
如连接6379服务器命令如下:
redis-cli -c -p 6379
连接6379服务器设置数据
连接6380服务器获取数据
[root@192 conf]# redis-cli -c -p 6379
127.0.0.1:6379> set name qingbo
-> Redirected to slot [5798] located at 127.0.0.1:6380
OK
127.0.0.1:6380>
可以看到,在 6379 端口的服务器上存储一个string类型的键值对 name = qingbo 的时,操作被重定向到了 6380 端口的服务器上,而 name = qingbo 这个键值对最终也被存储在了 6380 端口的服务器里。
同理,在获取数据时,也会重定向到对应数据实际存储的服务器上,然后在该服务器上进行操作。
[root@192 ~]# redis-cli -c -p 6380
127.0.0.1:6380> get name
"qingbo"
127.0.0.1:6380>
集群构建中出现的问题及解决办法
一、搭建Redis集群出现
[ERR] Node 127.0.0.1:6379 is not empty,Either the node already knows other nodes
问题
其解决办法:
1、修改配置文件将dbfilename dump-6379.rdb和appendfilename "appendonly-6379.aof"两行注释掉,以此类推将后面用于搭建集群的服务器的每个节点的配置文件中的对应.rdb和.aof注释掉或者删除
2、关掉Redis集群之前启动的各个实例的进程,重新启动。
3、启动好以后再次执行如下命令构建集群
redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 --cluster-replicas 1
二、客户端连接 redis-cluster(Redis集群时)操作数据时出现(error) MOVED 5798 127.0.0.1:6380
错误
其原因是:因为客户端在连接 Redis 服务器时启动redis-cli时没有设置集群模式所导致,启动的时候使用-c参数来启动集群模式,即带上参数 -c 即为连接到cluster集群,命令如下:
redis-cli -c -p 6379
[root@192 conf]# redis-cli -c -p 6379
127.0.0.1:6379> set name qingbo
-> Redirected to slot [5798] located at 127.0.0.1:6380
OK
127.0.0.1:6380>
可以看到,在 6379 端口的服务器上存储一个string类型的键值对 name = qingbo 的时,操作被重定向到了 6380 端口的服务器上,而 name = qingbo 这个键值对最终也被存储在了 6380 端口的服务器里。
同理,在获取数据时,也会重定向到对应数据实际存储的服务器上,然后在该服务器上进行操作。
[root@192 ~]# redis-cli -c -p 6380
127.0.0.1:6380> get name
"qingbo"
127.0.0.1:6380>
三、搭建集群时报错[ERR] Not all 16384 slots are covered by nodes.
其原因:
这个往往是由于主node移除了,但是并没有移除node上面的slot,从而导致了slot总数没有达到16384,其实也就是slots分布不正确。所以在删除节点的时候一定要注意删除的是否是Master主节点。
解决办法:
1、使用如下命令来修复集群
# redis-cli --cluster fix host:port
redis-cli --cluster fix 127.0.0.1:6379
2、修复完成后再用check命令检查下是否正确,其命令如下:
# redis-cli --cluster check host:port
redis-cli --cluster check 127.0.0.1:6379
3、如果分布不均匀那可以使用下面的方式重新分配slot
# redis-cli --cluster reshar host:port
redis-cli --cluster reshard 127.0.0.1:6379
确,其命令如下:
# redis-cli --cluster check host:port
redis-cli --cluster check 127.0.0.1:6379
3、如果分布不均匀那可以使用下面的方式重新分配slot
# redis-cli --cluster reshar host:port
redis-cli --cluster reshard 127.0.0.1:6379