部署Redis高可用集群

目录

部署Redis高可用集群

Redis集群环境

拓扑结构

IP地址

环境准备

工作原理

创建Redis集群

部署管理主机

redis-trib.rb脚本

redis服务器开启集群功能

管理主机创建集群

查看集群信息

错误排查

访问集群

管理集群(测试高可用)

测试集群功能

故障切换测试

添加服务器

添加master服务器

添加slave服务器

移除集群中的服务器

移除slave服务器

移除master服务器

将移除的redis服务器添加到集群

解散redis集群

把集群中的机器恢复为独立的redis服务器


部署Redis高可用集群

 

Redis集群环境

拓扑结构

  • Redis服务器:6台

  • 管理主机:1台

  • 客户端:1台

部署Redis高可用集群_第1张图片

IP地址

  • redis服务器IP地址及端口规划

主机名

IP地址

端口号

client50

192.168.159.50

redis51

192.168.159.51

6351

redis52

192.168.159.52

6352

redis53

192.168.159.53

6353

redis54

192.168.159.54

6354

redis55

192.168.159.55

6355

redis56

192.168.159.56

6356

host57

192.168.159.57

环境准备

  • 在所有集群主机(主机51~56)上运行redis服务

1、安装redis服务

Redis-4.0.11下载地址:http://www.redis.cn/download.html

以主机51为例,主机51~56都要进行以下操作

将下载好的软件包上传到51~56操作系统中:

[root@redis51 ~]# ls /root

[root@redis51 ~]# rpm -q gcc      //源码安装需要使用编译软件gcc

gcc-4.8.5-44.el7.x86_64

[root@redis51 ~]# yum -y install gcc        //若没有安装gcc,请安装gcc

[root@redis51 ~]# tar -zxvf redis-4.0.11.tar.gz

[root@redis51 ~]# cd redis-4.0.11

[root@redis51 redis-4.0.11]# make

[root@redis51 redis-4.0.11]# make install

2、检查redis服务

[root@redis51 redis-4.0.11]# ./utils/install_server.sh     //使用默认初始化配置,全部选项都按回车

[root@redis51 redis-4.0.11]# netstat -lntup | grep 6379       //查看服务是否运行

[root@redis51 ~]# /etc/init.d/redis_6379 stop        //停止服务

  • 修改配置文件

1、设置ip地址、端口:

[root@redis51 ~]# vim /etc/redis/6379.conf

  70 bind 192.168.159.51       //修改配置文件第70行,修改允许连接redis服务的ip地址

  93 port 6351                       // 修改配置文件第93行,修改redis服务的端口号

[root@redis51 ~]# /etc/init.d/redis_6379 start       //重启服务,使修改的配置生效

[root@redis51 ~]# netstat -lntup | grep 6351      //查看监听端口号和允许连接的ip地址

tcp        0      0 192.168.159.51:6351     0.0.0.0:*               LISTEN      23482/redis-server

2、验证6台主机的配置

主机192.168.159.51:

[root@redis51 ~]# netstat -lntup | grep 6351

tcp        0      0 192.168.159.51:6351     0.0.0.0:*               LISTEN      27860/redis-server

主机192.168.159.52:

[root@redis52 ~]# netstat -lntup | grep 6352

tcp        0      0 192.168.159.52:6352     0.0.0.0:*               LISTEN      16420/redis-server

主机192.168.159.53:

[root@redis53 ~]# netstat -lntup | grep 6353

tcp        0      0 192.168.159.53:6353     0.0.0.0:*               LISTEN      80097/redis-server

主机192.168.159.54:

[root@redis54 ~]# netstat -lntup | grep 6354

tcp        0      0 192.168.159.54:6354     0.0.0.0:*               LISTEN      14205/redis-server

主机192.168.159.55:

[root@redis55 ~]# netstat -lntup | grep 6355

tcp        0      0 192.168.159.55:6355     0.0.0.0:*               LISTEN      14126/redis-server

主机192.168.159.56:

[root@redis56 ~]# netstat -lntup | grep 6356

tcp        0      0 192.168.159.56:6356     0.0.0.0:*               LISTEN      82620/redis-server

  • 环境确认

    • 主机50~57的防火墙和SELinux处于关闭状态

      • ]# systemctl stop firewalld      //如果防火墙没关执行此操作,关闭防火墙

      • ]# setenforce 0        //如果SELinux没关执行此操作,关闭SELinux

    • redis服务器51~56内不能有数据

      • > flushall       //如果有数据执行此操作,清除所有数据

      • > save      //清除完数据,保存

工作原理

  • 工作原理

—— Redis集群是一个分布式存储高可用集群。

—— 分布式:数据存储在不同地点的服务器上,即数据存储在不同地点的不同服务器上。

—— 存取规则:通过获取存储数据的变量名,用算法CRC16做hash计算,计算结果会得到一个数字,将数字与16384进行求模运算,根据余数决定将变量与值,存放在集群的哪台服务器上。当我们创建集群的时候,会分配给每个主机占用编号的范围,这个范围叫哈希槽范围,判断取余与每个主机的哈希槽范围(编号范围)作对比,最终存放在余数所在哈希槽范围内的服务器上。

部署Redis高可用集群_第2张图片

创建Redis集群

部署管理主机

  • 也可部署在任意一台redis服务器上

—— 在生产环境中,我们也可以将管理服务部署在某一台redis服务器上面。

        优点:节省硬件资源,节约成本。

        缺点:当该服务器宕机时,管理主机也就宕机了,导致集群瘫痪。

—— 部署ruby脚本运行环境

—— 创建管理集群脚本

1、部署ruby脚本运行环境

1)安装ruby脚本依赖包

[root@host57 ~]# yum -y install ruby   

[root@host57 ~]# rpm -q ruby

ruby-2.0.0.648-36.el7.x86_64

2)安装第三方扩展程序

由于ruby脚本无法和redis通信,所以我们需要安装第三方扩展功能软件redis-3.2.1.gem来解决这个问题。

redis-3.2.1.gem下载地址:https://rubygems.org/gems/redis/versions/3.2.1

将软件redis-3.2.1.gem上传到主机192.168.159.57上:

[root@host57 ~]# ls

//如图所示,redis.3.2.1.gem软件包需要使用gem命令进行安装

[root@host57 ~]# which gem       //查看系统是否有gem命令

/usr/bin/gem

[root@host57 ~]# rpm -qf /usr/bin/gem       //查看提供gem命令的软件包

rubygems-2.0.14.1-36.el7.noarch        //在安装ruby脚本依赖包时,已经自动安装这个依赖包了。如果没有gem命令,就使用yum安装这个软件。

[root@host57 ~]# gem install redis-3.2.1.gem       //用命令gem来安装软件包redis.3.2.1.gem

部署Redis高可用集群_第3张图片

//如图所示,安装成功。

2、创建管理集群脚本

1)在源码包redis-4.0.11.tar.gz中找到管理集群脚本

将源码包redis-4.0.11.tar.gz上传到主机192.168.159.57目录/root中

[root@host57 ~]# ls

[root@host57 ~]# tar -zxf redis-4.0.11.tar.gz

[root@host57 ~]# cd redis-4.0.11/

[root@host57 redis-4.0.11]# cd src/

[root@host57 src]# ls *.rb

redis-trib.rb

2)将脚本拷贝到系统命令所在的路径下

[root@host57 src]# echo $PATH         //查看系统命令所在的路径下

/root/perl5/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin

[root@host57 src]# mkdir /root/bin       //创建命令检索目录

[root@host57 src]# cp redis-trib.rb /root/bin       //创建管理集群脚本

[root@host57 src]# ls /root/bin

redis-trib.rb

[root@host57 src]# ls -l /root/bin/         //查看是否有执行权限,脚本必须要有执行权限

total 68

-rwxr-xr-x. 1 root root 65991 Jan 18 03:08 redis-trib.rb

[root@host57 src]# redis-trib.rb help       //查看命令帮助,此时能输出帮助信息,说明管理集群脚本创建成功

注意:如果在执行 redis-trib.rb help 出现如下图所示错误,说明没有安装第三方插件redis-3.2.1.gem。

redis-trib.rb脚本

  • 用法格式

—— ]# redis-trib

命令

描述

create

创建集群

check

检查集群

info

查看集群信息

reshard

重新分片

del-node

删除主机

add-node --slave

添加slave主机

add-node

添加master主机

rebalance

平均分配hash slots

redis服务器开启集群功能

  • 配置6台redis服务器

—— 启用集群功能

—— 查看服务信息

主机redis51~56都要进行下面三步操作,以下以51为例进行示范:

1、查看是否开启集群功能

[root@redis51 ~]# redis-cli -h 192.168.159.51 -p 6351

192.168.159.51:6351> cluster info       //查看本机在集群里的信息

ERR This instance has cluster support disabled      //报错显示禁用集群支持,因为主机redis51没有开启集群功能

2、6台redis服务器启用集群功能

1)修改配置文件启用集群功能

[root@redis51 ~]# vim /etc/redis/6379.conf

815 cluster-enabled yes     //配置文件第815行去掉注释。启用集群功能

823 cluster-config-file nodes-6379.conf       //配置文件第823行去掉注释。定义存储集群信息的文件,使用默认文件,集群创建完毕后,文件 nodes-6379.conf 会自动创建在数据库目录下。

829 cluster-node-timeout 5000        //配置文件第829行去掉注释,将超时时间修改为5000毫秒。连接超时时间(单位毫秒),即redis服务器51如果在5000毫秒之内没有连接上另外5台redis服务器,说明对方的机器宕机了。

部署Redis高可用集群_第4张图片

//如图所示,红圈圈起来的地方是配置文件中需要修改的地方。

[root@redis51 ~]# redis-cli -h 192.168.159.51 -p 6351 shutdown        //关闭redis服务

[root@redis51 ~]# /etc/init.d/redis_6379 start        //重启redis服务,使修改的配置文件生效

Starting Redis server...

[root@redis51 ~]# netstat -lntup | grep redis-server       //查看服务是否运行

//如图所示,端口6351是redis服务的端口;端口16351是集群通信端口,集群通信端口是redis服务端口+10000。

3、查看本机服务的集群信息

[root@redis51 ~]# redis-cli -h 192.168.159.51 -p 6351

192.168.159.51:6351> cluster info       //查看本机在集群里的信息

部署Redis高可用集群_第5张图片

//如图所示,cluster_state:fail 集群的状态是失败的,因为还没有创建集群,所以当前的机器还没有在集群中。

4、验证6台主机的配置

主机192.168.159.51:

[root@redis51 ~]# netstat -lntup | grep redis

主机192.168.159.52:

[root@redis51 ~]# netstat -lntup | grep redis

主机192.168.159.53:

[root@redis51 ~]# netstat -lntup | grep redis

主机192.168.159.54:

[root@redis51 ~]# netstat -lntup | grep redis

主机192.168.159.55:

[root@redis51 ~]# netstat -lntup | grep redis

主机192.168.159.56:

[root@redis51 ~]# netstat -lntup | grep redis

管理主机创建集群

  • 管理主机host57创建集群

—— 创建集群

—— 查看集群信息

—— 检测集群

1、在管理主机host57上创建集群

[root@host57 ~]# redis-trib.rb create --replicas 1 \

192.168.159.51:6351 192.168.159.52:6352 \

192.168.159.53:6353 192.168.159.54:6354 \

192.168.159.55:6355 192.168.159.56:6356

//选项 --replicas 1 是定义每台主库的从库个数,即每台主库分配1台从库。--replicas 2 就是每台主库分配2台从库,即一共就需要9台服务器,以此类推。

部署Redis高可用集群_第6张图片

//如图所示,输出信息显示正在创建集群,正在为6个节点分配哈希槽。

选出了三个主服务器分别是:192.168.159.51:6351、192.168.159.52:6352、192.168.159.53:6353

给主服务器192.168.159.51:6351添加从服务器192.168.159.55:6355

给主服务器192.168.159.51:6352添加从服务器192.168.159.55:6356

给主服务器192.168.159.51:6353添加从服务器192.168.159.55:6354

M : 是指主服务器;S : 是指从服务器。

主服务器192.168.159.51:6351的哈希槽范围是0-5460(共5461个槽)

主服务器192.168.159.52:6352的哈希槽范围是5461-10922(共5461个槽)

主服务器192.168.159.53:6353的哈希槽范围是10923-16383(共5461个槽)

由于从服务器是同步主服务器的数据,所以从服务器不需要分配哈希槽。

部署Redis高可用集群_第7张图片

//如图所示,输入yes就按照系统分配的创建集群。红圈圈起来的地方的意思是所有的槽都已经分配完了;一共16384个槽都已全部分配。显示的这两行都是OK说明集群创建成功。

查看集群信息

  • 在管理主机host57上查看集群信息

—— 命令格式:redis-trib.rb info redis服务器IP:对应端口号

[root@host57 ~]# redis-trib.rb info 192.168.159.51:6351       //输入6台redis服务器中任意一台的IP和端口号,即可获得相同的输出信息(进群信息)

//如图所示,主库IP地址:端口号(主库ID号) -> 里面有0个变量(即无数据) | 分配了5461个槽 | 分配了一个从库

三个主库里面有0个变量(即无数据)

  • 在管理主机host57上检测集群

[root@host57 ~]# redis-trib.rb check 192.168.159.51:6351       //检查集群主机角色

部署Redis高可用集群_第8张图片

//如图所示,显示[OK]表示检测没有问题。

主库:该库的ID号 该库的IP地址:端口号 分配的哈希槽范围:0-5460(共5461个槽)主服务器

从库:该库的ID号 该库的IP地址:端口号 没有分配哈希槽(0个槽) 从服务器 同步数据 主库的ID号

  • 在每一台redis服务器本机查看集群信息

—— 以下使用主机51和52为示例

主机192.168159.51:

[root@redis51 ~]# redis-cli -h 192.168.159.51 -p 6351

192.168.159.51:6351> cluster info      //查看你集群信息

部署Redis高可用集群_第9张图片

192.168.159.51:6351> cluster nodes       //查看集群节点信息

部署Redis高可用集群_第10张图片

//如图所示,可以看见redis服务器对应的ip地址和端口号,以及该redis服务器是主服务器还是从服务器,myself是指当前查看信息的服务器

主机192.168.159.52:

[root@redis52 ~]# redis-cli -h 192.168.159.52 -p 6352

192.168.159.52:6352> cluster info      //查看你集群信息

192.168.159.52:6352> cluster nodes       //查看集群节点信息

部署Redis高可用集群_第11张图片

错误排查

如果出现以下错误,可以参考下面的解决思路,如果没有出现错误,可忽略此步骤。

  • 创建集群时可能出现的错误原因

—— 数据库服务器的数据没有清空

—— redis服务器没有启用集群功能

出现以上两种错误,需要删除配置文件/var/lib/redis/6379/node-6379.conf 并重启服务(每一台机器都要进行此操作),然后再进行集群的创建。因为无论集群创建成功还是失败,集群的信息都会存储在文件 /var/lib/redis/6379/node-6379.conf 中。如果修改完后,没有重启服务就会出现错误,提示集群已经创建

  • 解决思路

—— 主机51~56都要进行以下步骤

1、rm -rf /var/lib/redis/6379/nodes-6379.conf

2、重启动 redis 服务

3、在管理主机上再次执行创建集群命令

访问集群

  • 在客户端可以连接集群中任意一台redis服务器

  • 命令:]# redis-cli -c -h ip地址 -p 端口号

  • 选项 -c 集群模式。如果不加选项 -c ,将不会以集群的工作方式存储数据。

1、在主机192.168.159.50访问集群,并进行存储

1)安装redis服务,提供redis命令

[root@client50 ~]# redis-cli -c -h 192.168.159.51 -p 6351

bash: redis-cli: command not found...

[root@client50 ~]# ls       //上传redis软件包

[root@client50 ~]# tar -zxf redis-4.0.11.tar.gz

[root@client50 ~]# cd redis-4.0.11/

[root@client50 redis-4.0.11]# make

[root@client50 redis-4.0.11]# make install

[root@client50 redis-4.0.11]# ./utils/install_server.sh        //使用默认初始化配置,全部选项都按回车

[root@client50 redis-4.0.11]# /etc/init.d/redis_6379 stop

Stopping ...

Redis stopped

2)连接redis服务器进行数据存储

[root@client50 ~]# redis-cli -c -h 192.168.159.51 -p 6351       //选项 -c 以集群的方式访问数据库服务器51

192.168.159.51:6351> keys *       //此时的数据库服务器是没有数据的

(empty list or set)

192.168.159.51:6351> set name bob       //插入数据

-> Redirected to slot [5798] located at 192.168.159.52:6352       //因为值5798在主机52的槽的范围内,所以数据存储到了主机192.168.159.52上

OK

192.168.159.52:6352> keys *     

1) "name"

2、检查数据是否存入

主机192.168.159.51:

[root@redis51 ~]# redis-cli -h 192.168.159.51 -p 6351

192.168.159.51:6351> keys *       //发现没有数据,所以数据没有存储到主机51上

(empty list or set)

主机192.168.159.52:

[root@redis52 ~]# redis-cli -h 192.168.159.52 -p 6352

192.168.159.52:6352> keys *       //数据存入到数据库服务器52上

1) "name"

3、查看主从同步配置

1)在数据库服务器52上查看主从信息

主机192.168.159.52:

192.168.159.52:6352> cluster nodes

部署Redis高可用集群_第12张图片

//如图所示,本主机192.168.159.52是主服务器,可以通过主机52的id号,看到主机56是主机52的从服务器

2)在从服务器上查看同步的数据

主机192168.159.56:

[root@redis56 ~]# redis-cli -h 192.168.159.56 -p 6356

192.168.159.56:6356> keys *       //看见从服务器的数据已经同步

1) "name"     

4、再次存入数据并进行查看

1)客户端连接主机51进行数据存入

192.168.159.51:6351> set age 19

OK

192.168.159.51:6351> keys *

1) "age"

2)在主机51上查看数据

[root@redis51 ~]# redis-cli -h 192.168.159.51 -p 6351

192.168.159.51:6351> keys *

1) "age"

3)查看主从信息

192.168.159.51:6351> cluster nodes

部署Redis高可用集群_第13张图片

//如图所示,主机51是主服务器,主机55是主机51的从服务器

4)在从服务器上查看数据是否同步

主机192.168.159.55:

[root@redis55 ~]# redis-cli -h 192.168.159.55 -p 6355

192.168.159.55:6355> keys *       //从服务器数据同步成功

1) "age"

综上所示:当客户端连接到集群后存入数据,数据存储到哪个数据库服务器上,取决于经过算法发出的槽值,在哪个主库的槽范围内。

管理集群(测试高可用)

测试集群功能

故障切换测试

  • 停止 master 主机的 redis 服务

—— master宕机后对应的slave自动被选举为master

—— 原master启动后,会自动配置为当前master的slave

  • 检测集群

—— 在管理主机查看信息

—— ]# redis-trib.rb check 192.168.159.51:6351

—— ]# redis-trib.rb info 192.168.159.51:6351

  • 示例

1、在管理主机57上查看集群信息

[root@host57 ~]# redis-trib.rb check 192.168.159.51:6351

部署Redis高可用集群_第14张图片

//如图所示,显示ok说明集群正常

[root@host57 ~]# redis-trib.rb info 192.168.159.51:6351

部署Redis高可用集群_第15张图片

//如图所示,我们可以看出主服务器为51、52和53

2、停止主服务器51的redis服务,模拟主服务器宕机

主机192.168.159.51:

[root@redis51 ~]# redis-cli -h 192.168.159.51 -p 6351 shutdown

[root@redis51 ~]# netstat -lntup | grep redis-server       //没有输出结果表示服务已经停止

之前配置文件中我们设置了超时时间为5000毫秒,5000毫秒后主机51还没有恢复正常,那么主机51的从服务器55就会变为主服务器。

3、查看主从信息

[root@host57 ~]# redis-trib.rb info 192.168.159.51:6351       //主机51的redis服务关闭后,就不能通过主机51的IP查询主从信息了

[ERR] Sorry, can't connect to node 192.168.159.51:6351

[root@host57 ~]# redis-trib.rb info 192.168.159.52:6352       //查看主从信息

部署Redis高可用集群_第16张图片

//如图所示,主机52、53和55为主服务器,因为主机55是主机51的从服务器,所以当主机51宕机时,从服务器55自动变为主服务器。由于是一主一从结构,所以此时主服务器55没有从服务器了。

4、模拟主机51宕机期间存入数据

[root@client50 ~]# redis-cli -c -h 192.168.159.52 -p 6352

192.168.159.52:6352> set name bob       //这条数据存入到了主机52上,数据存入到哪个服务器是根据算法决定的,存入的数据不一定存入到主机55

OK

192.168.159.52:6352> set num 16

-> Redirected to slot [2765] located at 192.168.159.55:6355       //这条数据存入到主机55

OK

192.168.159.55:6355> keys *       //查看主机55的数据

1) "num"

2) "age"

5、恢复服务器51

主机192.168.159.51:

[root@redis51 ~]# /etc/init.d/redis_6379 start

Starting Redis server...

[root@redis51 ~]# netstat -lntup | grep redis-server

6、恢复后查看集群信息

主机192.168.159.57:

[root@host57 ~]# redis-trib.rb info 192.168.159.51:6351

部署Redis高可用集群_第17张图片

//如图所示,主机55本来没有从服务器,恢复主机51后,主机51自动变为主机55的从服务器。

[root@host57 ~]# redis-trib.rb check 192.168.159.51:6351

部署Redis高可用集群_第18张图片

//如图所示,主机51是主服务器55的从服务器。

7、查看恢复后数据是否自动同步

主机192.168.159.50:

使用客户端访问集群

[root@client50 ~]# redis-cli -c -h 192.168.159.51 -p 6351

192.168.159.51:6351> keys *       //此时主机51 为从服务器,且已经自动同步了宕机期间的数据

1) "num"

2) "age"

添加服务器

添加master服务器

  • 部署一台新的redis服务器

—— 运行服务并启用集群配置

—— 目的:为了扩大存储空间

                   减轻已有主服务器的访问压力

  • 添加master主机步骤

—— 添加master主机

—— 分配hash槽(slots)

  • 添加master主机

—— 添加时不指定主机角色,默认新主机被选为master

—— 添加的master主机,需手动分配hash槽

—— ]# redis-trib.rb add-node 192.168.159.58:6358 192.168.159.51:6351

         ]# redis-trib.rb add-node 要添加新机器的IP和端口 集群中任意一台机器的IP和端口

        输出结果显示 [OK] New node added correctly 表示添加成功

  • 重新分片

—— 移除hash槽个数

—— 接收hash槽主机ID

—— 移出hash槽主机ID

—— ]# redis-trib.rb reshard 192.168.159.51:6351       //重新分片

  • 示例

1、添加一台新的redis服务器58

[root@redis58 ~]# ip a | grep ens33

部署Redis高可用集群_第19张图片

[root@redis58 ~]# systemctl stop firewalld

[root@redis58 ~]# setenforce 0

[root@redis58 ~]# getenforce

Permissive

2、运行redis服务,并启动集群功能

1)安装redis服务

将下载好的软件包上传到主机58上:

[root@redis58 ~]# tar -zxvf redis-4.0.11.tar.gz

[root@redis58 ~]# cd redis-4.0.11

[root@redis58 redis-4.0.11]# make

[root@redis58 redis-4.0.11]# make install

[root@redis58 redis-4.0.11]# ./utils/install_server.sh     //使用默认初始化配置,全部选项都按回车

[root@redis58 redis-4.0.11]# netstat -lntup | grep 6379       //查看服务是否运行

[root@redis58 ~]# /etc/init.d/redis_6379 stop        //停止服务

2)设置ip地址、端口:

[root@redis58 ~]# vim /etc/redis/6379.conf

  70 bind 192.168.159.58       //修改配置文件第70行,修改允许连接redis服务的ip地址

  93 port 6358                       // 修改配置文件第93行,修改redis服务的端口号

[root@redis58 ~]# /etc/init.d/redis_6379 start       //重启服务,使修改的配置生效

[root@redis58 ~]# netstat -lntup | grep 6358      //查看监听端口号和允许连接的ip地址

tcp        0      0 192.168.159.58:6358     0.0.0.0:*               LISTEN      57591/redis-server

3)启用主机reds58的集群功能

①修改配置文件启用集群功能

[root@redis58 ~]# vim /etc/redis/6379.conf

815 cluster-enabled yes     //配置文件第815行去掉注释。启用集群功能

823 cluster-config-file nodes-6379.conf       //配置文件第823行去掉注释。定义存储集群信息的文件,使用默认文件,集群创建完毕后,文件 nodes-6379.conf 会自动创建在数据库目录下。

829 cluster-node-timeout 5000        //配置文件第829行去掉注释,将超时时间修改为5000毫秒。连接超时时间(单位毫秒),即redis服务器51如果在5000毫秒之内没有连接上另外5台redis服务器,说明对方的机器宕机了。

部署Redis高可用集群_第20张图片

②重启服务使配置生效

[root@redis58 ~]# redis-cli -h 192.168.159.58 -p 6358 shutdown        //关闭redis服务

[root@redis58 ~]# /etc/init.d/redis_6379 start        //重启redis服务,使修改的配置文件生效

Starting Redis server...

[root@redis58 ~]# netstat -lntup | grep redis-server       //查看服务是否运行

③查看本机服务的集群信息

[root@redis58 ~]# redis-cli -h 192.168.159.58 -p 6358

192.168.159.51:6358> cluster info       //查看本机在集群里的信息

部署Redis高可用集群_第21张图片

//如图所示,cluster_state:fail 集群的状态是失败的,因为当前的机器还没有在集群中。

3、在管理主机57,向集群添加master角色的redis服务器

[root@host57 ~]# redis-trib.rb add-node 192.168.159.58:6358 192.168.159.51:6351

部署Redis高可用集群_第22张图片

[root@host57 ~]# redis-trib.rb info 192.168.159.51:6351       //查看集群信息

部署Redis高可用集群_第23张图片

//如图所示,redis服务器58,已经成功添加到集群中。我们可以看见redis服务器58上有0个hash槽,说明数据永远不会存储到redis服务器58上,所以我们需要重新分配hash槽。

4、给新添加的master角色的redis服务器分配hash槽

[root@host57 ~]# redis-trib.rb reshard 192.168.159.51:6351

部署Redis高可用集群_第24张图片部署Redis高可用集群_第25张图片

//如图所示,How many slots do you want to move (from 1 to 16384)? 4096

意思是你想要移除多少个槽,移除4096个槽。因为一共16384个槽,共四个主服务器,所以每个服务器应该分配4096个槽。

What is the receiving node ID? b822e189c8cfdf4b78aa93b203916e3f14e6ce30

意思是接收4096个槽的主机ID是多少,b822e189c8cf...是主机192.168.159.58的ID

Source node #1:all

意思是从哪移出槽,all就是从当前所有主机上总共移出4096个槽

Do you want to proceed with the proposed reshard plan (yes/no)? yes

意思是你同意这样的设置么,yes就是同意,然后开始分配槽。

5、查看集群信息

[root@host57 ~]# redis-trib.rb info 192.168.159.51:6351

部署Redis高可用集群_第26张图片

//此时主机192.168.159.58有4096个槽,每个主服务器上都有4096个槽。

6、访问新添加的master角色的redis服务器存取数据

主机192.168.159.50:

[root@client50 ~]# redis-cli -c -h 192.168.159.58 -p 6358

192.168.159.58:6358> keys *

1) "age"

2) "name"

192.168.159.58:6358> set v1 1

OK

192.168.159.58:6358> set v2 2

-> Redirected to slot [13550] located at 192.168.159.53:6353

OK

192.168.159.53:6353> set v3 3

-> Redirected to slot [9423] located at 192.168.159.52:6352

OK

192.168.159.52:6352> set v4 4

-> Redirected to slot [5160] located at 192.168.159.55:6355

OK

添加slave服务器

  • 部署一台新的redis服务器

—— 运行服务并启用集群配置

  • 添加slave主机

—— ]# redis-trib add-node --slave [ --master-id id值 ] IP地址:端口 192.168.159.51:6351

如果不指定主节点的 id 的话,会把新节点随机添加为从节点最少的主库

  • 示例

1、添加一台新的redis服务器59

[root@redis59 ~]# ip a | grep ens33

部署Redis高可用集群_第27张图片

[root@redis59 ~]# systemctl stop firewalld

[root@redis59 ~]# setenforce 0

[root@redis59 ~]# getenforce

Permissive

2、运行redis服务,并启动集群功能

1)安装redis服务

将下载好的软件包上传到主机59上:

[root@redis59 ~]# tar -zxvf redis-4.0.11.tar.gz

[root@redis59 ~]# cd redis-4.0.11

[root@redis59 redis-4.0.11]# make

[root@redis59 redis-4.0.11]# make install

[root@redis59 redis-4.0.11]# ./utils/install_server.sh     //使用默认初始化配置,全部选项都按回车

[root@redis59 redis-4.0.11]# netstat -lntup | grep 6379       //查看服务是否运行

[root@redis59 ~]# /etc/init.d/redis_6379 stop        //停止服务

2)设置ip地址、端口:

[root@redis59 ~]# vim /etc/redis/6379.conf

  70 bind 192.168.159.59       //修改配置文件第70行,修改允许连接redis服务的ip地址

  93 port 6359                       // 修改配置文件第93行,修改redis服务的端口号

[root@redis59 ~]# /etc/init.d/redis_6379 start       //重启服务,使修改的配置生效

[root@redis59 ~]# netstat -lntup | grep 6359      //查看监听端口号和允许连接的ip地址

tcp        0      0 192.168.159.59:6359    0.0.0.0:*              LISTEN      7144/redis-server 1

3)启用主机reds59的集群功能

①修改配置文件启用集群功能

[root@redis59 ~]# vim /etc/redis/6379.conf

815 cluster-enabled yes     //配置文件第815行去掉注释。启用集群功能

823 cluster-config-file nodes-6379.conf       //配置文件第823行去掉注释。定义存储集群信息的文件,使用默认文件,集群创建完毕后,文件 nodes-6379.conf 会自动创建在数据库目录下。

829 cluster-node-timeout 5000        //配置文件第829行去掉注释,将超时时间修改为5000毫秒。连接超时时间(单位毫秒),即redis服务器51如果在5000毫秒之内没有连接上另外5台redis服务器,说明对方的机器宕机了。

部署Redis高可用集群_第28张图片

②重启服务使配置生效

[root@redis59 ~]# redis-cli -h 192.168.159.59 -p 6359 shutdown        //关闭redis服务

[root@redis59~]# /etc/init.d/redis_6379 start        //重启redis服务,使修改的配置文件生效

Starting Redis server...

[root@redis59 ~]# netstat -lntup | grep redis-server       //查看服务是否运行

③查看本机服务的集群信息

[root@redis59 ~]# redis-cli -h 192.168.159.59 -p 6359

192.168.159.51:6359> cluster info       //查看本机在集群里的信息

部署Redis高可用集群_第29张图片

//如图所示,cluster_state:fail 集群的状态是失败的,因为当前的机器还没有在集群中。

3、在管理主机57,向集群添加slave角色的redis服务器

[root@host57 ~]# redis-trib.rb info 192.168.159.51:6351 //查看集群信息

部署Redis高可用集群_第30张图片

//如图所示,注意此时主服务器192.168.159.58没有从服务器

[root@host57 ~]# redis-trib.rb add-node --slave 192.168.159.59:6359 192.168.159.51:6351 //向集群添加从服务器59。注意:如果不使用选项 --master-id 指定主节点的 id 的话,会把新节点随机添加为从节点最少的主库,由于主库58没有从服务器,所以此处可以不指定。如果主库从服务器的个数相等的话,就会将从服务器随机添加给任意一个主库。

部署Redis高可用集群_第31张图片

//如图所示,[OK] New node added correctly. 表示添加成功

4、查看集群信息

[root@host57 ~]# redis-trib.rb info 192.168.159.51:6351 //查看集群信息

部署Redis高可用集群_第32张图片

//如图所示,此时主库192.168.159.58有一个从服务器。

[root@host57 ~]# redis-trib.rb check 192.168.159.51:6351 //检查集群状态

部署Redis高可用集群_第33张图片

//如图所示,主机192.168.159.59是从服务器,从id为b822e189c8...的服务器复制数据,id为b822e189c8...的服务器是主服务器192.168.159.58,所以数据库192.168.159.59是主库192.168.159.58的从库。

5、访问新添加的slave角色的redis服务器存取数据

主机192.168.159.50:

[root@client50 ~]# redis-cli -c -h 192.168.159.59 -p 6359

192.168.159.59:6359> keys *

1) "v1"

2) "name"

3) "age"

192.168.159.59:6359> set v10 10

-> Redirected to slot [10847] located at 192.168.159.52:6352

OK

移除集群中的服务器

移除slave服务器

  • 移除slave主机

—— 从服务器没有hash槽,直接移除即可

—— 移除时指定从服务器id值

—— ]# redis-trib.rb del-node 192.168.159.51:6351 949e7793cfed1c859ef91e141f9395c686552ec4

]# redis-trib.rb del-node 集群中任意主机IP和端口号 要删除从服务器的ID值

  • 示例

1、在管理主机上删除从服务器59

主机192.168.159.57:

[root@host57 ~]# redis-trib.rb info 192.168.159.51:6351

部署Redis高可用集群_第34张图片

//如图所示,主库192.168.159.58有一个从服务器

[root@host57 ~]# redis-trib.rb del-node 192.168.159.51:6351 949e7793cfed1c859ef91e141f9395c686552ec4

//如图所示,移除时会自动停止该节点上的服务,即停止主机59上的redis服务

2、查看集群信息,并在主机59上查看服务是否停止

主机192.168.159.57:

[root@host57 ~]# redis-trib.rb info 192.168.159.51:6351

部署Redis高可用集群_第35张图片

//如图所示,此时主服务器192.168.159.58没有从服务器

主机192.168.159.59:

[root@redis59 ~]# netstat -lntup | grep redis-server //没有输出结果,表示redis服务器已经关闭

移除master服务器

  • 配置步骤

—— 释放占用的hash槽

—— 移除主机

—— ]# redis-trib.rb reshard 192.168.159.51:6351 //重新分片

—— ]# redis-trib.rb del-node 192.168.159.51:6351 master主机id值

  • 释放占用的slots

—— 指定移出 slots 个数

—— 指定接收 slots 主机ID

—— 指定移出 slots 主机ID

  • 示例

1、释放占用的hash槽

注意:之前占用hash槽存储的数据,会自动存储到迁移。即主库192.168.159.58占用的hash槽移给了目标服务器,先前根据移除的hash槽范围存储的数据,也会移动到对应的服务器上。

[root@host57 ~]# redis-trib.rb reshard 192.168.159.51:6351

部署Redis高可用集群_第36张图片部署Redis高可用集群_第37张图片

//如图所示:How many slots do you want to move (from 1 to 16384)? 4096

意思是你想要移除多少个槽,移除4096个槽。因为主库192.168.159.58一共分配了4096个槽。

What is the receiving node ID? af9b6fc5f07683a044f21c700a9f92a8eeb2581b

意思是接收4096个槽的主机ID是多少,af9b6fc5f...是主机192.168.159.52的ID,意思是将移除的4096个槽分配给主机主机192.168.159.52。

Source node #1:b822e189c8cfdf4b78aa93b203916e3f14e6ce30

意思是从哪移出槽,b822e189c...是主机192.168.159.58的ID,即从主机192.168.159.58中移出。

Source node #2:done

意思是还要从哪个主机上移出槽,done是不在添加,即从主机192.168.159.58中移出4096个槽。

Do you want to proceed with the proposed reshard plan (yes/no)? yes

意思是你同意这样的设置么,yes就是同意,然后开始分配槽。

2、查看集群信息,查看数据是否迁移

[root@host57 ~]# redis-trib.rb info 192.168.159.51:6351

部署Redis高可用集群_第38张图片

[root@client50 ~]# redis-cli -c -h 192.168.159.52 -p 6352

192.168.159.52:6352> keys * //主机58的数据已经被迁移到主机52上了

1) "v3"

2) "age"

3) "number"

4) "v10"

5) "name"

6) "v1"

3、在管理主机57上删除主机

[root@host57 ~]# redis-trib.rb del-node 192.168.159.51:6351 b822e189c8cfdf4b78aa93b203916e3f14e6ce30 //从集群中删除主机58

//如图所示,删除成功,主机58上的redis服务已经关闭。

主机192.168.159.58:

[root@redis58 ~]# netstat -lntup | grep redis-server //没有输出结果,说明主机58上的redis服务已经关闭

4、查看集群信息

[root@host57 ~]# redis-trib.rb info 192.168.159.51:6351 //查看集群信息

//如图所示,主机192.168.159.58已被删除。

5、平均分配槽的个数

[root@host57 ~]# redis-trib.rb info 192.168.159.51:6351 //查看集群信息

//如图所示,我们可以看出主机192.168.159.52占的槽的个数最多,那么就会导致主机52被访问的次数要比别的数据库多,所以我们将所有槽平均分给三个主库。

[root@host57 ~]# redis-trib.rb rebalance 192.168.159.51:6351 //将槽的个数平均分配

部署Redis高可用集群_第39张图片

[root@host57 ~]# redis-trib.rb info 192.168.159.51:6351

//如图所示,各主库的槽的个数已被平均分配。

将移除的redis服务器添加到集群

1、启动服务,重置集群信息

[root@redis59 ~]# netstat -lntup | grep redis-server

[root@redis59 ~]# /etc/init.d/redis_6379 start

Starting Redis server...

[root@redis59 ~]# netstat -lntup | grep redis-server

[root@redis59 ~]# redis-cli -h 192.168.159.59 -p 6359

192.168.159.59:6359> cluster info //此时查看集群信息,主机59还在集群中

cluster_state:ok

cluster_slots_assigned:16384

cluster_slots_ok:16384

cluster_slots_pfail:0

cluster_slots_fail:0

cluster_known_nodes:8

cluster_size:3

cluster_current_epoch:15

cluster_my_epoch:14

cluster_stats_messages_ping_sent:265

cluster_stats_messages_sent:265

cluster_stats_messages_pong_received:52

cluster_stats_messages_received:52

192.168.159.59:6359> cluster reset //重置集群信息

OK

192.168.159.59:6359> flushall //确保主机59中没有数据

OK

192.168.159.59:6359> save //保存

OK

192.168.159.59:6359> exit

2、添加主机59,做主机52的从库

[root@host57 ~]# redis-trib.rb check 192.168.159.51:6351

//查看主库192.168.159.52的id值

[root@host57 ~]# redis-trib.rb add-node --slave --master-id af9b6fc5f07683a044f21c700a9f92a8eeb2581b 192.168.159.59:6359 192.168.159.51:6351 //add-node添加节点,--slave添加的节点为从库,--master-id指定主库的id(即指定添加的节点为主库52的从库),192.168.159.59:6359是添加节点IP地址,192.168.159.51:6351连接集群(可为集群中任意一台主机的ip和端口)。

部署Redis高可用集群_第40张图片

[root@host57 ~]# redis-trib.rb info 192.168.159.51:6351

//如图所示,主库52有两个从服务器。

解散redis集群

把集群中的机器恢复为独立的redis服务器

除管理主机57外,所有主机(51-59)都要执行以下五个步骤

1、停止服务

[root@redis51 ~]# redis-cli -h 192.168.159.51 -p 6351 shutdown

2、删除数据库目录下的所有文件

[root@redis51 ~]# rm -rf /var/lib/redis/6379/*

3、禁用集群功能

[root@redis51 ~]# vim +815 /etc/redis/6379.conf

815 # cluster-enabled yes //注释第815行

823 # cluster-config-file nodes-6379.conf //注释第823行

829 # cluster-node-timeout 5000 //注释第829行

部署Redis高可用集群_第41张图片

4、启动服务

[root@redis51 ~]# /etc/init.d/redis_6379 start

Starting Redis server...

5、连接服务,查看集群信息

[root@redis51 ~]# redis-cli -h 192.168.159.51 -p 6351

192.168.159.51:6351> keys *

(empty list or set)

192.168.159.51:6351> cluster info

ERR This instance has cluster support disabled

你可能感兴趣的:(Redis数据库,redis,数据库,linux)