Redis-Cluster集群搭建及配置

来源:互联网 发布:爱普生清零软件中文版 编辑:程序博客网 时间:2024/06/06 00:06

前言

在上一篇文章中队redis进行了简单的介绍和安装,在这一篇文章中进行一个redis-Cluster的集群搭建。

Redis-Cluster介绍

redis-cluster架构设计

这里写图片描述
架构细节:

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

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

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

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

(5)Redis集群预分好16384个桶,当需要在 Redis 集群中放置一个 key-value 时,根据 CRC16(key) mod 16384的值,决定将一个key放到哪个桶中。

集群搭建

    Redis集群中要求奇数节点,所以至少要有三个节点,并且每个节点至少有一备份节点,所以需要6台服务器。这里我在一个服务器中使用了6个节点。

搭建

    1.在user/local路径下新建文件夹redis-cluster,复制redis(简单的介绍和安装文章中安装的redis) 到这个路径下

#创建redis-clustermkdir redis-cluster#将redis复制到redis-cluster文件目录中,分别命名为1-6cp -r /usr/local/redis /usr/local/redis-cluster/redis01cp -r /usr/local/redis /usr/local/redis-cluster/redis02cp -r /usr/local/redis /usr/local/redis-cluster/redis03......

这里写图片描述

    2.修改每一个下面的redis.conf文件

#编辑redis.confvim redis.conf#需要进行修改的内容port=7001#(剩下5个分别为7002,,7003,7004,7005,7006)  cluster-enabled yes  cluster-require-full-coverage no    #默认是yes,只要有结点宕机导致16384个槽没全被覆盖,整个集群就全部停止服务,所以一定要改为no

    3.需要一个ruby脚本redis-trib.rb 放到redis-cluster下(将redis的解压目录src目录下的该文件复制过去)

cp /usr/local/redis-3.2.9/src/redis-trib.rb  /usr/local/redis-cluster/

    4.执行ruby脚本

      执行ruby脚本,需要安装ruby的环境

 yum install ruby    yum install rubygems  

    5.安装redis需要依赖的gem包

      下载:https://rubygems.org/gems/redis/versions/3.2.2

      将redis-3.2.2.gem拷贝到linux的/usr/local/redis-cluster/下,然后执行安装

gem install redis-3.2.2.gem  

    6.启动所有的redis实例,

    启动上面创建的那6个redis节点,为了简便我们在/usr/local/redis-cluster/写一个脚本来启动所有的redis,内容如下

#redis集群启动脚本内容cd redis01/bin  ./redis-server redis.conf  cd ../../  cd redis02/bin  ./redis-server redis.conf  cd ../../  cd redis03/bin  ./redis-server redis.conf  cd ../../  cd redis04/bin  ./redis-server redis.conf  cd ../../  cd redis05/bin  ./redis-server redis.conf  cd ../../  cd redis06/bin  ./redis-server redis.conf  cd ../../  #给这个shell文件赋予执行权限chmod +x ./start-all.sh#开启所有的实例./start-all.sh

    7.使用redis-trib.rb创建集群

    因为是在服务器进行搭建测试,这里使用的ip是127.0.0.1,如果需要客户端访问,需要设置为服务器的ip,例192.168.251.129

./redis-trib.rb create --replicas 1 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  127.0.0.1:7006  

这里写图片描述
    然后输入yes 回车,如下图集群搭建成功:
这里写图片描述
注意:如果创建集群的时候报错:[ERR]Node XXXXXX is not empty. Either the node already knows other nodes (check withCLUSTER NODES) or contains some key in database 0
解决:删除生成的配置文件nodes.conf,如果不行则说明现在创建的结点包括了旧集群的结点信息,需要删除redis的持久化文件后再重启redis,比如:appendonly.aof、dump.rdb

    8.连接集群

    使用redis-cli -p 端口 -h ip地址 <-c>连接集群,连接任一节点都可以连接到集群中,但一定要带上 -c参数。如图说明成功。

#因为是本机,所以直接省略的ip直接写上了端口号redis01/bin/redis-cli -p 7001 -c

这里写图片描述

集群故障转移

测试故障转移

    使用下面命令查看所有的主从节点信息

./redis-trib.rb check 127.0.0.1:7001

这里写图片描述
    根据上图可以看到7001 7003 7005都是主节点,下面我们来模拟7005主节点宕机
    使用ps -ef|grep redis命令查看7005主节点的pid,进行kill -9 pid杀掉,我再看一下集群信息:

#找到7005的pidps -ef|grep redis#杀掉7005的进程kill -9 2699#查看集群信息./redis-trib.rb check 127.0.0.1:7001

这里写图片描述
    过几秒中我们在看一下
这里写图片描述
    最后,再次启动7005的redis服务,再次查看集群信息,发现7005并没有变为主节点,而是成为了7002的从节点,证明集群可用了
这里写图片描述

添加节点

节点新增包括新增主节点、从节点两种情况。以下分别做一下测试:

添加主节点

    1.继续复制redis命名为redis07、redis08、redis09

cp /usr/local/redis /usr/local/redis-clusr/redis07cp /usr/local/redis /usr/local/redis-clusr/redis08cp /usr/local/redis /usr/local/redis-clusr/redis09

    2.依次修改redis7007/7008/7009,的配置文件,端口号分别为7007/7008/7009,其他配置修改同上。

vim redis07/bin/redis.conf....

    3.启动redis07,并查看现在所有启动的redis

#启动7007[root@bogon bin]#./redis-server redis.conf#查看所有启动的redis[root@bogon bin]# ps -ef|grep redis

这里写图片描述

    4.添加节点到集群中
    上面可以看到,7007已经启动,现在加入集群中。添加使用redis-trib.rb的add-node命令

./redis-trib.rb add-node 127.0.0.1:7007 127.0.0.1:7002  
说明:add-node是加入集群节点,127.0.0.1:7007为要加入的节点,127.0.0.1:7002 表示加入的集群的一个节点,用来辨识是哪个集群,理论上那个集群的节点都可以。

报错:Node 127.0.0.1:7007 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
解决:删除redis07bin目录下的nodes.conf和dump.rdb。

    继续执行命令,成功:
这里写图片描述
    7.查看7007节点状态

./redis-trib.rb check 127.0.0.1:7007  

这里写图片描述
    从上图可以看出7007作为了主节点,但是他是没有slots需要我们给他进行分配。我们手动对集群进行重新分片迁移数据,需要重新分片命令 reshard

# 这个命令是用来迁移slot节点的,后面的127.0.0.1:7005是表示是哪个集群,端口填[7000-7007]都可以, redis-trib.rb reshard 127.0.0.1:7005

这里写图片描述

说明:How many slots do you want to move (from 1 to 16384)? 4096#输入4096表示要移动4096个哈希槽What is the receiving node ID?   #把这4096个哈希槽给谁呢?输入7007节点对应的idSource node #1: all    #输入all表示从所有的哈希槽拥有者中抽取4096个给7007节点也可以从固定的节点中拿4096个 Source node #1: 339a50df26f4722f14faba2a8fe3cad508059e88    #输入某个节点的id表示 从该节点上拿4096个 给7007这个节点 然后再执行done命令

    我们选择all 摁回车会展示分配槽的信息,再输入yes 回车就开始从其他节点进行槽点移动,如图
这里写图片描述
    8.现在我们查看集群的信息

./redis-trib.rb check 127.0.0.1:7007

这里写图片描述
    这样主节点7007添加成功

添加从节点

    1.新增从节点的命令为

./redis-trib.rb add-node --slave --master-id $[nodeid] 127.0.0.1:7008 127.0.0.1:7001
说明:$[nodeid]为要加到master主节点的node id;127.0.0.1:7000为集群的一个节点(集群的任意节点都行),用来辨识是哪个集群;如果没有给定那个主节点--master-id的话,redis-trib将会将新增的从节点随机到从节点较少的主节点上

    2.现在我们添加一下7008,看是否会自动加到没有从节点的7007主节点上

./redis-trib.rb add-node --slave 127.0.0.1:7008 127.0.0.1:7001

这里写图片描述
    3.查看7007的从节点信息

cd redis07/bin./redis-cli -c -p 7007 cluster nodes | grep d4d12a29ba5a491237cbd3b837fce52cf798979a

这里写图片描述

改变从节点的Master

    比如我们要将刚才的将7008添加为7007的从节点,现在将他修改为7001的从节点

    1.连接7008端口

./redis-cli -h 127.0.0.1 -p 7008 -c  #连接要修改的从节点

    2.移动到新的主节点

cluster replicate 002491fcd763e9d7ea9715a4b84f95321c534ff4    #002491fcd763e9d7ea9715a4b84f95321c534ff4为新的主节点node id

这里写图片描述

节点移除

和新增节点一样,节点的移除也分为主节点移除和从节点移除

移除主节点

    1.移除命令

redis-trib del-node 127.0.0.1:7002  ${node-id}  
说明:127.0.0.1:7002为集群节点,node-id为要删除的主节点。和添加节点不同,移除节点node-id是必需的,测试删除7001主节点:

    2.移除过程

    如果主节点有从节点,将从节点转移到其他主节点
    如果主节点有slot,去掉分配的slot,然后在删除主节点
    现在我们移除7007作为测试:

    3.进行移除

#取消分配的solts./redis-trib.rb reshard 127.0.0.1:7007
说明:How many slots do you want to move (from 1 to 16384)?4096  #移除多少个哈希槽,7007有4096个 全部移走What is the receiving node ID? 002491fcd763e9d7ea9715a4b84f95321c534ff4//接收7007节点slot的master  我们用7001来接收Source node #1: d4d12a29ba5a491237cbd3b837fce52cf798979a//被删除master7007的node-id  Source node #2:done  Do you want to proceed with the proposed reshard plan (yes/no)? yes //取消slot后,reshard

    此时7001的槽点
这里写图片描述
    4.执行删除

./redis-trib.rb del-node 127.0.0.1:7007 d4d12a29ba5a491237cbd3b837fce52cf798979a

这里写图片描述
    现在没有7007节点了,说明节点移除成功

移除从节点

    移除从节点比较简单。可以直接进行移除

./redis-trib.rb del-node 127.0.0.1:7009 2ab1b061c36f30ae35604e9a171ae3afdc3c87e5

参考资料

1.http://blog.csdn.net/qq_34021712/article/details/70244320
2.http://blog.csdn.net/fengshizty/article/details/51368004

原创粉丝点击