前言:废话不说,上手就干

redis的持久化功能保证了即使在服务器重启的情况下也不会丢失(或少量丢失)数据,但是由于数据是存储在一台服务器上的,如果这台服务器出现故障,比如硬盘问题等等,也会导致数据丢失。

为了避免单点故障,我们需要将数据复制多份部署在多台不同的服务器上,即使有一台服务器出现故障其他服务器依然可以继续提供服务。

这就要求当一台服务器上的数据更新后,自动将更新的数据同步到其他服务器上,也就是主从复制。

redis提供了复制功能来自动实现多台redis服务器的数据同步,我们可以通过部署多台redis,并在配置文件中指定这几台redis之间的主从关系,主负责写入数据,同时把写入的数据实时同步到从服务器,这种模式叫主从复制,即master/slave,并且redis默认master用于写,slave用于读,向slave写数据会导致错误

一、redis主从复制实现(master/slave)

方式1:修改配置文件,启动时,服务器读取配置文件,并自动为指定服务器的从服务器,从而构成主从复制关系。

方式2:./redis-server --slaveof,在启动redis时指定当前服务成为某个主redis的从slave。

方式1的实现步骤:

模拟多redis服务器,在一台已经安装redis的机器上,运行多个redis应用模拟多个redis服务器,一个master,两个slave

1、新建三个redis的配置文件

如果 Redis 启动,先停止。

作为 Master 的 Redis 端口是 6380

作为 Slaver 的 Redis 端口分别是 6382 , 6384

从原有的 redis.conf 拷贝三份,分别命名为 redis6380.conf, redis6382.conf , redis6384.conf

hystrix redis 全局熔断_配置文件


2、编辑master配置文件

编辑master的配置文件redis6380.conf,在空文件加入如下内容

include /usr/local/redis-3.2.9/redis.conf

daemonize yes

port 6380

pidfile /var/run/redis_6380.pid

logfile 6380.log

dbfilename dump6380.rdb

配置项说明:

include : 包含原来的配置文件内容。/usr/local/redis-3.2.9/redis.conf 按照自己的目录设置。

daemonize:yes 后台启动应用,相当于 ./redis-server & , &的作用。

port : 自定义的端口号

pidfile : 自定义的文件,表示当前程序的 pid ,进程 id。

logfile:日志文件名

dbfilename:持久化的 rdb 文件名

3. 编辑 Slave 配置文件

编辑 Slave 的配置文件 redis6382.conf 和 redis6384.conf: 在空文件加入如下内容

①:redis6382.conf:

include /usr/local/redis-3.2.9/redis.conf

daemonize yes

port 6382

pidfile /var/run/redis_6382.pid

logfile 6382.log

dbfilename dump6382.rdb

slaveof 127.0.0.1 6380

masterauth 123456

配置项说明:

slaveof : 表示当前 Redis 是谁的从。当前是 127.0.0.0 端口 6380 这个 Master 的从。

masterauth:连接主的密码(目前可忽略,因为目前主redis并没有配置密码)

②:redis6384.conf:

include /usr/local/redis-3.2.9/redis.conf

daemonize yes

port 6384

pidfile /var/run/redis_6384.pid

logfile 6384.log

dbfilename dump6384.rdb

slaveof 127.0.0.1 6380

masterauth 123456

4. 启动服务器 Master/Slave

hystrix redis 全局熔断_服务器_02


5. 查看配置后的服务消息

命令:

1)redis客户端使用指定端口连接redis服务器

./redis-cli -p 端口

2)查看服务器信息

info replication

登录到master:6380

hystrix redis 全局熔断_hystrix redis 全局熔断_03


在新的xshell窗口登录6380、6384

hystrix redis 全局熔断_hystrix redis 全局熔断_04


role表示当前是slave,主master的状态是可用(up,还有down不可用)

6、向master中写入数据

hystrix redis 全局熔断_服务器_05


7、在从slave中读数据

hystrix redis 全局熔断_hystrix redis 全局熔断_06


在从redis中只能读取数据,不能写入数据

hystrix redis 全局熔断_hystrix redis 全局熔断_07


二、容灾处理

当master服务出现故障,需手动将slave挂至新的master上

执行步骤

1、将master:6380停止(模拟挂掉)

hystrix redis 全局熔断_配置文件_08


2、选择一个slave升到Master,其他slave挂到新提升的master

hystrix redis 全局熔断_服务器_09


slaveof no one是把slave提升为master的命令,此时查看6382,发现此redis已经升级为master,但是slave为0;

3、将其他slave挂到新的master

hystrix redis 全局熔断_服务器_10


现在的主从关系,master是6382,slave是6384。

查看6382:

hystrix redis 全局熔断_redis_11


此时已经有一个slave,为6384

4、把原来的服务器修复后,重新工作,需要把它添加到现有的主从关系中。

先启动6380的redis服务

hystrix redis 全局熔断_redis_12


连接到6380端口

hystrix redis 全局熔断_redis_13


查询6380服务状态:

hystrix redis 全局熔断_配置文件_14


发现是一个master

把6380服务挂到当前的主从关系中

hystrix redis 全局熔断_hystrix redis 全局熔断_15


5、查询6382这个master的信息

hystrix redis 全局熔断_服务器_16


现在的主从关系是:

master: 6382

slave :6380、6384

6、操作命令

进入客户端需指定端口:./redis-cli -p 6380

不配置启动默认都是主master

info replication 查看redis服务器所处角色

7、总结

1)一个master可以有多个slave

2)slave下线,读请求的处理性能下降

3)master下线,写请求无法执行

4)当master发生故障,需手动将其中一个slave使用slaveof no one命令提升为master,其它slave执行slaveof命令指向这个新的master,从新的master处同步数据

5、主从复制模式故障转移需要手动操作,需实现自动化处理,这就是sentinel哨兵,实现故障自动转移

另外,以上的配置是建立在redis没有密码的情况下,如果你的redis设置了密码,那么在redisxxx.conf的配置文件要加上这么一句话

hystrix redis 全局熔断_配置文件_17


123456指的就是你的redis设置的密码,以上的这句话在你的主从配置文件中都要添加,否侧是无法建立主从关系的。

以上就是redis高级话题之主从复制–读写分离的内容,共勉!