Redis的高可用的原理及搭建

主从复制

redis通过一主多从的形式,将数据备份到各个从节点上,当主节点master宕机或者故障时,通过哨兵模式从slave节点中选择一个顶替master继续工作,避免了数据丢失,实现了redis的高可用,主从复制使得redis具备了较高的可扩展性和容错性的特点

image.png
作用

1、读写分离,分担redis读的压力:主从复制中master端主要负责写的操作,写入客户端输入的数据,同时将写入的数据同步到slave节点上,而slave节点主要负责读操作,master将读的流量分流到各个从节点上执行读操作,利用负载均衡的原理实现了redis分担读压力的效果
2、避免单点故障:避免单机故障后数据的丢失,通过哨兵模式从从节点中选出新的主节点
3、数据备份:将数据备份到各个从节点上,实现了数据备份

主从复制的策略

主从复制的方式使用的是RDB,复制的策略有以下两种

1、全量复制:

从节点初始化时,master通过bgsave的方式进行一次全量的复制操作形成一个RDB文件同时开启一个复制缓冲区记录从此时开始的所有写命令(如果从节点花费时间过长,将导致缓冲区溢出,最后全量同步失败),master将RDB文件和缓冲区数据传输到slave节点上,slave节点先清空节点上的数据然后再进行数据加载,在此之后redis会进行增量同步的模式,如果期间尝试增量失败的时候,还会再进行全量的复制

2、增量复制

master节点每执行一个写命令都会向slave节点发送相同的命令,slave节点接收并执行master的写命令

主从复制的搭建演示

由于条件有限,只能在一个节点上的演示主从复制,不多BB开干就完事了

进入redis的安装目录拷贝一个redis.conf并改名

image.png

先配置master节点,master节点的配置文件是redis.conf,编辑这个文件
开启守护进程,修改pid,日志文件名称,rdb文件名称,工作目录

image.png
image.png
image.png
image.png

接下来是slave节点的配置
为了方便,还是从刚刚修改过的redis.conf的基础上修改配置,

image.png

编辑redis6380.conf文件
修改端口、日志文件名称、rdb文件名称,主节点地址

image.png
image.png
image.png
image.png

启动6379 master节点,启动后查看6379端口redis是否启动成功

image.png

进入命令执行客户端,执行info查看6379的状态,我们看到这是个主节点

image.png
image.png

然后启动slave节点,启动后查看6380端口redis是否启动成功


image.png

进入命令执行客户端,执行info查看6380的状态,我们看到这是个主节点

image.png

我们看到这是个slave节点,并且master节点的ip端口是本机的6379,并且连接状态是up表示主从连接得通

image.png

到处我们的主从配置是完成了,我们去看看怎么玩这个主从复制

我们看看master和slave的数据全是空的


image.png
image.png

那我们给 master节点添加一些数据

image.png

我们看看slave节点会不会有相同的同步数据,结果是数据是同步过来了

image.png

我们在slave上添加数据会报错,证明了redis的从节点默认只能是有读操作


我们进入工作目录中可以看到生成的相应的log和rdb文件

我们看看这个6380.log的日志文件内容

image.png

从这个一段日志中我们可以看到了slave节点初始的过程,先是进行full resync全量的复制,然后flushing old data清理旧数据,loading db in memory加载数据 然后完成

如果redis的master节点挂了,如果没有一些监控切换master的脚本的程序的话我们就得需要手动去发现和切换master,而redis sentinel就是为了解决这种问题而生产的。

redis sentinel:哨兵模式

sentinel是redis高可用的实现方案。sentinel是一个redis的独立进程,这个进程并不是用来存储数据,而是用来监控redis的各个主从节点并进行故障转移,sentinel本身也存在着单点故障的问题,所以sentinel也是有多个节点的,节点之间能相互监控和通信,当sentinel有发现redis宕机了,sentinel将会对master进行下线,从slave节点中选出一个master顶替

工作步骤:

一、监控任务:

1、10秒任务:每个sentinel会对master和slave每10秒发送info命令收集redis主从节点运行信息,以确定redis的主从关系

image.png

2、2秒任务:每个sentinel每两秒会通过发布订阅的方式在master内部名叫sentinel:hello的频道发布消息,sentinel们在这个频道发布自身的信息和自己的意见同时也获取其他sentinel的信息和意见,这个频道是sentinel信息交换的平台,其中节点故障判断、sentinel领导选举都是在这里进行,并且每个新加入的sentinel都会去订阅这个频道以获取其他sentinel的信息

image.png

3、1秒任务:每个sentinel会对其他的sentinel和每个redis节点进行ping,实际上就是一个心跳检测,同时也是sentinel主观下线的依据

image.png

二、主观下线和客观下线:

配置:
sentinel monitor mymaster 192.168.200.128 6379 2
sentinel down-after-milliseconds mymaster 3000
1、主观下线:在每个sentinel每秒对master进行ping操作,如果在设置时间内没有回应则被当前的sentinel认为是有问题的master,这只是某个sentinel对master的个人观点,称为主观下线。例如我们使用上面的配置,设定了3000毫秒内没有回应则认为此master故障了
2、客观下线:当其他的sentinel也认为这个master有问题,并且超过设定的数量法定人数则会进行客观下线。例如我们使用上面的配置,当到达两个sentinel都认为master有问题时,就会达成客观下线。这里法定人数的配置最后使用:法定人数=sentinel节点数量/2+1(sentinel节点的数量最好配置成奇数)

三、领导者选举:

当sentinel们达成了客观下线后就会进行投票,选举出一个领导者对master进行故障转移。当某个sentinel拿到了超过了半数的投票,将会成为领导者,如果有两个sentinel拿到了同样的票数都成为了领导者,将会进行重选

image.png
四、故障转移:

在选举出领导者的sentinel节点后,这个sentinel将会从slave中选择一个合适的master节点,怎么才叫做合适呢主要有以下几点:
1、 选择slave-priority最高的slave节点(默认是相同)
2、选择复制偏移量最大的节点。
3、如果以上两个条件都不满足,选runId最小的(启动最早的)。
选出master节点后,sentinel会向剩余的slave节点发送命令让slave节点去复制这个新master,然后在通知客户端,master节点的改变,让客户端去连接新的master节点

sentinel搭建演示

(由于条件有限,搭建的sentinel和redis主从节点都是在同一台机器上)
我们看看这个配置的解释,这是我从网上找来的解释的挺好的

port 26379 #端口
daemonize yes #守护进程
#pid
pidfile /var/run/redis-sentinel26379.pid 
#工作目录
dir /usr/local/redis-5.0.0/data 
#日志文件
logfile "26379.log" 
 #sentinel主节点的名称
#mymaster 主节点 127.0.0.1 6379,2个sentinel检测到主节点有问题就进行故障转移
sentinel monitor mymaster 127.0.0.1 6379 2 
#30秒ping不同就认为主节点有问题
sentinel down-after-milliseconds mymaster 30000 
 #老的slave或者新的master进行复制,最多可以有多少个slave同时对新的master进行 同步,推荐1
sentinel parallel-syncs mymaster 1
 #故障转移时间
sentinel failover-timeout mymaster 180000

搭建基于我们已经搭建好的redis主从复制,master节点的端口是6379,slave的节点是6380和6381,创建两个文件夹 sentinel-data和sentinel-conf

image.png

进redis的解压目录拷贝一个sentinel.conf 到redis的安装目录的sentinel-conf目录中

image.png

进入sentinel-conf目录中,拷贝并并改名sentinel.conf 分别为sentinel26379.conf sentinel26380.conf sentinel26381.conf

image.png

修改编辑各个sentinel的配置文件,以sentinel26379.conf为例,根据你的ip和端口把上面的配置配进去:

image.png
image.png
image.png

其他的sentinel的配置就按照这样修改一下端口号和日志名称即可
然后分别启动sentinel,并查看sentinel是否启动成功

image.png

这样我们的sentinel算是安装成功,我们进入命令客户端看看sentinel的信息
sentinel 26379的发现了master的节点地址和数量,slave的数量和sentinel的数量

image.png

就此我们的redis高可用搭建就算完成了

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