redis 分片类型:
1.客户端分片
2.代理模式
3.服务端分片
redis 3.0 开始,redis原生支持服务端的分片 redis cluster
redis cluster 特性:
1.服务端自动把数据集分片到对应节点
2.故障下数据自动转移特性
redis 工作原理简要:
1.redis集群中的每个点,会开启两个TCP端口,一个用于和客户端交互,另一个端口用来与其他redis节点通讯(集群总线),通讯采用二进制协议(高效的数据交换、节约带宽)
2.redis没像memecache使用一致性hash解决增加节点问题,而是采用的hash槽(hash slot)
3.hash slot 总共有16384个,所有的key 都会通过CRC16算法映射到这些槽点上(key计算CRC16值,然后对16384取模)
4.假如有A、B、C节点。增加节点D,会从A、B、C节点移动数据到D节点上。把D节点移除,会把D节点数据移动到A、B、C上
5.可用性:redis cluster 采用 master-slaver 方式保证可用性
6.一致性:redis 不能保证强一致性,由于采用的主从异步同步数据的方式,返回到客户端写入成功,只是master写入成功。slave异步同步数据,可能失败。当然redis 也支持同步slave 再返回client,这样就需要在性能和一致性做出权衡
7.官方建议最小的redis cluster 是3master、3slaver
8.服务启动后,每个redis实例有一个Node ID,每个实例间的通讯是通过Node ID 而不是Ip 和port
redis cluster 集群搭建
1.创建目录
mkdir cluster-test
cd cluster-test
mkdir 7000 7001 7002 7003 7004 7005
2.每个目录自己的redis.conf
redis.conf:
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
3.安装linux
wget http://download.redis.io/redis-stable.tar.gz
tar xvzf redis-stable.tar.gz
cd redis-stable
make
make install
- 在各个目录下启动redis redis-server redis.conf
- 构建集群
redis-cli –cluster create 172.31.248.236:7000 172.31.248.236:7001 172.31.248.236:7002 \
172.31.248.236:7003 172.31.248.236:7004 172.31.248.236:7005 172.31.54.50:7003 172.31.54.50:7004 172.31.54.50:7005\
–cluster-replicas 2
cluster-replicas 2 含义是两个副本 - 链接集群
链接
redis-cli -c -p 7001
127.0.0.1:7001> set foo bat
-> Redirected to slot [12182] located at 127.0.0.1:7002
OK - 常用命令
redis-cli -p 7001 cluster nodes 查看hash slot 分布情况
redis-cli –cluster check 127.0.0.1:7000 查询集群节点明细及key数量
redis-cli –cluster help 查看cluster 命令 - 集群的failover add-node del-node
链接redis-cli后的操作
添加主节点操作
redis-cli –cluster add-node 172.31.248.236:7006 172.31.248.236:7000(添加主节点,第一个参数是要添加的节点,第二个参数是集群中的一个节点,新增节点会和集群中一个节点通讯并构成新集群)
redis-cli –cluster reshard 172.31.248.236:6390 (新增主节点无数据,通过reshard来重新分配)
添加子节点
redis-cli –cluster add-node 127.0.0.1:7006 127.0.0.1:7000 –cluster-slave (添加子节点,第二个参数是父节点ip及端口)
redis-cli –cluster add-node 127.0.0.1:7006 127.0.0.1:7000 –cluster-slave –cluster-master-id 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e (添加slave,并)
删除节点
redis-cli –cluster del-node 172.31.248.236:7006 (ip:port 为命令通讯节点)
如果删除后,其它节点还看得到这个被删除的节点,则可通过FORGET命令解决,需要在所有还看得到的其它节点上执行:
cluster forget<node-id>
9.遇到的坑
1.夸机器的集群搭建,禁止使用127.0.0.1
一些集群的Concept在这里:https://redis.io/topics/cluster-spec 。主要需要知道的是:
节点间的异步数据复制和last failover wins机制。
数据的合并操作应该被避免,由于“很大的值”是一种很普遍的情况(例如list和set之类的对象)。
键分布模型HASH_SLOT = CRC16(key) mod 16384 以及控制分布Slot的方式(hash tags)。
节点的属性、通信总线、握手方式和重定向机制等。。。
Redis集群服务实现的只是Redis单机服务的一个子集,所以在使用一些“高级功能”之前可能需要先确认下集群版本下的支持度。
链接:https://www.jianshu.com/p/b75e0d45b5e2
文章引用:https://redis.io/topics/cluster-tutorial#redis-cluster-tcp-ports
https://www.cnblogs.com/kevingrace/p/7910692.html
https://www.cnblogs.com/aquester/p/9891465.html