Redis Cluster搭建

为了提高网站响应速度,热点数据保存在内存中而不是直接从后端数据库中读取。Redis是很常用的Cache工具,并且已经在很多大型公司做过实践。但热点数据量往往很大,几个、上百G是很常见的情况。但无论使用物理主机还是云服务器,内存资源往往是受限的,除了scale up外,更需要使用的scale out横向可伸缩扩展,即分布式多个Redis实例协同运行。

概念误区

Redis高可用

Redis Sentinel是用来实现Redis高可用的一套解决方案,高可用的Redis主要由两部分组成:

  • 一个或者多个sentinel实例组成的sentinel系统
  • 一个Redis服务器(master redis)和多个从Redis服务器(slave redis)组成主从备份的Redis系统
  • 如果slave redis并没有对外提供读写服务, 那么Redis Sentinel系统本身并没有对Redis的承载能力进行扩容。

注意: sentinel系统本身是一个分布式的系统,用于监控Redis服务,在master redis 下线时,自动将某个slave redis上升为新的master redis。

Redis Sentinel 的负载能力与单点 Redis 的负载能力是一样的,但是可以使用分布式的Redis解决方案,例如Codis、Twemproxy、Redis cluster等,对Redis的承载能力进行扩容。

​ 生成环境下,建议slave redis至少部署两个,sentinel实例则至少三个

容灾切换

这里写图片描述
假定某个时刻,原来的master redis进入下线状态,Sentinel系统就会监控到master redis已下线,然后sentinel系统就会按照如下步骤进行故障转移操作:

  • 首先,sentinel系统会按照选举算法从多个slave redis中选举一个升为master
  • 其次,sentinel系统会向其他所有的slave redis发送新的复制命令,让它们称为新master redis的slave redis
  • 另外,Sentinel系统仍会继续监控已下线的redis,当它重新上线时,会将其设置为新master redis的slave redis

Redis Cluster

Redis Cluster是服务器Sharding技术,3.0版本正式提供。Redis Cluster中,Sharding采用slot(槽)的概念,集群使用公式CRC16(key) % 16384来计算key属于哪个槽。Redis集群中的每个node(节点)负责分摊16384个slot中的一部分,每个slot都对应一个node负责处理 。举个例子,一个集群可以有三个哈希槽,其中:

  • 节点 A 负责处理 0 号至 5500 号哈希槽。
  • 节点 B 负责处理 5501 号至 11000 号哈希槽。
  • 节点 C 负责处理 11001 号至 16383 号哈希槽。

    这里写图片描述

常见问题
  • 当动态添加或减少node节点时,需要对16384个槽做再分配 (处于半自动状态,需要人工介入?待验证)
  • Redis Cluster要保证16384个槽对应的node都能够正常工作,如果某个node发送故障,不仅它负责的slots失效,而且整个集群都将不能工作
  • Redis集群至少需要3个主节点,要保证Redis的高可用性,那每个主节点至少需要一个从节点。所以Redis集群至少需要6个节点,3个主节点,3个从节点
  • Redis Cluster本身提供了故障转移容错的能力,Redis Cluster的新节点识别能力、故障判断及故障转移能力 是通过集群中的每个node都在和其他nodes进行通信,这称为集群总线(cluster bus)。node之间使用对外服务端口号+10000和特殊的二进制协议进行通信 。例如,某个node的端口号为7111,那它与其它nodes通信的端口号是17111。
  • cluster被看做是一个整体,客户端可以连接任意一个node进行操作,就像操作单一Redis实例一样。如果客户端操作的key没有分配到该node上,Redis会返回转向指令,指向正确的node。
  • Redis Cluster是Redis 3.0以后才正式推出,大规模生产环境下的成功案例还不多,需要时间验证

Redis cluster vs sentinel

Redis Sentinel is the name of the Redis high availability solution... It has nothing to do with Redis Cluster and is intended to be used by people that don't need Redis Cluster, but simply a way to perform automatic fail over when a master instance is not functioning correctly.

注意: Taken from the Redis Sentinel design draft 1.3

Redis Cluster搭建

Redis服务安装

笔者安装的redis-4.0.9版本的redis,安装步骤如下:

1.编译和按照需要的包

yum install gcc tcl

2.下载Redis4的稳定版本
cd /usr/local/src
wget http://download.redis.io/releases/redis-4.0.9.tar.gz
3.创建安装目录

mkdir /usr/local/redis4

4.解压压缩文件并安装
tar -zxvf redis-4.0.9.tar.gz
cd redis-4.0.9
make PREFIX=/usr/local/redis4 install
注意:
  • 安装完成后,在/usr/local/redis4目录下的bin目录中包含redis的命令脚本redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-sentinel redis-server
  • 如果集群的实例部署在不同的机器上,则需要在每台机器上执行上述redis的安装步骤。

启动多个Redis实例

由于机器数量有限,笔者在单台机器上启动了6个redis实例,多台的部署与此类似,详细可查看参考资料——Redis集群搭建

1.将config file拷贝到指定的目录
创建目录
mkdir -p /usr/local/redis4/cluster/7111
mkdir -p /usr/local/redis4/cluster/7112
mkdir -p /usr/local/redis4/cluster/7113
mkdir -p /usr/local/redis4/cluster/7114
mkdir -p /usr/local/redis4/cluster/7115
mkdir -p /usr/local/redis4/cluster/7116
拷贝配置文件
cp /usr/local/src/redis-4.0.9/redis.conf /usr/local/redis4/cluster/7111/redis-7111.conf
cp /usr/local/src/redis-4.0.9/redis.conf /usr/local/redis4/cluster/7112/redis-7112.conf
cp /usr/local/src/redis-4.0.9/redis.conf /usr/local/redis4/cluster/7113/redis-7113.conf
cp /usr/local/src/redis-4.0.9/redis.conf /usr/local/redis4/cluster/7114/redis-7114.conf
cp /usr/local/src/redis-4.0.9/redis.conf /usr/local/redis4/cluster/7115/redis-7115.conf
cp /usr/local/src/redis-4.0.9/redis.conf /usr/local/redis4/cluster/7116/redis-7116.conf
2.修改配置文件

将上述步骤拷贝的6个配置文件逐个修改。

配置选项选项值说明
daemonize(位于GENERAL选项)yes,默认值为no是否作为守护进程运行
pidfile(位于GENERAL选项)/var/run/redis-7111.pid,默认为/var/run/redis.pid如果以后台进程运行,需要指定一个p
port(位于GENERAL选项)7111,默认为6379监听端口
databases(位于GENERAL选项)1,默认为16可用数据库数,默认数据库存储在DB0号ID库中,无特殊需求,建议仅设置一个数据库
appendonly(位于APPEND ONLY MODE选项)yes,默认注释启动aof持久化方式,因为redis本身同步数据文件是按上面save条件来同步的。所以有的数据会在一段时间只存在内存中
cluster-enable(位于REDIS CLUSTER选项)yes,默认注释是否打开redis集群
cluster-config-file(位于REDIS CLUSTER选项)/usr/local/redis4/cluster/7111/nodes.conf,默认注释集群配置文件,启动时自动生成,不用人为干涉
cluster-node-timeout(位于REDIS CLUSTER选项)15000,默认注释节点互连的超时时间,单位为毫秒
cluster-migration-barrier(位于REDIS CLUSTER选项)1,默认注释数据迁移的副本临界点,这个参数表示的是,一个主节点在拥有多少个从节点的时候就要割让出一个从节点出来给另外一个没有任何节点的从节点
luster-require-full-coverage(位于REDIS CLUSTER选项)yes,默认注释如果某一些key space没有被集群中的任何节点覆盖,集群将停止接收写入
3.逐个启动redis实例

按照如下命令逐个启动redis的实例。

/usr/local/redis4/bin/redis-server /usr/local/redis4/cluster/7111/redis-7111.conf
/usr/local/redis4/bin/redis-server /usr/local/redis4/cluster/7112/redis-7112.conf
/usr/local/redis4/bin/redis-server /usr/local/redis4/cluster/7113/redis-7113.conf
/usr/local/redis4/bin/redis-server /usr/local/redis4/cluster/7114/redis-7114.conf
/usr/local/redis4/bin/redis-server /usr/local/redis4/cluster/7115/redis-7115.conf
/usr/local/redis4/bin/redis-server /usr/local/redis4/cluster/7116/redis-7116.conf

注意 :逐个启动后,可以通过ps -aux | grep redis的命令来检测是否启动成功。

管理Redis集群

1.工具介绍及安装

redis-trib.rb是redis官方推出的管理redis集群的工具,集成在redis的源码目录下,是基于redis提供的集群命令封装成简单、便捷、实用的操作工具。使用之前需要安装Ruby依赖环境

安装ruby和rubygems
gem安装redis ruby接口
# gem install redis
Fetching: redis-4.0.1.gem (100%)
Successfully installed redis-4.0.1
Parsing documentation for redis-4.0.1
Installing ri documentation for redis-4.0.1
Done installing documentation for redis after 1 seconds
1 gem installed
拷贝集群管理命令到bin目录

cp /usr/local/src/redis-4.0.9/src/redis-trib.rb /usr/local/bin/redis-trib

2.执行Redis集群创建命令

执行集群创建的脚本,该命令只需要在其中一个节点执行;

redis-trib create --replicas 1 127.0.0.1:7111 127.0.0.1:7112 127.0.0.1:7113 127.0.0.1:7114 127.0.0.1:7115 127.0.0.1:7116

注意 :create——表示创建一个新的集群, –replicas 1表示每个主节点下面有一个从节点,后面的参数为redis实例的地址。程序会按照一定规则选举生成 3个master(主)3个slave(从)。 执行上述redis-trib命令后,会输出如下内容 ,没问题的话,就可以输入 yes

>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
127.0.0.1:7111
127.0.0.1:7112
127.0.0.1:7113
Adding replica 127.0.0.1:7115 to 127.0.0.1:7111
Adding replica 127.0.0.1:7116 to 127.0.0.1:7112
Adding replica 127.0.0.1:7114 to 127.0.0.1:7113
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 34b54ccc4358e2ef145232ee182dc1346be9328d 127.0.0.1:7111
   slots:0-5460 (5461 slots) master
M: 9fd3ed4af7d8ade053112eb30b87ae60710ab823 127.0.0.1:7112
   slots:5461-10922 (5462 slots) master
M: bcac95efa02b24ddb07ae186161457f575425bb6 127.0.0.1:7113
   slots:10923-16383 (5461 slots) master
S: f17572645ee8a0e60a62bd9d22a3f8f34e73b6bc 127.0.0.1:7114
   replicates 34b54ccc4358e2ef145232ee182dc1346be9328d
S: 3af81b11efae0c0b921218ec4ca1b920f662e985 127.0.0.1:7115
   replicates 9fd3ed4af7d8ade053112eb30b87ae60710ab823
S: ca15cf3f79f34f6fc40f354d3d8f88e62d9404e5 127.0.0.1:7116
   replicates bcac95efa02b24ddb07ae186161457f575425bb6
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join......
>>> Performing Cluster Check (using node 127.0.0.1:7111)
M: 34b54ccc4358e2ef145232ee182dc1346be9328d 127.0.0.1:7111
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: ca15cf3f79f34f6fc40f354d3d8f88e62d9404e5 127.0.0.1:7116
   slots: (0 slots) slave
   replicates bcac95efa02b24ddb07ae186161457f575425bb6
M: 9fd3ed4af7d8ade053112eb30b87ae60710ab823 127.0.0.1:7112
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
S: 3af81b11efae0c0b921218ec4ca1b920f662e985 127.0.0.1:7115
   slots: (0 slots) slave
   replicates 9fd3ed4af7d8ade053112eb30b87ae60710ab823
M: bcac95efa02b24ddb07ae186161457f575425bb6 127.0.0.1:7113
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
S: f17572645ee8a0e60a62bd9d22a3f8f34e73b6bc 127.0.0.1:7114
   slots: (0 slots) slave
   replicates 34b54ccc4358e2ef145232ee182dc1346be9328d
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
3.检查集群部署情况

连接任意节点查看集群部署结果。

redis4/bin]# ./redis-cli -c -p 7112 
127.0.0.1:7112> cluster nodes
9fd3ed4af7d8ade053112eb30b87ae60710ab823 127.0.0.1:7112@17112 myself,master - 0 1526019489000 2 connected 5461-10922
34b54ccc4358e2ef145232ee182dc1346be9328d 127.0.0.1:7111@17111 master - 0 1526019490618 8 connected 0-5460
3af81b11efae0c0b921218ec4ca1b920f662e985 127.0.0.1:7115@17115 slave 9fd3ed4af7d8ade053112eb30b87ae60710ab823 0 1526019489617 5 connected
ca15cf3f79f34f6fc40f354d3d8f88e62d9404e5 127.0.0.1:7116@17116 slave bcac95efa02b24ddb07ae186161457f575425bb6 0 1526019488000 6 connected
f17572645ee8a0e60a62bd9d22a3f8f34e73b6bc 127.0.0.1:7114@17114 slave 34b54ccc4358e2ef145232ee182dc1346be9328d 0 1526019490000 8 connected
bcac95efa02b24ddb07ae186161457f575425bb6 127.0.0.1:7113@17113 master - 0 1526019488616 3 connected 10923-16383

至此单机版的redis cluster部署全部完成,笔者处于调研阶段,所以部署的时候有点偷懒,生成环境的部署应该单机版的稍复杂些,但整体的流程应该类似。

参考资料

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值