Redis集群主从复制(一主两从)搭建配置教程【Windows环境】

Redis集群主从复制(一主两从)搭建配置教程【Windows环境】

2018年03月03日 00:05:00  阅读数:11350

版权声明:本文为博主-阿飞(dufyun)-原创文章,未经博主允许可转载,但请标明出处,谢谢! https://blog.csdn.net/u010648555/article/details/79427606

如何学会在合适的场景使用合适的技术方案,这值得思考。

由于本地环境的使用,所以搭建一个本地的Redis集群,本篇讲解Redis主从复制集群的搭建,使用的平台是Windows,搭建的思路和Linux上基本一致! 
(精读阅读本篇可能花费您15分钟,略读需5分钟左右)

Redis主从复制简单介绍

为了使得集群在一部分节点下线或者无法与集群的大多数节点进行通讯的情况下, 仍然可以正常运作, Redis 集群对节点使用了主从复制功能: 集群中的每个节点都有 1 个至 N 个复制品(replica), 其中一个复制品为主节点(master), 而其余的 N-1 个复制品为从节点(slave)。[ 摘自 Redis 集群中的主从复制 ]

那么上面是主从复制呢,简单的来说就是一个主节点master可以拥有一个甚至多个从节点的slave,而一个slave又可以拥有多个slave,如此下去,形成了强大的多级服务器集群架构。 
Master-Slave主从

其中主节点以写为主(可写也可以读),从节点只能读不可写入!【读写分离场景】 
其中主节点写入的数据会同步(不是准实时的)到salve上,这样如果主节点出现故障,数据丢失,则可以通过salve进行恢复。【容灾恢复场景,注:因为数据不是实时同步的,可能会存在从salve恢复数据后有数据丢失问题】

综上:下面是关于redis主从复制的一些特点: 
1.一个master可以有多个slave 
2.除了多个slave连到相同的master外,slave也可以连接其他slave形成图状结构 
3.主从复制不会阻塞master。也就是说当一个或多个slave与master进行初次同步数据时,master可以继续处理client发来的请求。相反slave在初次同步数据时则会阻塞不能处理client的请求。 
4.主从复制可以用来提高系统的可伸缩性,我们可以用多个slave 专门用于client的读请求,比如sort操作可以使用slave来处理。也可以用来做简单的数据冗余 
5.可以在master禁用数据持久化,只需要注释掉master 配置文件中的所有save配置,然后只在slave上配置数据持久化。 
6.可以用于读写分离和容灾恢复。

Redis主从复制的常用的几种方式

  1. 一主二仆 A(B、C) 一个Master两个Slave
  2. 薪火相传(去中心化)A - B - C ,B既是主节点(C的主节点),又是从节点(A的从节点)
  3. 反客为主(主节点down掉后,手动操作升级从节点为主节点) & 哨兵模式(主节点down掉后,自动升级从节点为主节点)

本次主要介绍一主二仆,和反客为主的操作,薪火相传不做介绍。哨兵模式后面专门写一篇进行介绍!

Redis主从复制的搭建(一主二仆)

1.下载Windows环境的Redis安装包

Redis For Windows Download 
或者 
Redis For Windows GitHub

2.下载完成进行解压

解压收的目录如下图: 
Window的Redis解压图

3.相关配置操作

(1)复制三份解压后Redis

我自己本地修改了名称,复制后文件夹名称显示如下:

<span style="color:#000000"><code>Redis-x64<span style="color:#4f4f4f">-</span><span style="color:#006666">3.2</span><span style="color:#006666">.100</span><span style="color:#4f4f4f">-</span><span style="color:#006666">6379</span>
Redis-x64<span style="color:#4f4f4f">-</span><span style="color:#006666">3.2</span><span style="color:#006666">.100</span><span style="color:#4f4f4f">-</span><span style="color:#006666">6380</span>
Redis-x64<span style="color:#4f4f4f">-</span><span style="color:#006666">3.2</span><span style="color:#006666">.100</span><span style="color:#4f4f4f">-</span><span style="color:#006666">6381</span>
</code></span>
  • 1
  • 2
  • 3
  • 4

(2)修改redis.windows.conf

6379文件夹,不做修改!

6380文件夹,修改如下:

<span style="color:#000000"><code>port 6380

# slaveof <span style="color:#006666"><<span style="color:#4f4f4f">masterip</span>></span> <span style="color:#006666"><<span style="color:#4f4f4f">masterport</span>></span>
slaveof 127.0.0.1 6379
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5

6381文件夹,修改如下:

<span style="color:#000000"><code><span style="color:#000088">port</span> <span style="color:#006666">6381</span>
slaveof <span style="color:#006666">127.0</span><span style="color:#006666">.0</span><span style="color:#006666">.1</span> <span style="color:#006666">6379</span>
</code></span>
  • 1
  • 2
  • 3

我默认大家是知道redis.xx.conf的相关配置的!如果不知道,请看: 
Redis学习——redis.conf 配置文件介绍

(3)加入简单的window脚本,方便快速启动!

在对应的redis文件夹下面新建

startRedisServer.bat

脚本的内容为:

<span style="color:#000000"><code>@echo off
redis-server<span style="color:#009900">.exe</span> redis<span style="color:#009900">.windows</span><span style="color:#009900">.conf</span>
@pause
</code></span>
  • 1
  • 2
  • 3
  • 4

然后在redis文件夹同级的目录下在新建

start6379.cmd

<span style="color:#000000"><code>@<span style="color:#4f4f4f">echo</span> off
<span style="color:#4f4f4f">cd</span> Redis-x64-<span style="color:#006666">3.2</span>.<span style="color:#006666">100</span>-<span style="color:#006666">6379</span>
startRedisServer.bat
</code></span>
  • 1
  • 2
  • 3
  • 4

然后6380和6381和上面操作一样,操作完成后如下图:

目录结构图

4.启动测试

启动规则:先启动主节点,然后在启动从节点!

(1)可以使用命令启动

进入相应的文件夹目录,使用启动命令:

redis-server.exe

(2)使用脚本启动

如上面图片,分别执行start6379.cmd, 
start6380.cmd,start6381.cmd。

先启动Master。使用客户端登录,查看信息如图:

Master启动后信息

然后启动6380和6381,然后可以看到:如图

Salve启动

在此查看6378的主从复制信息:如图

主节点详细信息

在登录6380和6381的客户端,查看节点信息:如图

从节点详细信息

测试读写,【主节点可读可写,从节点只能读不可写】,如下图:

读写测试

测试当主节点shutdown后,从节点的状态【从节点可读,从节点也不会升级为主节点】:

<span style="color:#000000"><code>127<span style="color:#9b703f">.0</span><span style="color:#9b703f">.0</span><span style="color:#9b703f">.1</span><span style="color:#000000">:6381</span>> <span style="color:#000000">info</span> <span style="color:#000000">replication</span>
# <span style="color:#000000">Replication</span>
<span style="color:#000000">role</span><span style="color:#000000">:slave</span>
<span style="color:#000000">master_host</span><span style="color:#000000">:127</span><span style="color:#9b703f">.0</span><span style="color:#9b703f">.0</span><span style="color:#9b703f">.1</span>
<span style="color:#000000">master_port</span><span style="color:#000000">:6379</span>
<span style="color:#000000">master_link_status</span><span style="color:#000000">:up</span>
<span style="color:#000000">master_last_io_seconds_ago</span><span style="color:#000000">:1</span>
<span style="color:#000000">master_sync_in_progress</span><span style="color:#000000">:0</span>
<span style="color:#000000">slave_repl_offset</span><span style="color:#000000">:15</span>
<span style="color:#000000">slave_priority</span><span style="color:#000000">:100</span>
<span style="color:#000000">slave_read_only</span><span style="color:#000000">:1</span>
<span style="color:#000000">connected_slaves</span><span style="color:#000000">:0</span>
<span style="color:#000000">master_repl_offset</span><span style="color:#000000">:0</span>
<span style="color:#000000">repl_backlog_active</span><span style="color:#000000">:0</span>
<span style="color:#000000">repl_backlog_size</span><span style="color:#000000">:1048576</span>
<span style="color:#000000">repl_backlog_first_byte_offset</span><span style="color:#000000">:0</span>
<span style="color:#000000">repl_backlog_histlen</span><span style="color:#000000">:0</span>
127<span style="color:#9b703f">.0</span><span style="color:#9b703f">.0</span><span style="color:#9b703f">.1</span><span style="color:#000000">:6381</span>>
127<span style="color:#9b703f">.0</span><span style="color:#9b703f">.0</span><span style="color:#9b703f">.1</span><span style="color:#000000">:6381</span>> <span style="color:#000000">get</span> <span style="color:#000000">hello</span>
"<span style="color:#000000">world</span>"
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

测试当主节点重新启动后,从节点的状态【从节点依然可以连接主节点】:

<span style="color:#000000"><code><span style="color:#006666">127.0</span><span style="color:#006666">.0</span><span style="color:#006666">.1</span>:<span style="color:#006666">6379</span>> info replication
<span style="color:#009900"># Replication</span>
role:master
connected_slaves:<span style="color:#006666">2</span>
slave0:ip=<span style="color:#006666">127.0</span><span style="color:#006666">.0</span><span style="color:#006666">.1</span>,port=<span style="color:#006666">6380</span>,state=online,offset=<span style="color:#006666">43</span>,lag=<span style="color:#006666">0</span>
slave1:ip=<span style="color:#006666">127.0</span><span style="color:#006666">.0</span><span style="color:#006666">.1</span>,port=<span style="color:#006666">6381</span>,state=online,offset=<span style="color:#006666">43</span>,lag=<span style="color:#006666">0</span>
master_repl_offset:<span style="color:#006666">43</span>
repl_backlog_active:<span style="color:#006666">1</span>
repl_backlog_size:<span style="color:#006666">1048576</span>
repl_backlog_first_byte_offset:<span style="color:#006666">2</span>
repl_backlog_histlen:<span style="color:#006666">42</span>
<span style="color:#006666">127.0</span><span style="color:#006666">.0</span><span style="color:#006666">.1</span>:<span style="color:#006666">6379</span>>
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

小插曲【反客为主】 
测试当主节点shutdown后,使用slaveof no one 是的6380成为主节点,但是也只是主节点,没有任何从节点!:如图

<span style="color:#000000"><code><span style="color:#006666">127.0</span><span style="color:#006666">.0</span><span style="color:#006666">.1</span>:<span style="color:#006666">6381</span>> info replication
<span style="color:#880000"># Replication</span>
role:slave
master_host:<span style="color:#006666">127.0</span><span style="color:#006666">.0</span><span style="color:#006666">.1</span>
master_port:<span style="color:#006666">6379</span>
master_link_status:down
master_last_io_seconds_ago:-<span style="color:#006666">1</span>
master_sync_in_progress:<span style="color:#006666">0</span>
slave_repl_offset:<span style="color:#006666">155</span>
master_link_down_since_seconds:jd
slave_priority:<span style="color:#006666">100</span>
slave_read_only:<span style="color:#006666">1</span>
connected_slaves:<span style="color:#006666">0</span>
master_repl_offset:<span style="color:#006666">0</span>
repl_backlog_active:<span style="color:#006666">0</span>
repl_backlog_size:<span style="color:#006666">1048576</span>
repl_backlog_first_byte_offset:<span style="color:#006666">0</span>
repl_backlog_histlen:<span style="color:#006666">0</span>
<span style="color:#006666">127.0</span><span style="color:#006666">.0</span><span style="color:#006666">.1</span>:<span style="color:#006666">6381</span>>
<span style="color:#006666">127.0</span><span style="color:#006666">.0</span><span style="color:#006666">.1</span>:<span style="color:#006666">6381</span>>
<span style="color:#006666">127.0</span><span style="color:#006666">.0</span><span style="color:#006666">.1</span>:<span style="color:#006666">6381</span>> slave no <span style="color:#009900">one</span>
(error) ERR unknown <span style="color:#000088">command</span> <span style="color:#009900">'slave'</span>
<span style="color:#006666">127.0</span><span style="color:#006666">.0</span><span style="color:#006666">.1</span>:<span style="color:#006666">6381</span>> slaveof no <span style="color:#009900">one</span>
OK
<span style="color:#006666">127.0</span><span style="color:#006666">.0</span><span style="color:#006666">.1</span>:<span style="color:#006666">6381</span>> info replication
<span style="color:#880000"># Replication</span>
role:master
connected_slaves:<span style="color:#006666">0</span>
master_repl_offset:<span style="color:#006666">0</span>
repl_backlog_active:<span style="color:#006666">0</span>
repl_backlog_size:<span style="color:#006666">1048576</span>
repl_backlog_first_byte_offset:<span style="color:#006666">0</span>
repl_backlog_histlen:<span style="color:#006666">0</span>
<span style="color:#006666">127.0</span><span style="color:#006666">.0</span><span style="color:#006666">.1</span>:<span style="color:#006666">6381</span>> <span style="color:#4f4f4f">set</span> test <span style="color:#006666">11</span>
OK
<span style="color:#006666">127.0</span><span style="color:#006666">.0</span><span style="color:#006666">.1</span>:<span style="color:#006666">6381</span>> <span style="color:#4f4f4f">get</span> test
<span style="color:#009900">"11"</span>
<span style="color:#006666">127.0</span><span style="color:#006666">.0</span><span style="color:#006666">.1</span>:<span style="color:#006666">6381</span>>
</code></span>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

详细可以参考 Redis主从复制 中的内容!

Redis主从复制的原理

第一种介绍

  1. 当设置好slave服务器后,slave会建立和master的连接,然后发送sync命令。
  2. Master接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master将传送整个数据文件到slave,以完成一次完全同步。
  3. 全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。(第一次全量)
  4. 增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步。(之后增量)
  5. 但是只要是重新连接master,一次完全同步(全量复制)将被自动执行。

当设置好slave服务器后,slave会建立和master的连接,然后发送sync命令。无论是第一次同步建立的连接还是连接断开后的重新连接,master都会启动一个后台进程,将数据库快照保存到文件中,同时master主进程会开始收集新的写命令并缓存起来。后台进程完成写文件 后,master就发送文件给slave,slave将文件保存到磁盘上,然后加载到内存恢复数据库快照到slave上。接着master就会把缓存的命令转发给slave。而且后续master收到的写命令都会通过开始建立的连接发送给slave。从master到slave的同步数据的命令和从 client发送的命令使用相同的协议格式。当master和slave的连接断开时slave可以自动重新建立连接。如果master同时收到多个 slave发来的同步连接命令,只会使用启动一个进程来写数据库镜像,然后发送给所有slave。

第二种介绍:

图片内容来源网络:

redis主从复制原理

第三种介绍:

Redis 主从同步有两种方式(或者所两个阶段):全同步和部分同步。 
主从刚刚连接的时候,进行全同步;全同步结束后,进行部分同步。当然,如果有需要,Slave 在任何时候都可以发起全同步。Redis 策略是,无论如何,首先会尝试进行部分同步,如不成功,要求从机进行全同步,并启动 BGSAVE……BGSAVE 结束后,传输 RDB 文件;如果成功,允许从机进行部分同步,并传输积压空间中的数据。 
同步原理图

Redis主从复制(一主两从/一主多从)的分析

  • IO剧增 
    每次slave断开以后(无论是主动断开,还是网路故障)再连接master都要将master全部dump出来rdb,在aof,即同步的过程都要重新执行一遍;所以要记住多台slave不要一下都启动起来,否则master可能IO剧增(间隔1-2分)

  • 复制延迟 
    由于所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重。

  • 可用性不高 
    当有主节点发生异常情况,就会导致不能写入,导致业务出错![解决方法是可以使用Redis-Sentinel模式,详情见系列文章第二篇]

注意: 
Redis 集群不保证数据的强一致性(strong consistency)Redis 集群的一致性保证(guarantee): 在特定条件下, Redis 集群可能会丢失已经被执行过的写命令。

参考文章

Windows下Redis的主从复制

Redis 主从复制(服务集群)

Redis主从复制

深入剖析Redis主从复制

附件

如果想直接使用本篇讲解使用的主从配置!我已经打包好了 点击 下载地址 进行下载!

本系列文章:

第一篇:Redis集群主从复制(一主两从)搭建配置教程【Windows环境】

第二篇:Redis高可用集群-哨兵模式(Redis-Sentinel)搭建配置教程【Windows环境】

第三篇:Redis创建高可用集群教程【Windows环境】



如果您觉得这篇博文对你有帮助,请点个赞,谢谢!


如果帅气(美丽)、睿智(聪颖),和我一样简单善良的你看到本篇博文中存在问题,请指出,我虚心接受你让我成长的批评,谢谢阅读!
祝你今天开心愉快!


欢迎访问我的csdn博客,我们一同成长!

不管做什么,只要坚持下去就会看到不一样!在路上,不卑不亢!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值