万念俱灰,说的就是我现在的心情......

周六下午写了一下午的读书笔记,由于我的 MAC 有点问题,重启了一下......

灰飞烟灭......

  第八章《集群》

总结

1:如何开启主从复制?

  - Redis.conf 中配置 slaveof 主数据库地址 主数据库端口

  - 启动一个 Redis 实例 redis-server --port 监听端口 --slaveof 主数据库地址 主数据库端口

2:如何查看主从数据库状态及其节点信息?

  - INFO replication

3:设置主从后,从库可以写么?

  - 不可以,如果在从库执行写操作的话,则会报错。

  - 不过也可以通过修改配置 slave-read-only 使得从库可以执行写操作,不过这会使得主从数据库不一致。通常是禁止的(默认)

4:主从的原理是什么呢?是如何实现的呢?

  - 当一个从数据库启动时,会向主库发送 PSYNC(Redis 2.8 之后) 命令。

  - 当主库接到 PSYNC(Redis 2.8) 命令时,会[保存快照(RDB) + 缓存保存快照期间的命令],当快照完成后,会把快照和缓存命令一块发给从库。

  - 当从库接到后,会根据RDB快照和缓存命令,进行同步(也叫做复制初始化)。

5:为什么有时候主从数据不一致?

  - 由于 Redis 采用了乐观复制,既乐观的认为主从数据最终是会同步的。

  - 当客户端发起请求后,主数据库执行完成会立即返回结果。并将命令异步同步从数据库。

  - 由于本身是异步,假如网络断开或者其他什么,就会导致主从数据不一致的情况发生。

6:如何解决主从数据不一致问题?

  - Redis 在配置中提供了解决一致性的方案,合理的配置这两个选项可以降低(注意,不是解决)一致性的问题。

  - min-slaves-to-write 3      是表示当有3个或者3个以上的从库更新了数据,主库才是可写的,如果不满足的话,会直接报错

  - min-slaves-max-lag 10    是表示允许从库失去连接的最长时间,当从库超过这个时间时候,我们就认为这个从库已经[挂了]

7:主/从 数据库崩溃的处理办法?

  - 当从库崩溃时,不会影响其他,当从库重启之后,主库会自动同步数据,所以也没有数据丢失问题。

  - 主库崩溃后,情况会有一些复杂。

    - 由于为了主库的性能最佳,通常会关闭 AOF/RDB 。

      - 如果关闭,一定不要使用 Supervisor 等进程管理工具实现自动重启,因为当自动重启后,主库没有任何数据,当从库连接上之后,同步数据,从库数据也将清空

    - 推荐使用 哨兵 机制来实现 主/从 的切换。

8:哨兵机制的简单实现?

  - 这里我开了两个 redis-server 实例, 8680 端口作为 master,8681 端口作为 slave。

  - 配置 哨兵 ,建立配置文件 sentinel.conf

    - sentinel monitor 监控数据库名称 地址 端口 最低通过票数

    - 例如: sentinel monitor mymaster 127.0.0.1 6379 1

  - 启动监控:redis-sentinel /path/to/sentinel.conf

  - 这时,我们杀死 master ,分析下日志

  -

:X  Aug ::27.444 # +monitor master mymaster 127.0.0.1  quorum 1     // 主库
4451:X 20 Aug 05:18:13.972 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380 // 发现一个备库 // 杀死主库进程
:X Aug ::12.835 # +sdown master mymaster 127.0.0.1 6380 // 主观认为数据库停止了服务
:X Aug ::12.837 # +odown master mymaster 127.0.0.1 #quorum /1 // 客观认为数据库已停止运行
:X Aug ::12.838 # +new-epoch 2 // 开始故障恢复
:X Aug ::12.839 # +try-failover master mymaster 127.0.0.1 6380 // 选择 6380 端口为主库

// 之后就是 6380 为主库,具体的细节一会在详细说

 9:哨兵机制的实现原理?

  - 当哨兵启动时,会和需要监控的主数据库建立两条连接。

    - 一条是 订阅 __sentinel__::hello 频道,获取其他哨兵节点信息。

    - 另一条需要定期发送 INFO 字段来获取,数据库本身信息。

  - 当和主数据库建立完成之后,定期执行下列操作

    - 10s/次 会向主数据库发送 INFO 命令

      - 获取当前数据库相关信息(节点数量/节点信息/等等)

    - 2s/次 会向主/从数据库的 __sentinel__::hello 频道发送自己的信息

    - 1s/次 向主数据库和其他哨兵节点发送Ping命令

  - 当主数据库出现问题时候

    - 哨兵向主数据库发送 ping 命令,未回复,则该哨兵认为主数据库 主观下线

    - 这时候会判断 quorum 参数

      - 例如  sentinel monitor mymaster 127.0.0.1 6379 3

      - 该配置表示,如果有三个哨兵认为主数据库主观下线

    - 才会认为该主数据库 客观下线

  - 当认为客观下线后,需要进行故障恢复。

    - 这时,会推举领头哨兵进行故障恢复。

      - 领头哨兵的选举流程为(Raft算法)

      - 发现数据库主观下线的哨兵,向其他人发送命令,要求选自己为 领头哨兵

      - 超过半数同意,则该哨兵成为领头哨兵进行故障恢复

10:什么样子的哨兵部署方案比较好?

  - 建议为每个节点部署(主/从)哨兵。

  - 保证环境一致。

  - 设置 quorum 为  N/2 + 1 ,N为节点数量,这样保证一半同意,才会生效。

《Redis 主从复制》的更多相关文章

  1. 简单物联网:外网访问内网路由器下树莓派Flask服务器

    最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...

  2. 利用ssh反向代理以及autossh实现从外网连接内网服务器

    前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...

  3. 外网访问内网Docker容器

    外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...

  4. 外网访问内网SpringBoot

    外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...

  5. 外网访问内网Elasticsearch WEB

    外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...

  6. 怎样从外网访问内网Rails

    外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...

  7. 怎样从外网访问内网Memcached数据库

    外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...

  8. 怎样从外网访问内网CouchDB数据库

    外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...

  9. 怎样从外网访问内网DB2数据库

    外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...

  10. 怎样从外网访问内网OpenLDAP数据库

    外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...

随机推荐

  1. VIM空格和TAB转换

    在.vimrc中添加以下代码后,重启vim即可实现按TAB产生4个空格:set ts=4 (注:ts是tabstop的缩写,设TAB宽4个空格)set expandtab 对于已保存的文件,可以使用下 ...

  2. Linux查看文件总的数据行数,并按行拆分

    先利用 wc -l BLM.txt       读出 BLM.txt 文件一共有多少行. 再 1. 以行数拆分 -l 参数: split –l 50 原始文件 拆分后文件名前缀 例:以50行对文件进行 ...

  3. Java知多少(46)try和catch的使用

    尽管由Java运行时系统提供的默认异常处理程序对于调试是很有用的,但通常你希望自己处理异常.这样做有两个好处.第一,它允许你修正错误.第二,它防止程序自动终止.大多数用户对于在程序终止运行和在无论何时 ...

  4. CLOS架构是啥?

    有多少种技术能够在六十五年后依旧能够熠熠生辉,在IT的基础架构中扮演着重要角色?CLOS架构应该算是一项.Clos架构,诞生于1952年,是由由贝尔实验室一位叫Charles Clos的人提出的.CL ...

  5. Python 函数(可变参数)

    在python函数中,可以定义可变参数,顾名思义,可变参数就是,传入的参数是可变的例如,给定一组数字a,b,c...  请计算a2 + b2 + c2 + …… 要定义出这个函数,我们必须确定输入的参 ...

  6. [algorithm] Dijkstra双栈算法表达式求值算法

    一.原理 Dijkstra所做的一个算法,双栈求值,用两个栈(一个保存运算符,一个用于保存操作数), 表达式由括号,运算符和操作数组成. (1).将操作数压入操作数栈 (2).将运算符压入运算符栈: ...

  7. [UI] 06 - jQuery

    前言 From : http://www.runoob.com/jquery/jquery-intro.html Ref: jQuery 实例 一.什么是 jQuery ? jQuery是一个Java ...

  8. 九度OJ 1067 n的阶乘 (模拟)

    题目1067:n的阶乘 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5666 解决:2141 题目描写叙述: 输入一个整数n,输出n的阶乘 输入: 一个整数n(1<=n<=2 ...

  9. SpringBoot切换Tomcat容器,SpringBoot使用Jetty容器

    SpringBoot切换Tomcat容器, SpringBoot修改为Jetty容器, SpringBoot使用undertow容器, SpringBoot使用Jetty容器 ============ ...

  10. LostRoutes项目日志——在main.js中添加多分辨率适配

    初始的Cocos2d-JS项目中的main.js代码的内容为: /** * A brief explanation for "project.json": * Here is th ...