欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-19 14:13:35
前言:废话不说,上手就干redis的持久化功能保证了即使在服务器重启的情况下也不会丢失(或少量丢失)数据,但是由于数据是存储在一台服务器上的,如果这台服务器出现故障,比如硬盘问题等等,也会导致数据丢失。为了避免单点故障,我们需要将数据复制多份部署在多台不同的服务器上,即使有一台服务器出现故障其他服务器依然可以继续提供服务。这就要求当一台服务器上的数据更新后,自动将更新的数据同步到其他服务器上,也就是主从复制。redis提供了复制功能来自动实现多台redis服务器的数据同步,我们可以通过部署多台red...

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

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

本文地址:https://blog.csdn.net/W18738842008/article/details/107189659