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

周六下午写了一下午的读书笔记,由于我的 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. centos 6.4 使用epel 源

    EPEL是RHEL 的 Fedora 软件仓库,把它添上,你就可以获得 RHEL AS 的高质量.高性能.高可靠性,又需要方便易用(关键是免费)的软件包更新功能.EPEL(Extra Packages ...

  2. MongoDB 基本操作

    //恢复备份数据到本地 mongorestore -d coolfen -drop <path>

  3. json转 PostMan bulk Edit application/x-www-form-urlencoded 需要的格式

    {?\n\s*"([^"]+)"\s*:\s*"?([^,"]+)"?\s*,?}? $1:$2\n PostMan需要的格式. json转 ...

  4. Ubuntu下安装和使用zookeeper和kafka

    1.在清华镜像站下载kafka_2.10-0.10.0.0.tgz 和 zookeeper-3.4.10.tar.gz 分别解压到/usr/local目录下 2.进入zookeeper目录,在conf ...

  5. Retrofit/Okhttp API接口加固技术实践(上)

    作者:Tamic 地址:http://blog.csdn.net/sk719887916/article/details/61914609 写这篇文章,我纠结了非常久,究竟是属于app安全系列,还是属 ...

  6. session一直报错Session store not set on request

    Route::group(['middleware' => ['web']], function () { //});仍然报错,看了 session是使用默认file,没问题:app/stora ...

  7. [Model] VGG16

     Jeff: fast.ai lesson 1&2感觉没讲什么干货. ~/keras/keras.json配置后台theano or tensorflow. ~/./theanorc处理器配置 ...

  8. 大杂烩 -- 简析TCP的三次握手与四次分手

    基础大杂烩 -- 目录 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - ...

  9. Mac OSX安装启动 zookeeper

    安装 zookeeper支持brew安装 ➜ ~ brew info zookeeper zookeeper: stable (bottled), HEAD Centralized server fo ...

  10. js for in 获得遍历数组索引和对象属性

    for in 遍历对象属性 获取的是对象的属性名 var person ={ name:"admin", age:"21", address:"sha ...