zoukankan      html  css  js  c++  java
  • Redis集群的三种模式

    一、主从模式

    通过持久化功能,Redis保证了即使在服务器重启的情况下也不会损失(或少量损失)数据,因为持久化会把内存中数据保存到硬盘上,重启会从硬盘上加载数据。
    但是由于数据是存储在一台服务器上的,如果这台服务器出现硬盘故障等问题,也会导致数据丢失。为了避免单点故障,通常的做法是将数据库复制多个副本以部署在不同的服务器上,这样即使有一台服务器出现故障,其他服务器依然可以继续提供服务。为此, Redis 提供了复制(replication)功能,可以实现当一台数据库中的数据更新后,自动将更新的数据同步到其他数据库上

    在复制的概念中,数据库分为两类,一类是主数据库(master),另一类是从数据库(slave)。主数据库可以进行读写操作,当写操作导致数据变化时会自动将数据同步给从数据库。而从数据库一般是只读的,并接受主数据库同步过来的数据。一个主数据库可以拥有多个从数据库,而一个从数据库只能拥有一个主数据库。

    主从数据库的配置

    主数据库不用配置,从redis的conf文件中可以加载从数据库的信息,也可以在启动时,使用 redis-server --port 6380 --slaveof 127.0.0.1 6379
    从数据库一般是只读,可以改为可写,但写入的数据很容易被主同步没,所以还是只读就可以。
    也可以在运行时使用slaveof ip port命令,停止原来的主,切换成刚刚设置的主 slaveof no one会把自己变成主

    复制原理

    从数据库启动时,会向主数据库发送sync命令,主数据库接收到sync后开始在后台保存快照rdb,在保存快照期间收到的命令缓存起来,当快照完成时,主数据库会将快照和缓存的命令一块发送给从**。复制初始化结束。
    之后,主每收到1个命令就同步发送给从。
    当出现断开重连后,2.8之后的版本会将断线期间的命令传给重数据库。增量复制

    主从复制是乐观复制,当客户端发送写执行给主,主执行完立即将结果返回客户端,并异步的把命令发送给从,从而不影响性能。也可以设置至少同步给多少个从主才可写。
    无硬盘复制:如果硬盘效率低将会影响复制性能,2.8之后可以设置无硬盘复制,repl-diskless-sync yes

    二、哨兵

    当主数据库遇到异常中断服务后,开发者可以通过手动的方式选择一个从数据库来升格为主数据库,以使得系统能够继续提供服务。然而整个过程相对麻烦且需要人工介入,难以实现自动化。 为此,Redis 2.8中提供了哨兵工具来实现自动化的系统监控和故障恢复功能。
    哨兵的作用就是监控redis主、从数据库是否正常运行,主出现故障自动将从数据库转换为主数据库
    例子:
    1主2从1哨兵

    redis-server --port 6379 
    redis-server --port 6380 --slaveof 192.168.0.167 6379 
    redis-server --port 6381 --slaveof 192.168.0.167 6379
    哨兵配置文件 sentinel.conf 
     sentinel monitor mymaster 192.168.0.167 6379  1
    这里的1代表1个哨兵
    

    注:
    配置哨兵监控一个系统时,只需要配置其监控主数据库即可,哨兵会自动发现所有复制该主数据库的从数据库

    这样哨兵就能监控主6379和从6380、6381,一旦6379挂掉,哨兵就会在2个从中选择一个作为主,根据优先级选,如果一样就选个id小的,当6379再起来就作为从存在。

    三、集群(cluster-enable)

    使用集群,只需要将每个数据库节点的cluster-enable配置打开即可。每个集群中至少需要三个主数据库才能正常运行。

    即使使用哨兵,redis每个实例也是全量存储,每个redis存储的内容都是完整的数据,浪费内存且有木桶效应。为了最大化利用内存,可以采用集群,就是分布式存储。即每台redis存储不同的内容。
    集群至少需要3主3从,且每个实例使用不同的配置文件,主从不用配置,集群会自己选。
    修改每个实例的配置文件:

     cluster-enabled yes  --开启集群
     cluster-config-file nodes-6382.conf --集群配置文件名,
    每个实例配置的要不同,redis会根据文件名自动新建
    集群的运行
    redis安装目录的src执行./redis-trib.rb create --replicas 1 
    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 127.0.0.1:6385
    
     
     


     
  • 相关阅读:
    JSON.parse解决Unexpected token ' in JSON at position 1报错
    angularjs $scope与this的区别,controller as vm有何含义?
    angularjs link compile与controller的区别详解,了解angular生命周期
    理解Promise.all,Promise.all与Promise.race的区别,如何让Promise.all在rejected失败后依然返回resolved成功结果
    angularjs 一篇文章看懂自定义指令directive
    js 记录几个因惯性思维引发的代码BUG,开发思维方式的自我反省
    js forEach参数详解,forEach与for循环区别,forEach中如何删除数组元素
    angularjs ng-if妙用,ng-if解决父子组件异步传值
    JS 从内存空间谈到垃圾回收机制
    Markdown数学公式语法
  • 原文地址:https://www.cnblogs.com/edda/p/13091869.html
Copyright © 2011-2022 走看看