使用redis集群可以干什么?
1.可以将数据分布式地存储在多个redis节点。
2.部分节点不可用时,仍然可以保证节点的可用性。
redis集群中节点对tcp端口的要求:
1.client与节点之间通信的接口,称为p1
2.节点之间通信的接口,称为p2。p2=p1+10000
redis集群与docker的兼容性:
redis集群不支持端口remapped,为了使docker与redis兼容,需要将docker在host networking mode下工作(--net=host)。
redis集群的分表
redis集群的分表没有使用一致性hash,而是将数据分布在16384个slot中,平均分布在集群中的多个节点。
好处:
1.增加节点和删除节点只需要将slot在节点间移动即可,移动slot时,无需down机。
redis支持同一个命令的执行中,对属于同一个slot的多个key进行操作,从而保证事务性。
使用hash tag可以保证多个key同属于一个slot
hash tag案例,大括号内的内容相同,两个key在同一个slot中:
1. keyA{foo}
2. keyB{foo}
redis集群的的主从模式
我们可以为redis的每个node设置slave,某个节点的master挂了,slave可用,则集群仍然可用。若某个节点的主从全部挂掉,那么系统不可用。
redis无法保证数据的强一致性,因为redis采用了异步复制。
异步复制:redis client向master写入数据,master返回ok,然后将数据复制到slave。
若复制完成前,master挂掉,那么数据有可能丢失。
性能与强一致性不可兼得。redis为了性能,牺牲了强一致性。
即使redis node采用同步复制,也有可能导致数据丢失。
丢失案例:
redis集群包括node A,B,C,分别为maser
a,b,c为slave,client z向A写入数据,A还没有把数据复制到slave a。此时发生了网络隔离,a被选举为新的master,那么就会发生数据丢失。
启动一个redis集群:
方案1:创建n个文件夹,7000~700n 每个文件夹中新建一个配置文件:
port 7000 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes
cd 700n
path/to/redis-server ./redis.conf
启动了n个实例后,
./redis-trib.rb create --replicas 1 host:port host1:port1 ... hostn:portn
如果首次运行,需要gem install redis
方案二:
用脚本启动:
create-cluster start
create-cluster create
停止命令:
create-cluster stop
redis重新分表:
./redis-trib.rb reshard --from <node-id> --to <node-id> --slots <number of slots> --yes <host>:<port>
添加新节点:
添加空白节点:
./redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000
添加空白节点后,可以通过重新分表,将一部分slot转移过去。
./redis-trib.rb add-node --slave 127.0.0.1:7006 127.0.0.1:7000
将7006添加为某个slave最少的master的slave
./redis-trib.rb add-node --slave --master-id 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 127.0.0.1:7006 127.0.0.1:7000
也可以将7006添加为某个master的slave
删除node-id的节点,如果该节点是master,前提是改master必须是空的。
./redis-trib del-node 127.0.0.1:7000 `<node-id>`
备份迁移:
登陆某个实例后,可以通过 cluster replicate master-node-id,将当前redis实例转移为指定master的slave
也可以通过配置文件,使得备份迁移自动完成,当某个master的备份挂掉后,可以通过自动将slave最多的master的slave转移给改节点
更新节点:
更新slave,可以直接stop,更新后启动。
更新master,可以通过slave,使master failover,然后该master变为slave,然后完成更新。
向cluster迁移
生成appendonly文件,然后启动cluster,使用生成的aof文件替换掉cluster的文件。
若原有redis有多key操作,而且key对应的值不在同一个节点上,那么不支持直接迁移。