redis集群配置
为什么要使用集群
- redis官方生成可以达到 10万/每秒,每秒执行10万条命令,假如业务需要每秒100万的命令执行呢。该怎么处理呢
- 一台服务器内存正常是16~256G,假如你的业务需要500G内存,又该如何解决
集群的核心思想是将数据分片(sharding)储存于多个redis实例当中。
集群的方案有:
- twemproxy由Twitter开源
- Codis由豌豆荚开发,基于GO和C开发
- redis-cluster官方3.0版本后的集群方案
这里介绍redis的redis-cluster集群
集群原理
其中所有的子集就是一个集群。
redis3.0集群采用P2P模式,完全去中心化,将redis所有的key分成了16384个槽位,每个redis实例负责一部分slot,集群中的所有信息通过节点数据交换而更新。
分区规则
常见的分区规则有以下几种
-
顺序分区
按照数字的顺序进行key的分区。
-
节点取余分区
按照对每个节点的数据取余进行分区。
例如按照节点取余的方式,分三个节点1~100的数据对3取余,可以分为三类:
- 余数为0
- 余数为1
- 余数为2
-
虚拟槽分区
虚拟槽分区巧妙地使用了哈希空间,使用分散度良好的哈希函数把所有的数据映射到一个固定范围内的整数集合,整数定义为槽(slot)。
Redis Cluster槽的范围是0 ~ 16383。
槽是集群内数据管理和迁移的基本单位。采用大范围的槽的主要目的是为了方便数据的拆分和集群的扩展,
每个节点负责一定数量的槽。
redis cluster实验
本次集群的搭建分为:
- 准备六台集群服务器(三主三从)
- 使用rudy脚本进行槽位分配。
配置文件
redis支持多实例的功能,我们在单机演示集群搭建,需要6个实例,三个是主节点,三个是从节点,数量为6个节点才能保证高可用的集群。
其中单实例的配置文件如下:
port 7000
daemonize yes
dir "/opt/redis/data"
logfile "7000.log"
dbfilename "dump-7000.rdb"
cluster-enabled yes #开启集群模式
cluster-config-file nodes-7000.conf #集群内部的配置文件
cluster-require-full-coverage no #redis cluster需要16384个slot都正常的时候才能对外提供服务,换句话说,只要任何一个slot异常那么整个cluster不对外提供服务。 因此生产环境一般为no
我们在7000-7005搭6个服务。
检查它们是否成功运行:
root@long:/opt/test_redis# ls
cluster-7000.conf cluster-7001.conf cluster-7002.conf cluster-7003.conf cluster-7004.conf cluster-7005.conf
root@long:/opt/test_redis# redis-server cluster-7000.conf
root@long:/opt/test_redis# redis-server cluster-7001.conf
root@long:/opt/test_redis# redis-server cluster-7002.conf
root@long:/opt/test_redis# redis-server cluster-7003.conf
root@long:/opt/test_redis# redis-server cluster-7004.conf
root@long:/opt/test_redis# redis-server cluster-7005.conf
查看是否成功运行:
槽位配置
此时集群还不可以,可以登录redis-cli检查是否能够设置key,会发现报错:
注意-c是以集群模式打开客户端
接下来演示的是使用ruby脚本来进行槽位自动分配
-
配置ruby环境
# 下载ruby wget http://ftp.ruby-lang.org/pub/ruby/ruby-2.6.4.tar.gz # 安装ruby tar -zxvf ruby-2.6.4.tar.gz #解压 ./configure --prefix=/opt/ruby/ #解包makefile make && make install # 编译安装 # 配置环境变量,这里不做代码描述
-
下载redis官方提供的ruby脚本分配槽(redis-trib.rb)
这里踩了一下坑,教程上介绍的是提供ruby安装redis提供的gem包。可是安装完成后没找到安装了相关命令。
解决方式是直接下redis的包,去里面找ruby脚本
# 可以尝试一下安装gem包试试,不行再下redis包去找脚本 # 下载gem软件包 wget http://rubygems.org/downloads/redis-3.3.0.gem # gem装包 gem install -l redis-3.3.0.gem # 接下来在全局或者ruby路径查找redis-trib.rb脚本 find / -name redis-trib.rb
再附上直接转redis包的过程(redis源码包:http://download.redis.io/releases/redis-3.2.3.tar.gz)
-
进行槽位的自动分配
注意执行之前要确保集群启动。(即6个集群节点都跑起来了)
# 运行redis-trib.rb进行槽位分配(--replicas 1 代表每一个主节点分配一个从节点) ./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
运行情况
至此,redis cluster已经完成运行。本实验展示的是在一台宿主机上做的集群部署。如果在多台机器上运行redis,就可以有效的做好信息分片。
结果如下:
- 集群状态
- 集群写入和读取信息(注意需要-c参数才能启动以集群启动redis)