安全认证

开启认证

redis默认开启了保护模式,只允许本地回环地址登录并访问数据库

修改redis的配置文件,并重启redis的服务
vim /opt/redis_cluster/redis_6379/conf/redis_6379.conf
# 绑定主机地址
bind 10.0.0.51
# 开启验证
requirepass 123456 重启redis服务
pkill redis
ps -ef|grep redis
redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf
ps -ef|grep redis

验证安全认证是否成功

没认证的情况

认证之后的情况

主从复制

部署第二个redis的环境(10.0.0.52)

1 从10.0.0.51拷贝redis到10.0.0.52上
10.0.0.51
[root@db01 ~]# tar -czvf redis.tar.gz /opt/redis_cluster/
[root@db01 ~]# scp redis.tar.gz 10.0.0.52:/opt 2 解压压缩包
10.0.0.52
[root@db02 opt]# cd /opt/
[root@db02 opt]# tar -xf redis.tar.gz
[root@db02 opt]# mv opt/* ./
[root@db02 opt]# ls
opt redis_cluster redis.tar.gz
[root@db02 opt]# rm -rf opt/
[root@db02 opt]# ls redis_cluster/
redis redis-3.2.9 redis_6379
[root@db02 opt]# ll redis_cluster/
lrwxrwxrwx 1 root root 31 Jan 10 11:48 redis -> /opt/redis_cluster/redis-3.2.9/
drwxrwxr-x 6 root root 309 May 17 2017 redis-3.2.9
drwxr-xr-x 5 root root 85 Jan 10 14:24 redis_6379 3 执行 make install 命令,把redis相关的命令添加的环境变量中
[root@db02 opt]# cd /opt/redis_cluster/redis-3.2.9
[root@db02 redis]# make install 4 创建数据存放目录
[root@db02 redis]# mkdir /data/redis_cluster/redis_6379 -p 5 修改配置文件
[root@db02 redis]# vim /opt/redis_cluster/redis_6379/conf/redis_6379.conf
# 绑定主机地址
bind 10.0.0.52 6 启动redis
[root@db02 redis]# redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf
[root@db02 redis]# redis-cli -h 10.0.0.52
10.0.0.52:6379> set k1 v1
OK
10.0.0.52:6379> get k1
"v1"
10.0.0.52:6379>

建立主从复制关系

从库默认只有只读权限,建立主从关系后,从库默认会被清空

1 建立主从方式1
不推荐使用这种方式,因为重启主从关系失效
[root@db02 redis]# redis-cli -h 10.0.0.52
10.0.0.52:6379> SLAVEOF 10.0.0.51 6379 2 建立主从方式2:
写入从库配置文件中
[root@db02 redis]# vim /opt/redis_cluster/redis_6379/conf/redis_6379.conf
# 开启主从关系
slaveof 10.0.0.51 6379 重启redis
[root@db02 redis]# pkill redis
[root@db02 redis]# redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf
[root@db02 redis]# ps -ef|grep redis 验证
[root@db02 redis]# redis-cli -h 10.0.0.52
10.0.0.52:6379> set k5 v5
(error) READONLY You can't write against a read only slave.
10.0.0.52:6379>
10.0.0.52:6379> keys *
1) "k3"
2) "k2"
3) "k1"
10.0.0.52:6379>

主从复制过程

流程
1)从服务器连接主服务器,发送SYNC命令; 
2)主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令; 
3)主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令; 
4)从服务器收到快照文件后丢弃所有旧数据,载入收到的快照; 
5)主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令; 
6)从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令; 

主从复制的局限性

1. 执行主从复制前,将现有的数据备份一份到其他目录
2. 建议将主从复制写入到配置文件中
3. 在业务低峰时期做主从复制
4. 拷贝数据会占用服务器资源
5. 不能自动完成主从切换,需要人工介入

断开主从

[root@db02 redis_6379]# redis-cli -h 10.0.0.52
10.0.0.52:6379> SLAVEOF no one

哨兵模式

说明

哨兵模式也要基于主从复制模式

redis的主从模式下,主节点一旦发送故障不能提供服务,需要人工干预,将从节点升为主节点,同时,还需要修改客户端配置,对于很多的应用场景这种方式无法接受

Sentinel(哨兵)架构解决了 redis 主从需要人工干预的问题

哨兵模式是redis的高可用实现方案,实际生产环境中,对提高整个系统可用性非常有帮助的

特点
1. 监控:哨兵会不断的定期检查你的主服务器和从服务器是否都运作正常
2. 提醒:当监控到某个redis服务器出现问题时, 哨兵可以通过 api 向管理员或者其他应用程序发送通知
3. 自动故障迁移 :当主服务器不能正常工作时,哨兵会开始一次自动故障迁移

架构图

规划

需要三台服务器
10.0.0.51 主
10.0.0.52 从
10.0.0.53 从 注意这里也要部署一下redis基础环境,和10.0.0.52部署的时候一样 | 角色 | IP | 端口 |
| ----------- | --------- | ----- |
| Master | 10.0.0.51 | 6379 |
| Sentinel-01 | 10.0.0.51 | 26379 | | slave | 10.0.0.52 | 6379 |
| Sentinel-02 | 10.0.0.52 | 26379 | | slave | 10.0.0.53 | 6379 |
| Sentinel-03 | 10.0.0.53 | 26379 |

部署

1 10.0.0.51 主服务器

[root@db01 ~]# mkdir -p /data/redis_cluster/redis_26379/
[root@db01 ~]# mkdir -p /opt/redis_cluster/redis_26379/{conf,pid,logs}
[root@db01 ~]# vim /opt/redis_cluster/redis_26379/conf/redis_26379.conf
bind 10.0.0.51
port 26379
daemonize yes
logfile /opt/redis_cluster/redis_26379/logs/redis_26379.log
dir /data/redis_cluster/redis_26379/
# master 主节点别名 主节点IP 端口,需要2个 sentinel 节点同意
sentinel monitor mymaster 10.0.0.51 6379 2
# 选项指定了 sentinel 意味服务器已经断线所需的毫秒数
sentinel down-after-milliseconds mymaster 3000
# 向新的主节点发起复制操作的从服务器个数,1: 轮询发起复制
# 轮询发起复制的好处,降低主节点的开销
sentinel parallel-syncs mymaster 1
# 故障转移超时时间
sentinel failover-timeout mymaster 18000 启动
[root@db01 ~]# redis-sentinel /opt/redis_cluster/redis_26379/conf/redis_26379.conf
[root@db01 ~]# ps -ef|grep redis
root 7622 1 0 10:01 ? 00:00:05 redis-server 10.0.0.51:6379
root 7816 1 0 10:58 ? 00:00:01 redis-sentinel 10.0.0.51:26379 [sentinel]

2 10.0.0.52 从服务器

[root@db02 ~]# mkdir -p /data/redis_cluster/redis_26379/
[root@db02 ~]# mkdir -p /opt/redis_cluster/redis_26379/{conf,pid,logs}
[root@db02 ~]# vim /opt/redis_cluster/redis_26379/conf/redis_26379.conf
bind 10.0.0.52
port 26379
daemonize yes
logfile /opt/redis_cluster/redis_26379/logs/redis_26379.log
dir /data/redis_cluster/redis_26379/
# master 主节点别名 主节点IP 端口,需要2个 sentinel 节点同意
sentinel monitor mymaster 10.0.0.51 6379 2
# 选项指定了 sentinel 惹味服务器已经断线所需的毫秒数
sentinel down-after-milliseconds mymaster 3000
# 向新的主节点发起复制操作的丛及诶单个数,1 轮询发起复制
sentinel parallel-syncs mymaster 1
# 故障转移超时时间
sentinel failover-timeout mymaster 18000 启动
[root@db02 ~]# redis-sentinel /opt/redis_cluster/redis_26379/conf/redis_26379.conf
[root@db02 ~]# ps -ef|grep redis
root 12415 1 0 10:01 ? 00:00:05 redis-server 10.0.0.52:6379
root 12616 1 0 11:04 ? 00:00:00 redis-sentinel 10.0.0.52:26379 [sentinel]

3 10.0.0.53 从服务器

[root@db02 ~]# mkdir -p /data/redis_cluster/redis_26379/
[root@db02 ~]# mkdir -p /opt/redis_cluster/redis_26379/{conf,pid,logs}
[root@db02 ~]# vim /opt/redis_cluster/redis_26379/conf/redis_26379.conf
bind 10.0.0.53
port 26379
daemonize yes
logfile /opt/redis_cluster/redis_26379/logs/redis_26379.log
dir /data/redis_cluster/redis_26379/
# master 主节点别名 主节点IP 端口,需要2个 sentinel 节点同意
sentinel monitor mymaster 10.0.0.51 6379 2
# 选项指定了 sentinel 惹味服务器已经断线所需的毫秒数
sentinel down-after-milliseconds mymaster 3000
# 向新的主节点发起复制操作的丛及诶单个数,1 轮询发起复制
sentinel parallel-syncs mymaster 1
# 故障转移超时时间
sentinel failover-timeout mymaster 18000 启动
[root@db03 ~]# redis-sentinel /opt/redis_cluster/redis_26379/conf/redis_26379.conf
[root@db03 ~]# ps -ef |grep redis
root 7565 1 0 10:46 ? 00:00:01 redis-server 10.0.0.53:6379
root 7618 1 0 11:04 ? 00:00:00 redis-sentinel 10.0.0.53:26379 [sentinel]

配置文件的变化

当所有的节点都启动后,配置文件发生了变化,体现在三个方面
1. sentinel 节点自动发现了从节点
2. 去掉了默认的配置,例如 sentinel parallel-syncs mymaster 1 参数
3. 添加了配置记录相关参数

登录命令

[root@db01 ~]# redis-cli -h 10.0.0.51 -p 26379
10.0.0.51:26379> INFO sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=10.0.0.51:6379,slaves=2,sentinels=3 [root@db02 ~]# redis-cli -h 10.0.0.52 -p 26379
10.0.0.52:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=10.0.0.51:6379,slaves=2,sentinels=3
10.0.0.52:26379>

模拟故障转移

在 10.0.0.51 主服务器上
[root@db01 ~]# pkill redis
[root@db01 ~]# ps -ef|grep reids
root 7903 7262 0 11:17 pts/0 00:00:00 grep --color=auto reids 在 10.0.0.52 服务器上查看(从这里可以看出 10.0.0.53 成为了主服务器)
[root@db02 ~]# redis-cli -h 10.0.0.52 -p 26379
10.0.0.52:26379> INFO sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=10.0.0.53:6379,slaves=2,sentinels=3
10.0.0.52:26379>

手动选出主节点

10.0.0.51 上启动redis和sentinel服务
[root@db01 ~]# redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf
[root@db01 ~]# redis-sentinel /opt/redis_cluster/redis_26379/conf/redis_26379.conf
[root@db01 ~]# ps -ef|grep redis
root 7930 1 0 11:25 ? 00:00:00 redis-server 10.0.0.51:6379
root 7947 1 0 11:25 ? 00:00:00 redis-sentinel 10.0.0.51:26379 [sentinel]
[root@db01 ~]# redis-cli -h 10.0.0.51 -p 26379
10.0.0.51:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=10.0.0.53:6379,slaves=2,sentinels=3
10.0.0.51:26379> 从上可以看出主节点还在 10.0.0.53 上,我们手动切回10.0.0.51
redis sentinel 存在多个从节点时,如果想将指定的从节点升为主节点,可以将其他节点的 slavepriority 配置为0,但是需要注意 failover后,将 slave-priority 调回原来值 查看 slave-priority 值
[root@db02 ~]# redis-cli -h 10.0.0.52
10.0.0.52:6379> CONFIG GET slave-priority
1) "slave-priority"
2) "100" 设置 slave-priority 值(10.0.0.52 10.0.0.53 都要设置)
[root@db02 ~]# redis-cli -h 10.0.0.52
10.0.0.52:6379> CONFIG GET slave-priority
10.0.0.52:6379> CONFIG SET slave-priority 0
OK
10.0.0.52:6379> CONFIG GET slave-priority
1) "slave-priority"
2) "0" [root@db03 ~]# redis-cli -h 10.0.0.53
10.0.0.53:6379> CONFIG GET slave-priority
1) "slave-priority"
2) "100"
10.0.0.53:6379> CONFIG SET slave-priority 0
OK
10.0.0.53:6379> CONFIG GET slave-priority
1) "slave-priority"
2) "0" [root@db03 ~]# redis-cli -h 10.0.0.53 -p 26379
10.0.0.53:26379> sentinel failover mymaster
OK
10.0.0.53:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=10.0.0.51:6379,slaves=2,sentinels=3
可以看到已经把 主服务器切回到 10.0.0.51 上了 恢复 10.0.0.52 10.0.0.53 上的 slave-priority 值
[root@db02 ~]# redis-cli -h 10.0.0.52
10.0.0.52:6379> CONFIG SET slave-priority 100
OK
10.0.0.52:6379> CONFIG GET slave-priority
1) "slave-priority"
2) "100" [root@db03 ~]# redis-cli -h 10.0.0.53 -p 6379
10.0.0.53:6379> CONFIG SET slave-priority 100
OK
10.0.0.53:6379> CONFIG GET slave-priority
1) "slave-priority"
2) "100"

哨兵模式读写分离

https://www.cnblogs.com/kevingrace/p/9004460.html

客户端配置连接的是sentinel信息,比如连接sentinel.conf文件中定义的master名称。在sentinel监听时,当master节点挂了,它会在slave节点中自动选举出新
的master节点,而当挂了的老master节点重新恢复后就会成为新的slave节点。对于客户端来说,redis主从切换后它不需要修改连接配置。 python连接redis sentinel集群(需要安装python redis客户端,即执行"pip install redis")
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import redis
from redis.sentinel import Sentinel # 连接哨兵服务器(主机名也可以用域名)
sentinel = Sentinel([('192.168.10.202', 26379), ('192.168.10.203', 26379), ('192.168.10.205', 26379)], socket_timeout=0.5) # 获取主服务器地址
master = sentinel.discover_master('mymaster')
print(master)
# 输出:('192.168.10.202', 26379) # 获取从服务器地址
slave = sentinel.discover_slaves('mymaster')
print(slave)
# 输出:[('192.168.10.203', 26379), ('192.168.10.205', 26379), ('172.31.0.5', 26379)] # 获取主服务器进行写入
master = sentinel.master_for('mymaster', socket_timeout=0.5, password='redis_auth_pass', db=15)
w_ret = master.set('foo', 'bar')
# 输出:True # # 获取从服务器进行读取(默认是round-roubin)
slave = sentinel.slave_for('mymaster', socket_timeout=0.5, password='redis_auth_pass', db=15)
r_ret = slave.get('foo')
print(r_ret)
# # 输出:bar

Redis-02-主从复制和哨兵模式的更多相关文章

  1. redis的主从复制和哨兵模式

    Redis主从复制是什么? 行话:也就是我们所说的主从复制,主机数据更新后根据配置和策略, 自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主 Redis主从复制 ...

  2. redis: 主从复制和哨兵模式(十三)

    redis 主从复制 最低要求是一主二从(一个主机和两个从机) 主机才能写 从机只能读 只要从机连接到主机 数据就会全量复制到从机 环境配置(同一台机器) 1:配置文件 redis.conf配置如下: ...

  3. redis的主从复制(哨兵模式)

    p.p1 { margin: 0; font: 10px ".SF NS Text" } Master以写为主,Slave以读为主 读写分离 容灾恢复 一.一主多从 配置文件修改: ...

  4. Linux基于Docker的Redis主从复制、哨兵模式搭建

    本教程基于CentOS7,开始本教程前,请确保您的Linux系统已安装Docker. 1.使用docker下载redis镜像 docker pull redis 安装完成后,使用docker imag ...

  5. Redis——(主从复制、哨兵模式、集群)的部署及搭建

    Redis--(主从复制.哨兵模式.集群)的部署及搭建 重点: 主从复制:主从复制是高可用redis的基础,主从复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复. 哨兵和集群都是 ...

  6. Redis高可用之哨兵模式Sentinel配置与启动(五)

    0.Redis目录结构 1)Redis介绍及部署在CentOS7上(一) 2)Redis指令与数据结构(二) 3)Redis客户端连接以及持久化数据(三) 4)Redis高可用之主从复制实践(四) 5 ...

  7. Redis实战——redis主从备份和哨兵模式实践

    借鉴:http://redis.majunwei.com/topics/sentinel.html     https://blog.csdn.net/u011784767/article/detai ...

  8. 0030redis主从复制以及哨兵模式的搭建

    ------------------------------redis主从备份以及哨兵模式------------------------------------------------------- ...

  9. 《【面试突击】— Redis篇》-- Redis的主从复制?哨兵机制?

    能坚持别人不能坚持的,才能拥有别人未曾拥有的.关注左上角编程大道公众号,让我们一同坚持心中所想,一起成长!! <[面试突击]— Redis篇>-- Redis的主从复制?哨兵机制? 在这个 ...

  10. Redis 高可用之哨兵模式

    参考   : https://mp.weixin.qq.com/s/Z-PyNgiqYrm0ZYg0r6MVeQ 一.redis高可用解决方案 redis主从 优点:1.高可靠性,主从实时备份,有效解 ...

随机推荐

  1. Python上下文管理器你学会了吗?

    ​什么是上下文管理器 对于像文件操作.连接数据库等资源管理的操作,我们必须在使用完之后进行释放,不然就容易造成资源泄露.为了解决这个问题,Python的解决方式便是上下文管理器.上下文管理器能够帮助你 ...

  2. flask 的安装与使用

    一.Flask Flask 是一个轻量级的框架,可以将数据库中的数据呈现到页面上(动态网站). 之前搭建的网站是静态网站(没有连接数据库)页面的数据不会改变.但是现在用的网站都是动态网站. 1.下载F ...

  3. SEO优化:如何挖掘关键词谷歌篇

    最近SEO禅在做安卓项目比较忙,大部分入门理论的文章也写了差不多了,有的也写了一个系列,但是感觉还是不够完善,有很多边边角角的地方感觉也没说清楚,所以还是有必要写一些零散文章去补充说明下,就比如关于S ...

  4. C语言:数据类型转换 自动转换 强制转换

    数据类型转换就是将数据(变量.数值.表达式的结果等)从一种类型转换为另一种类型. 自动类型转换 自动类型转换就是编译器默默地.隐式地.偷偷地进行的数据类型转换,这种转换不需要程序员干预,会自动发生.1 ...

  5. C语言入门思路

    C语言编程入门 0.数学中的常数在编程语言中称为常量,是一直不变的.如1,2,'a',"abc",3456,34.56等1.变量:类似于数学中的未知数.实际上就是指可用内存的一块区 ...

  6. 使用vlookup的模糊匹配和字符串拼接

    1,=IF(ISNA(VLOOKUP("*"&$D2&"*",$A$2:$A$43,1,FALSE))=FALSE,TRUE,FALSE) 2, ...

  7. python -- os处理模块

    # --------------------------------# 使用os模块操作目录和文件# --------------------------------# getcwd() 获取当前目录 ...

  8. Docker的学习体验

    由于兴致使然,便想学习一点Docker技术.于是,写了这篇学习Docker的体会.笔拙,见谅. 第一件事--把网线插上 相信很多人都被官网的<Sample application>的 do ...

  9. 单细胞分析实录(18): 基于CellPhoneDB的细胞通讯分析及可视化 (上篇)

    细胞通讯分析可以给我们一些细胞类群之间相互调控/交流的信息,这种细胞之间的调控主要是通过受配体结合,传递信号来实现的.不同的分化.疾病过程,可能存在特异的细胞通讯关系,因此阐明这些通讯关系至关重要. ...

  10. Python开发篇——构建虚拟Python开发环境(Conda+Poetry)

    前言 之前虽略有提及Python,但是没有实际地写点料.惭愧,惭愧,所以这次先起个头,讲讲如何构建虚拟Python开发环境.相信之前看过我博客的人可能会想:博主不会又要聊聊Docker吧?放心,不会. ...