Redis学习 redis集群(手敲一遍)(十五)

RedisCluster是redis的分布式解决方案,在3.0版本后推出的方案,有效地解决了Redis分布式的需求,当遇到单机内存、并发等瓶颈时,可使用此方案来解决这些问题

分布式数据库概念:

1,分布式数据库把整个数据按分区规则映射到多个节点,即把数据划分到多个节点上,每个节点负责整体数据的一个子集

比如我们库有900条用户数据,有3个redis节点,将900条分成3份,分别存入到3个redis节点

分区规则:

   常见的分区规则哈希分区和顺序分区,redis集群使用了哈希分区,顺序分区暂用不到,不做具体说明;

   rediscluster采用了哈希分区的“虚拟槽分区”方式(哈希分区分节点取余、一致性哈希分区和虚拟槽分区)

虚拟槽分区(槽:slot)

RedisCluster采用此分区,所有的键根据哈希函数(CRC16[key]&16383)映射到0-16383槽内,共16384个槽位,每个节点维护部分槽及槽所映射的键值数据

   哈希函数: Hash()=CRC16[key]&16383 按位与

   槽与节点的关系如下

redis用虚拟槽分区原因:

1,解耦数据与节点关系,节点自身维护槽映射关系,分布式存储

redisCluster的缺陷:

a,键的批量操作支持有限,比如mset, mget,如果多个键映射在不同的槽,就不支持了

b,键事务支持有限,当多个key分布在不同节点时无法使用事务,同一节点是支持事务

c,键是数据分区的最小粒度,不能将一个很大的键值对映射到不同的节点

d,不支持多数据库,只有0,select 0

e,复制结构只支持单层结构,不支持树型结构。

集群环境搭建

 1,在/usr/local/bin/clusterconf目录

6389为6379的从节点,6390为6380的从节点,6391为6381的从节点

2,分别修改6379、 6380、 7381、 6389、 6390、 6391配置文件

   port 6379                      //节点端口

   cluster-enabled yes              //开启集群模式

   cluster-node-timeout 15000       //节点超时时间(接收pong消息回复的时间)

   cluster-config-file  /usrlocalbin/cluster/data/nodes-6379.conf 集群内部配置文件

  其它节点的配置和这个一致,改端口即可

3,配置完后,启动6个redis服务

4,自动安装模式:

在/usr/local新建目录:ruby

链接:https://pan.baidu.com/s/1vrrc35aV436ezzn0zQtDoQ 
提取码:jwe1

从这个链接下载  ruby-2.3.1.tar.gz   和  redis-3.3.0.gem

tar -zxvf ruby-2.3.1.tar.gz

a,  cd ruby-2.3.1

  b,  ./configure -prefix=/usr/local/ruby

  c,  make && make install   //过程会有点慢,大概5-10分钟

  d, 然后gem install -l redis-3.3.0.gem  //没有gem需要安装yum install gem

注意:ln -s /usr/local/ruby/bin/ruby /usr/bin/ruby  ln用绝对路径

         另外gem加入环境变量

错误信息:in `call': ERR Slot 157 is already busy (Redis::CommandError)

解决方案:在Redis集群中,清空各个节点上的数据,并执行cluster reset指令。

 

e,准备好6个节点,(注意不要设置requirepass),将/usr/local/bin/clusterconf/data的config-file删除;依次启动6个节点:./redis-server clusterconf/redis6379.conf

如果之前redis有数据存在,flushall清空;(坑:不需要cluster meet ..)

  f, 进入cd /usr/local/bin,  执行以下:1代表从节点的个数

./redis-trib.rb create --replicas 1 192.168.46.133:6379 192.168.46.133:6380 192.168.46.133:6381 192.168.46.133:6389 192.168.46.133:6390 192.168.46.133:6391

主从分配,6379是6389的从节点

e,集群健康检测:

redis-trib.rb check 192.168.46.133:6379   (注:redis先去注释掉requirepass,不然连不上)

如此出现了这个问题,6379的5798槽位号被打开了

解决如下:

6379,6380,6381的有部分槽位被打开了,分别进入这几个节点,执行

6380:>cluster setslot 1180 stable

cluster setslot 2998 stable

cluster setslot 11212 stable

其它也一样,分别执行修复完后:

此时修复后的健康正常;

当停掉6379后,过会6389变成主节点

注意:使用客户端工具查询时要加-c

      ./redis-cli -h 192.168.42.111 -p 6379 -c

mset aa bb cc dd,批设置对应在不同的solt上,缺点

14,集群正常启动后,在每个redis.conf里加上

   masterauth “12345678”

   requiredpass “12345678”

  当主节点下线时,从节点会变成主节点,用户和密码是很有必要的,设置成一致

15,这上面是一主一从,那能不能一主多从呢?

./redis-trib.rb create --replicas 2

192.168.42.111:6379 192.168.42.111:6380 192.168.42.111:6381

 

192.168.42.111:6479 192.168.42.111:6480 192.168.42.111:6481

 

192.168.42.111:6579 192.168.42.111:6580 192.168.42.111:6581

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值