redis-cluster搭建

一,系统概述

  1. 1系统总体构架

Redis-Cluster架构

说明:每台Redis机器上有三个Redis实例:一个Master节点,两个Slave节点(Slave节点用来对主节点数据进行备份以及故障切换使用)。Master-Slave的组合方式如图1所示,在Cluster模式下,每个组内有一个Master和一至多个Slave(图中为1个Master对应2个Slave),且多个组的master共同组成一个Cluster集群。

(1)所有的Redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽;

(2)节点的fail是通过集群中超过半数的节点对其检测,检测失效时才生效;

(3)客户端与redis节点直连,不需要中间proxy层,客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可;

(4) Redis-Cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<-> value。

1.2主从数据同步

Redis在2.8及以上版本使用psync命令完成主从数据同步,同步过程分为:全量复制和增量复制。增量复制是对老版复制的重大优化,有效避免了不必要的全量复制操作。

从节点使用psync命令完成增量复制和全量复制功能,命令格式:pysnc {runId} {offset},参数含义如下:

  • runId:从节点所复制主节点的运行id。
  • offset:当前从节点已复制的数据偏移量。

psync命令运行流程如图2所示:

流程说明:

  • 从节点(slave)发送psync命令给主节点,参数runId是当前从节点保存的主节点运行ID,如果没有则默认值为?,参数offset是当前从节点保存的复制偏移量,如果是第一次参与复制则默认值为-1。
  • 主节点(master)根据psync参数和自身数据情况决定响应结果:
  • 如果回复+FULLRESYNC {runId}{offset},那么从节点将触发全量复制流程。
  • 如果回复+CONTINUE,从节点将触发增量复制流程。
  • 如果回复+ERR,说明主节点版本低于Redis 2.8,无法识别psync命令,从节点将发送旧版的sync命令触发全量复制流程。

1.3故障恢复

Redis集群自身实现了高可用:当集群内少量节点出现故障时通过自动故障转移保证集群可以正常对外提供服务。

当主节点发生故障时,需要在它的从节点中选出一个替换它,从而保证集群的高可用。当从节点通过内部定时任务发现自身复制的主节点宕掉时,将会触发故障恢复流程,如图所示:

  • 资格审查:每个从节点检查最后与主节点断线时间,判断是否有资格替换故障的主节点。如果从节点与主节点断线时间超过cluster-node-time*cluster-slave-validity-factor,则当前从节点不具备故障转移资格。参数cluster-slave-validity-factor用于判断从节点是否有资格参与选举的有效因子,默认为10。
  • 准备选举时间:当从节点符合故障转移资格后,更新触发故障选举的时间,只有到达该时间后才能执行后续流程。
  • 发起选举:当从节点定时任务检测故障选举时间(failover-auth-time)到达后,发起选举流程。
  • 选举投票
  • 替换主节点

1.4 Redis持久化

Redis支持两种持久化方式:RDB和AOF,下面会对两种持久化方式做介绍。不论哪种持久化方式,都会带来性能的消耗。可以通过配置文件来指定它们中的一种,或者同时使用它们(不建议同时使用),或者全部禁用。

如果你的redis运行在网络稳定性差/物理环境糟糕情况下,建议你的master和slave均采取AOF;

如果你的环境一切非常良好,且redis服务需要接受密集性的write操作,那么建议master采取RDB,slave采取AOF方式。

RDB持久化适用场景

一次性把当前进程数据生成内存快照保存到硬盘,产生的文件紧凑压缩比更高,因此读取RDB恢复速度更快。Redis默认开启RDB持久化。

适用场景:由于每次生成RDB开销较大,无法做到实时持久化,一般用于数据冷备和全量复制场景。

AOF持久化适用场景

以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中的命令达到恢复数据的目的。Redis默认AOF持久化关闭。

适用场景:AOF的主要作用是解决了数据持久化的实时性,可将数据及时同步到文件中,但需要较多的磁盘IO。适用于对数据备份实时性、安全性要求较高的场景。

二,Redis cluster安装步骤

2.1 安装准备工作

程序包准备

  1. redis安装包:redis-3.2.3.tar.gz
  2. redis依赖包:ruby-2.3.1.tar.gz、rubygems-2.6.6.zipredis-3.3.1.gem

文件路径准备,需要建立两个独立文件系统

  1. 新建安装包存放的文件目录:mkdir -p /data1/redis ,目录权限设置为 755,且属主属组设置为redistt用户;

b)新建依赖包存放的文件目录:mkdir -p /data1/redis/ruby

c) 新建存放持久化数据的文件目录:mkdir -p /data1/redis/dump  (可选项!开启持久化时建立此目录)

Redis安装需要创建如下用户组用户

名称

类型

标识

主组

主目录

描述

bc

-

-

redis用户组

redistt

用户

bc

/data1/redis

redis用户

需要按照我行数据中心相关管理要求,为以上用户设置密码。

2.2 安装依赖软件

安装redis集群,需要用到一个管理redis集群的工具redis-trib.rb,它将redis提供的集群命令封装成简单、便捷、实用的操作命令,redis-trib.rb是用ruby开发的,所以redis集群需要先安装ruby环境。

使用root用户安装

(1)安装Ruby(此步需要先确认系统是否已安装ruby,已安装的是什么版本,如果是ruby 1.8.7,此版本过低,后面创建集群会出问题。需要卸载老版本,可通过yum remove ruby命令卸载,然后利用下面步骤安装新版本2.3.1)

tar -zxvf  ruby-2.3.1.tar.gz

cd ruby-2.3.1

./configure

make

make install

(2)安装rubygem

cd ..

unzip rubygems-2.6.6.zip

cd rubygems-2.6.6

ruby setup.rb

(3)安装gem-redis

cd ..

gem install -l redis-3.3.1.gem           (#安装包的位置)

三,安装配置Redis Server

3.1创建redis目录

su - redistt

mkdir -p /data1/redis/buildit/

mkdir -p /data1/redis/config/

mkdir -p /data1/redis/logs/

mkdir -p /data1/redis/backup/

//创建集群目录(根据本机具体端口设置,本文档设置了三个端口7003,7005,7007)

mkdir -p /data1/redis/config/7003

mkdir -p /data1/redis/config/7005

mkdir -p /data1/redis/config/7007

查看目录

ls -alrt /data1/redis

3.2 安装Redis Server

cd /data1/redis/buildit/

cp /data1/redis/redis-3.2.3.tar.gz ./

tar -zxvf  redis-3.2.3.tar.gz

cd redis-3.2.3

make

exit   #切换root用户

cd /data1/redis/buildit/redis-3.2.3

make install

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

su – redistt  #切换到redistt用户

cd /data1/redis/buildit/redis-3.2.3

cp redis.conf  /data1/redis/backup/

cp redis.conf  /data1/redis/config/7003

cp redis.conf  /data1/redis/config/7005

cp redis.conf  /data1/redis/config/7007

3.3 Redis Cluster配置

所有服务器的所有端口的redis.conf都要做此配置,在本文档中使用了三台服务器,每个服务器上有三个端口(7003,7005,7007)。

vi /data1/redis/config/[端口]/redis.conf

(1)修改daemonize no 为 daemonize yes,即配置redis以守护进程方式运行

(2)修改bind地址为本机服务器IP 如bind 22.5.230.132(IP按实际情况写)

(3)修改端口为指定端口 如 port 7003

(4)修改pid文件位置及名称pidfile /var/run/redis_[端口号].pid

(5)设置redis日志,logfile /data1/redis/logs/redis_[端口号].log

(6)设置redis的日志级别,loglevel notice

(7)持久化设置(核心下移项目redis主从均关闭持久化)

redis默认开启RDB方式,AOF方式默认关闭。所以按如下方式,注释RDB持久化配置项。

# save 900 1

# save 300 10

# save 60 10000  (关闭RDB)

(8)设置客户端可以执行的管理命令(将敏感操作命令进行重命名,仅仅管理员知晓)

# rename-command CONFIG “ ”   改为:

rename-command CONFIG "ADMCONFIG"

并添加下面几行:

rename-command FLUSHDB “ADMFLUSHDB”

rename-command FLUSHALL “ADMFLUSHALL”

 (9)根据系统的内存情况,设置支持的最大内存数(依实际情况设置)

maxmemory 8gb

(10)设置达到最大内存后的内存清理策略。(依据数据重要性,选择是否配置)

maxmemory-policy allkeys-lru ,达到最大内存后,根据最少使用原则优先删除最近未使用的key。

如果不配置该项,默认达到maxmemory后key也不会被删除。

(11)开启集群模式

cluster-enabled yes

(12)设置集群节点配置文件 (启动自动生成) 

cluster-config-file nodes_端口号.conf

(13)设置集群节点宕机时间(即多少毫秒断开连接即被认为是宕机)

cluster-node-timeout 15000

(14)设置从节点failover为主节点时间因子:  

从节点failover为主节点需要经过(node-timeout * slave-validity-factor) + repl-ping-slave-period 毫秒的时间,如node-timeout为30ms,时间因子slave-validity-factor为10,repl-ping-slave-period为10ms,则经过310ms后从节点升级为主节点。

因此,为保证集群可用性,一般设置时间因子为0即

cluster-slave-validity-factor 0设为0,从节点会一直尝试启动failover。

默认值是10s,超过310秒slave将不会尝试进行故障转移)

(15)设置cluster-migration-barrier 1(即有多于1个slave节点时,slave节点能够自动迁移至没有从节点的主节点上)

(16)设置cluster-require-full-coverage no(即部分节点宕机,其他节点仍对外提供服务。默认不提供服务)

(17)为Redis集群设置访问密码(requirepass和masterauth都需要设置,否则发生主从切换时,就会遇到授权问题。(注意各个 节  点的密码都必须一致)(使用redis-trib.rb工具构建集群,集群构建前不要设置密码,构建后通过config set+ config rewrite命令逐个机器设置密码,所以此步跳过 。)

# requirepass foobared

修改为:

requirepass abc

masterauth abc

(注:abc是个密码示例,具体可根据实际情况设置,建议密码位数20位左右,防暴力破解)

//修改配置文件属性,每台服务器的每个端口都需执行

chmod og-r /data1/redis/config/[端口]/redis.conf

ls -alrt  /data1/redis/config/

3.4Redis加入系统服务

 #切换到root用户,然后依次执行如下操作:

cd /data1/redis/buildit/redis-3.2.3

cp utils/redis_init_script /etc/rc.d/init.d/redis

cp /etc/rc.d/init.d/redis /data1/redis/backup/

vi /etc/rc.d/init.d/redis

(1)REDISPORT=6379 修改为:

REDISPORT=$2

(2)CONF="/etc/redis/${REDISPORT}.conf" 修改为:

CONFLOC="/data1/redis/config/${REDISPORT}"

(3)$EXEC $CONF 修改为下面两行(即删除$EXEC $CONF行,添加下面两行)

cd $CONFLOC

$EXEC redis.conf

wq退出vi

3.5 启动Redis Server服务

  1. root用户
  2. 所有服务器的所有端口都要启动

/etc/init.d/redis start [端口号]

  1. 检查服务进程是否存在

ps -ef|grep redis

   正常情况如下:

3.6 创建Redis Cluster集群

只需在其中一台服务器上执行创建集群命令(命令中具体的ip以实际情况为准)

添加失败,把虚拟机中的防火墙清一下 : iptables -F

redis-trib.rb create --replicas 2 192.168.136.136:7003 192.168.136.137:7003 192.168.136.138:7003  192.168.136.136:7005 192.168.136.137:7005 192.168.136.138:7005 192.168.136.136:7007 192.168.136.137:7007 192.168.136.138:7007

解释说明:

 a) redis-trib.rb create为集群创建命令;

 b) –replicas  2 指定了为Redis Cluster中的每个Master主节点配备几个Slave从节点,节点角色由顺序决定,先master主节点,之后是slave从节点;

创建过程:

通过以上两图可以看出cluster已经建立完成.

也可以通过如下命令检查说明cluster已经建立完成:

输出如下信息,没有任何警告或错误,表示集群启动成功并处于ok状态:

[OK] All nodes agree about slots configuration.

>>> Check for open slots...

>>> Check slots coverage...

[OK] All 16384 slots covered

通过客户端测试redis-cli -c -h hostIP -p port

$ redis-cli -c -h 22.5.230.133 -p 7003

到此,Redis Cluster安装步骤结束。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值