Redis进阶实践之十 Redis主从复制的集群模式

一、引言

          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 6379

           设置完成:

           主节点配置信息:
           131.1:6379>info Replication
           #Replication
           role:master
           connected_slaves:1
           slave0:ip=131.1,port=6379,state=online,offset=239,lag=
           master_repl_offset:239
           repl_backlog_active:
           repl_backlog_size:1048576
           repl_backlog_first_byte_offset:2
           repl_backlog_histlen:238


           从节点配置信息:
           127.128:info Replication
           #Replication
           role:slave
           master_host:131.1
           master_port:
           master_link_status:up
           master_last_io_seconds_ago:8
           master_sync_in_progress:0

           slave_repl_offset:253
           slave_priority:100
           slave_read_only:

           connected_slaves:

           master_replid:7f2e5cde55803c8b78d26c16f0111695e3c1fb6f8
           master_replid2:000000000000000000000000000000000000000000
           second_repl_offset:-

           repl_backlog_active:252


       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配置文件
127.128 6379
           如果需要密码
           masterauth 123456

           
           master_replid:23ed05016a5fdf45e45318281b7f827cbbf75025
           master_replid2:00000000000000000000000000000000000000000


           127.128
           master_link_status:down
           master_last_io_seconds_ago:-
           master_link_down_since_seconds:jd
           slave_priority:0

Slave从节点日志显示为:

        * Connecting to MASTER [11188] 07 Feb 15:33:10.908 

        * MASTER <-> SLAVE sync started[10.909 

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

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

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

        * Full resync from master: 0e17ac45471c6a94dadec46f993c14ee6dc33726:10.980 

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

        * MASTER <-> SLAVE sync: Flushing old data[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 

                  port 

                  timeout 30  # 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 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   

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读752次。关系型数据库关系型数据库是一个结构化的数据库,创建在关系模型(二维表模型)基础上,一般面向于记录SQL语句(标准数据查询语言)就是一种基于关系型数据库的语言,用于执行对关系型数据库中数据的检索和操作主流的关系数据库包括Oracle、Mysql、SQL Server、Microsoft Access、DB2等非关系型数据库NoSQL(nOSQL=Not Only SQL),意思是“不仅仅是SQL”,是非关系型数据库的总称。除了主流的关系型数据库外的数据库,都认为是非关系型主流的NoSQ.._redis是非关系型数据库吗
文章浏览阅读687次,点赞2次,收藏5次。商城系统中,抢购和秒杀是很常见的营销场景,在一定时间内有大量的用户访问商场下单,主要需要解决的问题有两个:1. 高并发对数据库产生的压力;2. 竞争状态下如何解决商品库存超卖;高并发对数据库产生的压力对于第一个问题,使用缓存来处理,避免直接操作数据库,例如使用 Redis。竞争状态下如何解决商品库存超卖对于第二个问题,需要重点说明。常规写法:查询出对应商品的库存,判断库存数量否大于 0,然后执行生成订单等操作,但是在判断库存是否大于 0 处,如果在高并发下就会有问题,导致库存_php库存结余并发
文章浏览阅读1.4k次。MongoTemplate开发spring-data-mongodb提供了MongoTemplate和MongoRepository两种方式访问MongoDB,MongoRepository的方式访问较为简单,MongoTemplate方式较为灵活,这两种方式在Java对于MongoDB的运用中相辅相成。_springboot插入指定的mongodb数据库
文章浏览阅读887次,点赞10次,收藏19次。1.背景介绍1. 背景介绍NoSQL数据库是一种非关系型数据库,它的特点是可以存储非结构化的数据,并且可以处理大量的数据。HBase是一个分布式、可扩展的列式存储系统,它是基于Google的Bigtable设计的。HBase是一个开源的NoSQL数据库,它的核心功能是提供高性能的随机读写访问。在本文中,我们将对比HBase与其他NoSQL数据库,例如Redis、MongoDB、Cass...
文章浏览阅读819次。MongoDB连接失败记录_edentialmechanisn-scram-sha-1
文章浏览阅读470次。mongodb抽取数据到ES,使用ELK内部插件无法获取数据,只能试试monstache抽取mongodb数据,但是monstache需要mongodb replica set 模式才能采集数据。############monstache-compose文件。#replicas set 启动服务。# 默认备份节点不能读写,可以设置。# mydb指的是需要同步的数据库。#登录主mongodb初始化rs。#primary 创建用户。# ip地址注意要修改。# ip地址注意要修改。_monstache csdn
文章浏览阅读913次,点赞4次,收藏5次。storage:fork: trueadmin登录切换数据库注意: use 代表创建并使用,当库中没有数据时默认不显示这个库删除数据库查看表清单> show tables # 或者 > show collections表创建db.createCollection('集合名称', [options])table1字段类型描述capped布尔(可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。_mongodb5
文章浏览阅读862次。Centos7.9设置MongoDB开机自启(超全教程,一条龙)_mongodb centos开机启动脚本
文章浏览阅读1.3k次,点赞6次,收藏21次。NoSQL数据库使用场景以及架构介绍
文章浏览阅读856次,点赞21次,收藏20次。1.背景介绍1. 背景介绍NoSQL数据库是一种非关系型数据库,它的设计目标是为了解决传统关系型数据库(如MySQL、Oracle等)在处理大量不结构化数据方面的不足。NoSQL数据库可以处理大量数据,具有高性能、高可扩展性和高可用性。但是,与关系型数据库不同,NoSQL数据库没有固定的模式,数据结构也不一定是表格。在NoSQL数据库中,数据存储和查询都是基于键值对、列族、图形等不同的...
文章浏览阅读416次。NoSQL定义:非关系型、分布式、开放源码和具有横向扩展能力的下一代数据库。由c++编写的开源、高性能、无模式的基于分布式文件存储的文档型数据库特点:高性能、高可用性、高扩展性、丰富的查询支持、可替换已完场文档某个指定的数据字段应用场景:社交场景:使用mongodb存储用户信息游戏场景:用户信息,装备积分物流场景:订单信息,订单状态场景操作特点:数据量大;读写操作频繁;价值较低的数据,对事物性要求不高开源、c语言编写、默认端口号6379、key-value形式存在,存储非结构化数据。_nosql
文章浏览阅读1.5k次,点赞3次,收藏2次。Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException: Failed to create socket. at redis.clients.jedis.DefaultJedisSocketFactory.createSocket(DefaultJedisSocketFactory.java:110) at redis.clients.jedis.Connection.connect(Conne_redis.clients.jedis.exceptions.jedisconnectionexception: failed to create so
文章浏览阅读6.5k次,点赞3次,收藏12次。readAnyDatabase(在所有数据库上都有读取数据的权限)、readWriteAnyDatabase(在所有数据库上都有读写数据的权限)、userAdminAnyDatabase(在所有数据库上都有管理user的权限)、dbAdminAnyDatabase(管理所有数据库的权限);:clusterAdmin(管理机器的最高权限)、clusterManager(管理和监控集群的权限)、clusterMonitor(监控集群的权限)、hostManager( 管理Server);_mongodb创建用户密码并授权
文章浏览阅读593次。Redis是一个基于内存的键值型NoSQL数据库,在实际生产中有着非常广泛的用处_搭建本地redis
文章浏览阅读919次。Key 的最佳实践[业务名]:[数据名]:[id]足够简短:不超过 44 字节不包含特殊字符Value 的最佳实践:合理的拆分数据,拒绝 BigKey选择合适数据结构Hash 结构的 entry 数量不要超过 1000(默认是 500,如果达到上限则底层会使用哈希表而不是 ZipList,内存占用较多)设置合理的超时时间批量处理的方案:原生的 M 操作Pipeline 批处理注意事项:批处理时不建议一次携带太多命令。Pipeline 的多个命令之间不具备原子性。_redis高级实战
文章浏览阅读1.2k次。MongoDB 递归查询_mongodb数据库 递归
文章浏览阅读1.2k次。通过实际代码例子介绍:如何通过MongoTemplate和MongoRepository操作数据库数据_springboot操作mongodb
文章浏览阅读687次,点赞7次,收藏2次。首先欢迎大家阅读此文档,本文档主要分为三个模块分别是:Redis的介绍及安装、RedisDesktopManager可视化工具的安装、主从(哨兵)模式的配置。_redis 主从配置工具
文章浏览阅读764次。天下武功,无坚不摧,唯快不破!我的名字叫 Redis,全称是 Remote Dictionary Server。有人说,组 CP,除了要了解她外,还要给机会让她了解你。那么,作为开发工程师的你,是否愿意认真阅读此心法抓住机会来了解我,运用到你的系统中提升性能。我遵守 BSD 协议,由意大利人 Salvatore Sanfilippo 使用 C 语言编写的一个基于内存实现的键值型非关系(NoSQL)..._redis 7.2 源码
文章浏览阅读2k次。MongoDB 的增删改查【1】_mongodb $inc