八、Redis Cluster介绍与搭建

Redis Cluster 介绍与搭建

1.Redis Cluster介绍
  Redis Cluster是Redis的分布式解决方案,在Redis 3.0版本正式推出的,有效解决了Redis分布式方面的需求。当遇到单机内存、并发、流量等瓶颈时,可以采用Cluster架构达到负载均衡的目的。
1.1 数据分布理论
  分布式数据库首要解决把整个数据集按照分区规则映射到多个节点的问题,即把数据集划分到多个节点上,每个节点负责整个数据的一个子集。常见的分区规则有哈希分区和顺序分区。Redis Cluster采用哈希分区规则,因此接下来会讨论哈希分区规则。常见的哈希分区有以下几种:

  • 节点取余分区
  • 一致性哈希分区
  • 虚拟槽分区

  Redis Cluster采用虚拟槽分区,因此先介绍一下虚拟槽分区。

  虚拟槽分区巧妙地使用了哈希空间,使用分散度良好的哈希函数把所有的数据映射到一个固定范围内的整数集合,整数定义为槽(slot)。比如Redis Cluster槽的范围是0 ~ 16383。槽是集群内数据管理和迁移的基本单位。采用大范围的槽的主要目的是为了方便数据的拆分和集群的扩展,每个节点负责一定数量的槽。

1.2Redis数据分区
  Redis Cluster采用虚拟槽分区,所有的键根据哈希函数映射到0 ~ 16383,计算公式:slot = CRC16(key)&16383。每一个节点负责维护一部分槽以及槽所映射的键值数据。

  下图展现一个五个节点构成的集群,每个节点平均大约负责3276个槽,以及通过计算公式映射到对应节点的对应槽的过程。
这里写图片描述
Redis虚拟槽分区的特点:

  • 解耦数据和节点之间的关系,简化了节点扩容和收缩难度。
  • 节点自身维护槽的映射关系,不需要客户端或者代理服务维护槽分区元数据。
  • 支持节点、槽、键之间的映射查询,用于数据路由、在线伸缩等场景。

1.3集群功能限制

  Redis集群相对单机在功能上有一定限制。

  • key批量操作支持有限。如:msetmget,目前只支持具有相同slot值的key执行批量操作。
  • key事务操作支持有限。支持多key在同一节点上的事务操作,不支持分布在多个节点的事务功能。
  • key作为数据分区的最小粒度,因此不能将一个大的键值对象映射到不同的节点。如:hash、list。
  • 不支持多数据库空间。单机下Redis支持16个数据库,集群模式下只能使用一个数据库空间,即db 0。
  • 复制结构只支持一层,不支持嵌套树状复制结构。

2.搭建 Redis Cluster
  搭建集群主要有两种方式,一种是原生命令安装,另一种是官方工具安装
2.1原生命令安装(仅用于理解原理,真实搭建不推荐这种)
搭建集群工作分为三步:

  • 准备节点
  • 节点握手
  • 分配槽

2.1.1准备节点
  Redis 集群一般由多个节点组成,节点数量为6个才能保证组成完整高可用的集群。下面给出一个节点的配置,其他的节点和该节点只是端口不同。

port 7000
daemonize yes
dir /usr/local/redis/data
logfile "7000.log"
dbfilename "dump-7000.rdb"
cluster-enabled yes
cluster-config-file nodes-7000.conf
//若一个节点不可用,则集群不可用(默认yes)
cluster-require-full-coverage no

启动所有的节点

./redis-server conf/redis-7000.conf
./redis-server conf/redis-7001.conf
./redis-server conf/redis-7002.conf
./redis-server conf/redis-7003.conf
./redis-server conf/redis-7004.conf
./redis-server conf/redis-7005.conf

可以查看日志文件

cat log/redis-7000.log
13103:M 30 May 15:02:09.577 * DB loaded from disk: 0.000 seconds
13103:M 30 May 15:02:09.578 * The server is now ready to accept connections on port 7000

  有日志文件可得,节点已经启动成功。这个日志文件是Redis服务器普通的日志文件,在集群模式下,第一次也会自动创建一个日志文件,由配置文件cluster-config-file指定文件。
  集群配置文件的作用:当集群内节点发生信息变化时,如添加节点、节点下线、故障转移等。节点会自动保存集群的状态到配置文件中。该配置文件由Redis自行维护,不要手动修改,防止节点重启时产生集群信息错乱。

我们来查看一下,集群模式的日志文件:

cat nodes-7000.conf 
29978c0169ecc0a9054de7f4142155c1ab70258b :0 myself,master - 0 0 0 connected
vars currentEpoch 0 lastVoteEpoch 0

也可以通过客户端连接该节点,通过命令CLUSTER NODES来查看:

127.0.0.1:7000> CLUSTER NODES
29978c0169ecc0a9054de7f4142155c1ab70258b :6379 myself,master - 0 0 0 connected

2.1.2节点握手
  节点握手是指一批运行在集群模式的节点通过Gossip协议彼此通信,达到感知对方的过程。节点握手是集群彼此通信的第一步。
  命令方式握手

./redis-cli -p 7000 cluster meet 127.0.0.1 7001
./redis-cli -p 7000 cluster meet 127.0.0.1 7002
./redis-cli -p 7000 cluster meet 127.0.0.1 7003
./redis-cli -p 7000 cluster meet 127.0.0.1 7004
./redis-cli -p 7000 cluster meet 127.0.0.1 7005

  客户端方式握手

cluster meet <ip> <port>

查看日志或者使用命令查看是否已经成功感知其他节点

//命令
./redis-cli -p 7000 cluster nodes

cf9f8d97e122b0cc4d3b151650f00a5724ba6109 127.0.0.1:7002 master - 0 1533732030903 0 connected
66669ca2d52a849c58b26e1fe5e9e58c763c0a82 127.0.0.1:7000 myself,master - 0 0 1 connected
78ce474fa7cb82fbb6c8547c222098ea4f725956 127.0.0.1:7001 master - 0 1533732031913 2 connected
46e5b438b44fab8d18c08d7d692df8e3337a924d 127.0.0.1:7005 master - 0 1533732029896 5 connected
43a5439f089438a3c02e7fb86c336235dbeb3263 127.0.0.1:7004 master - 0 1533732024848 4 connected
b94a564dcb9954da98e6da8dc99da51008d7373b 127.0.0.1:7003 master - 0 1533732028886 3 connected

./redis-cli -p 7000 cluster info

cluster_state:fail
cluster_slots_assigned:0
cluster_slots_ok:0
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6   //集群内能相互感知到的节点总数量
cluster_size:0
cluster_current_epoch:5
cluster_my_epoch:1
cluster_stats_messages_sent:767
cluster_stats_messages_received:767

  当前已经使这六个节点组成集群,但是现在还无法工作,因为集群节点还没有分配槽(slot)。

2.1.3主从分配
  主从分配命令

//<node-id>可以通过“./redis-cli -p 7000 cluster nodes”查找
./redis-cli -p <port> cluster replicate <node-id>

  7003、7004、7005分别作为7000、7001、7002的从节点,命令如下:

//设置7003为7000的从节点
./redis-cli -p 7003 cluster replicate 66669ca2d52a849c58b26e1fe5e9e58c763c0a82

//设置7004为7001的从节点
./redis-cli -p 7004 cluster replicate 78ce474fa7cb82fbb6c8547c222098ea4f725956

//设置7005为7002的从节点
./redis-cli -p 7005 cluster replicate cf9f8d97e122b0cc4d3b151650f00a5724ba6109

  以7000为例,查看主从关系

./redis-cli -p 7000 cluster nodes

cf9f8d97e122b0cc4d3b151650f00a5724ba6109 127.0.0.1:7002 master - 0 1533733128212 0 connected
66669ca2d52a849c58b26e1fe5e9e58c763c0a82 127.0.0.1:7000 myself,master - 0 0 1 connected
78ce474fa7cb82fbb6c8547c222098ea4f725956 127.0.0.1:7001 master - 0 1533733131749 2 connected
46e5b438b44fab8d18c08d7d692df8e3337a924d 127.0.0.1:7005 slave cf9f8d97e122b0cc4d3b151650f00a5724ba6109 0 1533733130235 5 connected
43a5439f089438a3c02e7fb86c336235dbeb3263 127.0.0.1:7004 slave 78ce474fa7cb82fbb6c8547c222098ea4f725956 0 1533733132254 4 connected
b94a564dcb9954da98e6da8dc99da51008d7373b 127.0.0.1:7003 slave 66669ca2d52a849c58b26e1fe5e9e58c763c0a82 0 1533733131244 3 connected

  从上面的信息可以看出,主从关系已经设置完毕。

2.1.4分配槽
  可以看一下7000端口的槽个数

[root@administrator bin]# ./redis-cli -p 7000 cluster info

cluster_state:fail
cluster_slots_assigned:0      // 被分配槽的个数为0
cluster_slots_ok:0
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:0
cluster_current_epoch:5
cluster_my_epoch:1
cluster_stats_messages_sent:3198
cluster_stats_messages_received:3198

  接下来为节点分配槽空间。通过cluster addslots命令:

redis-cli -h 127.0.0.1 -p 7000 cluster addslots {0..5461}
OK
redis-cli -h 127.0.0.1 -p 7001 cluster addslots {5462..10922}
OK
redis-cli -h 127.0.0.1 -p 7002 cluster addslots {10923..16383}
OK

备注:若分配槽空间错误,需要重新分配,则需要将分配错误的槽空间在所分配的节点上删除,再重新分配:

//假如我误将所有的槽都分配给了7000,则将不属于它的槽删除,再重新分配

//第一步:查询7000端口上分配的所有槽
./redis-cli -h 127.0.0.1 -p 7000 -c cluster slots

   1) (integer) 5462
   2) (integer) 10922
   3) 1) "127.0.0.1"
      2) (integer) 7001
   4) 1) "127.0.0.1"

//第二步:删除所有查询到的槽(上面可以看到是分配给7001端口的槽,但是仍需要在7000端口上删除)
./redis-cli -h 127.0.0.1 -p 7000 -c cluster delslots {5462..10922}

//第一步:查询7001端口上分配的所有槽
./redis-cli -h 127.0.0.1 -p 7001 -c cluster slots

   1) (integer) 0
   2) (integer) 5461
   3) 1) "127.0.0.1"
      2) (integer) 7000
   4) 1) "127.0.0.1"
      2) (integer) 7003


//第二步:删除所有查询到的槽(上面可以看到是分配给7000端口的槽,但是仍需要在7001端口上删除)
./redis-cli -h 127.0.0.1 -p 7001 -c cluster delslots {0..5461}

//第一步:查询7002端口上分配的所有槽
./redis-cli -h 127.0.0.1 -p 7002 -c cluster slots

1) 1) (integer) 5462
   2) (integer) 10922
   3) 1) "127.0.0.1"
      2) (integer) 7001
   4) 1) "127.0.0.1"
      2) (integer) 7004
2) 1) (integer) 0
   2) (integer) 5461
   3) 1) "127.0.0.1"
      2) (integer) 7000
   4) 1) "127.0.0.1"
      2) (integer) 7003
3) 1) (integer) 10923
   2) (integer) 16383
   3) 1) "127.0.0.1"
      2) (integer) 7000
   4) 1) "127.0.0.1"
      2) (integer) 7003



//第二步:删除所有查询到的槽(上面可以看到是分配给7000、7001、7002端口的槽,但是仍需要在7002端口上删除)
./redis-cli -h 127.0.0.1 -p 7001 -c cluster delslots {0..16383}

  我们将16383个槽平均分配给7000、7001、7002端口的节点。再次执行CLUSTER INFO查看一下集群的状态:

127.0.0.1:7000> CLUSTER INFO
cluster_state:ok                // 集群状态OK
cluster_slots_assigned:16384    // 已经分配了所有的槽
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:5
cluster_my_epoch:1
cluster_stats_messages_sent:1212
cluster_stats_messages_received:1212

  可以通过CLUSTER NODES来查看分配情况:

127.0.0.1:7000> CLUSTER NODES
e0c7961a1b07ab655bc31d8dfd583da565ec167d 127.0.0.1:6384 master - 0 1496129666347 0 connected
961097d6be64ebd2fd739ff719e97565a8cee7b5 127.0.0.1:6382 master - 0 1496129664844 5 connected
29978c0169ecc0a9054de7f4142155c1ab70258b 127.0.0.1:6379 myself,master - 0 0 1 connected 0-5461
8f285670923d4f1c599ecc93367c95a30fb8bf34 127.0.0.1:6380 master - 0 1496129665846 3 connected 5462-10922
6fb7dfdb6188a9fe53c48ea32d541724f36434e9 127.0.0.1:6383 master - 0 1496129661838 4 connected
66478bda726ae6ba4e8fb55034d8e5e5804223ff 127.0.0.1:6381 master - 0 1496129666848 2 connected 10923-16383

2.1.4查看是否可用

[root@administrator bin]# ./redis-cli -c -p 7000
127.0.0.1:7000> set hello world
OK
127.0.0.1:7000> get hello
"world"

2.2官方工具Ruby安装(推荐安装方式)

2.2.1安装RVM配置Ruby开发环境
(1)安装curl

sudo yum install  curl
curl -L  get.rvm.io | bash -s stable

若失败时,执行以下命令:

curl -sSL  https://rvm.io/mpapis.asc  |  gpg2  --import  -
curl  -L  get.rvm.io |  bash -s  stable

(2)查找配置文件

find   /  -name  rvm.sh

并使其配置文件生效

source  /etc/profile.d/rvm.sh

(3)下载 rvm 依赖

rvm  repuirements

(4) 查看centos 下rvm管理的软件和版本, ruby也在其中

rvm  list known

(5)安装ruby-2.3.7

rvm install ruby-2.3.7

若报错如下:
这里写图片描述
则执行如下指令:

//升级网络安全服务即可
yum update nss

(6)查看Ruby是否安装成功

[root@administrator gems]# ruby -v
ruby 2.3.7p456 (2018-03-28 revision 63024) [i686-linux]

备注:Ruby的安装目录是/usr/local/rvm/gems/ruby-2.3.7
(7)删除某个版本的ruby 并把文档和 gems也删除(补充)

rvm  remove  ruby-2.2.0 --docs  --gems

(8)选择一个版本的ruby 需要在系统安装两个版本的ruby情况下使用(补充)

rvm  use ruby-2.2.0 --default

(9)查询当前使用的版本(补充)

rvm info

2.2.2安装rubygem redis

//下载
wget http://rubygems.org/downloads/redis-3.3.0.gem
//检查redis-3.3.0.gem相关依赖包
sudo gem list -- check redis gem
//安装redis-3.3.0.ge
sudo gem install -l redis-3.3.0.gem

2.2.3查看redis安装文件夹/src/redis-trib.rb是否能执行

[root@administrator src]# ./redis-trib.rb

当出现下方数据时,表示前面安装所有软件成功:

Usage: redis-trib <command> <options> <arguments ...>

  create          host1:port1 ... hostN:portN
                  --replicas <arg>
  check           host:port
  fix             host:port
  reshard         host:port
                  --from <arg>
                  --to <arg>
                  --slots <arg>
                  --yes
  add-node        new_host:new_port existing_host:existing_port
                  --slave
                  --master-id <arg>
  del-node        host:port node_id
  set-timeout     host:port milliseconds
  call            host:port command arg arg .. arg
  import          host:port
                  --from <arg>
  help            (show this help)

For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.

2.2.2使用redis-trib.rb创建集群
(1)准备所有节点
参见原始命令安装中的准备节点
(2)将所有的节点加入集群中,并设置每个主节点带一个从节点(会自动分配哈希槽)

./redis-trib.rb create --replicas 1 192.168.10.130:8000 192.168.10.130:8001 192.168.10.130:8002 192.168.10.130:8003 192.168.10.130:8004 192.168.10.130:8005

备注:–replicas [args] :这个参数的意思是每个主节点带几个从节点。比如我们这里设置为1,则每个主节点带一个从节点,则前三个8000/8001/8002为主节点,8003/8004/8005为从节点

(3)查看集群中左右节点的信息及其主从关系
连接任一节点的客户端,用cluster nodes命令查看

[root@administrator bin]# ./redis-cli -h 192.168.10.130 -c -p 8006 cluster nodes
acaa378638c5ecfe7303299aad77a30aa56e5a59 192.168.10.130:8002 master - 0 1534163782036 9 connected 5461-8191 13653-16383
438096b0e2ebdb43d624fed7bb291351e7f4cc7e 192.168.10.130:8006 myself,slave acaa378638c5ecfe7303299aad77a30aa56e5a59 0 0 6 connected
d00ce09944299bac7ba381744f5ff0bdec9915ee 192.168.10.130:8004 slave 067cc7101dd1ec715632de475c8a7e0258c2a660 0 1534163786070 8 connected
6fc9ab3b4eb3e73123417a7382f5e8bca6ed8d67 192.168.10.130:8003 slave af4997f6902d40aacbbeaa32b26b75812b5feea0 0 1534163785063 7 connected
067cc7101dd1ec715632de475c8a7e0258c2a660 192.168.10.130:8001 master - 0 1534163784055 8 connected 2731-5460 10923-13652
af4997f6902d40aacbbeaa32b26b75812b5feea0 192.168.10.130:8000 master - 0 1534163780017 7 connected 0-2730 8192-10922

(4)增加节点(补充)

./redis-trib.rb add-node [新节点的IP]:[新节点的port] [主节点的IP]:[主节点的port] 

(5)设置主从关系(设置8004节点为8001节点的从节点)(补充)
第一步:重新分配8004节点的槽

./redis-trib.rb reshard 192.168.1.160:8004

系统会提示我们要移动多少哈希槽,这里移动所有8004上的节点(PS:因为8004节点必须是空的,才可以成为8001的从节点)
这里写图片描述
然后还需要指定把这些哈希槽转移到哪个节点上,输入8001节点的ID
这里写图片描述
然后需要我们指定转移哪几个几点的哈希槽,这里就是8004节点的哈希槽,输入8004节点的ID以后,按Enter,然后输入done(PS:输入all 表示从所有的主节点中随机转移,凑够2730个哈希槽)
这里写图片描述
然后再输入yes,redis集群就开始分配哈希槽了。
第二步:连接8004的客户端,设置为8001的从节点
连接8004的客户端

./redis-cli -h 192.168.10.130 -c -p 8004

查看所属集群的所有节点信息

192.168.10.130:8004> cluster nodes
acaa378638c5ecfe7303299aad77a30aa56e5a59 192.168.10.130:8002 master - 0 1534162855196 3 connected 5461-8191
067cc7101dd1ec715632de475c8a7e0258c2a660 192.168.10.130:8001 master - 0 1534162854187 8 connected 2731-5460 10923-13652
6fc9ab3b4eb3e73123417a7382f5e8bca6ed8d67 192.168.10.130:8003 slave af4997f6902d40aacbbeaa32b26b75812b5feea0 0 1534162853176 7 connected
af4997f6902d40aacbbeaa32b26b75812b5feea0 192.168.10.130:8000 master - 0 1534162852167 7 connected 0-2730 8192-10922
438096b0e2ebdb43d624fed7bb291351e7f4cc7e 192.168.10.130:8006 master - 0 1534162856205 6 connected 13653-16383
d00ce09944299bac7ba381744f5ff0bdec9915ee 192.168.10.130:8004 myself,master - 0 0 5 connected

设置主从关系

cluster replicate [节点ID]

这里写图片描述

(6)删除节点(补充)
若删除的是主节点,则需要将该节点的所有哈希槽转移到其他节点,参见(6)设置主从关系中的转移办法,然后使用下方的命令删除

./redis-trib.rb del-node [删除节点的IP]:[删除节点的port]  删除的节点ID

若删除的从节点,则直接使用上述命令删除即可

(7)删除集群(补充)
将该集群中所有节点相关的文件全部删除即可(主要是日志文件、dump文件、节点配置文件等)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值