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

周六下午写了一下午的读书笔记,由于我的 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. LeetCode: Find Peak Element 解题报告

    Find Peak Element A peak element is an element that is greater than its neighbors. Given an input ar ...

  2. golang_elasticsearch 多精确值匹配

    问题 比如要查找属于两种类型的物品,这个时候,term查询就不行了,需要采用terms查询. golang中的用法 看了一下,olivere/elastic 包提供了一个 terms查询,于是高兴的直 ...

  3. winserver2012 自启动软件

    开始->运行->输入shell:startup 在打开的启动文件夹中,将需要启动程序的快捷方式复制进去,完工 重启试试吧

  4. (转载)Redis5.0重量级特性Stream尝鲜

    转 导读:Redis5.0最新重点推出了Stream的支持,给众多架构师在消息队列方面带来了新的选择,特别是Redis粉丝们绝对是一个福音.那么Redis的Stream有哪些特别的功能?跟kafka有 ...

  5. SmileyCount.java笑脸加法程序代写(QQ:928900200)

    SmileyCount.java 1/4Java Programming 2014Course Code: EBU4201Mini ProjectTask 1 [30 marks]SmileyCoun ...

  6. Scala学习笔记(二):object、伴生对象和基本类

    object object 是只有一个实例的类.它的定义与Java中的class类似,如: // 单例对象 object AppEntry { def main(args: Array[String] ...

  7. 使用UIScrollView 结合 UIImageView 实现图片循环滚动

    场景: 在开发工作中,有时我们需要实现一组图片循环滚动的情况.当我们使用 UIScrollView 结合 UIImageView 来实现时,一般 UIImageView 会尽量考虑重用,下面例子是以( ...

  8. DedeCMS中channelartlist自增参数global.itemindex

    在 dede:channelartlist 标签下,使用: {dede:global.itemindex runphp='yes'} {/dede:global.itemindex} dede:cha ...

  9. [Tensorflow] RNN - 02. Movie Review Sentiment Prediction with LSTM

    From: Predicting Movie Review Sentiment with TensorFlow and TensorBoard Ref: http://www.cnblogs.com/ ...

  10. 检测浏览器是否支持某个css属性

    以浏览器是否支持translate3d 为例说明,当然现代浏览器已经支持该属性.如果浏览器实现了带有前缀的某个属性,比如说支持-webkit-transform,但是不支持直接写transform,可 ...