登录  | 加入社区

黑狼游客您好!登录后享受更多精彩

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

查看: 1471|回复: 0

Redis实战篇之搭建集群

[复制链接]

151

主题

151

帖子

0

现金

黑狼菜鸟

Rank: 1

积分
0
发表于 2019-3-18 09:26:55 | 显示全部楼层 |阅读模式 来自 浙江杭州
Redis 集群简介

Redis Cluster 即 Redis 集群,是 Redis 官方在 3.0 版本推出的一套分布式存储方案。完全去中央化,由多个节点构成,全部节点相互互联。Redis 客户端可以直接毗连任何一节点获取集群中的键值对,不必要中心署理,假如该节点不存在用户所指定的键值,其内部会主动把客户端重定向到键值地点的节点。
Redis 集群是一个网状布局,每个节点都通过 TCP 毗连跟其他每个节点毗连。在一个有 N 个节点的集群中,每个节点都有 N-1 个流出的 TCP 毗连,和 N-1 个流入的毗连,这些 TCP 毗连会永世保持。
vr7z3AYRHb4ylgQB.jpg
Redis Cluster 同其他分布式存储系同一样,重要具备以下两个功能:
数据分区
Redis 集群会将用户数据分散生存至各个节点中,突破单机 Redis 内存最大存储容量。集群引入了 哈希槽slot的概念,其搭建完成后会生 16384 个哈希槽slot,同时会根据节点的数目大抵均等的将 16384 个哈希槽映射到差别的节点上。当用户存储key-value时,集群会先对key举行 CRC16 校验然后对 16384 取模来决定key-value放置哪个槽,从而实现主动分割数据到差别的节点上。

数据冗余
Redis 集群支持主从复制和故障规复。集群利用了主从复制模子,每个主节点master应至少有一个从节点slave。假设某个主节点故障,其全部子节点会广播一个数据包给集群里的其他主节点来哀求选票,一旦某个从节点收到了大多数主节点的回应,那么它就赢得了推举,被推选为主节点,负责处置惩罚之前旧的主节点负责的哈希槽。

关于 Redis Cluster 具体先容以及实现原理请拜见 Redis Cluster 教程 和 Redis Cluster 规范,在此不再赘述。
下载 & 安装 Redis

实行情况信息
Linux 版本:CentOS Linux release 7.4.1708
Redis 版本:5.0.3

先在服务器或假造机中安装一个单机 Redis,假如已安装可以跳过本节,未安装过的正勤学习下。
进入 Redis 待安装目次。
cd /usr/local下载、解压 Redis 源代码压缩包。
wget http://download.redis.io/releases/redis-5.0.3.tar.gz
tar -zxvf redis-5.0.3.tar.gz然后进入解压后的目次并利用 make 下令实行编译安装 Redis。
cd redis-5.0.3
make && make install不要高兴,由于你极有大概会碰到由于 GCC 编译器未安装导致编译失败的环境。不要发急,请次序实行如下下令。
yum -y install gcc
make distclean
make && make install
Redis 基于 C 语言开辟,故编译源码必要 GCC(Linux下的一个编译器,这里必要用来编译.c文件)的支持。如呆板上未安装必要先实行下令yum -y install gcc安装 GCC 编译工具,然后make distclean扫除之宿世成的文件,末了make && make install重新编译安装。
终极出现雷同下文输出则表现 Redis 安装乐成。
......
Hint: It's a good idea to run 'make test' ;)

    INSTALL install
    INSTALL install
    INSTALL install
    INSTALL install
    INSTALL install
make[1]: 脱离目次“/usr/local/redis-5.0.3/src”假如源码编译无误且实行效果精确,make install下令会将步伐安装至体系预设的可实行文件存放路径,一样平常是/usr/local/bin目次,可以通过如下终端输出确认。固然,也可以利用make install PREFIX=下令安装到指定路径。
[root@localhost bin]# cd /usr/local/bin
[root@localhost bin]# ls -l
总用量 32672
-rwxr-xr-x. 1 root root 4367328 3月   6 06:11 redis-benchmark
-rwxr-xr-x. 1 root root 8092024 3月   6 06:11 redis-check-aof
-rwxr-xr-x. 1 root root 8092024 3月   6 06:11 redis-check-rdb
-rwxr-xr-x. 1 root root 4802696 3月   6 06:11 redis-cli
lrwxrwxrwx. 1 root root      12 3月   6 06:11 redis-sentinel -> redis-server
-rwxr-xr-x. 1 root root 8092024 3月   6 06:11 redis-server至此,单机 Redis 安装完成。
搭建 Redis 集群

进入正题。
依据 Redis Cluster 内部故障转移实现原理,Redis 集群至少必要 3 个主节点,而每个主节点至少有 1 从节点,因此搭建一个集群至少包罗 6 个节点,三主三从,而且分别摆设在差别呆板上。
条件有限,测试情况下我们只能在一台呆板上创建一个伪集群,通过差别的 TCP 端口启动多个 Redis 实例,构成集群。
现在 Redis Cluster 的搭建有两种方式:

  • 手动方式搭建,即手动实行 cluster 下令,一步步完成搭建流程。
  • 主动方式搭建,纵然用官方提供的集群管理工具快速搭建。
两种方式原理一样,主动搭建方式只是将手动搭建方式中必要实行的 Redis 下令封装到了可实行步伐。生产情况下保举利用第二种方式,简朴快捷,不易堕落。不外本文实战演示两种方式都会提及。
手动方式搭建

启动节点

搭建集群的第一步就是要先把到场搭建集群的每个节点启动起来。
由于我们这是在一台呆板上模仿多个节点,可以预先规划下各个节点的属性:
SuRrAb0ah4H44G6l.jpg

根据上述规划,可以先通过如下下令创建各个节点启动设置文件的存放目次。
mkdir /usr/local/redis-cluster
cd redis-cluster
mkdir -p 7001 7002 7003 8001 8002 8003次序实行如下行下令,进入 Redis 源码包目次并将默认设置文件redis.conf分别复制到六个节点设置存放目次中,作为各自节点启动设置文件。
cd /usr/local/redis-5.0.3
cp redis.conf /usr/local/redis-cluster/7001
cp redis.conf /usr/local/redis-cluster/7002
cp redis.conf /usr/local/redis-cluster/7003
cp redis.conf /usr/local/redis-cluster/8001
cp redis.conf /usr/local/redis-cluster/8002
cp redis.conf /usr/local/redis-cluster/8003接下来必要分别修改每个节点的设置文件。下面贴的是节点 A 的设置文件/usr/local/redis-cluster/7001/redis.conf中启用或修改的一些须要参数。其他节点 B、C、D、E、F 参照修改,留意把涉及端口的地方修改成各自节点预先规划的即可。
bind 192.168.83.128                    # 设置当前节点主机地点      
port 7001                              # 设置客户端毗连监听端口     
pidfile /var/run/redis_7001.pid        # 设置 Redis 实例 pid 文件      
daemonize yes                          # 以保卫历程运行 Redis 实例     
cluster-enabled yes                    # 启用集群模式
cluster-node-timeout 15000             # 设置当前节点毗连超时毫秒数
cluster-config-file nodes-7001.conf    # 设置当前节点集群设置文件路径完成上述工作就可以通过如下几组下令启动待搭建集群中的 6 个节点了。
/usr/local/bin/redis-server /usr/local/redis-cluster/7001/redis.conf
/usr/local/bin/redis-server /usr/local/redis-cluster/7002/redis.conf
/usr/local/bin/redis-server /usr/local/redis-cluster/7003/redis.conf
/usr/local/bin/redis-server /usr/local/redis-cluster/8001/redis.conf
/usr/local/bin/redis-server /usr/local/redis-cluster/8002/redis.conf
/usr/local/bin/redis-server /usr/local/redis-cluster/8003/redis.conf末了通过ps -ef|grep redis下令确认各个节点服务是否已经正常运行。
[root@localhost bin]# ps -ef|grep redis
root       5613      1  0 04:25 ?        00:00:00 /usr/local/bin/redis-server 127.0.0.1:7001 [cluster]
root       5650      1  0 04:26 ?        00:00:00 /usr/local/bin/redis-server 127.0.0.1:7002 [cluster]
root       5661      1  0 04:26 ?        00:00:00 /usr/local/bin/redis-server 127.0.0.1:7003 [cluster]
root       5672      1  0 04:27 ?        00:00:00 /usr/local/bin/redis-server 127.0.0.1:8001 [cluster]
root       5681      1  0 04:27 ?        00:00:00 /usr/local/bin/redis-server 127.0.0.1:8002 [cluster]
root       5690      1  0 04:27 ?        00:00:00 /usr/local/bin/redis-server 127.0.0.1:8003 [cluster]
root       5731   1311  0 04:28 pts/0    00:00:00 grep --color=auto redis如上输出可以看出上面规划的 6 个节点都乐成启动。
节点握手

固然上面 6 个节点都启用了聚集支持,但默认环境下它们是不相互信托大概说没有接洽的。节点握手就是在各个节点之间创建链接(每个节点与其他节点相连),形成一个完备的网格,即集群。
节点握手的下令如下:
cluster meet ip port但为了创建聚集,不必要发送形成完备网格所需的全部 cluster meet 下令。只要能发送充足的cluster meet消息,可以让每个节点都可以通过一系列已知节点到达每个其他节点,缺失的链接将被主动创建。
比方,假如我们通过cluster meet将节点 A 与节点 B 毗连起来,并将 B 与 C 毗连起来,则 A 和 C 会本身找到握手方式并创建链接。
我们的创建的 6 个节点可以通过 redis-cli 毗连到 A 节点实行如下五组下令完成握手,生产情况必要将 IP 127.0.0.1更换成外网 IP。
cluster meet 127.0.0.1 7002
cluster meet 127.0.0.1 7003
cluster meet 127.0.0.1 8001
cluster meet 127.0.0.1 8002
cluster meet 127.0.0.1 8003如上述下令正常实行输出效果如下。
[root@localhost bin]# /usr/local/bin/redis-cli -p 7001
127.0.0.1:7001> cluster meet 127.0.0.1 7002
OK
127.0.0.1:7001> cluster meet 127.0.0.1 7003
OK
127.0.0.1:7001> cluster meet 127.0.0.1 8001
OK
127.0.0.1:7001> cluster meet 127.0.0.1 8002
OK
127.0.0.1:7001> cluster meet 127.0.0.1 8003
OK接下来可以通过 cluster nodes 下令检察节点之间 的链接状态。我随机找了两个节点 B 和 F 测试,输出效果如下所示。
[root@localhost /]# /usr/local/bin/redis-cli -p 7002 cluster nodes
61e8c4ed8d1ff2a765a4dd2c3d300d8121d26e12 127.0.0.1:7001@17001 master - 0 1552220691885 4 connected
a8a41694f22977fda78863bdfb3fc03dd1fab1bd 127.0.0.1:8002@18002 master - 0 1552220691000 5 connected
51987c4b5530c81f2845bb9d521daf6d3dce3659 127.0.0.1:8001@18001 master - 0 1552220690878 3 connected
1b4b3741945d7fed472a1324aaaa6acaa1843ccb 127.0.0.1:7002@17002 myself,master - 0 1552220690000 1 connected
19147f56e679767bcebb8653262ff7f56ca072a8 127.0.0.1:7003@17003 master - 0 1552220691000 2 connected
ed6fd72e61b747af3705b210c7164bc68739303e 127.0.0.1:8003@18003 master - 0 1552220690000 0 connected
[root@localhost /]# /usr/local/bin/redis-cli -p 8002 cluster nodes
1b4b3741945d7fed472a1324aaaa6acaa1843ccb 127.0.0.1:7002@17002 master - 0 1552220700255 1 connected
ed6fd72e61b747af3705b210c7164bc68739303e 127.0.0.1:8003@18003 master - 0 1552220703281 0 connected
19147f56e679767bcebb8653262ff7f56ca072a8 127.0.0.1:7003@17003 master - 0 1552220700000 2 connected
a8a41694f22977fda78863bdfb3fc03dd1fab1bd 127.0.0.1:8002@18002 myself,master - 0 1552220701000 5 connected
61e8c4ed8d1ff2a765a4dd2c3d300d8121d26e12 127.0.0.1:7001@17001 master - 0 1552220702275 4 connected
51987c4b5530c81f2845bb9d521daf6d3dce3659 127.0.0.1:8001@18001 master - 0 1552220701265 3 connected可以看到,节点 B 和节点 F 都已经分别和其他 5 个节点创建链接。
至此,节点握手完成。
分配槽位

此时 Redis 集群还并没有处于上线状态,可以在恣意一节点上实行 cluster info 下令来检察现在集群的运行状态。
[root@localhost ~]# /usr/local/bin/redis-cli -p 7001 cluster info
cluster_state:fail
......上面输出cluster_state:fail表现当前集群处于下线状态。由于只有给集群中全部主节点分配好槽位(即哈希槽slot,本文第一末节有提及)集群才气上线。
分配槽位的下令如下:
cluster addslots slot [slot ...]根据预先规划,这一步必要利用 cluster addslots 下令手动将 16384 个哈希槽大抵均平分配给主节点 A、B、C。
/usr/local/bin/redis-cli -p 7001 cluster addslots {0..5461}
/usr/local/bin/redis-cli -p 7002 cluster addslots {5462..10922}
/usr/local/bin/redis-cli -p 7003 cluster addslots {10923..16383}上面三组下令实行完毕,可以再次检察现在集群的一些运行参数。
[root@localhost ~]# /usr/local/bin/redis-cli -p 7001 cluster info
cluster_state: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:4
cluster_stats_messages_ping_sent:11413
cluster_stats_messages_pong_sent:10509
cluster_stats_messages_meet_sent:11
cluster_stats_messages_sent:21933
cluster_stats_messages_ping_received:10509
cluster_stats_messages_pong_received:10535
cluster_stats_messages_received:21044如上输出cluster_state:ok证实 Redis 集群乐成上线。
主从复制

Redis 集群乐成上线,不外还没有给主节点指定从节点,此时假如有一个节点故障,那么整个集群也就挂了,也就无法实现高可用。
集群中必要利用 cluster replicate 下令手动给从节点设置主节点。
集群复制下令如下:
cluster replicate node-id集群中各个节点的node-id可以用cluster nodes下令检察,如下输出1b4b3741945d7fed472a1324aaaa6acaa1843ccb便是主节点 B 的node-id。
[root@localhost /]# /usr/local/bin/redis-cli -p 8002 cluster nodes
1b4b3741945d7fed472a1324aaaa6acaa1843ccb 127.0.0.1:7002@17002 master - 0 1552220700255 1 connected
ed6fd72e61b747af3705b210c7164bc68739303e 127.0.0.1:8003@18003 master - 0 1552220703281 0 connected
19147f56e679767bcebb8653262ff7f56ca072a8 127.0.0.1:7003@17003 master - 0 1552220700000 2 connected
a8a41694f22977fda78863bdfb3fc03dd1fab1bd 127.0.0.1:8002@18002 myself,master - 0 1552220701000 5 connected
61e8c4ed8d1ff2a765a4dd2c3d300d8121d26e12 127.0.0.1:7001@17001 master - 0 1552220702275 4 connected
51987c4b5530c81f2845bb9d521daf6d3dce3659 127.0.0.1:8001@18001 master - 0 1552220701265 3 connected根据预先规划,A主D从;B主E从;C主F从。实行如下三组下令分别为从节点 D、E、F 指定其主节点,使聚集可以主动完成主从复制。
/usr/local/bin/redis-cli -p 8001 cluster replicate 61e8c4ed8d1ff2a765a4dd2c3d300d8121d26e12
/usr/local/bin/redis-cli -p 8002 cluster replicate 1b4b3741945d7fed472a1324aaaa6acaa1843ccb
/usr/local/bin/redis-cli -p 8003 cluster replicate 19147f56e679767bcebb8653262ff7f56ca072a8下令实行乐成后,我们便算以手动方式乐成搭建了一个 Redis 集群。
末了,再来检察一下集群中的节点信息。
[root@localhost ~]# /usr/local/bin/redis-cli -p 8002 cluster nodes
1b4b3741945d7fed472a1324aaaa6acaa1843ccb 127.0.0.1:7002@17002 master - 0 1552233328337 1 connected 5462-10922
ed6fd72e61b747af3705b210c7164bc68739303e 127.0.0.1:8003@18003 slave 19147f56e679767bcebb8653262ff7f56ca072a8 0 1552233327000 2 connected
19147f56e679767bcebb8653262ff7f56ca072a8 127.0.0.1:7003@17003 master - 0 1552233325000 2 connected 10923-16383
a8a41694f22977fda78863bdfb3fc03dd1fab1bd 127.0.0.1:8002@18002 myself,slave 1b4b3741945d7fed472a1324aaaa6acaa1843ccb 0 1552233327000 5 connected
61e8c4ed8d1ff2a765a4dd2c3d300d8121d26e12 127.0.0.1:7001@17001 master - 0 1552233327327 4 connected 0-5461
51987c4b5530c81f2845bb9d521daf6d3dce3659 127.0.0.1:8001@18001 slave 61e8c4ed8d1ff2a765a4dd2c3d300d8121d26e12 0 1552233326320 4 connected主动方式搭建

Redis 3.0 版本之后官方发布了一个集群管理工具 redis-trib.rb,集成在 Redis 源码包的src目次下。其封装了 Redis 提供的集群下令,利用简朴、便捷。
不外 redis-trib.rb 是 Redis 作者利用 Ruby 语言开辟的,故利用该工具之前还必要先在呆板上安装 Ruby 情况。背面作者大概意识到这个题目,Redis 5.0 版本开始便把这个工具集成到 redis-cli 中,以--cluster参数提供利用,此中create下令可以用来创建集群。
启动节点

利用集群管理工具搭建集群之前,也是必要先把各个节点启动起来的。节点的启动方式请拜见本文「手动方式创建」-「启动节点」一节,此处不再赘述。
集群管理工具搭建

假如您安装的 Redis 是 3.x 和 4.x 的版本可以利用 redis-trib.rb 搭建,不外之前必要安装 Ruby 情况。
先利用 yum 安装 Ruby 情况以及其他依靠项。
yum -y install ruby ruby-devel rubygems rpm-build确认安装版本。
[root@localhost redis-cluster]# ruby -v
ruby 2.0.0p648 (2015-12-16) [x86_64-linux]再利用 redis-trib.rb 脚本搭建集群,详细下令如下所示。
/usr/local/redis-5.0.3/src/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:8001 127.0.0.1:8002 127.0.0.1:8003不外,本文实行情况利用的 Redis 版本是 5.0.3,以是我可以直接利用redis-cli --cluster create下令搭建,详细下令如下所示。
/usr/local/bin/redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:8001 127.0.0.1:8002 127.0.0.1:8003 --cluster-replicas 1主节点在前,从节点在后。此中--cluster-replicas参数用来指定一个主节点带有的从节点个数,如上--cluster-replicas 1即表现 1 个主节点有 1 个从节点。
下令实行乐成会有雷同如下输出。
[root@localhost bin]# redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:8001 127.0.0.1:8002 127.0.0.1:8003 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 127.0.0.1:8001 to 127.0.0.1:7001
Adding replica 127.0.0.1:8002 to 127.0.0.1:7002
Adding replica 127.0.0.1:8003 to 127.0.0.1:7003
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 32f9819fc7d561bfa2b7189182200e86d9901b8a 127.0.0.1:7001
   slots:[0-5460] (5461 slots) master
M: cca0fbfa374bc175d481e68ee9ed13b65453e967 127.0.0.1:7002
   slots:[5461-10922] (5462 slots) master
M: 964cfa1c2dcfe36b6d3c63637f0d57ccb568354e 127.0.0.1:7003
   slots:[10923-16383] (5461 slots) master
S: 1b47b9e6e7a79523579b8d2ddcd5e708583ed317 127.0.0.1:8001
   replicates 32f9819fc7d561bfa2b7189182200e86d9901b8a
S: aba9330f3e70f26a8af4ced1b672fbcc7bc62d78 127.0.0.1:8002
   replicates cca0fbfa374bc175d481e68ee9ed13b65453e967
S: 254db0830cd764e075aa793144572d5fa3a398f0 127.0.0.1:8003
   replicates 964cfa1c2dcfe36b6d3c63637f0d57ccb568354e
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
...
>>> Performing Cluster Check (using node 127.0.0.1:7001)
M: 32f9819fc7d561bfa2b7189182200e86d9901b8a 127.0.0.1:7001
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: aba9330f3e70f26a8af4ced1b672fbcc7bc62d78 127.0.0.1:8002
   slots: (0 slots) slave
   replicates cca0fbfa374bc175d481e68ee9ed13b65453e967
S: 1b47b9e6e7a79523579b8d2ddcd5e708583ed317 127.0.0.1:8001
   slots: (0 slots) slave
   replicates 32f9819fc7d561bfa2b7189182200e86d9901b8a
S: 254db0830cd764e075aa793144572d5fa3a398f0 127.0.0.1:8003
   slots: (0 slots) slave
   replicates 964cfa1c2dcfe36b6d3c63637f0d57ccb568354e
M: cca0fbfa374bc175d481e68ee9ed13b65453e967 127.0.0.1:7002
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
M: 964cfa1c2dcfe36b6d3c63637f0d57ccb568354e 127.0.0.1:7003
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.OK,搭建完成!一条下令搞定。
文章到此就竣事了,以为还不错的朋侪不要忘了关注收藏一下,逐日分享干货好文。


pFRCkl7R7vcK7DEv.jpg




上一篇:第二十二期临床遗传病生信实操培训班(上海班)
下一篇:【Linux】CentOS7安装Nginx
您需要登录后才可以回帖 登录 | 加入社区

本版积分规则

 

QQ|申请友链|小黑屋|手机版|Hlshell Inc. ( 豫ICP备16002110号-5 )

GMT+8, 2024-4-25 18:28 , Processed in 0.072953 second(s), 47 queries .

HLShell有权修改版权声明内容,如有任何爭議,HLShell將保留最終決定權!

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表