今天来搭建一个Redis-Cluster, redis是在3.0.0版本后支持了Redis-Cluster集群, 它是Redis官方提出的解决方案, Redis-Cluster采用无中心结构, 每个节点保存数据和整个集群状态, 每个节点都和其他所有节点连接.
对于redis是什么, 以及如何搭建redis单机版本, 本文中就不介绍了.
我们为什么需要用到redis集群?
- 单击版redis内存容量有限的问题
- 高并发场景下, 单击版redis性能不高
- 单击版redis不具有高可用性, 不能应用于生产环境
下面我们用一张图来看一下, 如何解决这样一个需求: 我需要存30G的数据到redis中, 但是一台机器只有10G不够使用, 所以我想使用redis集群来解决, 并且同时要做到高可用.
redis最少需要3个主节点, 对应每个主节点有一个副本(从节点), 所以我们最少需要6个节点. 本文将要搭建的依然是redis的伪集群, 就是在一台服务器(虚拟机)上搭建, 通过不同的端口号来区分. 其实与实际生产环境中的搭建步骤没有本质区别, 都是一样的.
了解redis集群中的存储机制 – 槽的概念(slot)
redis-cluster 把所有的物理节点映射到slot 上,cluster 负责维护.
Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样运算后得出的数肯定回事0-16383之间的一个数字. 因此这样每个key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。
例如三个节点:槽分布的值如下:
SERVER1: 0-5460
SERVER2: 5461-10922
SERVER3: 10923-16383
举个栗子:
- 如果要存一个key是name, value是hello
- 那么首先对name通过crc16得出一个结果, 然后对16384进行取余(模运算)
- 得出的数字假如是8888, 那么cluster就会找哪个主节点的区间包含了8888
- 那么找到了是redis-2, 就会把这个key-value存到redis-2中, 对应的从节点也会有一份
搭建Redis-Cluster
在正式搭建之前, 先整理一下搭建Redis-Cluster集群需要哪些步骤:
准备工作:
-
redis的安装包
wget http://download.redis.io/releases/redis-4.0.2.tar.gz tar -zxvf redis-4.0.2.tar.gz
-
linux系统 (这里使用的是centOS 6)
-
安装编译C语言的环境 (redis是C语言写的)
yum -y install gcc gcc-c++ libstdc++-devel tcl -y
-
安装ruby (们需要使用ruby脚本来实现集群搭建)
yum install ruby yum install rubygems
搭建工作:
- 第一步: 上传redis的安装包到linux中, 解压缩.
- 第二步: 进入redis, make 编译
- 第三步: make install 安装6个redis实例
- 第四步: 拷贝redis的配置文件redis.conf到6个实例的bin目录下
- 第五步: 修改redis.conf配置文件
- 修改bind的IP
- 端口号 (7001 - 7006) 用于区分不同的redis实例
- 设置后台运行进程
- 设置开启集群
- 第六步: 启动6个redis实例
- 第七步: 上传用于搭建redis集群的ruby脚本
- 第八步: 安装ruby脚本
- 第九步: 执行ruby脚本搭建redis集群
- 第十步: 存入key-value, 进行测试
第一步: 上传redis的安装包到linux中, 解压缩.
mv redis-4.0.2/ redis-src
第二步: 进入redis, make 编译
cd /usr/local/redis-cluster/redis-src/
make MALLOC=libc
第三步: make install 安装6个redis实例
cd /usr/local/redis-cluster/redis-src/
make install PREFIX=/usr/local/redis-cluster/redis-1
make install PREFIX=/usr/local/redis-cluster/redis-2
make install PREFIX=/usr/local/redis-cluster/redis-3
make install PREFIX=/usr/local/redis-cluster/redis-4
make install PREFIX=/usr/local/redis-cluster/redis-5
make install PREFIX=/usr/local/redis-cluster/redis-6
第四步: 拷贝redis的配置文件redis.conf到6个实例的bin目录下
vim redis-1/bin/redis.conf
vim redis-2/bin/redis.conf
vim redis-3/bin/redis.conf
vim redis-4/bin/redis.conf
vim redis-5/bin/redis.conf
vim redis-6/bin/redis.conf
-
修改bind的IP为当前IP
-
修改运行端口为7001 (7002 7003 …)
-
设置后台运行进程
-
开启集群
第六步: 启动6个redis实例
cd /usr/local/redis-cluster/redis-1/bin
./redis-server redis.conf