数据分布
数据分区
分区规则
顺序分区:是按照顺序分区;特点就是数据分散易倾斜,键值业务相关可顺序访问支持批量操作。例如HBase,BigTable
哈希分区:将数据按照某种规则打撒。列入hash(key)%3;特点数据分散度高键值分布业务无关无法顺序访问支持批量操作。例如memcache,redis
hash分区:
节点取余
当添加一个节点时,会导致数据大量迁移,几乎达到了80%以上,所以采用节点取余的方式推荐采有多倍扩容,就是添加的机器是原有集群节点数的倍数 ,数据的迁移会缩小到50%
一致性Hash
在一个圆环上,均匀的把节点分布在圆环上,数据的token落在圆环上,顺时针寻找最近的节点就是数据存储的节点。节点伸缩只影响邻近的节点,但是还是有数据迁移。翻倍伸缩能保证最小迁移数据和负载均衡
虚拟槽分区
槽其实只是一个数据,多个节点来均分这个数字
预设虚拟槽:每个槽映射一个数据子集,一般比节点数大
搭建集群
分布式架构
每个节点之间是互相通信的,每个节点都负责读写
redis Cluster架构
节点
cluster-enabled:yes
meet
节点之间互相通信,交换消息,所有节点共享消息
指派槽
客户端需要计算出数据所管理到槽,然后映射到该槽上
复制
每个主节点有一个从节点,主备切换不需要依赖从节点
redis cluster特性
复制
高可用
分片
redis cluster的安装
redis cluster的安装方式有两种:
原生命令安装
官方工具安装
原生命令安装
配置开启节点
配置开启redis
port ${port} daemonize yes dir "/opt/redis/redis/data" dbfilename "dump-${port}.rdb" cluster-enabled yes cluster-config-file nodes-${port}.conf
用以上模板完成对
redis-server redis-7000.conf redis-server redis-7001.conf redis-server redis-7002.conf redis-server redis-7003.conf redis-server redis-7004.conf redis-server redis-7005.conf
meet
cluster meet ip port redis-cli -h 127.0.0.1 -p 7000 cluster meet 127.0.0.1 7000 #两个节点之间就可以相互同信 redis-cli -h 127.0.0.1 -p 7000 cluster meet 127.0.0.1 7001 redis-cli -h 127.0.0.1 -p 7000 cluster meet 127.0.0.1 7002 redis-cli -h 127.0.0.1 -p 7000 cluster meet 127.0.0.1 7003 redis-cli -h 127.0.0.1 -p 7000 cluster meet 127.0.0.1 7004 redis-cli -h 127.0.0.1 -p 7000 cluster meet 127.0.0.1 7005
cluster节点主要配置
cluster-enabled yes
cluster-node-timeout 15000 #故障转移的时间或者节点超时时间,在redis源码中很多都用到这个配置
cluster-config-file "nodes.conf"
cluster-require-full-coverage yes #集群内所有节点都能提供服务
查看集群的信息
redis-cli -p 7000 cluster nodes
指派槽
cluster addslots slot [slot...] redis-cli -h 127.0.0.1 -p 7000 cluster addslots {0...5461} redis-cli -h 127.0.0.1 -p 7001 cluster addslots {5462...10992} redis-cli -h 127.0.0.1 -p 7002 cluster addslots {10993...16383} redis-cli -p 7000 cluster slots #查看槽的分配信息
设置主从
redis-cli -p 7000 cluster nodes #查看集群的节点信息 可以查看每个节点的node-id cluster replicate node-id redis-cli -h 127.0.0.1 -p 7003 cluster replicate ${node-id-7000} redis-cli -h 127.0.0.1 -p 7004 cluster replicate ${node-id-7001} redis-cli -h 127.0.0.1 -p 7005 cluster replicate ${node-id-7002}
官方工具安装
下载、编译、安装Ruby
wget http://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.0.tar.gz tar -zxvf ruby-2.5.0.tar.gz ./configure -prefix=/usr/local/ruby make make install cd /usr/local/ruby cp bin/ruby /usr/local/bin
安装rubygem redis
安装redis-trib.rb
cp ${REDIS_HOME}/src/redis-trib.rb /usr/local/bin
配置开启redis,配置文件跟上面相同
redis-server redis-8000.conf redis-server redis-8001.conf redis-server redis-8002.conf redis-server redis-8003.conf redis-server redis-8004.conf redis-server redis-8005.conf
一键开启
./redis-trib.rb create --replicas 1 127.0.0.1:8000 1 127.0.0.1:8001 1 127.0.0.1:8002 1 127.0.0.1:8003 1 127.0.0.1:8004 1 127.0.0.1:8005
集群伸缩
伸缩原理
集群伸缩=槽和数据在节点之间的移动
实际就是添加机器或者减少机器,导致数据迁移扩容集群
2.1. 准备新节点
集群模式
配置和其他节点统一
启动后是孤儿节点
redis-server conf/redis-6385.conf
redis-server conf/redis-6386.conf
redis-6385.conf和redis-6386.conf配置与集群的统一
2.2. 加入集群(实际就是meet操作)
将新添加的6385和6386节点加入到集群
cluster meet 127.0.0.1 6385
cluster meet 127.0.0.1 6386
加入过后查看集群配置
cluster nodes
加入集群的作用
为它迁移槽和数据实现扩容
作为从节点负责故障转移
利用redis-trib.rb工具加入集群
redis-trib.rb add-node new_host:new_port existing_host:existing_port --slave --master-id <arg>
redis-trib.rb add-node 127.0.0.1:6385 127.0.0.16379
2.3. 迁移槽和数据
2.4 实际操作
生成配置文件
#把redis-7000.conf的内容7000替换成7006内容并复制到redis-7006.conf
sed 's/7000/7006/g' redis-7000.conf > redis-7006.conf
sed 's/7000/7007/g' redis-7000.conf > redis-7007.conf
启动两个节点
redis-server redis-7006.conf
redis-server redis-7007.conf
进入7006的客户端
redis-cli -p 7006
cluster nodes
退出后再7000的节点加入7006,7007
#加入7006
redis-cli -p 7000 cluster meet 127.0.0.1 7006
#加入7007
redis-cli -p 7000 cluster meet 127.0.0.1 7007
在7007的节点上做主从 7007从,7006主
redis-cli -p 7007 cluster replicate <7006的replicateId>
通过以下命令可以看到7006节点是没有分配到槽的
redis-cli -p 7000 cluster nodes
用redis-trib.rb 来迁移数据
#会打印出当前集群的状态
redis-trib.rb reshard 127.0.0.1:7000
#提示迁移多少个槽
#添加到哪个节点,输入节点ID
#all or none
#是否继续
查看槽的集群分配
redis-cli -p 7000 cluster slots
- 缩容集群
3.1 下线迁移槽
3.2 忘记节点
cluster forget {downNodeId}
3.3 关闭节点
3.4 实际操作
迁移槽
#将7006节点迁移到7000
redis-trib.rb reshard --form <7006ID> --to <7000ID> --slots <槽的数量> host:port
可一个直接通过 redis-trib.rb查看帮助
用redis-trib.rb忘记并下线节点(下线的时候需要先下从节点否则,集群会做一个故障转移)
redis-trib.rb del-node 1127.0.0.1:7000 <忘记节点ID >
已经很晚了。。。。。。睡觉 下面会接着介绍客户端路由,集群原理及常见的问题