微影青龙
当前位置:首页 - 微信 >

深入学习 Redis(5):集群

2019-10-31来源:汽车资讯网

(给数据分析与开发加星标,提升数据技能


来源:编程迷思

www.cnblogs.com/kismetv/p/9853040.html


在前面的文章中已经介绍了 Redis 的几种高可用技术:持久化主从复制哨兵,但这些方案仍有不足,其中最主要的问题是存储能力受单机限制,以及无法实现写操作的负载均衡。


本文将详细介绍集群,主要内容包括:

  • 集群的作用

  • 集群的搭建方法及设计方案

  • 集群的基本原理

  • 客户端访问集群的方法

  • 实践须知(集群伸缩、故障转移、参数优化等)


集群的作用


集群,即 Redis Cluster,是 Redis 3.0 开始引入的分布式存储方案。集群由多个节点(Node)组成,Redis 的数据分布在这些节点中。


集群中的节点分为主节点和从节点:只有主节点负责读写请求和集群信息的维护;从节点只进行主节点数据和状态信息的复制。


集群的作用,可以归纳为两点:


数据分区


数据分区(或称数据分片)是集群最核心的功能。集群将数据分散到多个节点:

  • 一方面突破了 Redis 单机内存大小的限制,存储容量大大增加。

  • 另一方面每个主节点都可以对外提供读服务和写服务,大大提高了集群的响应能力。


Redis 单机内存大小受限问题,在介绍持久化和主从复制时都有提及。


例如,如果单机内存太大,bgsave 和 bgrewriteaof 的 fork 操作可能导致主进程阻塞,主从环境下主机切换时可能导致从节点长时间无法提供服务,全量复制阶段主节点的复制缓冲区可能溢出。


高可用


集群支持主从复制和主节点的自动故障转移(与哨兵类似),当任一节点发生故障时,集群仍然可以对外提供服务。本文内容基于 Redis 3.0.6。


集群的搭建


我们将搭建一个简单的集群:共 6 个节点,3 主 3 从。方便起见,所有节点在同一台服务器上,以端口号进行区分,配置从简。


3个主节点端口号:7000/7001/7002;对应的从节点端口号:8000/8001/8002。


集群的搭建有两种方式:

  • 手动执行 Redis 命令,一步步完成搭建

  • 使用 Ruby 脚本搭建


两者搭建的原理是一样的,只是 Ruby 脚本将 Redis 命令进行了打包封装;在实际应用中推荐使用脚本方式,简单快捷不容易出错。下面分别介绍这两种方式。


执行 Redis 命令搭建集群


集群的搭建可以分为四步:

  • 启动节点:将节点以集群模式启动,此时节点是独立的,并没有建立联系。

  • 节点握手:让独立的节点连成一个网络。

  • 分配槽:将 16384 个槽分配给主节点。

  • 指定主从关系:为从节点指定主节点。


实际上,前三步完成后集群便可以对外提供服务;但指定从节点后,集群才能够提供真正高可用的服务。


启动节点


集群节点的启动仍然是使用 redis-server 命令,但需要使用集群模式启动。


下面是 7000 节点的配置文件(只列出了节点正常工作关键配置,其他配置,如开启 AOF,可以参照单机节点进行):

#redis-7000.conf
port 7000
cluster-enabled yes
cluster-config-file "node-7000.conf"
logfile "log-7000.log"
dbfilename "dump-7000.rdb"
daemonize yes


其中的 cluster-enabled 和 cluster-config-file 是与集群相关的配置。


cluster-enabledyes:Redis 实例可以分为单机模式(standalone)和集群模式(cluster);cluster-enabledyes 可以启动集群模式。


在单机模式下启动的 Redis 实例,如果执行 info server 命令,可以发现 redis_mode 一项为 standalone,如下图所示:

集群模式下的节点,其 redis_mode 为 cluster,如下图所示:

cluster-config-file:该参数指定了集群配置文件的位置。每个节点在运行过程中,会维护一份集群配置文件。


每当集群信息发生变化时(如增减节点),集群内所有节点会将最新信息更新到该配置文件。


当节点重启后,会重新读取该配置文件,获取集群信息,可以方便的重新加入到集群中。


也就是说,当 Redis 节点以集群模式启动时,会首先寻找是否有集群配置文件。


如果有则使用文件中的配置启动;如果没有,则初始化配置并将配置保存到文件中。集群配置文件由 Redis 节点维护,不需要人工修改。


编辑好配置文件后,使用 redis-server 命令启动该节点:

redis-server redis-7000.conf


节点启动以后,通过 cluster nodes 命令可以查看节点的情况,如下图所示:

其中返回值第一项表示节点 id,由 40 个 16 进制字符串组成,节点 id 与主从复制一文中提到的 runId 不同。


Redis 每次启动 runId 都会重新创建,但是节点 id 只在集群初始化时创建一次,然后保存到集群配置文件中,以后节点重新启动时会直接在集群配置文件中读取。


其他节点使用相同办法启动,不再赘述。需要特别注意,在启动节点阶段,节点是没有主从关系的,因此从节点不需要加 slaveof 配置。


节点握手


节点启动以后是相互独立的,并不知道其他节点存在;需要进行节点握手,将独立的节点组成一个网络。


节点握手使用 cluster meet {ip} {port} 命令实现,例如在 7000 节点中执行 clustermeet 192.168.72.128 7001,可以完成 7000 节点和 7001 节点的握手。


注意:ip 使用的是局域网 ip,而不是 localhost 或 127.0.0.1,是为了其他机器上的节点或客户端也可以访问。


此时再使用 cluster nodes 查看:

在 7001 节点下也可以类似查看:

同理,在 7000 节点中使用 cluster meet 命令,可以将所有节点加入到集群,完成节点握手:

cluster meet 192.168.72.128 7002
cluster meet 192.168.72.128 8000
cluster meet 192.168.72.128 8001
正在学习 网站首页 返回栏目 只有学习让我快乐
标签:
网站简介 联系我们 网站申明 网站地图

版权所有:www.mihoroscoposemanal.com ©2017 微影青龙

微影青龙提供的所有内容均是网络转载或网友提供,本站仅提供内容展示服务,不承认任何法律责任。