Redis 集群的数据分片
概述:Redis 集群的数据分片是redis进行分布式存储的一种,它引入了hash槽的概念,每个redis节点存储一定范围的hash槽 ,redis集群有16384个hash槽,每个key通过CRC16校验后对16384取模来决定存储在哪个槽哪个节点
比如当前有三个节点 那么:
节点 A 包含 0 到 5500号哈希槽.
节点 B 包含5501 到 11000 号哈希槽.
节点 C 包含11001 到 16384号哈希槽.
1.安装ruby、gem-redis
sudo yum install ruby -y
rubygems下载地址 https://rubygems.org/pages/download
如果安装过程中出现SSLError请看这里 https://bundler.io/v1.16/guides/rubygems_tls_ssl_troubleshooting_guide.html#troubleshooting-certificate-errors
因为redis分片需要用到redis-trib 需要安装redis gem
gem install redis
2.创建6个redis实例 3个主节点3个备节点
redis-start.sh
#!/bin/bash
redis-server /usr/local/etc/redis/cluster/6740/6740.conf;
redis-server /usr/local/etc/redis/cluster/6741/6741.conf;
redis-server /usr/local/etc/redis/cluster/6742/6742.conf;
redis-server /usr/local/etc/redis/cluster/6743/6743.conf;
redis-server /usr/local/etc/redis/cluster/6744/6744.conf;
redis-server /usr/local/etc/redis/cluster/6745/6745.conf;
3.修改每个redis配置文件的信息,下面以6740.conf ,其他配置文件注意修改相应的端口
# 端口号
port 6740
# 后台启动
daemonize yes
# 开启集群
cluster-enabled yes
#集群节点配置文件
cluster-config-file nodes-6740.conf
# 集群连接超时时间
cluster-node-timeout 500
# 进程pid的文件位置
pidfile /var/run/redis-6740.pid
# 开启aof
appendonly yes
# aof文件路径
appendfilename "appendonly-6740.aof"
# rdb文件路径
dbfilename dump-6740.rdb
4.建立节点联系 需要redis-trib.rb 这个可以在redis源码目录src中找到
我这里是已经把redis-trib.rb 复制到redis-start.sh同样的目录下
$ sh redis-start.sh #启动redis实例
$ ps -ef | grep redis #查看是否6个实例启动成功
$ ./redis-trib.rb create --replicas 1 127.0.0.1:6740 127.0.0.1:6741 127.0.0.1:6742 127.0.0.1:6743 127.0.0.1:6744 127.0.0.1:6745
#redis-trib.rb create 创建一个集群
#--replicas 1 每个主节点创建一个备节点
5.集群中加入新节点
$ ./redis-trib.rb add-node 127.0.0.1:6746 127.0.0.1:6740
#127.0.0.1:6746 新增节点的地址
#127.0.0.1:6740 集群中的一个节点 也可以是127.0.0.1:6740-6745中任意一个
6.为新节点分配hash槽
$ ./redis-trib.rb reshard 127.0.0.1:6740
接着会提示需要迁移多少槽点到新节点,一般是平均分配那么就是16384/4=4096
所以输入4096
接着按照提示输入node ID 30858dbf483b61b9838d5c1f853a60beaa4e7ab61b这一串东西
按照提示继续输入:all # redis-trib 将从各个源节点中各取出一部分哈希槽, 凑够 4096 个, 然后移动到新节点上
7.为新节点添加一个备节点
$ ./redis-trib.rb add-node --slave --master-id efc3131fbdc6cf929720eb61b 127.0.0.1:6746 127.0.0.1:6740
#--master-id 主节点ID
8.移除一个主节点
先把要移除节点里面的数据重新分配到其他节点上重复步骤6 注意第一个提示输入node ID输入要移除节点ID 第二个输入done
Source node #1:30858dbf483b61b9838d5c1f853a60beaa4e7ab61b
Source node #2:done
9.移除备节点
$ ./redis-trib.rb del-node 127.0.0.1:6740 44321e7d619410dc4e0a8745366610a0d06d19410
参考:https://juejin.im/entry/596343056fb9a06bc340ac15
更多redis 集群命令参考 https://www.zybuluo.com/phper/note/205009#cluster-nodes