分享

亲密接触Redis-第三天(Redis的Load Balance)-1

eying 发表于 2016-3-16 13:25:22 [显示全部楼层] 只看大图 回帖奖励 阅读模式 关闭右栏 0 11467
问题导读




1.Redis3.x中如何引入的Load Balance?
2.Redis Cluster如何实现?
3.怎样使用Rubb Gem的Redis模块+redis-trib.rb创建集群?









前言

上两天讲述了Redis的基本搭建和基于HA的集群布署方式以及相关的策略和注意点。今天开始讲述Redis的Cluster功能,而这块目前来说网上资料不是太全,就算有1,2篇也只是单讲服务端的搭建也并未提及相关的客户端怎么和Redis Cluster间的调用问题。

我们今天要讲述的Redis Cluster是真正的Load Balance,它和Sentinel不一样,Sentinel虽然也叫集群,可是它是一种HA策略即High Available或者又通俗的被称为“灾难转移”策略。



Redis3.x中引入的Load Balance

从Redis3.x开始已经支持Load Balance功能了。
Redis Cluster  是Redis的集群实现,内置数据自动分片机制,集群内部将所有的key映射到16384个Slot中,集群中的每个Redis Instance负责其中的一部分的Slot的读写。集群客户端连接集群中任一Redis Instance即可发送命令,当Redis Instance收到自己不负责的Slot的请求时,会将负责请求Key所在Slot的Redis Instance地址返回给客户端,客户端收到后自动将原请求重新发往这个地址,对外部透明。一个Key到底属于哪个Slot由crc16(key) % 16384 决定。在Redis Cluster里对于负载均衡和HA相关都已经支持的相当完善了。

  • 负载均衡(Load Balance):集群的Redis Instance之间可以迁移数据,以Slot为单位,但不是自动的,需要外部命令触发。
  • 集群成员管理:集群的节点(Redis Instance)和节点之间两两定期交换集群内节点信息并且更新,从发送节点的角度看,这些信息包括:集群内有哪些节点,IP和PORT是什么,节点名字是什么,节点的状态(比如OK,PFAIL,FAIL,后面详述)是什么,包括节点角色(master 或者 slave)等。

关于可用性,集群由N组主从Redis Instance组成。

主可以没有从,但是没有从 意味着主宕机后主负责的Slot读写服务不可用。

一个主可以有多个从,主宕机时,某个从会被提升为主,具体哪个从被提升为主,协议类似于Raft,参见这里。如何检测主宕机?Redis Cluster采用quorum+心跳的机制。从节点的角度看,节点会定期给其他所有的节点发送Ping,cluster-node-timeout(可配置,秒级)时间内没有收到对方的回复,则单方面认为对端节点宕机,将该节点标为PFAIL状态。通过节点之间交换信息收集到quorum个节点都认为这个节点为PFAIL,则将该节点标记为FAIL,并且将其发送给其他所有节点,其他所有节点收到后立即认为该节点宕机。从这里可以看出,主宕机后,至少cluster-node-timeout时间内该主所负责的Slot的读写服务不可用。

1.png

Redis Cluster的特点如下:

  • 节点自动发现
  • slave->master选举,集群容错
  • Hot resharding:在线分片
  • 集群管理:clusterxxx
  • 基于配置(nodes-port.conf)的集群管理
  • ASK 转向/MOVED转向机制
  • 布署无需指定master
  • 可以支持超过1,000台节点的集群

Redis Cluster的实现

Redis Cluster依赖于其官方位于Redis编译包内(我们此处使用的是redis-stable版本)/src目录下的redis-trib.rb 文件,这是一个ruby脚本,为此你必须把你的服务器环境作一个先期准备。

搭建Cluster前的环境准备

  • 安装CentOS或者是RHE
  • 在安装Linux时需要一定记得安装GCC库、LibC、LibStdC++、Rubby库(1.9.2或以上)、ZLIB库(1.2.6或以上),如果你装机时没有安装这些“optional package”可以通过yum install gcc这样的命令在Linux联网的情况下来进行Linux安装后的额外包的安装
  • 安装ruby gems库(1.8.16或以上)- rubygems-1.8.16.tgz(运行内在的setup.rb),下载 rubygems-1.8.16.tgz 后在解压包的/path/gem 运行

[mw_shl_code=applescript,true]sudo ruby setup.rb[/mw_shl_code]

  • 在ruby gems安装后,你必须安装gem的redis模块,可以通过官网或者相关可信任连接下载redis-3.2.1.gem(先下载.gem文件再用gem安装)如:

[mw_shl_code=applescript,true]gem install -l redis-3.2.1.gem [/mw_shl_code]


Redis集群节点的规划

使用make PREFIX=/usr/local/redis1 install这样的命令连续搭建至少6个nodes,Redis Cluster的最低要求是(3个Master,3个Slave),这在我们的“亲密接触Redis-第一天”中有详细描述怎么编译安装一个redis了,此处全部是采用redis-stable这个版本。

2.png

集群节点的配置每个节点在第一次配置时,除去:

  • .pid文件和路径
  • /logfile文件和路径
  • Data存放路径
  • Port

其余配置,完全一样,并且无master和slave之分。

PORT端口配置要点:

所有Master(如3个Master的端口号以+1方式递增:7001,7002,7003)

所有的Slaver的端口号必须且一定要符合这样的原则:slave的端口比相关的master大1000号,如7001的slave的端口号为8001。

举例来说:

3个Master为7001,7002,7003,我们的3个Slave就为8001,8002,8003

redis.conf文件内:

  • maxmemory-policy allkeys-lru
  • cluster-enabled yes(启用,把前面的#注释掉)
  • cluster-config-file nodes-7001.conf(启用,把前面的#注释掉,此处建议使用本节点的PORT号为文件名,这样便于区分
  • cluster-node-timeout 15000(启用,把前面的#注释掉)
  • cluster-migration-barrier 1(启用,把前面的#注释掉)

使用Rubb Gem的Redis模块+redis-trib.rb创建集群

一切准备就绪后,把6个redis节点全部启动起来。

3.png

redis-trib.rb位于下载下来的redis-stable目录的/src目录内。

使用如下命令创建Redis集群:

[mw_shl_code=applescript,true]./redis-trib.rb create --replicas 1 192.168.0.1:7001 192.168.0.1:7002 192.168.0.1:7003 192.168.0.1:8001 192.168.0.1:8002 192.168.0.1:8003 [/mw_shl_code]

注:命令行中一定要把所有的master列出后,再列出所有的slave(依照master的顺序列slave),6个节点全部列在命令行中。

命令执行后过了一段时间系统会提示你如下信息

4.jpg

集群创建成功后会显示如下信息:

4.1.png

这就说明Redis集群已经创建了,以后只要使用redis-server redis.conf这样的命令把每个节点启动起来就可以了。



相关文章


亲密接触Redis-第一天
http://www.aboutyun.com/forum.php?mod=viewthread&tid=17674


亲密接触Redis-第二天(Redis Sentinel)
http://www.aboutyun.com/forum.php?mod=viewthread&tid=17673


亲密接触Redis-第三天(Redis的Load Balance)-1
http://www.aboutyun.com/forum.php?mod=viewthread&tid=17689


亲密接触Redis-第三天(Redis的Load Balance)-2
http://www.aboutyun.com/forum.php?mod=viewthread&tid=17690









没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条