您的位置:首页 > 数据库 > Redis

redis集群cluster搭建,扩容缩容

2017-06-28 00:00 531 查看
摘要: redis的集群模式的部署配置过程

1. 概要说明


1.1. 概述

本文旨在说明平台部署环境搭建的过程和详细步骤说明,为后面系统部署提供清晰的参考依照。
以下搭建部署的环境,为一个小型的分布式集群环境。满足负载均衡和单点故障转移,支持动态增减服务器等功能。后续平台的部署都可参考此搭建过程扩充。


1.2. 环境清单

系统:Red Hat Enterprise Linux Server release 6.5 (Santiago)
内存: 4G内存+4G交换区
硬盘:45G
服务器IP: 192.168.242.128 192.168.242.130 192.168.242.131


1.3. 资源清单

gcc : gcc 版本 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC)
redis中间件:redis-3.2.9.tar.gz
ruby: ruby-2.3.4.tar.gz
ruby的redis依赖: redis-3.3.0.gem
说明:配置cluster需要使用redis自带的redis-trib.rb脚本,该脚本位于redis-3.2.9/src路径下,由ruby语言编写,所以需要ruby环境和ruby连接redis的工具包,ruby环境部署使用ruby-2.3.4.tar.gz,ruby的redis的依赖使用redis-3.3.0.gem


2. 架构图
2.1. cluster的物理架构图
服务器:192.168.242.128 192.168.242.130 192.168.242.131


2.2. cluster逻辑架构图


3. redis主节点部署
3.1. 源码编译
1、 redis源码编译需要gcc编译器
2、 解压
$tar -zxvf redis-3.2.9.tar.gz

进入路径 redis-3.2.9
执行make命令编译
$make

编译成功后src路径下会有如下文件


文件说明:

编号 文件 说明
1mkreleasehdr.sh redis自带的版本管理工具,非redis源码编译产生
2redis-benchmark性能测试工具
3redis-check-aofaof文件检测修复工具
4redis-check-rdbrdb文件检查修复工具
5redis-cliredis客户端
6redis-sentinel哨兵server
7redis-serverredis服务端
8redis-trib.rbruby语言编写,非redis源码编译产生,该脚本用来配置cluster,运行该脚本需要ruby环境和ruby的redis依赖
3.2. 配置说明
本文档仅指导部署一个简单可用的redis cluster集群,使用最简化的配置。如对cluster集群有更高的要求,需针对性的配置其他参数。
redis配置文件redis.conf位于redis-3.2.9/路径下
3.3. 部署
1、三台机器192.168.242.128 192.168.242.130 192.168.242.131,每台机器创建redis用户,在redis用户根路径下创建如下路径:
redis-cluster/ run/data
redis-cluster/run/logs

2、把redis编译后的文件复制到redis-cluster路径下
3、将redis.conf配置文件复制到redis-cluster路径下,改名为redis_6301.conf
4、按照下述配置修改redis_6301.conf

1、# bind 127.0.0.1 把绑定ip参数禁用
2、protected-mode no 禁用保护模式
3、port 6379 端口改为6301
4、daemonize yes 使用守护进程启动
5、pidfile /home/redis/redis-cluster /run/redis_6301.pid 修改pid文件及路径
6、logfile "/home/redis/redis-cluster/run/logs/redis_6301.log" 修改日志文件及路径
7、# save 900 1
# save 300 10
# save 60 10000 禁用快照持久化
8、dbfilename dump_6301.rdb 修改dump文件名
9、dir /home/redis/redis-cluster/ run/data 修改dump和aof文件路径
10、maxmemory 1073741824 设置redis使用内存大小,单位字节
11、maxmemory-policy allkeys-lru 指定数据淘汰策略
12、maxmemory-samples 5
13、appendonly yes 开启aof持久化模式
14、appendfilename "appendonly_6301.aof" 修改aof持久化文件名称
15、cluster-enabled yes 开启cluster模式
16、cluster-config-file nodes-6301.conf 修改cluster节点配置文件名称
17、cluster-node-timeout 5000 设置cluster-node超时时间
18、 slowlog-log-slower-than 5000 调整满日志耗时阀值(非必须)
5、复制redis_6301.conf,名为redis_6302.conf,修改redis_6302.conf,其中6301全部替换为6302
完成上述工作后,redis的目录为


6、启动所有redis实例,没有先后顺序
$ ./redis-server redis_6301.conf
$ ./redis-server redis_6302.conf
启动完成后,查看 $HOME/redis-cluster/run/logs路径下的两个日志文件,是否有error
4. cluster配置
到此步,启动了6个redis实例,这6个redis实例都是单独运行,之间没有任何关联关系,以下步骤说明如何配置cluster集群
4.1. 配置说明
配置cluster需要ruby环境和ruby的redis依赖,ruby环境的机器可以和redis主节点为同一台机器,也可以是另外的机器,分别见如下两图:



4.2. ruby环境安装
检查ruby环境是否已经存在
ruby –v

如果有版本信息输出,说明ruby环境已经存在,否则按照如下步骤安装

以root用户安装ruby环境,源码安装ruby环境需要gcc编译器
上传ruby-2.3.4.tar.gz到root根路径
解压
#tar -zxvf ruby-2.3.4.tar.gz

解压后进入ruby-2.3.4路径
执行
# ./configure --prefix=/usr/local/ruby-2.3.4
可以不指定安装路径--prefix
执行完毕后执行
#make
执行完毕后执行
#make install

执行完毕后配置环境变量
此次配置全局环境变量
执行
#vi /etc/profile
在打开的文件中最后添加
#ruby
export RUBY_HOME=/usr/local/ruby-2.3.4
export PATH=$PATH:$RUBY_HOME/bin

保存退出后执行如下命令,使添加的ruby环境变量生效
#source /etc/profile

在任意路径下执行如下命令进行验证
#ruby -v
有如下输出表示ruby环境配置完成
ruby 2.3.4p301 (2017-03-30 revision 58214) [x86_64-linux]

4.3. redis-3.3.0.gem安装
redis-3.3.0.gem是ruby的redis依赖
查看redis-3.3.0.gem是否安装
方式一:
$ gem specification redis
如果输出:ERROR: No gem matching 'redis (>=0)' found 表示没有安装
方式二:
$ gem query --local|grep redis
如果没有任何输出表示没有安装
安装步骤如下:
上传redis-3.3.0.gem到root用户根路径
执行如下命令安装
#gem install -l redis-3.3.0.gem

如果出现如下错误


检查机器上是否安装了zlib、和zlib-devel包,检查方式:

# rpm -qa|grep zlib
zlib-1.2.7-17.el7.x86_64
zlib-devel-1.2.7-17.el7.x86_64

可以是其他版本,如:

zlib-1.2.3-29.el6.x86_64
zlib-devel-1.2.3-29.el6.x86_64

若没有或缺一个,下载如下两个rpm包并安装(如个机器上有这两个包,即使版本不一致也无需安装下面的新包)
zlib-1.2.7-17.el7.x86_64.rpm
zlib-devel-1.2.7-17.el7.x86_64.rpm

安装完成后,进入ruby源码中ruby-2.3.4/ext/zlib,在该路径下执行如下命令
# ruby extconf.rb
# make
#make install

再次安装redis-3.3.0.gem
#gem install -l redis-3.3.0.gem

4.4. redis-cluster配置
执行如下命令
$ ./redis-trib.rb create --replicas 1 192.168.242.128:6301 192.168.242.128:6302 192.168.242.130:6301 192.168.242.130:6302 192.168.242.131:6301 192.168.242.131:6302
命令说明:
redis-trib.rb 该脚本由redis提供,位于redis-3.2.9/src路径下,可单独复制出来放在任意机器的任意路径下,该任意机器必须配置了ruby-2.3.4和redis-3.3.0.gem(不要求同此版本)
create 创建cluster命令
--replicas 1 指定cluster集群配置从节点,数字1表示每个master有1个slave,后面的ip:port表示运行的redis实例,cluster集群要求不能少于3个master,由于每个master配置一个slave,所以必须有master*2的redis实例,执行该命令,redis会给出建议配置,输入yes即可,不需要手动指定master-slave关系。
下图展示整个cluster集群创建过程


执行创建命令后,redis会检测给定的ip:port,并给出建议的master-slave配置,分配hash槽到master,在shell输入yes表示同意该配置,并继续执行,如下图:


4.5. 验证

1、 使用redis自带的客户端redis-cli进行验证,这是最简单的验证方式,可通过任意一个master的客户端操作cluster集群
2、 redis-cli对集群(cluster)的操作的支持是非常基本的,所以redis-cli总是依靠redis集群节点将命令(数据)转向(redirect)到正确的节点上。一个真正的(serious)的集群客户端应该做的更好,应该用缓存记录哈希槽(slot)与节点地址的映射(map),从而直接将命令发送到正确的节点上。这种映射只会在集群的配置出现某些修改时改变,比如,在一次故障转移(failover)之后,或者系统管理员通过添加或移除一个或多个节点来修改集群的布局(layout)之后。
例:通过redis-cli连接master1(slot为0-5500),写入一个key,该key通过CRC16校验后对16384取模决定放在5845号槽中(slot),而5845号槽分布在master2上,cluster再把该key转发(redirect)到master2上。
redis-cli 连接cluster某个主节点需要增加-c参数
如:
./redis-cli -c -h host -p port


5. 扩容缩容
5.1. 扩容
5.1.1. 添加主主节点
扩容指的是添加主主节点
扩容分为三个步骤
一、 启动新的redis主节点
二、 将新的redis主节点加入cluster集群
三、 分配hash槽
5.1.1.1. 启动新的redis主节点
新增机器192.168.242.132
从上述cluster集群任意一个机器上复制$HOME/redis-cluster到192.168.242.132上,删除
$HOME/redis-cluster/run路径下的文件,删除$HOME/redis-cluster/run/logs路径下的文件,删除$HOME/redis-cluster/run/data路径下的文件
进入$HOME/redis-cluster路径,启动6301主节点
$ ./redis-server redis_6301.conf

此时新主节点与cluster的关系如下图:


5.1.1.2. 将新主节点加入已有的cluster集群
命令格式如下:
./redis-trib.rb add-node ip1:port1 ip2:port2
add-node命令是增加新主节点(节点)
ip1:port1 新增的redis主节点(节点)的ip和端口
ip2:port2 已有的cluster集群中的任意一个主节点的ip和端口
下图展示新增redis主节点过程:


此时新增redis主节点与cluster的关系如下图:


新的redis主节点加入了cluster,但尚未分配hash槽,不会有数据写入该主节点,也不会到该主节点上读取数据,但可以通过该主节点转发请求(写入或读取)


5.1.1.3. 分配hash槽
分配hash槽的命令格式:
./redis-trib.rb reshard ip:port
reshard 该命令是重新分配hash槽,即可以向新增的redis主节点分配hash槽,也可以对已有的redis主节点进行重新分配hash槽
ip:port cluster集群中任意一个节点
操作步骤:
$ ./redis-trib.rb reshard 192.168.242.132:6301
执行改命令后,cluster集群会检查所有redis主节点,并询问分配多少个hash槽


输入需要的hash槽数量后,cluster询问需要分配hash槽的redis主节点 的ID(目标redis主节点)


输入ID后,cluster询问从已有的cluster的哪个主节点分出hash槽,此处输入源redis主节点的ID,如果输入all,则表示从现有的所有的redis主节点中分出hash槽到新增redis主节点中,此时cluster会计算并选择合适的hash槽分配到新增redis主节点中


分配hash槽后的关系图:


可以连接cluster集群中的任意一个redis主节点查看cluster信息:


5.1.2. 添加从主节点
5.1.2.1. 通过redis-trib.rb添加
通过redis-trib.rb有两种方式
第一种:
命令格式
./redis-trib.rb add-node --slave ip1:port1 ip2:port2
add-node 增加节点命令
--slave 增加节点的属性,slave角色
ip1:port1 增加的slave的ip和端口
ip2:port2 目标cluster集群的任意一个节点的ip和端口
此处的命令和添加一个主节点命令类似,此处并没有指定添加的这个从节点的主节点,这种情况下系统会在其他的复制集中的主节点中随机选取一个作为这个从节点的主节点。
下图展示的是把192.168.242.132:6302作为slave加入cluster中


第二种:
./redis-trib.rb add-node --slave --master-id xxxx ip1:port1 ip2:port2
该方式指定增加的slave的master
--master-id xxxx master的id

5.1.2.2. 通过从节点自身添加
该方式指的是改变一个slave的master ,即该redis节点已经在cluster集群中,并是某个master的slave
通过redis-cli连接slave(已192.168.242.132:6302为例)


5.2. 缩容
缩容的步骤和扩容的步骤相反,
1、 先把要下线 的redis 主节点中的hash槽迁移到cluster中的其他redis主节点上
2、 从cluster中移除需下线的redis主节点
3、 停止已移除的redis主节点
缩容验证思路:
在移除hash槽前,先连接cluster集群中的任意一个主节点,写入一个key,查看该key落在几号hash槽上,移除该hash槽所在的redis节点(即缩容),缩容完成后,再次读取该key,验证是否命中。


cluster 集群信息


缩容节点:192.168.242.130:6301
5.2.1. 移除hash槽
可以把需下线的redis主节点(源节点)上的hash 槽均匀的移到其他主节点(目标节点)上,也可以全部移到一个节点上
命令格式:
$ ./redis-trib.rb reshard ip:port

reshard 重新分片命令
ip:port cluster集群中的任意一个节点
步骤:
1、通过redis-trib.rb连接任意一个节点
2、输入需要移动的hash 槽的数量
3、输入目标节点的id
4、输入源节点的id,回车后输入done
5、cluster集群计算后给出配置信息,输入yes完成hash槽的迁移
下图展示一次完成的hash槽迁移:


5.2.2. 移除需下线的redis主节点
cluster集群中一个redis主节点的所有的hash槽完全迁移后,即可将该主节点从cluster集群中移除
移除命令格式:
$ ./redis-trib.rb del-node ip:port xxxx

del-node 从cluster集群中移除一个主节点
ip:port cluster集群中任意一个节点ip和端口
xxxx 需要移除的主节点的id
下图展示移除过程:


被移除后的redis实例,会停止运行
5.2.3. 移除从节点
移除从节点较为简单,因为不需要迁移hash槽,直接用命令一处即可


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  redis cluster 集群部署