行话:也就是咱们所说的主从复制,主机数据更新后根据配置和策略,redis
自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主数据库
(1)读写分离服务器
(2)容灾恢复学习
知识注意:测试
(1)配从(库)不配主(库)3d
(2)从库配置:slaveof 主库IP 主库端口日志
(3)info replication查看当前redis节点信息(是主仍是从等等)server
开始配置:blog
这里作演示是装在一台机器上,方便学习(生产环境是装在不一样机器上的)进程
咱们这里并不安装三个redis,而是已copy三个配置文件来区分。
分别是:redis6379.conf,redis6380.conf,redis6381.conf
修改配置文件内容:(这里的修改都是为了区分不一样机器,6379就是端口号)
daemonize yes:开启后台启动
pid /var/run/redis6379.pidpid文件以端口号来区分
P ort 6379指定端口
logfile "redis6379.log"指定log文件名字
dbfilename dump6379.rdb这里使用的是rdb持久化方式,那么就修改rdb快照文件名
(每一个配置文件都须要修改)
修改好配置文件后,分别启动三个redis进程:
../bin/redis-server redis6379.conf
../bin/redis-server redis6380.conf
../bin/redis-server redis6381.conf
查看是否启动成功:
能够看到redis三个进程分别在6380,6381,6379三个端口号启动了。
分别链接这三个redis进程,查看当前redis状态:
6379端口:
6380端口:
6381端口:
如今能够看到,三个redis进程状态都是master,都没有slave。
开始主从复制配置:
一个master,两个slave。
定义:6379当master,6380和6381都为slave
能够看到咱们只是注意的地方:配从(库)不配主(库)
好的,分别在6380和6381上的redis去关联6379的redis:
slaveof 127.0.0.1 6379
(注意:咱们这里是以命令方式去关联主的,当前redis关闭即失效。若是想要从新启动还能关联主,那么须要再配置文件中配置。)
而后咱们再查看6380和6381端口redis的状态:
能够看到两台主机都已经改为slave了,并且还标识出master的信息。
若是已经出现以上图片显示,那么表明1主2从配置成功了。
(1)slave一、slave2是从头开始复制仍是从切入点开始复制?当前主机器上已经有了k1 k2 k3了,从机器才关联过来,那么在从机器上能拿到k1 k2 k3吗?
测试:
主服务器先写key
从服务再去关联主服务器,去拿key
答案是能够的!!!分析一下,应该是从机器关联主机器时,会将主机器全部key都copy一份给从机器
(2)从机是否能够写?set能否?主服务器是否能够读呢?get能否
测试:
在从机上写:redis会提示你只是一个从机,是只能读不能写。
在主机上读:能够读,主机可读可写
(3)主机shutdown后状况如何?从机是上位仍是原地待命
测试:
主机shutdown:
查看从机状态:
能够看到,从机状态仍是没有改变,从机是在原地待命
(4)主机又回来了后,主机新增记录,从机还可否顺利复制?
测试:
重新启动主机,写入一个k5
在从机上获取k5:
从机上获取k5成功。
得出结论:
主机回来后而且新增记录,从机能顺利复制主机上的数据。
(5)其中一台从机down后状况如何?依照原有它能跟上大部队吗?
测试:
关闭从机,从新启动从机。
主机写入k6,从机上获取k6,会发现是不行的。
为何呢?安装的时候已经说了:
(注意:咱们这里是以命令方式去关联主的,当前redis关闭即失效。若是想要从新启动还能关联主,那么须要再配置文件中配置。)
若是不相信能够去看下当前从机的状态,它已经变成master了。
这里就不贴截图了。
什么是薪火相传?
上一个slave能够是下一个slave的master,slave一样能够接收其余
slaves的链接和同步请求,那么该slave做为了链条中下一个的master,
能够有效减轻master的写压力。
注意:
中途变动转向:会清除以前的数据,从新创建拷贝最新的
设置薪火相传
slaveof 新主库IP 新主库端口
我这里仍是拿以前配好的6379,6380,6381来作案例。
主机:6379
从机:6380,6381
将6381指向6380,。6380仍是指向6379(不变)。
6381端口redis信息:
6380端口redis信息:
能够看到6380端口的redis仍是slave,可是它底下有一个slave,正是6381,好的如今咱们已经配置成功了。
测试一下:在6379下修改个值,6380上必定是能够取到的,看看6381上能不能取到
ok,6381上也是能够拿到值的,那么薪火相传成功!!!!
什么是反客为主?
当主机中宕机了,那么咱们能够手动的中止从机与主机的同步,将从机转成主机。再将其余的从机与当前这台主机同步数据,另成一个体系。
命令介绍:
slaveof no one使当前数据库中止与其余数据库的同步,转成主数据库。
反客为主案例:
假如如今主机挂掉了:这里是人为手动关闭,模拟挂掉
查看从机状态:
这里能够发现master的状态是down,那么如今将80端口redis设置为主机,81端口redis作80端口的从机:
slaveof no one使当前数据库中止与其余数据库的同步,转成主数据库。
Info replication查看当前redis的一个信息,能够发现当前已是master了
再将81关联到80上,再查看当前81上的信息,就能够看到关联的master是80的redis了。
slaveof 127.0.0.1 6380
测试主从复制是否成功:
测试成功!!在80上写数据,在81上能够读取到。
全量复制:
slave启动成功链接到master后会发送一个sync命令
master接到命令启动后台的存盘进程,同时收集全部接收到的用于修改数据集命令,
在后台进程执行完毕以后,master将传送整个数据文件到slave,以完成一次彻底同步
而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
增量复制:
master继续将新的全部收集到的修改命令依次传给slave,完成同步。
注意:
(可是只要是从新链接master,回自动执行一次彻底同步(全量复制))
反客为主的自动版,可以后台监控主机是否故障,若是故障了根据投票数自动将从库转换为主库。
咱们仍是使用6379,6380,6381机器来演示。
(先调回1主2从状况,这里就不演示了。)
主机:6379
从机:6380,6381
(1)在/usr/local/redis/conf下建立一个名为sentinel.conf的文件,并写入内容
sentinel monitor 被监控数据库名字(本身起一个名字) 127.0.0.1 6379 1
上面最后一个数字1,表示主机挂掉后salve投票看让谁接替成为主机,得票数多的redis成为主机
注意:这里要监控的是主机
(2)启动哨兵
这是个人目录:
bin下面就是redis的一些启动脚本。
config下是我copy出来的redis配置文件和刚刚建立的sentinel.conf
到config目录下执行命令启动哨兵:
../bin/redis-sentinel sentinel.conf
(注意:这里的命令根据不一样的redis安装目录也是会不相同的。)
好的,若是看到以上打印出得图就是启动成功。能够看到已经在监控6379了,并且还找到了6379的从机器6380和6381。
(1)原有的master挂了,会怎么样?
好的,咱们测试一下,咱们手动让6379挂掉,看下哨兵会怎么处理。
模拟6379宕机:(手动让6379宕掉)
稍等一会,看到哨兵日志:
这里已经检测到6379主机宕机,那么就会投票选出一个主机,这里能够看到的是选出的主机是6380。
咱们去看下6380和6381的信息
6380:
6381:
以上截图已经能够看到,6380已经成了主机,并且6381已经改变了关联的主机,改为选举出来的6380了。
总结出:若是主机挂掉了,那么会在从机上投票选举出主机,而且修改剩余的从机关联到新的主机中。
(2)若是以前的master重启回来,会不会双master冲突?
测试开始:
从新启动6379端口的redis,查看它的信息,看一看是什么状况:
能够看到6379变成了slave,主机是6380。
并且启动6379时,哨兵打印出了一条日志:
意思:将从机6379关联到6380上。
总结:以前的master从新启动后,并不会冲突,会以从机的身份来关联主机。
注意:一组sentinel能同时监控多个Master
复制的延迟:
因为全部的写操做都是先在master上操做,而后同步更新到slave上,因此从master同步到slave机器有必定的延迟,当系统很繁忙的时候,延迟问题会更加严重,slave机器数量的增长也会使这个问题更加严重。
好的。到了这里主从复制和哨兵模式完成!!!