Redis学习笔记(10)——主从复制

1、什么是Redis主从复制redis

主从复制,当用户往Master端写入数据时,经过Redis Sync机制将数据文件发送至Slave,Slave也会执行相同的操做确保数据一致;且实现Redis的主从复制很是简单。数据库

2、Redis主从复制原理c#

在Slave启动并链接到Master以后,它将主动发送一个SYNC命令。此后Master将启动后台存盘进程,同时收集全部接收到的用于修改数据集的命令,在后台进程执行完毕后,Master将传送整个数据库文件到Slave,以完成一次彻底同步。而Slave服务器在接收到数据库文件数据以后将其存盘并加载到内存中。此后,Master继续将全部已经收集到的修改命令,和新的修改命令依次传送给Slaves,Slave将在本次执行这些数据修改命令,从而达到最终的数据同步。缓存

若是Master和Slave之间的连接出现断连现象,Slave能够自动重连Master,可是在链接成功以后,一次彻底同步将被自动执行。服务器

若是Master同时收到多个 slave发来的同步链接命令,只会使用启动一个进程来写数据库镜像,而后发送给全部slave。网络

3、Redis主从复制特色架构

一、同一个Master能够拥有多个Slaves。spa

二、Master下的Slave还能够接受同一架构中其它slave的连接与同步请求,实现数据的级联复制,即Master->Slave->Slave模式;线程

三、Master以非阻塞的方式同步数据至slave,这将意味着Master会继续处理一个或多个slave的读写请求;code

四、Slave端同步数据也能够修改成非阻塞是的方式,当slave在执行新的同步时,它仍能够用旧的数据信息来提供查询;不然,当slave与master失去联系时,slave会返回一个错误给客户端;

五、主从复制具备可扩展性,即多个slave专门提供只读查询与数据的冗余,Master端专门提供写操做;

六、经过配置禁用Master数据持久化机制,将其数据持久化操做交给Slaves完成,避免在Master中要有独立的进程来完成此操做。

4、Redis主从复制实现

1.在本地建立两个目录:RedisMaster、RedisSlave 。 分别存放Master服务和Slave服务。

2.修改Master服务的配置文件redis.conf(推荐使用文本编译器打开,例如:Notepad++

3.修改Slave服务的配置文件redis.conf:


4.开启主从服务, 咱们先开启Master服务

而后咱们开启Slave服务:

当咱们开启Slave服务时,Master服务的窗口会增长一些信息:

能够看到在Slave服务启动并链接到Master服务以后,它将主动发送一个SYNC命令,用来同步数据。Master先dump出rdb文件,而后将rdb文件全量传输给slave,而后Master把缓存的命令转发给Slave,初次同步完成。

第二次以及之后的同步实现是:Master将变量的快照直接实时依次发送给各个Slave。无论什么缘由致使Slave和Master断开重连都会重复以上过程。Redis的主从复制是创建在内存快照的持久化基础上,只要有Slave就必定会有内存快照发生。虽然Redis宣称主从复制无阻塞,但因为Redis使用单线程服务,若是Master快照文件比较大,那么第一次全量传输会耗费比较长时间,且文件传输过程当中Master可能没法提供服务,也就是说服务会中断。 

5.下面咱们来写个控制台程序来试试读写分离:

using ServiceStack.Redis;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace String
{
    class Program
    {
        static void Main(string[] args)
        {
            RedisClient Masterclient = new RedisClient("127.0.0.1", 6379);
            RedisClient Slaveclient = new RedisClient("127.0.0.1", 6379);
            Console.WriteLine("Master写入数据");
            string data = Console.ReadLine();
            Masterclient.Set<string>("data", data);
            string readmaster = Slaveclient.Get<string>("data");
            Console.WriteLine("Slave读取数据:"+readmaster);
            Console.ReadKey();
        }
    }
}

View Code

5、Redis主从复制存在的问题

在读《京东云实践:浅谈Redis主从复制》 时,看到一个问题:主从复制在遇到网络不稳定的状况下,Slave和Master断开(包括闪断)会致使Master须要将内存中的数据所有从新生成rdb文件(快照文件),而后传输给Slave。Slave接收完Master传递过来的rdb文件之后会将自身的内存清空,把rdb文件从新加载到内存中。这种方式效率比较低下,尤为是在数据量大的状况下,毕竟网络闪断未必丢数据或者说丢的数据只是少部分,但却要为此付出将整个内存数据都从新传输一次的代价。若是可以将闪断过程的更新数据传递给Slave,那么就不须要将Master内存中的全部数据都传递给Slave了。Redis做者在2.8中已经将这个部分复制的思路实现了。

6、Redis数据恢复

当Redis服务器挂掉之后,重启时将按如下优先级恢复数据到内存:

1.若是只配置了AOF,重启时加载AOF文件恢复数据。

2.若是同时配置了RBD和AOF,启动时只加载AOF文件恢复数据。

3.若是只配置了RDB,启动时将加载dump文件恢复数据。

相关文章
相关标签/搜索