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路径下会有如下文件

文件说明:

编号

文件

说明

1

mkreleasehdr.sh

redis自带的版本管理工具,非redis源码编译产生

2

redis-benchmark

性能测试工具

3

redis-check-aof

aof文件检测修复工具

4

redis-check-rdb

rdb文件检查修复工具

5

redis-cli

redis客户端

6

redis-sentinel

哨兵server

7

redis-server

redis服务端

8

redis-trib.rb

ruby语言编写,非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集群扩容和缩容_redis集群cluster搭建,扩容缩容相关推荐

  1. 故障转移集群无法连接到节点_Redis集群以及自动故障转移测试

    在Redis中,与Sentinel(哨兵)实现的高可用相比,集群(cluster)更多的是强调数据的分片或者是节点的伸缩性,如果在集群的主节点上加入对应的从节点,集群还可以自动故障转移,因此相比Sen ...

  2. redis 集群_Redis集群管理

    阅读文本大概需要10分钟. 1.简介 Redis在生产环境中一般是通过集群的方式进行运行,Redis集群包括主从复制集群和数据分片集群两种类型. *主从复制集群提供高可用性,而数据分片集群提供负载均衡 ...

  3. 两台服务器安装redis集群_Redis Cluster搭建高可用Redis服务器集群

    一.Redis Cluster集群简介 Redis Cluster是Redis官方提供的分布式解决方案,在3.0版本后推出的,有效地解决了Redis分布式的需求,当一个节点挂了可以快速的切换到另一个节 ...

  4. Redis高可用集群Redis Cluster搭建

    前言: Redis3.0版本之前,可以通过Redis Sentinel(哨兵)来实现高可用 ( HA ),从3.0版本之后,官方推出了Redis Cluster,它的主要用途是实现数据分片(Data ...

  5. Redis数据结构、持久化、缓存技术和集群详解

    redis 是什么? 是完全开源免费的,用c语言编写的,是一个单线程,高性能的(key/value)内存数据库,基于内存运行并支持持久化的nosql数据库 能干嘛? 主要是用来做缓存,但不仅仅只能做缓 ...

  6. 04_Flink-HA高可用、Standalone集群模式、Flink-Standalone集群重要参数详解、集群节点重启及扩容、启动组件、Flink on Yarn、启动命令等

    1.4.Flink集群安装部署standalone+yarn 1.4.1.Standalone集群模式 1.4.2.Flink-Standalone集群重要参数详解 1.4.3.集群节点重启及扩容 1 ...

  7. Redis高可用——主从复制、哨兵模式、集群

    文章目录 一.Redis高可用 1.什么是高可用 2.Redis的高可用技术 二.Redis主从复制 1.Redis主从复制的作用 2.主从复制的流程 三.主从复制的搭建 实验准备 1.所有主机安装R ...

  8. Redis搭建集群,三主三从集群模式

    几种常见的redis集群模式: 方案一:主从复制 优点: 支持主从复制,主机会自动将数据同步到从机,可以进行读写分离 为了分载Master的读操作压力,Slave服务器可以为客户端提供只读操作的服务, ...

  9. redis进阶持久化、事务、主从复制、集群高可用

    一.redis持久化 1 Rdb方式 Rdb方式一般为redis的默认数据持久化方式.默认开启,是通过手动(save-阻塞式,bgsave-异步)或周期性方式保存redis中key/value的一种机 ...

最新文章

  1. ubuntu下SVN服务器安装配置
  2. MIPS介绍与MIPS汇编的常用指令
  3. php提交注册表单,php用户注册表单验证
  4. Hug a developer today
  5. 50 个 jQuery 插件可将你的网站带到另外一个高度 【已翻译100%】
  6. rslinx连接linux教程,RSLinx Classic软件通讯配置教程
  7. http请求接口开发的几种方式
  8. preparedstatement mysql 数据_使用PreparedStatement对象操作数据库
  9. 【C/C++】标准库之 numeric
  10. Python简单操作爬取微博热搜榜(表格.xls模式存储)
  11. [编程题] 翻转数列--附详细分析思路
  12. layui 改写 table 排序,填加中文按照拼音排序
  13. Python项目实战:各种小说姓名生成器
  14. 射线与圆、球相交检测
  15. 【C#上位机】西门子1200PLC实用定位控制程序案例
  16. 日历javascript代码
  17. 2022湖南最新建筑八大员(市政)考试试题题库及答案解析
  18. 在循环之前或循环中声明变量之间的区别?
  19. Iometer 测试
  20. python伪代码的写法_伪代码的写法

热门文章

  1. WebSphere安装
  2. MySql数据库连接超时处理
  3. Linux下root密码忘记的解决办法
  4. 移民澳洲好网站http://home.hexun.com/ausky/default.html
  5. gitee项目能用SVN拉取吗_用好 Git 和 SVN,轻松驾驭版本管理
  6. php文件数组,从文件到数组php
  7. java list 截取部分数据_Java List.subList()方法:获取列表中指定范围的子列表
  8. java amr 转 mp3_JAVA 音频转换AMR 转MP3,OS,Linux cent os 7
  9. SQL Cursor(游标)
  10. 体质测试java代码_求java代码,要求做一个测试类,实现以下功能之一。最好三个功能都有。...