redis cluster

/ redis / 0 条评论 / 548浏览

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
  1. 在各个目录下启动redis redis-server redis.conf

  2. 构建集群

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 含义是两个副本

  1. 链接集群

    链接 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

  2. 常用命令

    redis-cli -p 7001 cluster nodes 查看hash slot 分布情况 redis-cli --cluster check 127.0.0.1:7000 查询集群节点明细及key数量 redis-cli --cluster help 查看cluster 命令

  3. 集群的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