66.9-Redis主从复制、高可用和3.0集群

决心做好你自己,要知道,只有发现自我价值的人,才不会苦恼 !


总结:

  1. redis持久化是有缺陷的,

Redis集群

Redis集群分为:
主从复制Replication
高可用 Sentinel(必用) 怎么都能用:3台
集群Cluster

1. 主从复制

典型的主从模型,主Redis服务称为Master,从Redis服务称为Slave。一主可以多从。

Master会一直将自己的数据更新同步到Slave,以保持主从同步。
只有Master可以执行读写操作,Slave只能执行读操作。客户端可以连接到任一Slave执行读操作,来降低Master的读取压力。

创建主从复制

1. 命令创建(主  从)
redis-server --slaveof <master-ip> <master-port>
配置当前服务称为某Redis服务的Slave
redis-server --port 6380 --slaveof 127.0.0.1 6379

2. 指令创建
SLAVEOF host port命令,将当前服务器状态从Master修改为别的服务器的Slave 
redis > SLAVEOF 192.168.1.1 6379,将服务器转换为Slave 
redis > SLAVEOF NO ONE ,将服务器重新恢复到Master,不会丢弃已同步数据

3. 配置方式
启动时,服务器读取配置文件,并自动成为指定服务器的从服务器
slaveof <masterip> <masterport>
slaveof 127.0.0.1 6379

主从实验
Master 192.168.140.135 6379
Slave 192.168.140.140 6379

# redis-cli -h 192.168.142.140 -p 6379
slave> SET testkey abc
slave> KEYS *
slave> SLAVEOF 192.168.142.135 6379
slave> KEYS *   看看是否发生改变
slave> set slavekey 123
(error) READONLY You can't write against a read only slave.
master> SET masterkey 123
slave> GET masterkey
slave> SLAVEOF NO ONE     解除从
slave> KEYS *
slave> SET slavekey1 abc  可写了
slave> KEYS *

采用上面的多种方式都可以实现主从模式,一般来说,主从服务器都是固定的,采用配置文件方式。

主从复制问题
一个Master可以有多个Slaves。
如果Slave下线,只是读请求的处理能力下降。
但Master下线,写请求无法执行。
当Master下线,其中一台Slave使用SLAVEOF no one命令成为Master,其它Slaves执行SLAVEOF命令指向这个新的Master,从它这里同步数据。

这个主从转移的过程手动的,如果要实现自动故障转移,这就需要Sentinel哨兵,实现故障转移Failover操作

2. 高可用Sentinel

Redis官方的高可用方案,可以用它管理多个Redis服务实例。
Redis Sentinel是一个分布式系统,可以在一个架构中运行多个Sentinel进程

使用编译时产生的redis-sentinel文件,在新的版本中,它就是redis-server的软链接。

Sentinel启动启动一个运行在Sentinel模式下的Redis服务实例
redis-sentinel /path/to/sentinel.conf
redis-server /path/to/sentinel.conf --sentinel
推荐使用第一种

[root@Centos7 dell]# cd /magedu/redis/bin/
[root@Centos7 bin]# ll
total 15080
-rwxr-xr-x. 1 root root 2433432 Aug 13 17:07 redis-benchmark
-rwxr-xr-x. 1 root root   24992 Aug 13 17:07 redis-check-aof
-rwxr-xr-x. 1 root root 5191752 Aug 13 17:07 redis-check-rdb
-rwxr-xr-x. 1 root root 2586480 Aug 13 17:07 redis-cli
lrwxrwxrwx. 1 root root      12 Aug 13 17:07 redis-sentinel -> redis-server
-rwxr-xr-x. 1 root root 5191752 Aug 13 17:07 redis-server

Sentinel会监控Master、Slave是否正常,可以监控多个Master、Slave。

Sentinel网络:监控同一个Master的Sentinel会自动连接,组成分布式的Sentinel网络,相互通信并交换监控信息

服务器下线
当一个sentinel认为被监视的服务器已经下线时,它会向网络中的其他Sentinel进行确认,判断该服务器是否真的已经下线

如果下线的服务器为主服务器,那么sentinel网络将对下线主服务器进行自动故障转移,通过将下线主服务器的某个从服务器提升为新的主服务器,并让其从服务器转为复制新的主服务器,以此来让系统重新回到上线的状态

如果原来的主服务器恢复,只能成为一台Slave服务器。

主观下线sdown:单个Sentinel认为服务器下线
客观下线odown:多个Sentinel通信后做出了服务器下线的判断

当server1的下线时长超过用户设定的下线时长上限时,Sentinel系统就会对server1执行故障转移操作:

  • 首先,Sentinel系统会挑选server1属下的其中一个从服务器,并将这个被选中的从服务器升级为新的主服务器。
  • 之后,Sentinel系统会向server1属下的所有从服务器发送新的复制指令,让它们成为新的主服务器的从服务器,当所有从服务器都开始复制新的主服务器时,故障转移操作执行完毕。
  • 另外,Sentinel还会继续监视已下线的server1,并在它重新上线时,将它设置为新的主服务器的从服务器。
配置

至少包含一个监控配置选项,用于指定被监控Master的相关信息

Sentinel monitor<name><ip><port><quorum> ,例如 sentinel monitor mymaster 127.0.0.1 6379 2   

监视mymaster的主服务器,服务器ip和端口,将这个主服务器判断为下线失效至少需要2个Sentinel同意,如果多数Sentinel同意才会执行故障转移
Sentinel会根据Master的配置自动发现Master的Slaves

sentinel down-after-milliseconds mymaster 60000
认为服务器下线的毫秒数。Sentinel在指定的毫秒数内没有返回给Sentinel的Ping回复,视为主管下线Sdown。

sentinel failover-timeout mymaster 180000
若sentinel在该配置值内未能完成failover操作(即故障时主从自动切换),则认为本次failover失败

sentinel parallel-syncs mymaster 1
在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步。1表示只能有1台从服务器从新主服务器同步数据,以便其他从服务器继续提供客户端服务的响应。

port 26379
Sentinel默认端口号为26379

Sentinel实验

Master 192.168.140.135 6379
Slave 192.168.140.140 6379

先启动主从2个Redis服务
提供Sentinel配置文件

sentinel1.conf文件内容如下
port 26379 
Sentinel monitor s1 192.168.142.135 6379 1    # 1台下线;
sentinel down-after-milliseconds s1 6000 
sentinel failover-timeout s1 10000 
sentinel parallel-syncs s1 1 

启动Sentinel
redis-sentinel sentinel1.conf
在从服务器的配置中增加 slaveof 192.168.142.135 6379 ,并重启该服务

模拟Master下线
主观下线有一个超时时间 ;

# ps aux | grep redis-server 
root       4588  0.1  0.9  38736  9752 ?        Ssl  14:44   0:34 /magedu/redis/bin/redis-server 
192.168.142.135:6379 
root       4754  0.0  0.0 103244   852 pts/2    S+   20:23   0:00 grep redis-server 
# kill -9 4588 
Master下线后,开始投票,决议通过后,提升从为新主
Master再次上线

原来的主上线后,被迫转换为从。

3. Redis Cluster

从3.0开始,Redis支持分布式集群
Redis集群采用无中心节点设计,每一个Redis节点间互相通信。
客户端可以连接任意一个集群的节点。

Redis集群节点复制

Redis集群的每个节点都有两种角色可选:主节点master node、从节点slave node。其中主节点用于存储数据,而从节点则是某个主节点的复制品

当用户需要处理更多读请求的时候,添加从节点可以扩展系统的读性能,因为Redis集群重用了单机Redis复制特性的代码,所以集群的复制行为和我们之前介绍的单机复制特性的行为是完全一样的


Redis集群故障转移

Redis集群的主节点内置了类似Redis Sentinel的节点故障检测和自动故障转移功能,当集群中的某个主节点下线时,集群中的其他在线主节点会注意到这一点,并对已下线的主节点进行故障转移

集群进行故障转移的方法和Redis Sentinel进行故障转移的方法基本一样,不同的是,在集群里面,故障转移是由集群中其他在线的主节点负责进行的,所以集群不必另外使用Redis Sentinel

Redis集群分片

集群将整个数据库分为16384个槽位slot,所有key都数据这些slot中的一个,key的槽位计算公式为slot_number=crc16(key)%16384,其中crc16为16位的循环冗余校验和函数
集群中的每个主节点都可以处理0个至16383个槽的访问请求,当16384个槽都有某个节点在负责处理时,集群进入上线状态,并开始处理客户端发送的数据命令请求

举例
三个主节点7000、7001、7002平均分配16384个slot槽位
节点7000指派的槽位为0到5460
节点7001指派的槽位为5461到10922
节点7002指派的槽位为10923到16383

Redis集群Redirect转向

由于Redis集群无中心节点,请求会发给任意主节点
主节点只会处理自己负责槽位的命令请求,其它槽位的命令请求,该主节点会返回客户端一个转向错误
客户端根据错误中包含的地址和端口,重新向正确的负责的主节点发起命令请求

Redis集群总结

Redis集群是一个由多个节点组成的分布式服务集群,它具有复制、高可用和分片特性
Redis的集群没有中心节点,并且带有复制和故障转移特性,这可用避免单个节点成为性能瓶颈,或者因为某个节点下线而导致整个集群下线

集群中的主节点负责处理槽(储存数据),而从节点则是主节点的复制品
Redis集群将整个数据库分为16384个槽,数据库中的每个键都属于16384个槽中的其中一个
集群中的每个主节点都可以管理槽,当16384个槽都有节点在负责时,集群进入上线状态,可以执行客户端发送的数据命令

主节点只会执行和自己负责的槽有关的命令,当节点接收到不属于自己处理的槽的命令时,它将会处理指定槽的节点的地址返回给客户端,而客户端会向正确的节点重新发送

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345