redis系列(13)-- 高级话题之主从复制--读写分离--容灾处理

前言:废话不说,上手就干
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
redis系列(13)-- 高级话题之主从复制--读写分离--容灾处理_第1张图片
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 redis系列(13)-- 高级话题之主从复制--读写分离--容灾处理_第2张图片
5. 查看配置后的服务消息
命令:
1)redis客户端使用指定端口连接redis服务器
./redis-cli -p 端口
2)查看服务器信息
info replication
登录到master:6380
redis系列(13)-- 高级话题之主从复制--读写分离--容灾处理_第3张图片
在新的xshell窗口登录6380、6384
redis系列(13)-- 高级话题之主从复制--读写分离--容灾处理_第4张图片
role表示当前是slave,主master的状态是可用(up,还有down不可用)
6、向master中写入数据
redis系列(13)-- 高级话题之主从复制--读写分离--容灾处理_第5张图片
7、在从slave中读数据
redis系列(13)-- 高级话题之主从复制--读写分离--容灾处理_第6张图片
在从redis中只能读取数据,不能写入数据
在这里插入图片描述
二、容灾处理
当master服务出现故障,需手动将slave挂至新的master上
执行步骤
1、将master:6380停止(模拟挂掉)
redis系列(13)-- 高级话题之主从复制--读写分离--容灾处理_第7张图片
2、选择一个slave升到Master,其他slave挂到新提升的master
redis系列(13)-- 高级话题之主从复制--读写分离--容灾处理_第8张图片
slaveof no one是把slave提升为master的命令,此时查看6382,发现此redis已经升级为master,但是slave为0;
3、将其他slave挂到新的master
redis系列(13)-- 高级话题之主从复制--读写分离--容灾处理_第9张图片
现在的主从关系,master是6382,slave是6384。
查看6382:
redis系列(13)-- 高级话题之主从复制--读写分离--容灾处理_第10张图片
此时已经有一个slave,为6384
4、把原来的服务器修复后,重新工作,需要把它添加到现有的主从关系中。
先启动6380的redis服务
redis系列(13)-- 高级话题之主从复制--读写分离--容灾处理_第11张图片
连接到6380端口
在这里插入图片描述
查询6380服务状态:
redis系列(13)-- 高级话题之主从复制--读写分离--容灾处理_第12张图片
发现是一个master
把6380服务挂到当前的主从关系中

redis系列(13)-- 高级话题之主从复制--读写分离--容灾处理_第13张图片
5、查询6382这个master的信息
redis系列(13)-- 高级话题之主从复制--读写分离--容灾处理_第14张图片
现在的主从关系是:
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的配置文件要加上这么一句话
redis系列(13)-- 高级话题之主从复制--读写分离--容灾处理_第15张图片
123456指的就是你的redis设置的密码,以上的这句话在你的主从配置文件中都要添加,否侧是无法建立主从关系的。
以上就是redis高级话题之主从复制–读写分离的内容,共勉!

你可能感兴趣的:(redis)