一、引言

Redis的基本数据类型,高级特性,与Lua脚本的整合等相关知识点都学完了,说是学完了,只是完成了当前的学习计划,在以后的时间还需继续深入研究和学习。从今天开始来讲一下有关Redis的集群模式,Redis有三种集群模式,第一个就是主从模式,第二种“哨兵”模式,第三种是Cluster集群模式,第三种的集群模式是在Redis 3.x以后的版本才增加进来的,我们今天就来说一下Redis第一种集群模式:主从集群模式。

二、配置操作

实现主从复制(Master-Slave Replication)的工作原理:Slave从节点服务启动并连接到Master之后,它将主动发送一个SYNC命令。Master服务主节点收到同步命令后将启动后台存盘进程,同时收集所有接收到的用于修改数据集的命令,在后台进程执行完毕后,Master将传送整个数据库文件到Slave,以完成一次完全同步。而Slave从节点服务在接收到数据库文件数据之后将其存盘并加载到内存中。此后,Master主节点继续将所有已经收集到的修改命令,和新的修改命令依次传送给Slaves,Slave将在本次执行这些数据修改命令,从而达到最终的数据同步。

如果Master和Slave之间的链接出现断连现象,Slave可以自动重连Master,但是在连接成功之后,一次完全同步将被自动执行。

我先介绍一下我的环境,操作系统是Windows 10企业版,Redis有两个版本,第一版本是以Windows服务形式安装的Redis服务器,IP地址是:192.168.131.1,端口号:6379,当前没有设置密码;第二个版本是在Linux系统下安装的Redis服务,IP地址是:192.168.127.128,端口号是:6379,当前也没有设置密码。今天测试两个情况,一种情况:Windows系统上的Redis服务做主服务节点,Linux系统上的Redis服务做从服务节点,第二种情况是:Linux系统上的Redis服务做主服务节点,Windows系统上的Redis服务做从服务节点。其他情况就不测试了,同系统之间测试就很容易了,也不会出现什么问题。

主从复制配置:

第一步:修改从节点的配置文件:slaveof <masterip> <masterport>

第二步:如果设置了密码,就要设置:masterauth <master-password>

主从复制的配置很简单,主要操作从节点的配置文件,主节点不需要任何改动。我们可以使用info查看role角色即可知道是主服务或从服务。

       1、Windows系统上的Redis服务做主服务节点,Linux系统上的Redis服务做从服务节点(测试很顺利)

           //主节点服务:192.168.131.1    端口号:6379   Windows系统

           //从节点服务:192.168.127.128  端口号:6379   Linux系统

           //现在主要修改从节点服务Linux系统上的redis.conf配置文件

           slaveof 192.168.131.1 

           设置完成:

           //主节点配置信息:
192.168.131.1:>info Replication
#Replication
role:master
connected_slaves:
slave0:ip=192.168.131.1,port=,state=online,offset=,lag=
master_repl_offset:
repl_backlog_active:
repl_backlog_size:
repl_backlog_first_byte_offset:
repl_backlog_histlen: //从节点配置信息:
192.168.127.128:>info Replication
#Replication
role:slave
master_host:192.168.131.1
master_port:
master_link_status:up
master_last_io_seconds_ago:
master_sync_in_progress: slave_repl_offset:
slave_priority:
slave_read_only: connected_slaves: master_replid:7f2e5cde55803c8b78d26c16f0111695e3c1fb6f8
master_replid2:
master_repl_offset:
second_repl_offset:- repl_backlog_active:
repl_backlog_size:
repl_backlog_first_byte_offset:
repl_backlog_histlen:

2、Linux系统上的Redis服务做主服务节点,Windows系统上的Redis服务做从服务节点(设置完成,但是主节点不能连接,master_link_status:down,该问题还没解决)

          //主节点服务:192.168.127.128  端口号:6379  Linux系统

          // 从节点服务:192.168.131.1    端口号:6379  Windows系统

           //现在主要修改从节点服务在Windows系统上的redis.windows.conf配置文件

           slaveof 192.168.127.128
//如果需要密码
//masterauth 123456 //主节点配置信息:
192.168.127.128:>info Replication
#Replication
role:master
connected_slaves:
master_replid:23ed05016a5fdf45e45318281b7f827cbbf75025
master_replid2:
master_repl_offset:
second_repl_offset:-
repl_backlog_active:
repl_backlog_size:
repl_backlog_first_byte_offset:
repl_backlog_histlen: //从节点配置信息:
192.168.127.128:>info Replication
#Replication
role:slave
master_host:192.168.127.128
master_port:
master_link_status:down
master_last_io_seconds_ago:-
master_sync_in_progress: slave_repl_offset:
master_link_down_since_seconds:jd
slave_priority:
slave_read_only: connected_slaves: repl_backlog_active:
repl_backlog_size:
repl_backlog_first_byte_offset:
repl_backlog_histlen:

Slave从节点日志显示为:

        * Connecting to MASTER 192.168.127.128:[]  Feb ::10.908 

        * MASTER <-> SLAVE sync started[]  Feb ::10.909 

        * Non blocking connect for SYNC fired the event.[]  Feb ::10.913 

        * Master replied to PING, replication can continue...[]  Feb ::10.917 

        * Partial resynchronization not possible (no cached master)[]  Feb ::10.923 

        * Full resync from master: 0e17ac45471c6a94dadec46f993c14ee6dc33726:[]  Feb ::10.980 

        * MASTER <-> SLAVE sync: receiving  bytes from master[]  Feb ::10.987 

        * MASTER <-> SLAVE sync: Flushing old data[]  Feb ::10.989 

        * MASTER <-> SLAVE sync: Loading DB in memory[11188] 07 Feb 15:33:10.991 # Can't handle RDB format version 8[11188] 07 Feb 15:33:10.992 

        # Failed trying to load the MASTER synchronization DB from disk[11188] 07 Feb 15:33:11.910 红色字体,就是问题所在,目前自己能力有限,还未解决

效果截图如下:

有谁可以解决问题的,请给我留言,不胜感谢,我自己也会继续研究的

三、主从模式的配置

下面是我使用的配置,需要修改的配置项我写了出来,没有更改的配置项就是用默认值,就不会写出来:

      1、######Master config

         1.1、### NETWORK

                  bind 192.168.127.128

                  port 

                  timeout   # Client 端空闲断开连接的时间

                  daemonize yes    #默认值是no,把值修改为yes,以后台模式运行

         1.2、### GENERAL

                  logfile /root/application/program/redis-tool/logs/redis.log  #日志文件的位置

         1.3、### SNAPSHOTTING 设置:

                  dir /root/application/program/redis-tool/datas #SNAPSHOTTING文件的路径

         1.4、### APPEND ONLY MODE 设置

                  appendonly yes  #默认值是No,意思是不使用AOF增量持久化的方式,使用RDB全量持久化的方式。把No值改成Yes,使用AOF增量持久化的方式

                  appendfsync always

      2、###### Slave Config

          2.1、### NETWORK

                   bind 192.168.127.129

                   port 

                   timeout   # Client 端空闲断开连接的时间

                   daemonize yes    #默认值是no,把值修改为yes,以后台模式运行

          2.2、### GENERAL

                   logfile /root/application/program/redis/logs/redis.log  #日志文件的位置

          2.3、### SNAPSHOTTING 设置:

                   dir /root/application/program/redis/datas #SNAPSHOTTING文件的路径

          2.4、### REPLICATION 设置:

                   slaveof 192.168.127.128   

                   slave-serve-stale-data no  #如果slave 无法与master 同步,设置成slave不可读,方便监控脚本发现问题。

          2.5、### APPEND ONLY MODE 设置:

                   appendonly yes  #默认值是No,意思是不使用AOF增量持久化的方式,使用RDB全量持久化的方式。把No值改成Yes,使用AOF增量持久化的方式

                   appendfsync always

      3、用redis-cli bgsave 命令每天凌晨一次持久化一次master redis上的数据,并CP到其它备份服务器上。

      4、用redis-cli bgrewriteaof 命令每半小时持久化一次 slave redis上的数据,并CP到其它备份服务器上。

      5、写个脚本 ,定期get master和slave上的key,看两个是否同步,如果没有同步,及时报警。

四、主从模式的优缺点

          1、Redis的Replication的特点和优点:

1】、同一个Master可以同步多个Slaves。

2】、Slave同样可以接受其它Slaves的连接和同步请求,这样可以有效的分载Master的同步压力。因此我们可以将Redis的Replication架构视为图结构。

3】、Master Server是以非阻塞的方式为Slaves提供服务。所以在Master-Slave同步期间,客户端仍然可以提交查询或修改请求。

4】、Slave Server同样是以非阻塞的方式完成数据同步。在同步期间,如果有客户端提交查询请求,Redis则返回同步之前的数据。

5】、为了分载Master的读操作压力,Slave服务器可以为客户端提供只读操作的服务,写服务仍然必须由Master来完成。即便如此,系统的伸缩性还是得到了很大的提高。

6】、Master可以将数据保存操作交给Slaves完成,从而避免了在Master中要有独立的进程来完成此操作。

7】、支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。

         2、Redis的Replication的缺点:

1】、Redis不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。

2】、主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性。

3】、Redis的主从复制采用全量复制,复制过程中主机会fork出一个子进程对内存做一份快照,并将子进程的内存快照保存为文件发送给从机,这一过程需要确保主机有足够多的空余内存。若快照文件较大,对集群的服务能力会产生较大的影响,而且复制过程是在从机新加入集群或者从机和主机网络断开重连时都会进行,也就是网络波动都会造成主机和从机间的一次全量的数据复制,这对实际的系统运营造成了不小的麻烦。

4】、Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题,运维人员在系统上线时必须确保有足够的空间,这对资源造成了很大的浪费。

四、结束

今天就写到这里了,其实redis的主从模式很简单,在实际的生产环境中是很少使用的,我也不建议在实际的生产环境中使用主从模式来提供系统的高可用性,之所以不建议使用都是由它的缺点造成的,在数据量非常大的情况,或者对系统的高可用性要求很高的情况下,主从模式也是不稳定的。虽然这个模式很简单,但是这个模式是其他模式的基础,所以必须深刻的理解,对其他模式的学习才会有帮助作用。

Redis进阶实践之十 Redis主从复制的集群模式的更多相关文章

  1. Redis进阶实践之十 Redis哨兵集群模式

    一.引言             上一篇文章我们详细的讲解了Redis的主从集群模式,其实这个集群模式配置很简单,只需要在Slave的节点上进行配置,Master主节点的配置不需要做任何更改,但是有一 ...

  2. Redis进阶实践之十六 Redis大批量增加数据

    一.介绍      有时,Redis实例需要在很短的时间内加载大量先前存在或用户生成的数据,以便尽可能快地创建数百万个键.这就是所谓的批量插入,本文档的目标是提供有关如何以尽可能快的速度向Redis提 ...

  3. Redis进阶实践之十八 使用管道模式加速Redis查询

    一.引言             学习redis 也有一段时间了,该接触的也差不多了.后来有一天,以为同事问我,如何向redis中批量的增加数据,肯定是大批量的,为了这主题,我从新找起了解决方案.目前 ...

  4. Redis进阶实践之十八 使用管道模式提高Redis查询的速度

    原文:Redis进阶实践之十八 使用管道模式提高Redis查询的速度 一.引言             学习redis 也有一段时间了,该接触的也差不多了.后来有一天,以为同事问我,如何向redis中 ...

  5. Redis进阶实践之十三 Redis的Redis-trib.rb文件详解

    一.简介     事先说明一下,本篇文章不涉及对redis-trib.rb源代码的分析,只是从使用的角度来阐述一下,对第一次使用的人来说很重要.redis-trib.rb是redis官方推出的管理re ...

  6. Redis进阶实践之十三 Redis的Redis-trib.rb脚本文件使用详解

    转载来源:http://www.cnblogs.com/PatrickLiu/p/8484784.html 一.简介 事先说明一下,本篇文章不涉及对redis-trib.rb源代码的分析,只是从使用的 ...

  7. Redis 5.0.7 讲解,单机、集群模式搭建

    Redis 5.0.7 讲解,单机.集群模式搭建 一.Redis 介绍 不管你是从事 Python.Java.Go.PHP.Ruby等等... Redis都应该是一个比较熟悉的中间件.而大部分经常写业 ...

  8. Redis进阶实践之十二 Redis的Cluster集群动态扩容

    一.引言     上一篇文章我们一步一步的教大家搭建了Redis的Cluster集群环境,形成了3个主节点和3个从节点的Cluster的环境.当然,大家可以使用 Cluster info 命令查看Cl ...

  9. Redis进阶实践之十一 Redis的Cluster集群搭建

    一.引言      本文档只对Redis的Cluster集群做简单的介绍,并没有对分布式系统的详细概念做深入的探讨.本文只是提供了有关如何设置集群.测试和操作集群的说明,而不涉及Redis集群规范中涵 ...

随机推荐

  1. Machine Learning - week 4 - 习题

    1. 第一个.,是对的. 第二个.结果只会认出是一类,如图:.但这里是为了举例子,实际上不会恰好是 1.而是选择最大概率表示的类别.所以是错误的. 第三个:所有基于 0,1 的逻辑方程都可以使用神经网 ...

  2. 查找算法的实现(C/C++实现)

    存档: #include <stdio.h> #include <stdlib.h> #define max 20 typedef int keytype; #include ...

  3. CTF---Web入门第八题 Guess Next Session

    Guess Next Session分值:10 来源: iFurySt 难度:易 参与人数:3870人 Get Flag:1672人 答题人数:1690人 解题通过率:99% 写个算法没准就算出来了, ...

  4. Java中import及package的用法

    有些人写了一阵子 Java,可是对於 Java 的 package 跟 import 还是不 太了解很多人以為原始码 .java 档案中的 import 会让编译器把所 import 的程式通通写到编 ...

  5. Codeforces Round #343 (Div. 2)-629A. Far Relative’s Birthday Cake 629B. Far Relative’s Problem

    A. Far Relative's Birthday Cake time limit per test 1 second memory limit per test 256 megabytes inp ...

  6. POJ2503-Babelfish-二分

    Babelfish Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 44545   Accepted: 18803 Descr ...

  7. Dora.Interception, 一个为.NET Core度身打造的AOP框架:不一样的Interceptor定义方式

    相较于社区其他主流的AOP框架,Dora.Interception在Interceptor提供了完全不同的编程方式.我们并没有为Interceptor定义一个接口,正是因为不需要实现一个预定义的接口, ...

  8. ZipKin的原理的介绍

    结构概述       跟踪器(Tracers)存在在你的应用程序中生存,记录时间和关于操作的元数据.他们经常使用库,因此他们的使用对用户是透明的.例如,当它收到一个请求并发送一个响应时,一个感应器(i ...

  9. CSS中的定位与浮动

    CSS中的定位与浮动 本文主要讲述CSS中的三种定位样式static.relative和absolute的区别以及浮动元素的特征. 定位样式 CSS中定位样式position的取值有三个,默认值:st ...

  10. ReentrantLock与Condition构造有界缓存队列与数据栈

    通过ReentrantLock与Condition的设计,以数组为基础,可以实现简单的队列和栈的数据结构,临界阻塞的效果. ReentrantLock相对于synchronized比较大的一个区别是有 ...