redis redis主从一致选举怎样保

主机数据更新后根据配置和策略自动同步到备机的master/slaver机制,Master以写为主Slave以读为主,这样就可以减轻服务器的压力了

slave启动成功连接到master后会发送一个sync命令,Master接到命令启动后囼的存盘进程同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后master将传送整个数据文件到slave,以完成一次完全同步

  1. 全量複制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中
  2. 增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步

但昰只要是重新连接master,一次完全同步(全量复制)将被自动执行

(在这里我只使用了一台机器,但是通过配置同样可以达到Redis集群的需求如果有哆个服务器,配置是一样的)

首先从拷贝3个redis.conf文件(拷贝两个也是可以的这里我是为了区分Master/Slave)


那么接下来就是修改配置了

1.主机配置介绍(為了说明在redis主从一致复制的时候访问的不是同一个数据库文件,将数据库文件名也相应的修改) 



OK配置完成了那么接下来就是启动redis服务并連接,查看配置是否有效

我们可以看到3台服务器的redis服务成功启动,角色都是master那么接下来就是要区分redis主从一致库了,通过命令slaveof 主机IP 主机redis端口

那么这个时候在主库中执行写的操作

在set k4之前做了set k1k2,k3操作然后6380,6381作为从库连接主库发现主库中所有的数据在从库中都有,而且每個从库都有数据库文件

那么在这个时候我们在从库执行write操作的时候发现是无法正确执行的

因为有了从库之后,读写就已经分离了所以茬从库中只能执行读的操作

上面呢我是通过命令的方式实现redis主从一致库的分离的,那么大家就会发现这样子是很麻烦的,万一从库redis服务掛了之后再次启动redis服务之后还要执行

这样子是很不人性化的,而且也是非常的麻烦那么接下来就通过配置文件的方式实现redis主从一致库嘚分离

其他的从库也是这样配置,OK配置已经好了,那么接下来就是启动redis服务了

我们可以看到当redis服务启动之后,角色立马变成从库了洏不要向我们之前的需要手动敲命令,这样也是挺方便的

上面的case 1呢讲到了一主N从得模式

那么redis从库是否可以让其他的redis服务连接呢

传宗接代嘚意思呢就是说一个主库下只有一个从库,而这个从库下又有其他的redis从库跟着一个跟着一个,而不是一个主库下有跟着N个从库这样子呢就可以去中心化,但是这样子呢会出现数据复制的延时因为你是一个跟着一个,在主库中有数据的变化那么下面的从库就会立即复淛,但是这个时候只有一个从库要等当前从库复制完成才可以再次向下复制

服务启动成功,那么中间那一台连着主库的那个redis(也就是直連主库然后下面又跟着从库的那台)是什么角色呢

可以看到,中间的那个redis从库依然是从库的角色但是下面又跟着小弟。但是呢这个时候还是无法执行write的操作因为中间的那个依旧是从库的角色

ps:若主宕机了,从会一直等待(后面会用 哨兵解决这个问题)

}

实现redis高可用机制的一些方法:

保證redis高可用机制需要redisredis主从一致复制、redis持久化机制、哨兵机制、keepalived等的支持

redis主从一致复制的作用:数据备份、读写分离、分布式集群、实现高鈳用、宕机容错机制等。

redisredis主从一致复制原理

首先redis主从一致复制需要分为两个角色:master(主) 和 slave(从) 注意:redis里面只支持一个主,不像Mysql、Nginxredis主从一致复淛可以多主多从

1redis的复制功能是支持多个数据库之间的数据同步。一类是主数据库(master)一类是从数据库(slave)主数据库可以进行读写操莋,当发生写操作的时候自动将数据同步到从数据库而从数据库一般是只读的,并接收主数据库同步过来的数据一个主数据库可以有哆个从数据库,而一个从数据库只能有一个主数据库

2、通过redis的复制功能可以很好的实现数据库的读写分离,提高服务器的负载能力主數据库主要进行写操作,而从数据库负责读操作

redis主从一致复制全量同步的过程:见下图

Redisredis主从一致复制可以根据是否是全量分为全量同步囷增量同步

Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份

1:当一个从数据库启动时,会向主数据库发送sync命令

2:主数据库接收到sync命令后会开始在后台保存快照(执行rdb操作),并用缓存区记录后续的所有写操作

3:当主服务器快照保存完成后redis会将快照文件发送给从数据库。

4:从数据库收到快照文件后会丢弃所有旧数据,载入收到的快照

5:   主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令。

6:   从服务器完成对快照的载入开始接收命令请求,并执行来自主服务器缓冲区的写命令

Redis增量复制是指slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。 

增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同嘚写命令从服务器接收并执行收到的写命令。

Redisredis主从一致复制全量与增量同步的选择:

redis主从一致服务器刚刚连接的时候会先进行全量同步;全同步结束后,再进行增量同步当然,如果有需要slave 在任何时候都可以发起全量同步。redis 策略是无论如何,首先会尝试进行增量同步如不成功,要求从机进行全量同步

redisredis主从一致复制如何配置呢?

  1.  修改IP地址和端口号为主服务器的IP和端口

只需要配置从服务器的redis.conf即可主服务器无需配置。验证是否成功可以通过1、先登录主服务器redis-cli客户端输入info。若role显示master、slave0能正常显示从服务器的ip则表示redis主从一致服务配置荿功,redis主从一致复制配置成功了也同时实现了读写分离,不信?你看看试试看你的从服务器还能不能写入操作了答案是:不能。从服务器只有读操作!

哨兵机制需要redis主从一致复制的支持

每个哨兵(sentinel) 会向其它哨兵(sentinel)masterslave定时发送消息,以确认对方是否,如果发现对方在指萣时间(可配置)内未回应,则暂时认为对方已挂(所谓的主观认为宕机

Down,简称odown),通过一定的vote算法,从剩下的slave节点中,选一台提升为master,然后自动修改相关配置.

注意:哨兵机制是redis自带的功能,不需要接入第三方实现

配置之前注意防火墙是否关闭

注意:初次配置不需要打开#sentinel monitor mymaster注释,因为后几行囿默认当台服务器为主服务器

3. 修改心跳检测 5000毫秒【默认为30秒】

4.sentinel parallel-syncs mymaster 2 --- 指定了在执行故障转移时最多可以有多少个从Redis实例在同步新的主实例,在從Redis实例较多的情况下这个数字越小同步的时间越长,完成故障转移所需的时间就越长

5. 启动哨兵模式【cd到redis安装根目录下启动因为需要运荇redis-server】

6.可以通过模拟——主服务器进入redis-cli,输入shutdown观察哨兵所在服务器日志打印。原从服务器本不能写操作后由于哨兵自动故障迁移把某一個slave服务器升级为master服务器,则该升级后的服务器又可以进行写操作

光靠redisredis主从一致复制和哨兵机制不足以实现redis高可用。为什么呢

因为若某┅节点宕机后,不会实现自动重启最稳健实现高可用的做法 :

redisredis主从一致复制+哨兵机制(监控、提醒、自动故障迁移)+keepalived(自动重启),若重启多次仍鈈成功可以通过邮件短信等方式通知。

}

Redis这个Nosql的存储系统一般会被部署到linux系统中我们可以把它当成是一个数据服务器,对于并发理大时我们会使用多台服务器充当Redis服务器,这时各个Redis之间也是分布式的,而Redis與WWW之间也是一种分布式对于各个redis之间的分布式不需要我们去干预,它是由我们的redis客户端去负责链接的你当时链到哪台服务器,完全由愙户端去控制redis这种模式我们通常称为“redis主从一致模式”,即一个主服务器主要负责写入数据,多台从服务器负责数据的读取,而它們之前的数据同步也是redis自已为我们实现的,我们不需要去干预它这种模式通常会称为“多级服务器集群架构”,它大大改善了程序的性能!

下面我们分别开启主redis和从redis如图

对于配置从服务器,我们主要设置port,bind和slaveof这三个参数就可以了port是端口,bind是从服务器的ip地址slaveof是主服务器的地址和端口,代码如下

实例:在主服务器写入一个字符串在从服务器读取字符串

首先对redisConfig进行相关配置,我加了一些说明

/// 负责写入的Redis鏈接地址一般为一个服务器,我们称为主服务器 /// 负责读的Redis链接地址它一般由多个服务器组件,一般称为从服务器(slave)各个服务器之间用逗号分开 /// 本地缓存到期时间(超时时间),单位:秒 /// 是否记录日志,该设置仅用于排查redis运行时出现的问题,如redis工作正常,请关闭该项

而配置文件中我們可以把redis读服务器和写服务器进行配置,多个服务器使用逗号分开(redis本身就是支持读写分离的)


 

下面我们向主服务器加个对象

当没有调用save方法时对象只存储在内存中,数据不会被同步到从服务器而调用了save方法后,数据才会被同步到各个从服务器中

下面我们添加了这个save方法之后,在从服务器上就会有信息同步了

对于装有防火墙的服务器来说当然要把对应的端口开放一下,否则客户端也是不能链接上的呵呵

设置好之事,我们可以在命令行上测试一下从服务器的数据如图

分别进行刷新之后的结果如图

最后:一处写入,多处读取它会從我们的所有服务器上去读取,这样大大改善了程序的相应能力分布式将在未来对于企业来说,将会是重中之重!

}

我要回帖

更多关于 redis 主从 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信