redis主从复制配置

redis主从复制配置原理

通过过持久化功能,Redis保证了即使在服务器重启情况下也不会损失数据,但由于数据存储在一台服务器上,服务器的硬盘出现故障也会导致数据丢失。为了避免单点故障,希望将数据库复制多个副本以部署在不同的服务器上,即使有一台服务器出现故障其他服务器依然可以继续提高服务。要求当一台服务器上的数据更新后可以自动将更新的数据同步到其他区服务器上,Redis提高了复制功能可以自动实现同步过程。

同步数据库分为两类: 一类是主数据库,一类是从数据库。主数据库可以进行读写操作,当发生写操作时自动将数据同步给从数据库。而从数据库一般只是只读的,并接受主数据库同步过来的数据。一个主数据库可以拥有多个从数据库,而一个从数据库只能拥有一个主数据库。
在redis中使用复制功能很简单,只需要在从数据库的配置文件中加入:
slaveof 主数据库的IP 主数据库端口
主数据库中的任何数据变化都会自动同步到从数据库。默认情况下从数据库是只读的,如果直接修改从数据库的数据会出现错误。但可以设置从数据库配置文件的slava-read-only为no使得从数据库可写,对从数据库的任何更改都不会同步给任何其他数据库,并且主数据库更新了对应的数据会覆盖从数据库中的改动。
注意:SLAVEOF命令会停止和原来数据库的同步转而和新数据库同步。还可以使用SLABEOF NO ONE来使当前数据库停止接收其他数据库的同步转成主数据库。

操作步骤

安装好redis之后,进行redis的主从配置,在同一台主机上启动3个redis服务,master的端口为6379,两个slave的端口分别是6380,6381。

首先分别配置启动这3个服务:

1.查找redis 配置文件的目录

$locate 6379.conf

2.修改6379.conf文件内容

$sudo vim 6379.conf

修改内容:

#修改端口

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.分别启动6379、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集群。
它的主要功能有一下几点:
1、不时地监控redis是否按照预期良好地运行;
2、如果发现某个redis节点运行出现状况,能够通知另外一个进程(例如它的客户端);
3、能够进行自动切换。当一个master节点不可用时,能够选举出master的多个slave(如果有超过一个slave的话)中的一个来作为新的master,其它的slave节点会将它所追随的master的地址改为被提升为master的slave的新地址。
4、哨兵为客户端提供服务发现,客户端链接哨兵,哨兵提供当前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的节点的状态:

 

posted @ 2017-05-26 17:05  牛头人  阅读(1643)  评论(0编辑  收藏  举报