vlambda博客
学习文章列表

Redis的三种集群方his

边学边做,边做边学!

Redis的常用的集群方式主要有以下3种

1:主从复制

2:哨兵(Sentinel)

3:Cluster

一、主从

Redis的三种集群方his

主从其实就是一般包含一个主,一个或多个从,从节点从主节点复制数据,可以实现读写分离,主节点做写,从节点做读。在配置上基本没什么要改的。这里用Linux做演示。

//这里启动3个docker,就让5678当主节点吧  docker run -d -p 5678:6379 redis docker run -d -p 5679:6379 redis docker run -d -p 5677:6379 redis

启动之后分别进入容器里面

Redis的三种集群方his

 

 在主节点里面添加数据。并且能够查到

Redis的三种集群方his

 

 然后我们去随便一个从节点里面去查询,发现并不能查到,这是为什么呢?因为还没有做数据的同步

Redis的三种集群方his

 

 要做数据的同步需要执行这个命令

slaveof host port

Redis的三种集群方his

 

 ok,这样就能查到数据了。然后后面无论在主节点添加数据,都能在从节点查询到。

如果想知道主节点有多少从节点的话可以使用  这个命令

info replication

Redis的三种集群方his

 

 主从节点的优缺点:

优点:可以实现读写分离,主节点的数据会自动复制到从节点,分担主节点的压力

缺点:当主节点宕机了,会导致部分数据未同步。也不具备容错和回复功能,无论主节点或者从节点宕机都需要等重启之后才能使用

二、哨兵模式

Redis的三种集群方his

其实哨兵模式也是一种主从,只不过增加了哨兵的功能,用于监控主节点的状态,当主节点宕机之后会进行投票重新选出主节点。

哨兵的宕机分为两种:主观宕机(我认为你掉线了)和客观宕机(我们认为你掉线了),当客观宕机了之后就会再选举一个从节点作为主节点,而这又可以分为两步

1:选哨兵领导

a:我发现了master下线,你们(其他哨兵)选我当哨兵领导吧

b:其他哨兵没有选过其他人当领导,那我就是领导了

c:超过一半的其他哨兵同意,我就是领导了

d:如果有多个哨兵同时参选,等待任意时间后重新发起投票,直到选出了领头的

2:由哨兵领导推举主节点

选主节点要遵循以下原则

a:健康性:从节点响应的时间
b:完整性:根据从节点备份的完整性,根据数据备份偏移量
c:稳定性:启动时间周期,心跳检测
d:如果以上三个条件都相等,则根据节点启动时分配的run id来分配,runid越小越有可能被选择为主节点

然后开始吧。哨兵需要做一些配置文件。

Redis的三种集群方his

 

 配置文件

主节点:redis-6379.conf:

port 6379requirepass 123456

从节点如上,端口分别是6380,6381

port 6380slaveof 127.0.0.1 6379masterauth 123456

port 6381slaveof 127.0.0.1 6379masterauth 123456

然后是哨兵:

# 其他两个sentinel节点的端口号分别为26380、26381port 26379sentinel monitor mymaster 127.0.0.1 6379 2sentinel down-after-milliseconds mymaster 3000# 必须配置,否则启动后sentinel节点都会是sdown(主观宕机)状态或者odown(客观宕机)状态sentinel auth-pass mymaster 123456

然后启动就行了。可以把哨兵模式做成这个样子,把配置文件都放到Sentinel文件夹里面然后一键启动(哈哈,刚学的)

Redis的三种集群方his

 

 启动代码:

@echo offecho Starting Sentinel:pushd %~dp0\Sentinelecho Targets: 7010-7011@start "Redis (Sentinel-Target): 7010" /min ..\3.0.503\redis-server.exe redis-7010.conf@start "Redis (Sentinel-Target): 7011" /min ..\3.0.503\redis-server.exe redis-7011.confecho Monitors: 26379-26381@start "Redis (Sentinel): 26379" /min ..\3.0.503\redis-server.exe sentinel-26379.conf --sentinel@start "Redis (Sentinel): 26380" /min ..\3.0.503\redis-server.exe sentinel-26380.conf --sentinel@start "Redis (Sentinel): 26381" /min ..\3.0.503\redis-server.exe sentinel-26381.conf --sentinelpopd

启动之后可以发现7011是从节点,7010是主节点Redis的三种集群方his

 

 然后通过以下命令进入到26379哨兵查看主从节点状态

redis-cli -p 26379

Redis的三种集群方his

 

 然后我们将主节点7010关闭,可以发现,哨兵就重新将7011选为主节点了(当然这里只启动了两个,可以多启动几个节点,测试效果更佳),而当之前关闭的主节点重启之后,就会变成从节点

Redis的三种集群方his

 

 这是重启后的,会连接到现在的主节点7011

Redis的三种集群方his

 

 哨兵模式的优缺点

优点:哨兵模式可以算主从模式的升级吧,主从的优点都有,而且哨兵还有监控的功能,当主节点宕机之后哨兵会推选一个健康的从节点做主节点,这样提高了软件的可用性

缺点:主从模式的缺点都有,而且配置哨兵啥的比较麻烦,而且在重新选举主节点期间,无法确定主从,无法工作

三、cluster

Redis的三种集群方his

集群采用了多主多从,按照一定的规则进行分片,将数据分别存储,一定程度上解决了哨兵模式下单机存储有限的问题。

集群模式一般是3主3从,且需要ruby辅助搭建。

1:复制5个redis出来,作为3主3从,端口可以自定义

 2:修改配置:cluster-enabled yes

3:安装 Ruby

将下载的Redis驱动文件redis-3.3.2.gem复制到Ruby安装目录下(即:C:Ruby30-x64),打开CMD,运行如下命令:

gem install --local C:Ruby30-x64redis-3.3.2.gem

5:下载集群管理工具,将扩展名为rb的文件拷贝到6379文件夹中

6:将6个redis启动,在6379的文件夹下cmd,输入命令:

//replicas 1 表示为集群中的每个主节点创建1个从节点redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384

接着执行就是了,这里要选yes

Redis的三种集群方his

 

 以上,集群搭建完毕。我们可以登录6379查看集群状态

redis-cli -p 6378cluster nodes


 

 从上面我们可以看到集群中3个主节点被分成了3个分区,可以来单独存储自己的数据。然后我们设置一个值,会自动跳转到相应的节点。

 

在部署集群的时候我踩了以下几个坑,希望能够注意下!

1:invalid byte sequence in UTF-8 解决:文件夹不能含中文
2:Node 127.0.0.1:6379 is not configured as a cluster node 解决:将cluster-enabled yes的注释取消
3:Node 127.0.0.1:6379 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0 解决:清除dump和aof文件
4:ERR Slot 5798 is already busy (Redis::CommandError) 解决:挨个登录客户端,执行flushall和cluster reset命令,然后重新执行命令创建集群
5:(error) MOVED 6918 127.0.0.1:6380 解决:redis-cli启动时使用 -c -p

6:销毁之前的集群  解决:将node.conf删除

集群的优缺点

优点:配置了多主多从,可以使数据分区,去中心化,减小了单台机子的负担,且可用性更高于哨兵模式

缺点:搭建麻烦