redis主从复制配置原理redis
经过过持久化功能,Redis保证了即便在服务器重启状况下也不会损失数据,但因为数据存储在一台服务器上,服务器的硬盘出现故障也会致使数据丢失。为了不单点故障,但愿将数据库复制多个副本以部署在不一样的服务器上,即便有一台服务器出现故障其余服务器依然能够继续提升服务。要求当一台服务器上的数据更新后能够自动将更新的数据同步到其余区服务器上,Redis提升了复制功能能够自动实现同步过程。
同步数据库分为两类: 一类是主数据库,一类是从数据库。主数据库能够进行读写操做,当发生写操做时自动将数据同步给从数据库。而从数据库通常只是只读的,并接受主数据库同步过来的数据。一个主数据库能够拥有多个从数据库,而一个从数据库只能拥有一个主数据库。
在redis中使用复制功能很简单,只须要在从数据库的配置文件中加入:
slaveof 主数据库的IP 主数据库端口
主数据库中的任何数据变化都会自动同步到从数据库。默认状况下从数据库是只读的,若是直接修改从数据库的数据会出现错误。但能够设置从数据库配置文件的slava-read-only为no使得从数据库可写,对从数据库的任何更改都不会同步给任何其余数据库,而且主数据库更新了对应的数据会覆盖从数据库中的改动。
注意:SLAVEOF命令会中止和原来数据库的同步转而和新数据库同步。还可使用SLABEOF NO ONE来使当前数据库中止接收其余数据库的同步转成主数据库。 数据库
操做步骤vim
安装好redis以后,进行redis的主从配置,在同一台主机上启动3个redis服务,master的端口为6379,两个slave的端口分别是6380,6381。后端
首先分别配置启动这3个服务:服务器
1.查找redis 配置文件的目录测试
$locate 6379.confspa
2.修改6379.conf文件内容3d
$sudo vim 6379.conf日志
修改内容:blog
#修改端口
port 6379
#开启为yes
daemonize yes
#修改pidfile
pidfile /var/run/redis_6379.pid
#修改logfile
logfile /var/log/redis_6379.log
#修改dbfilename
dbfilename dump_6379.rdb
#修改dir 持久化目录
dir /var/lib/redis/6379
3.复制6379.conf,建立6380.conf和6381.conf文件
4.修改复制出来的文件内容
a.修改6380.conf文件内容:
#修改端口
port 6380
#开启为yes
daemonize yes
#修改pidfile
pidfile /var/run/redis_6380.pid
#修改logfile
logfile /var/log/redis_6380.log
#修改dbfilename
dbfilename dump_6380.rdb
#修改dir 持久化目录
dir /var/lib/redis/6380
b.修改6381.conf文件内容:
#修改端口
port 6381
#开启为yes
daemonize yes
#修改pidfile
pidfile /var/run/redis_6381.pid
#修改logfile
logfile /var/log/redis_6381.log
#修改dbfilename
dbfilename dump_6381.rdb
#修改dir 持久化目录
dir /var/lib/redis/6381
5.在/var/lib/redis/目录下,分别建立目录名称为6380和6381的文件夹,不然启动服务会报错
6.分别启动637九、6380和6381的redis服务,查看连通性,以下所示6380的启动:
这样分别启动了3个redis服务,目前3个服务都是单独的,未关联。
分别查看3个服务的状态
接着配置主从关系
以端口6379的服务为master,则其余两个端口服务为slave,分别对6380.conf和6381.conf文件进行配置,步骤以下所示:
1.分别关闭已经启动的服务
2.分别修改6380.conf和6381.conf的配置文件
#slaveof <masterip> <masterport>
个人修改成:
slaveof 10.60.35.60 6379
3.分别启动端口为6380和6381的服务
4.分别启动客户端,以下所示:
5.在端口为6379的客户端添加一个名称为k2的字符串
分别在端口为6380和6381的客户端能够访问
这样一个简单的主从配置就配好了
若是在slave节点添加数据,将会报错:
由于redis主从默认是读写分离,master节点写数据,slave节点读数据,所以,slave节点没法写入数据。
能够经过info replication命令查看节点的状态:
注意:另外redis的slave节点也能够做为它的子节点的master节点,其配置方法和上面配置同样,这样节点之间能够层层配置下去,犹如薪火相传。例如:
端口为6379的为master节点,其slave节点为端口6380的节点,而端口为6380的节点下面又有一个slave节点为端口为6381的节点。这样能够薪火相传,只须要将端口为6381的节点的配置修改成:slaveof 10.60.35.60 6380,便可。
Redis哨兵模式
Redis Sentinel 模式简介
Redis-Sentinel是官方推荐的高可用解决方案,当redis在作master-slave的高可用方案时,假如master宕机了,redis自己(以及其不少客户端)都没有实现自动进行主备切换,而redis-sentinel自己也是独立运行的进程,能够部署在其余与redis集群可通信的机器中监控redis集群。
它的主要功能有一下几点:
一、不时地监控redis是否按照预期良好地运行;
二、若是发现某个redis节点运行出现情况,可以通知另一个进程(例如它的客户端);
三、可以进行自动切换。当一个master节点不可用时,可以选举出master的多个slave(若是有超过一个slave的话)中的一个来做为新的master,其它的slave节点会将它所追随的master的地址改成被提高为master的slave的新地址。
四、哨兵为客户端提供服务发现,客户端连接哨兵,哨兵提供当前master的地址而后提供服务,若是出现切换,也就是master挂了,哨兵会提供客户端一个新地址。
哨兵(sentinel)自己也是支持集群的
很显然,单个哨兵会存在本身挂掉而没法监控整个集群的问题,因此哨兵也是支持集群的,咱们一般用三台哨兵机器来监控一组redis集群。
完成主从配置之后,开始配置哨兵模式,步骤以下:
1.在解压的安装包中复制sentinel.conf文件到指定的位置,以下所示:
2.修改sentinel.conf文件的内容
a.将配置文件中当前主机名为mymaster的改成咱们如今的主机名称
b.修改主要配置
#哨兵的一些日志路径
dir "/tmp"
#对应的分别是名称,ip,端口,投票选举的次数(那么咱们哨兵监听的确定是master的ip而后端口是6379,1说明当master主服务器down机以后,剩下的服务器要进行一个投票选举出一个主服务器)
sentinel monitor study03 10.60.35.60 6379 1
#配置表明哨兵0.5ms进行一次检查这个集群
sentinel down-after-milliseconds study03 5000
#配置表明你的几个从节点将支持转换为主服务器的这个事情
sentinel parallel-syncs study03 2
3.启动哨兵模式
4.测试
a.中止端口为6379的服务
b.等待查看哨兵日志
c.查看端口为6381的节点的状态
角色改成master了
d.端口为6379的节点返回
查看哨兵的日志:
端口为6379的节点成为slave节点
查看端口为6379的节点的状态: