Redis 集群(cluster)

 

虽然做了主从复制,但单个master的容量受机器内存限制,往往要做集群来提升容量。

 

redis 5.0之前的版本通过执行redis-trib.rb来创建集群,而redis-trib.rb是使用ruby语言写的脚本,需要配置ruby环境,此外还需要安装redis.gem来管理集群。

18年11月redis 5.0发布,使用redis-cli代替redis-trib.rb来创建集群,当然redis-trib.rb现在还能用(向下兼容),在redis解压目录的src下还有这个文件,但后续会被取消掉,不建议再使用。

 

此处使用redis 5.0来创建集群。

 

 


 

 

 集群设置

1、编辑已安装的redis的redis.conf,设置允许集群

 

参与集群的所有节点都不能是slave,所以如果配置了replicaof,需将其注释掉。

 

参与集群的节点的数据库必须要是空的,所以如果该节点有.rdb、.aof等数据库文件,需将其删除。

如果集群失败,后续尝试时要先删除之前的数据库(.rdb、.aof)。

 

 

 

2、在/usr/local下新建目录redis-cluster,把已安装的redis复制6份,放到redis-cluster下,依次重命名为redis1、redis2.....修改端口号,避免端口冲突

创建集群至少要3个master,每个master至少要有一个replica(副本,即slave),这是官方规定的。

所以至少要6个节点,这6个节点都不能设置replicaof,哪些节点作为master、哪些节点作为slave,由集群自动分配,不能由我们手动设置。

 

如果在配置文件中设置了文件保存路径,需要看下各个redis设置的路径有没有冲突,主要有2处:

  • logfile    redis的日志文件的保存位置
  • /redis/data    数据库文件的保存位置

 

 

 

3、redis-cluster下新建脚本start-all.sh,用来启动6个redis-server

cd /usr/local/redis-cluster
redis1/bin/redis-server redis1/conf/redis.conf
redis2/bin/redis-server redis2/conf/redis.conf
redis3/bin/redis-server redis3/conf/redis.conf
redis4/bin/redis-server redis4/conf/redis.conf
redis5/bin/redis-server redis5/conf/redis.conf
redis6/bin/redis-server redis6/conf/redis.conf
redis7/bin/redis-server redis7/conf/redis.conf

文件默认没有x权限,需要chmod给此文件添加x权限。

 

如果弄错了,要关掉redis-server,不要一个一个地redis-cli shutdown,很麻烦,

可以写成脚本,一次关闭所有redis-server,也可以ps -ef | grep redis查看redis进程,然后kill pid1 pid2 .....一次杀死所有的redis-server。

 

 

 

4、运行start-all.sh,启动6个redis-server

./start-all.sh   #当前目录是/usr/local/redis-cluster

 

 

 

5、使用某个redis-cli创建集群

 redis1/bin/redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.01:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 --cluster-replicas 1

指定要参加集群的节点(ip、port),cluster-replicas指定每个master分配几个slave,会自动分配master、slave。

 

比如6个节点,设置1,6*(1/2)=3个master,6*(1/2)=3个slave;

比如24个节点,设置2,24*(1/3)=8个master,24*(2/3)=16个slave。

master看做1,slave看做指定的数字,按比值计算。

 

参加集群的节点,自动分配时,一般是前面的作为master,后面的作为slave。

比如我们的6个节点,设置1,就是前3个(6379、6380、6381)作为master,后三个(6382、6383、6384)作为对应的slave。

 

那个warning是因为所有节点的ip都是相同的(127.0.0.1),会提示一下,不影响。

实际运维时要在redis.conf中用bind绑定机器的实际ip,用实际ip来创建集群。

看到已经给出集群配置方案。

 

 

输入yes同意配置方案,便开始按照方案进行集群配置。同意只能输入yes,不能输入y替代。

slot(槽点)是用来进行写指令的,只分配给master,一共16384个槽点,均匀分配给各个master。

slave只是作为备份,不执行写指令,不需要槽点,所以分配0个槽点。

 

 

 

6、连接到集群中的某个节点,比如127.0.0.1:6379

redis1/bin/redis-cli -c  #连接到集群节点(不管是master、还是slave)都要使用参数-c,c即cluster
#redis1/bin/redis-cli -h 127.0.0.1 -p 6379 -c

 

 

查看集群信息:

cluster info

集群状态、槽点信息、节点数都可以看到,其中集群大小cluster_size只算master的个数。

 

注意是cluster info,不是info cluster。info cluster是查看是否允许集群:

1表示允许集群

 

 

查看此节点的主从复制:

info replication

如果当前节点是slave,会列出所属master的信息(ip、port)。

 

 

设置值、取值:

设置、取值都是:先根据key的哈希值确定槽点位置,自动转到该槽点所在的节点,然后在该槽点处设置值、取值。

 

 


 

 

 

redis的集群和tomcat的不同,所有tomcat节点上部署的项目都一样,所以要nginx确定转发到哪个tomcat节点。

redis集群是把数据分散存储在多个节点上,这些节点共同组成一个完成的redis数据库。

集群中每2个master节点之间都可以通信,每个节点上都维护者集群各个节点的信息。

在.aof、.rdb所在目录下,有一个nodes.conf:

包括各个节点的ip、port,角色(master、slave),是集群中的第几个节点,和当前节点之间是否能ping通(是否connected)。

如果是master,还包括槽点区间。

设置值、取值的时候,先根据key的hash值确定槽点位置,再根据这个配置确定该槽点所在节点的ip、port,转交给该节点操作。

 

 

 

slave会复制所属master上的数据(rdb、aof),虽然也可以进行读写操作,但都是转到master上操作(因为槽点都在master上),并不是在slave本身进行操作。

使用集群后,主从复制就没必要设置读写分离了,因为都是转到master上读写数据,终究都是在master上进行操作,

况且master集群(多个master),单个master负载压力减小,只使用master也扛得住。

所以一般读写都连接到master节点操作,slave只作为备份。连接到哪一个master节点都行。

 

 

 

节点配置文件的保存位置可以指定,默认文件名为nodes.conf,和.aof、.rdb保存在同一目录下。

创建集群时会往每个节点的nodes.conf中写入初始配置,之后每个节点每秒都会ping一下其它节点,确定其它节点的状态,来维护、更新这个节点配置文件。

可以指定超时时间,默认30s,在30s内没收到该节点的回复,就主观认为该节点挂掉了,将该节点标识为fail。

 

如果超过一半的master都将某个master标识为fail,那就认为该master节点确实挂掉了。

(虽然slave也在默默维护节点信息,但毕竟是备胎,主从有别,不能和master平起平坐,没有发言权|表决权)

集群会自动将从该master的所有slave中选一个新的master。

 

集群(cluster)会自动配置主从复制、哨兵,无需我们手动配置。

 

如果挂掉的master的所有slave都不可用,那整个集群就挂掉了。

如果超过一半的master在短时间内都挂掉,不管slave可不可用,整个集群直接挂掉。

 

 

 

 

有时候查看某个节点nodes.conf,有些节点明明down掉了,nodes.conf中却显示connected、并未标识为fail。

这是因为你查看的nodes.conf所属的redis-server已经down掉,down掉了还怎么更新|维护节点信息?节点信息是过时的。

 

 

如果连接集群中的某个master时,不加参数-c,则只能在读写该master上的槽点,不能读写其它master上的槽点。

 

使用redis-cli --cluster create创建好集群以后,nodes.conf已经生成,

不管是重启redis-server、还是重启Linux,redis.conf、nodes.conf中的集群配置都还在,启动集群中的所有节点,会自动加入集群,无需再次使用redis-cli --cluster create创建集群。

但如果不满足集群要求,比如某个master及其所有slave节点你一个都没开启,那集群肯定是fail状态。

 

posted @ 2019-06-24 21:12  chy_18883701161  阅读(2231)  评论(0编辑  收藏  举报