1 NoSQL

1.1 NoSQL简介

noSql==not only sql(不仅仅是SQL),NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在处理web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,出现了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。

1.2 NoSQL分类

键值(Key-Value)存储数据库

这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。Key/value模型对于IT系统来说的优势在于简单、易部署。但是如果数据库管理员(DBA)只对部分值进行查询或更新的时候,Key/value就显得效率低下了。举例如:Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB。 [1]

列存储数据库

这部分数据库通常是用来应对分布式存储的海量数据。键仍然存在,但是它们的特点是指向了多个列。这些列是由列家族来安排的。如:Cassandra, HBase, Riak. [1]

文档型数据库

文档型数据库的灵感是来自于Lotus Notes办公软件的,而且它同第一种键值存储相类似。该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如JSON。文档型数据库可以看作是键值数据库的升级版,允许之间嵌套键值,在处理网页等复杂数据时,文档型数据库比传统键值数据库的查询效率更高。如:CouchDB, MongoDb. 国内也有文档型数据库SequoiaDB,已经开源。 [1]

图形(Graph)数据库

图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上。NoSQL数据库没有标准的查询语言(SQL),因此进行数据库查询需要制定数据模型。许多NoSQL数据库都有REST式的数据接口或者查询API。如:Neo4J, InfoGrid, Infinite Graph。 [1]

1.3 不同分类之间的对比

分类 Examples举例 典型应用场景 数据模型 优点 缺点
键值(key-value) Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB 内容缓存,主要用于处理大量数据的高访问负载,也用于一些日志系统等等。 Key 指向 Value 的键值对,通常用hash table来实现 查找速度快 数据无结构化,通常只被当作字符串或者二进制数据
列存储数据库 Cassandra, HBase, Riak 分布式的文件系统 以列簇式存储,将同一列数据存在一起 查找速度快,可扩展性强,更容易进行分布式扩展 功能相对局限
文档型数据库 CouchDB, MongoDb Web应用(与Key-Value类似,Value是结构化的,不同的是数据库能够了解Value的内容) Key-Value对应的键值对,Value为结构化数据 数据结构要求不严格,表结构可变,不需要像关系型数据库一样需要预先定义表结构 查询性能不高,而且缺乏统一的查询语法。
图形(Graph)数据库 Neo4J, InfoGrid, Infinite Graph 社交网络,推荐系统等。专注于构建关系图谱 图结构 利用图结构相关算法。比如最短路径寻址,N度关系查找等 很多时候需要对整个图做计算才能得出需要的信息,而且这种结构不太好做分布式的集群方案。

1.4 特点

易扩展

NoSQL数据库种类繁多,但是一个共同的特点都是去掉关系数据库的关系型特性。数据之间无关系,这样就非常容易扩展。无形之间,在架构的层面上带来了可扩展的能力。

大数据量,高性能

NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于它的无关系性,数据库的结构简单。一般MySQL使用Query Cache。NoSQL的Cache是记录级的,是一种细粒度的Cache,所以NoSQL在这个层面上来说性能就要高很多。 [3]

灵活的数据模型

NoSQL无须事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删字段是一件非常麻烦的事情。如果是非常大数据量的表,增加字段简直就是——个噩梦。这点在大数据量的Web 2.0时代尤其明显。

高可用

NoSQL在不太影响性能的情况,就可以方便地实现高可用的架构。比如Cassandra、HBase模型,通过复制模型也能实现高可用;

1.5 体系结构

NoSQL框架体系NosoL整体框架分为四层,由下至上分为数据持久层(data persistence)、整体分布层(data distribution model)、数据逻辑模型层(data logical model)、和接口层(interface),层次之间相辅相成,协调工作。

数据持久层定义了数据的存储形式,主要包括基于内存、基于硬盘、内存和硬盘接口、订制可拔插四种形式。基于内存形式的数据存取速度最快,但可能会造成数据丢失。基于硬盘的数据存储可能保存很久,但存取速度较基于内存形式的慢。内存和硬盘相结合的形式,结合了前两种形式的优点,既保证了速度,又保证了数据不丢失。订制可拔插则保证了数据存取具有较高的灵活性。

数据分布层定义了数据是如何分布的,相对于关系型数据库,NoSQL可选的机制比较多,主要有三种形式:一是CAP支持,可用于水平扩展。二是多数据中心支持,可以保证在横跨多数据中心是也能够平稳运行。三是动态部署支持,可以在运行着的集群中动态地添加或删除节点。 (CAP代表Consistency一致性,Availability可用性和Partition tolerance分区容错性)

数据逻辑层表述了数据的逻辑变现形式,与关系型数据库相比,NoSQL在逻辑表现形式上相当灵活,主要有四种形式:一是键值模型,这种模型在表现形式上比较单一,但却有很强的扩展性。二是列式模型,这种模型相比于键值模型能够支持较为复杂的数据,但扩展性相对较差。三是文档模型,这种模型对于复杂数据的支持和扩展性都有很大优势。四是图模型,这种模型的使用场景不多,通常是基于图数据结构的数据定制的。

接口层为上层应用提供了方便的数据调用接口,提供的选择远多于关系型数据库。接口层提供了五种选择:Rest,Thrift,Map/Reduce,Get/Put,特定语言API,使得应用程序和数据库的交互更加方便。

NoSQL分层架构并不代表每个产品在每一层只有一种选择。相反,这种分层设计提供了很大的灵活性和兼容性,每种数据库在不同层面可以支持多种特性。


3V=海量Velume、多样Variety、实时Velocity

3高=高并发、高可扩、高性能


2 redis入门

2.1 简介(是什么)

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings)散列(hashes)列表(lists)集合(sets)有序集合(sorted sets)范围查询bitmapshyperloglogs地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication)LUA脚本(Lua scripting)LRU驱动事件(LRU eviction)事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。redis即(remote dictionary server)远程字典服务

2.2 能干什么

数据库、缓存、消息中间件

2.3 使用(安装+docker操作)

docker下:

安装命令: docker pull redis

(默认方式)启动命令: docker run —name some-redis1 -p 6380:6379 -d redis:4 —requirepass “123456”

  • —name : 命名
  • -p: 端口映射
  • -d: 后台运行
  • —requirepass: 设置通行密码(即打开客户端时需要填写auth 123456指令来开启同行命令)

(配置文件)启动命令:docker run -v /myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf —name myredis redis redis-server /usr/local/etc/redis/redis.conf

链接客户端命令: docker exec -it contain ID(启动的redis_server container 的ID)redis-cli

输入通行指令: auth 123456

进行常规的操作

退出:QUIT

如下图:

redis 缓存 - 图1

redis配置文件简介

redis中对存储大小的定义

  • 1k => 1000 bytes
  • 1kb => 1024 bytes
  • 1m => 1000000 bytes
  • 1mb => 1024*1024 bytes
  • 1g => 1000000000 bytes
  • 1gb => 1024_1024_1024 bytes

redis中常用的配置

including配置项

  • include path:引入外部配置文件

network配置项

  • bind url:绑定客户端url地址
  • port 6379:绑定端口号
  • tcp-backlog 511:backlog其实是一个连接队列,backlog队列=tcp完成的链接+未完成的tcp链接,在一个高并发的环境下需要一个高的tcp-backlog值来提升客户链接速度,其值会在Linux内核下降低到/proc/sys/net/core/somaxconn的值,要想提高tcp-backlog的值,必须将两个值一同设置。
  • timeout 0:Close the connection after a client is idle for N seconds (0 to disable)
  • tcp-keepalive 300:检测tcp的网络通信是否存活,每300秒检测一次。(用于集群服务器)

general配置项

  • daemonize yes:yes表示开启后台启动,no表示关闭后台启动。
  • loglevel notice:设置日志级别,分别为debug,verbose,notice和warning
  • logfile “”:设置日志文件名,若为空则强迫Redis登录标准输出,并将内容输出到/dev/null;
  • databases 16:设置数据库数量,默认16个
  • always-show-logo yes:设置启动时是否展示redis的logo

SNAPSHOTTING(快照)配置项

  • Save the DB on disk:持久化设置,下面是默认设置,数据最终都会存储到dump.rdb文件中。
    • save 900 1:表示900秒内,若是key改变一次则存储;
    • save 300 10:表示300秒内,若是key改变10次则存储;
    • save 60 10000:表示60 秒内,若是key改变10000次则存储;
  • stop-writes-on-bgsave-error yes:再bgsave发生错误时,停止写。
  • rdbcompression yes:是否开启rdb压缩,默认开启;(用默认的)
  • rdbchecksum yes:是否开启rdb数据校验,默认开;(用默认的)
  • dbfilename dump.rdb:设置rdb持久化的情况下,持久化文件的名称。(用默认的)
  • rdb-del-sync-files no:

REPLICATIO配置项

SECURITY配置项

  • requirepass password:设置客户端登录密码,默认不设置,如果设置了,需要在客户端输入auth password来开启服务器验证。

LIMIT配置项

  • maxclients number:最大链接客户端,默认值10000
  • maxmemory size:最大占用内存
  • maxmemory-policy strategy:存储策略,表示在存储满的时候,采用哪种方式管理内存;有五种方式,分别如下:
    • volatile-lru -> Evict using approximated LRU, only keys with an expire set.
    • allkeys-lru -> Evict any key using approximated LRU.
    • volatile-lfu -> Evict using approximated LFU, only keys with an expire set.
    • allkeys-lfu -> Evict any key using approximated LFU.
    • volatile-random -> Remove a random key having an expire set.
    • allkeys-random -> Remove a random key, any key.
    • volatile-ttl -> Remove the key with the nearest expire time (minor TTL)
    • noeviction -> Don’t evict anything, just return an error on write operations.

LRU表示最少使用算法,最少使用的先清除掉。

  • maxmemory-samples 5:抽样默认为5,LRU和TTL算法都是估算值,需要样本来提高精度。

redis持久化

redis支持持久化的策略有两种,分别是AOF和RDB,AOF表示append only file,RDB表示redis database;

RDB持久化

rdb的持久化策略是fork一个redis主进程,然后利用此进程将缓存数据保存为快照,最终反映为一个dump.rdb文件。redis重启的时候,默认会加载dump.rdb文件,恢复缓存数据。

两种持久化策略

  1. + save:创建一个fork进程,然后利用fork进程将当前的缓存保存为快照,此操作会阻塞客户端,但不消耗额外的内存。
  2. + bisave:创建一个fork进程,然后异步的利用fork进程将缓存保存为快照,此操作不会阻塞客户端,但消耗额外的内存。

关于RDB的配置:

  1. save time updateDataNumber:默认为save 900 1,save 300 10,save 60 10000,上面有解释。
  2. stop-writes-on-bgsave-error yes:默认值为yes,表示如果最后一次数据保存失败了,就停止写的操作,让用户意识到数据持久化出现了故障。
  3. rdbcompression yes:默认为yes,表示对dump.rdb文件进行压缩。
  4. rdbchecksum yes:默认为yes,表示对dump.rdb文件进行CRC64算法来进行数据校验,但是会损失10%的性能。
  5. dbfilename filename:为dump.rdb指定快照文件名,如果指定了,新的文件名会替换dump文件名。
  6. dir address:设置dump.db文件的保存位置和加载位置。

RDB的优劣势:

优势:

(1)RDB文件紧凑,全量备份,非常适合用于进行备份和灾难恢复。

(2)生成RDB文件的时候,redis主进程会fork()一个子进程来处理所有保存工作,主进程不需要进行任何磁盘IO操作。

(3)RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。

劣势:

   RDB快照是一次全量备份,存储的是内存数据的二进制序列化形式,存储上非常紧凑。当进行快照持久化时,会开启一个子进程专门负责快照持久化,子进程会拥有父进程的内存数据,父进程修改内存子进程不会反应出来,所以在快照持久化期间修改的数据不会被保存,可能丢失数据。

适用场景:数据量大,但精度要求不高的情况下。

AOF持久化

aof持久化是为了解决rdb精度不高的情况下出现的,其持久化的方式是创建一个后台进程,将每次redis的数据修改命令记录到一个appendonly.aof文件中,然后在下次redis启动时会按序执行这个aof文件中记录的指令,从而恢复redis的数据。aof的优先级高于RDB,会优先加载aof文件。

关于aof的配置:

  1. appendonly no:默认关闭aof持久化,因为官方认为rdb已经够用了。
  2. appendfilename “appendonly.aof”:设置aof日志文件。
  3. appendfsync strategy:设置aof持久化策略,总共有三种策略,如下:
    • always:总是持久化,即每进行一次写指令操作,就将记录此次指令到文件中。速度最慢
    • everysec:每秒执行一次持久化操作,此值为默认值。慢于always
    • no:不进行持久化;最快
  4. no-appendfsync-on-rewrite no:防止在BGSAVE或BGREWRITEAOF正在运行时在主进程中调用fsync()(fsync函数同步内存中所有已修改的文件数据到储存设备。)。如果设置为yes,最坏的情况下会损失大约30秒的日志数据,建议设置为No。
  5. auto-aof-rewrite-percentage 100:设置aof文件重写率
  6. auto-aof-rewrite-min-size 64mb:设置aof最小多大时开始自动重写。
  7. aof-load-truncated yes:此配置的意思时aof文件可能被截断,即aof文件中可能出现错误日志,在出现错误日志的情况下,redis加载aof文件时,会产生命令执行错误,错误后是该继续启动redis服务器呢,还是中止服务器启动并发送错误信息呢?如果设置为yes,则继续启动服务器,如果是no,则返回错误信息,且拒绝开启服务器。
  8. aof-use-rdb-preamble yes:这个配置意思是,重写aof文件时,会给rdb前缀来完成快速的重写;其文件结构为(RDB文件)(AOF尾巴);恢复的时候,先加载rdb前缀,然后加载aof结尾,从而完成快速的恢复操作。默认为yes

优势:

(1)AOF可以更好的保护数据不丢失,一般AOF会每隔1秒,通过一个后台线程执行一次fsync操作,最多丢失1秒钟的数据。(2)AOF日志文件没有任何磁盘寻址的开销,写入性能非常高,文件不容易破损。

(3)AOF日志文件即使过大的时候,出现后台重写操作,也不会影响客户端的读写。

(4)AOF日志文件的命令通过非常可读的方式进行记录,这个特性非常适合做灾难性的误删除的紧急恢复。比如某人不小心用flushall命令清空了所有数据,只要这个时候后台rewrite还没有发生,那么就可以立即拷贝AOF文件,将最后一条flushall命令给删了,然后再将该AOF文件放回去,就可以通过恢复机制,自动恢复所有数据

缺点:

(1)aof文件过大,即数据恢复时间长

(2)服务器性能消耗增大

aof和rdb的对比

redis 缓存 - 图2

redis事务控制

redis对事务的支持是不完全的,即虽然有事务这个机制,但并没有完全的实现事务所拥有的性质。在redis中,事务就是将很多的操作语句放在一个容器中,然后在事务录制完后,执行这个容器中的所有操作。

事务操作指令:

mutil:开启事务指令

discard:放弃当前事务

exec:结束当前事务指令录入,并执行事务。

watch key[….]:监视一个key值,当监视的key值在事务操作期间改变,则此事务失效。原理就是CAS(check and set检查并设置),类似于乐观锁,或者说表级锁,给监视的K加一个版本控制,当两个客户端抢夺一个资源的时候,先修改的会升级版本,后修改的由于版本低于此时锁住数据的版本,会导致修改失败。

unwatch:让所有的watch失效,exec和discard也会使所有的watch失效。

注意点1:redis事务如果在录入语句时,语句发生编译错误,则此事务失效,放弃执行并报错;如果是语句正确,但是执行错误,则不会发生事务失效,而是将事务执行完毕。如下代码:

set k1 v1
set k2 v2 
set k3 v3
watch k1 k2 k3 #监视k1 k2 k3,在进行事务操作时,如果有别的客户端修改此三个k,则事务会立即失效,并寻找下一次机会填写事务。
mutil #开启事务
set k1 p 
get k1
setget k1 23r23r#此命令编译错误,会导致事务失效,即上述的set k1 p 和 get k1失效(事务失效)
incrby k1 1#此命令语法上正确,即编译通过,但是在执行时报错,因为k1的值是v1字符串,字符串不能自增。此命令不会导致事务失效。
discard # 放弃事务操作
unwatch #放弃监视所有的k
exec #执行事务

redis消息中间件

redis的消息中间件是通过发布-订阅模式实现的,即服务端将消息发布到特定的频道上,订阅此频道的客户端在服务端发布数据后,会自动拉去此频道的信息。这是基于进程之间的通信。

注意:没有人用redis做消息中间件,因为比他好的还有ActiveMQ、RabbitMQ、ZeroMQ和Kafka。

操作redis消息中间件的命令:

  1. Psubscribe pattern[…]:订阅一个或多个发布频道,支持通配符,即psubscribe key*:订阅所有key开头的频道。
  2. PUBLISH channel message:给指定频道发布消息
  3. SUBSCRIBE channel[…]:订阅指定channel,不支持通配符
  4. UNSUBSCRIBE channel[…]:取消订阅指定channel
  5. PUNSUBSCRIBE pattern[…]:通配方式取消订阅channel
  6. PUBSUB:查看订阅与发布ma4状态信息

redis的master/slave(主人/奴隶)

怎么用

master/slave意为主从,用计算机的行话就是主从复制,主只负责写的操作,而从只且只能负责读的操作,这就叫主从复制,出现这种情况主要是为了备灾而准备,他能干嘛?1、读写分离;2、容灾恢复

redis使用master/slave的方法有两种:

  1. 从机在redis客户端输入slaveof IP port 命令,来和主机取得联系。

    slaveof 127.0.0.1 6379 #表示和 127.0.0.1 6379取得联系,并设此端口的reids为主机。

  2. 直接在从机的配置文件种使用如下配置来开启主从复制:

    replicaof

怎么玩

一主两仆

假设,现在有三台机器,一主两仆,且都以按上面的命令或者配置文件部署好了,出现如下情况会发生什么情况;

  1. 在reids主机的运行期间,有从机链接主机,那么试问从机是否有完整的数据?部署如下所示: ```bash

    第一个主机

    redis-server configOfLocation redis-cli -p 6379

    开启客户端

    127.0.0.1:6379 >set k1 v1 127.0.0.1:6379 >set k2 v2

    就在这个时候,从机链接了主机


第二个机器

redis-server configOfLocation redis-cli -p 6380

设置127.0.0.1 6379为自己的主机

slaveof 127.0.0.1 6379

问?此时从机是否有主机的数据,即从机是否有k1 和 k2两个键值对呢? 答:有的,因为从机在配置的一瞬间,就会直接从主机上拉去所有的数据信息到从机上。 ```

  1. 在redis主从机运行期间,主机因为意外断掉了,试问从机还能正常运行吗?从机还是从机吗?从机能进行写的操作吗?
    答:从机仍然能正常运行,从机依旧是从机,从机不能进行写的操作。(在成为从机的那一颗,注定了它只能进行读操作,只能是奴隶。)
  2. 在上面2的情况下,如果主机又恢复链接了,试问从机还是给此主机服务吗?主机的数据还会发送到从机上吗?
    答:主机依旧是主机,主机的数据仍然会发送到从机上去。
  3. 主从机运行过程中,如果从机断掉了,会不会影响主机?主机的信息还会发送给从机吗?
    答:不影响主机的运行,都断掉了,不可能接受主机的信息了。奴隶就是奴隶,不可能影响主子的。
  4. 在上面4的情况下,如果主机又恢复链接了,试问从机会继续给主机服务吗?
    答:分两种情况,第一种是使用命令式的链接主机,自己成为从机,即输入 slaveof命令。在输入slaveof命令前,从机不在为主机服务,换句话说就是此时的从机是完全独立的,自己本身就是master。在输入命令后,从机就只能为主机服务了。第二种情况是,配置文件方式的成为从机,此种方式无论怎么重启和断掉,从机永远都是主机的slave。

薪火相传

在上面的一主两仆种,主机只链接了两个从机,所以说主机的管理难度不大,但是要是从机有上万个,那么主机的管理难度呢?同时,如果主机崩了,那么从机不就没得管了吗?换言之,就是一个奴隶主直接管不了一万个奴隶。

为了解决这个问题,奴隶主想了个办法,就是任命部分奴隶官职,让部分有权利的奴隶去管其他的奴隶,则奴隶主的管理难度不久下降了吗?

假令上面的主机名为m1,从机分别为s1和s2,让m1管理s1,让s1管理s2。这样,主机的负担就减轻了。

思路有了,操作怎么办?

具体操作:s2断开与主机的链接,然后s2再用slaveof ip port和s1取得主从联系就可以了。

操作完后,三台服务器的关系如下图所示:

redis 缓存 - 图3

反客为主

假设在薪火相传的情况下,主机彻底奔溃了,那么就需要从机翻身为主,成为主机。

具体操作:在从机S1中输入命令slaveof no one就可变从机S1为主机,此时的从机S1仍然挂载着从机S2,此时的S2就是S1的从机,S1就是S2的主机。

一个问题:假设我的S1翻身为主机了,如果这个时候主机又恢复运行了,试问S1是不是还在主机上挂载着?主机M1的修改会不会影响S1和S2;

答:一旦翻身为主,那么S1就不会再与主机M1有任何联系了, 主机的修改不会影响S1,主机只是单独的作为一个主机进行运行。

为啥嘞

master/slave复制的原理

从机在执行salve命令后,会向master发送一个sync的命令,master接到命令后,会将自己的数据修改操作提取出来打包成一个文件,然后将这个文件发送给slave,slave接到这个文件后进行加载解析,即slave得到了master的数据。

在master/slave中,有两种复制方法,分别如下:

  1. 全量复制,表示salve直接提取所有的master数据修改操作到本地,然后解析恢复数据。(每次slave断开重连都会启用此复制操作)
  2. 增量复制,表示salve已经和master取得联系了,master每进行一次修改操作,都会将此操纵同步给slave,让slave去执行。

复制延迟

由于master的每次数据修改操作都会发送给slave,这就导致slave如果在网络拥堵的情况下,不能及时接收到master的数据,即slave延迟加载获得master的传递信息。但问题是,如果网络不拥堵,就没有延迟加载了吗?即使网络不拥堵,但是现有的master操作,后有的master——slave信息传递,所以说无论怎样,都有延迟。

哨兵模式sentinel

上述的主从关系都是依靠命令来解决的,假设在凌晨两点35分24秒,主机管理,又没有人上班,从机又不能完成写的操作,这就导致master/slave会整体瘫痪。为了解决这个问题,出现了一个哨兵模式,即设置一个哨兵用来监视master,如果master挂了,哨兵会发送信息给reids系统,redis调用一些命令操作来解决这个master挂了的问题。

具体怎么解决的呢?系统会在此主机上的slave中选一个作为master,并用此master管理其它的salve。如何选取呢?投票解决,系统会在所有的slave中实行投票机制,谁的票数高谁当主机。

具体实现

在redis.conf的同目录下新建一个sentinel.conf文件,此文件的内容如下:

sentinel monitor

哨兵可以创建多个

例如:sentinel monitor lm 127.0.0.1 6379 1 # 表示创建一个哨兵lm,用来监视127.0.0.1 6379master,后面的1表示投 # 票,谁的票数多,谁当master

启用哨兵

在redis服务器启动后,可以使用redis-sentinel sentinel.conf-of-location(sentinel.conf文件的位置)命令来启动哨兵。

启用哨兵后,有一个问题,如果master断了,在此master原来的slave中选取了一个master来管理剩下的slave,那么如果在管理的过程中,原来的master又恢复重连了,new master和old master到底谁才是老大?不是老大的那个该何去何从?

答:new master 是老大,old master会成为new master 的小弟slave。