redis

4.3 主从复制

4.3.1 主从复制–读写分离

通过持久化功能,Redis 保证了即使在服务器重启的情况下也不会丢失(或少量丢失)
数据,但是由于数据是存储在一台服务器上的,如果这台服务器出现故障,比如硬盘坏了,
也会导致数据丢失。
为了避免单点故障,我们需要将数据复制多份部署在多台不同的服务器上,即使有一台
服务器出现故障其他服务器依然可以继续提供服务。
这就要求当一台服务器上的数据更新后,自动将更新的数据同步到其他服务器上,那该
怎么实现呢? Redis 的主从复制。
在这里插入图片描述

Redis 提供了复制(replication)功能来自动实现多台 redis 服务器的数据同步(每天19 点 新闻联播,

基本从 cctv1-8,各大卫视都会播放)
我们可以通过部署多台 redis,并在配置文件中指定这几台 redis 之间的主从关系,主
负责写入数据,同时把写入的数据实时同步到从机器,这种模式叫做主从复制,即
master/slave,并且 redis 默认 master 用于写,slave 用于读,向 slave 写数据会导致错误

(1) Redis 主从复制实现(master/salve)

方式 1:修改配置文件,启动时,服务器读取配置文件,并自动成为指定服务器的从服务器,从而构成主从复制的关系
方式 2: ./redis-server --slaveof ,在启动 redis 时指定当前服务成为某个主 Redis 服务的从 Slave
方式 1 的实现步骤:模拟多 Reids 服务器, 在一台已经安装 Redis 的机器上,运行多个 Redis 应用模拟多
                                 个 Reids 服务器。一个 Master,两个 Slave. 

A、新建三个 Redis 的配置文件

如果 Redis 启动,先停止。
作为 Master 的 Redis 端口是 6380
作为 Slaver 的 Redis 端口分别是 6382 , 6384
从原有的 redis.conf 拷贝三份,分别命名为 redis6380.conf, redis6382.conf , redis6384.conf
在这里插入图片描述

B、 编辑 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
#masterauth 123456


配置项说明:

  1. include : 包含原来的配置文件内容。/usr/local/redis-3.2.9/redis.conf 按照自己的目录设置。
  2. daemonize:yes 后台启动应用,相当于 ./redis-server & , &的作用。
  3. port : 自定义的端口号
  4. pidfile : 自定义的文件,表示当前程序的 pid ,进程 id。
  5. logfile:日志文件名
  6. dbfilename:持久化的 rdb 文件名

C、 编辑 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 的从。
②: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

D、启动服务器 Master/Slave 都启动

启动方式 ./redis-server 配置文件
启动 Redis,并查看启动进程

./redis-server ../redis6380.conf

./redis-server ../redis6382.conf

./redis-server ../redis6384.conf

在这里插入图片描述

E、 查看配置后的服务信息

命令:
①: Redis 客户端使用指定端口连接 Redis 服务器
./redis-cli -p 端口
②:查看服务器信息
info replication
登录到 Master:6380
在这里插入图片描述
查看当前服务信息
在客户端的 Redis 内执行命令

info replication
Master 服务的查看结果:
在这里插入图片描述
在新的 Xshell 窗口分别登录到 6382 ,6384 查看信息
在新的 Xshell 窗口分别登录到 6382 ,6384 查看信息
6384 也登录内容同 6382.

F、 向 Master 写入数据

在 6380 执行 flushall 清除数据,避免干扰的测试数据。 生产环境避免使用。
在这里插入图片描述

G、在从 Slave 读数据

6382,6384 都可以读主 Master 的数据,不能写
在这里插入图片描述
Slave 写数据失败

在这里插入图片描述

(2) 容灾处理

当 Master 服务出现故障,需手动将 slave 中的一个提升为 master, 剩下的 slave 挂至新的
master 上(冷处理:机器挂掉了,再处理)
命令:
①:slaveof no one,将一台 slave 服务器提升为 Master (提升某 slave 为 master)
②:slaveof 127.0.0.1 6381 (将 slave 挂至新的 master 上)
执行步骤:

A、 将 Master:6380 停止(模拟挂掉)

 

B、 选择一个 Slave 升到 Master,其它的 Slave 挂到新提升的 Master

 

C、 将其他 Slave 挂到新的 Master

在 Slave 6384 上执行

 

 现在的主从(Master/Slave)关系:Master 是 6382 , Slave 是 6384 查看 6382:

 

D 原来的服务器重新添加到主从结构中

6380 的服务器修改后,从新工作,需要把它添加到现有的 Master/Slave 中先启动 6380 的 Redis 服务

 

 连接到 6380 端口

 

 当前服务挂到 Master 上

 

E 查看新的 Master 信息

在 6382 执行:

现在的 Master/Slaver 关系是:

   Master: 6382

   Slave: 6380         6384

(3) 操作命令

进入客户端需指定端口:./redis-cli -p 6380 不配置启动默认都是主 master

info replication

查看 redis 服务器所处角色

4) 总结

  1. 一个 master 可以有多个 slave
  2. slave 下线,读请求的处理性能下降
  3. master 下线,写请求无法执行
  4. 当 master 发生故障,需手动将其中一台 slave 使用 slaveof no one 命令提升为 master,其它 slave 执行 slaveof 命令指向这个新的 master,从新的 master 处同步数据
  5. 主从复制模式的故障转移需要手动操作,要实现自动化处理,这就需要 Sentinel 哨兵,实现故障自动转移

4.3.2 高可用 Sentinel 哨兵

Sentinel 哨兵是 redis 官方提供的高可用方案,可以用它来监控多个 Redis 服务实例的运行情况。Redis Sentinel 是一个运行在特殊模式下的 Redis 服务器。Redis Sentinel 是在多个 Sentinel 进程环境下互相协作工作的。

 

Sentinel 系统有三个主要任务:

  1. 监控:Sentinel 不断的检查主服务和从服务器是否按照预期正常工作。
  2. 提醒:被监控的 Redis 出现问题时,Sentinel 会通知管理员或其他应用程序。
  3. 自动故障转移:监控的主 Redis 不能正常工作,Sentinel 会开始进行故障迁移操作。将一个从服务器升级新的主服务器。 让其他从服务器挂到新的主服务器。同时向客户端提供新的主服务器地址。

 

(1) Sentinel 配置

1)Sentinel 配置文件

#sentinel配置

#sentinel端口

port 26379

#工作路径,注意路径不要和主重复

dir "/usr/local/redis-6379"

# 守护进程模式

daemonize yes

#关闭保护模式

protected-mode no

# 指明日志文件名

logfile "./sentinel.log"

#哨兵监控的master,主从配置一样,这里只用输入redis主节点的ip/port和法定人数。

sentinel monitor mymaster 192.168.125.128 6379 1

# master或slave多长时间(默认30秒)不能使用后标记为s_down状态。

sentinel down-after-milliseconds mymaster 5000

#若sentinel在该配置值内未能完成failover操作(即故障时master/slave自动切换),则认为本次failover失败。

sentinel failover-timeout mymaster 18000

#设置master和slaves验证密码

sentinel auth-pass mymaster 123456

sentinel parallel-syncs mymaster 1

#指定了在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步

 

 

 

 复制三份sentinel.conf文件:

 

Sentinel系统默认 port 是26379 。三个配置port分别设置为 26380  , 26382 , 26384 。三个文件分别命名:

  1. sentinel26380.conf
  2. sentinel26382.conf
  3. sentinel26384.conf 执行复制命令 cp sentinel.conf xxx.conf

 

2) 三份 sentinel 配置文件修改:

1、修改 port 26380、 port  26382、 port  26384 2、修改 sentinel monitor mymaster 127.0.0.1 6380 2 格式:sentinel  monitor  <name>  <masterIP>  <masterPort>  <Quorum 投票数>

 Sentinel监控主(Master)Redis, Sentinel根据Master的配置自动发现Master的Slave,Sentinel 默认端口号为26379 。

 

sentinel26380.conf

1) 修改 port

 

2)修改监控的 master 地址

 

 sentinel26382.conf 修改port 26382  , master的port 6382 sentinel26384.conf 修改port 26384  , master的port 6382

设置密码 

sentinel monitor mymaster 127.0.0.1 6380 2
sentinel auth-pass mymaster 123456

(3) 启动主从(Master/Slave)Redis

启动 Reids 

./redis-server ../redis6380.conf

./redis-server ../redis6382.conf

./redis-server ../redis6384.conf

 

 查看 Master 的配置信息连接到 6382 端口

 

使用 info 命令查看 Master/Slave

(4) 启动 Sentinel

redis安装时make编译后就产生了redis-sentinel程序文件,可以在一个redis中运行多个 sentinel进程。

启动一个运行在Sentinel模式下的Redis服务实例

./redis-sentinel  sentinel 配置文件

执行以下三条命令,将创建三个监视主服务器的Sentinel实例:

./redis-sentinel  ../sentinel26380.conf

./redis-sentinel  ../sentinel26382.conf

./redis-sentinel  ../sentinel26384.conf

在 XShell 开启三个窗口分别执行:

 

5) 主 Redis 不能工作

让 Master 的 Redis 停止服务, 执行 shutdown 先执行 info replication 确认 Master 的 Redis ,再执行 shutdown

 

 查看当前 Redis 的进程情况

 

(6) Sentinel 的起作用

在 Master 执行 shutdown 后, 稍微等一会 Sentinel 要进行投票计算,从可用的 Slave选举新的 Master。

查看 Sentinel 日志,三个 Sentinel 窗口的日志是一样的。

 

查看新的 Master

 

 查看原 Slave 的变化

 

(7) 新的 Redis 加入 Sentinel 系统,自动加入 Master

重新启动 6382

 

 查看 6384 的信息

 

测试数据:在 Master 写入数据

 

在 6382 上读取数据,不能写入

 

8) 监控

  1. Sentinel 会不断检查 Master 和 Slave 是否正常
  2. 如果 Sentinel 挂了,就无法监控,所以需要多个哨兵,组成 Sentinel 网络,一个健康的

   Sentinel 至少有 3 个 Sentinel 应用。 彼此在独立的物理机器或虚拟机。

  1. 监控同一个 Master 的 Sentinel 会自动连接,组成一个分布式的 Sentinel 网络,互相通信并交换彼此关于被监控服务器的信息
  2. 当一个 Sentinel 认为被监控的服务器已经下线时,它会向网络中的其它 Sentinel 进行确认,判断该服务器是否真的已经下线
  3. 如果下线的服务器为主服务器,那么 Sentinel 网络将对下线主服务器进行自动故障转移,通过将下线主服务器的某个从服务器提升为新的主服务器,并让其从服务器转移到新的主服务器下,以此来让系统重新回到正常状态
  4. 下线的旧主服务器重新上线,Sentinel 会让它成为从,挂到新的主服务器下

9) 总结

  • 主从复制,解决了读请求的分担,从节点下线,会使得读请求能力有所下降,Master 下线,写请求无法执行
  •  Sentinel 会在 Master 下线后自动执行故障转移操作,提升一台 Slave 为 Master,并让其它Slave 成为新 Master 的 Slave

 

4.4  安全设置

(1) 设置密码

访问 Redis 默认是没有密码的,这样不安全,任意用户都可以访问。可以启用使用密码才能访问 Redis。 设置 Redis 的访问密码,修改 redis.conf 中这行 requirepass 密码。密码要比较复杂,不容易破解,而且需要定期修改。因为 redis 速度相当快,所以在一台比较好的服务器下,一个外部的用户可以在一秒钟进行 150K 次的密码尝试,需要指定非常非常强大的密码来防止暴力破解。

A、 开启访问密码设置

修改 redis.conf , 使用 vim 命令。 找到 requirepass 行去掉注释,requirepass 空格后就是密码。

例 1:设置访问密码是 123456 ,这是练习使用,生产环境要设置复杂密码修改 redis.conf,文件 480 行左右。原始内容:

 

修改后:

 

查看修改结果:

 

B、 访问有密码的 Redis

如果 Redis 已经启动,关闭后,重新启动。

 

访问有密码的 Redis 两种方式:

①:在连接到客户端后,使用命令 auth 密码 , 命令执行成功后,可以正常使用 Redis

②:在连接客户端时使用 -a 密码。例如 ./redis-cli -h ip -p port -a password

启动 Redis

 

 

使用 ① 访问

 

输入命令 auth 密码

 

使用 ② 方式

 

绑定 ip

修改 redis.conf 文件,把# bind 127.0.0.1 前面的注释#号去掉,然后把 127.0.0.1 改成允许访问你 redis 服务器的 ip 地址,表示只允许该 ip 进行访问。多个 ip 使用空格分隔。

 例如 bind 192.168.1.100  192.168.2.10

 

修改默认端口

修改 redis 的端口,这一点很重要,使用默认的端口很危险,redis.conf 中修改 port 6379 将其修改为自己指定的端口(可随意),端口 1024 是保留给操作系统使用的。用户可以使用

的范围是 1024-65535

 

 使用 -p 参数指定端口,例如:./redis-cli -p 新设置端口

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值