Redis安全认证

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

  • protected-mode : yes/no,保护模式,是否只允许本地访问
vi /opt/redis_cluster/redis_6379/conf/redis_6379.conf

#指定IP进行监听
bind 10.0.0.51 127.0.0.1

#增加requirepass
requirepass 123456

添加以上内容后重启redis

#使用指定地址和auth进行密码验证
[root@db01 ~]# redis-cli -h 10.0.0.51
10.0.0.51:6379> set v1 v1
(error) NOAUTH Authentication required.
10.0.0.51:6379> auth 123456
OK
db01:6379> set v1 v1
OK

#使用命令行模式验证
[root@db01 ~]# redis-cli -h 10.0.0.51 get v1
(error) NOAUTH Authentication required.
[root@db01 ~]# redis-cli -h 10.0.0.51 -a 123456 get v1
"v1"

Redis主从复制

在分布式系统中为了解决单点问题,通常会把数据复制多个副本到其他机器,满足故障恢复和负载均衡等求.复制功能是高可用Redis的基础,后面的哨兵和集群都是在复制的基础上实现高可用的.

建立复制

每个从节点只能有一个主节点,主节点可以有多个从节点,配置复制的方式有三种

  1. 在配置文件中加入slaveof {masterHost} {masterPort}随redis启动生效
  2. 在redis-server启动命令后加入slaveof {masterHost} {masterPort}生效
  3. 直接使用命令slaveof {masterHost} {masterPort}生效

由于是编译安装,可以将/opt下的文件直接使用scp复制到其他主机相同位置解压后编译

#db01
cd /opt
tar -zcvf redis_cluster.tar.gz redis_cluster/
scp -rp /opt/redis_cluster.tar.gz  root@10.0.0.52:/opt
scp -rp /opt/redis_cluster.tar.gz  root@10.0.0.53:/opt

#db02,db03
cd /opt
tar -xf redis_cluster.tar.gz
cd /opt/redis_cluster/redis-3.2.9/
make install
#创建数据目录
mkdir /data/redis_cluster/redis_6379 -p
#分别修改配置文件为当前ip
sed -i "s/10.0.0.51/`ifconfig eth0|awk 'NR==2{print $2}'`/g" /opt/redis_cluster/redis_6379/conf/redis_6379.conf
#启动服务
redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf

查看日志

#db01,db02
tail -20 /opt/redis_cluster/redis_6379/logs/redis_6379.log

主从.png

使db02成为从库

#db02
redis-cli -h 10.0.0.52

#开启复制,db01需要配置hosts文件
#slaveof db01 6379
slaveof 10.0.0.52 6379

#验证数据
dbsize
#查看复制状态信息命令
Info replication

断开复制

Slaveof命令不但可以建立复制,还可以在从节点执行slave of no one来断开与主节点复制关系

  • 断开与主节点复制关系
  • 从节点晋升为主节点
  • 从节点断开复制后不会抛弃原有数据,只是无法再获取主节点上的数据变化.
#db02
redis-cli -h 10.0.0.52

#断开复制
slaveof no one

执行slaveof {newMasterIp} {newMasterPort}命令命令还可以实现切主操作,所谓切主是指把当前从节点对主节点的复制切换到另一个主节点.

线上操作一定要小心,因为切主后会清空之前所有的数据

  1. 断开与旧主节点的复制关系
  2. 与新主节点建立复制关系
  3. 删除从节点当前所有数据
  4. 对新主节点进行复制操作

Redis Sentinel(哨兵)

Redis的主从模式下,主节点一旦发生故障不能提供服务,需要人工干预,将从节点晋升为主节点,同时还需要修改客户端配置.对于很多应用场景这种方式无法接受.Sentinel(哨兵)架构解决了redis主从人工干预的问题.Redis Sentinel是redis的高可用实现方案,实际生产环境中,对提高整个系统可用性非常有帮助的.

哨兵主要功能

Redis Sentinel 是一个分布式系统, Redis Sentinel为Redis提供高可用性.可以在没有人为干预的情况下阻止某种类型的故障.

  • Redis的Sentinel系统用于管理多个Redis服务器(instance)该系统执行以下三个任务
  1. 监控(Monitoring):Sentinel 会不断地定期检查你的主服务器和从服务器是否运作正常.
  2. 提醒(Notification):当被监控的某个Redis服务器出现问题时,Sentinel可以通过API向管理员或者其他应用程序发送通知.
  3. 自动故障迁移(Automatic failover):当一个主服务器不能正常工作时,Sentinel会开始一次自动故障迁移操作,它会将失效主服务器的其中一个从服务器升级为新的主服务器,并让失效主服务器的其他从服务器改为复制新的主服务器.当客户端试图连接失效的主服务器时,集群也会向客户端返回新主服务器的地址,使得集群可以使用新主服务器代替失效服务器

哨兵示意图.png

目录规划

角色IP端口
Master10.0.0.516379
Sentinel-0110.0.0.5126379
Master10.0.0.526379
Sentinel-0210.0.0.5226379
Master10.0.0.536379
Sentinel-0310.0.0.5326379

安装配置命令

哨兵是基于主从复制,所以需要先部署好主从复制,建议使用ansible剧本批量部署

  • 配置文件解释
#mymaster主节点别名 主节点 ip 和端口,判断主节点失败,两个 sentinel 节点同意
sentinel monitor mymaster 10.0.0.51 6379 2
#选项指定了 Sentinel 认为服务器已经断线所需的毫秒数
sentinel down-after-milliseconds mymaster 30000
#向新的主节点发起复制操作的从节点个数,1轮询发起复制
sentinel parallel-syncs mymaster 1
#故障转移超时时间
sentinel failover-timeout mymaster 180000
  • db01
#db01

mkdir -p /data/redis_cluster/redis_26379
mkdir -p /opt/redis_cluster/redis_26379/{conf,pid,logs}
cat > /opt/redis_cluster/redis_26379/conf/redis_26379.conf << EOF
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
sentinel monitor mymaster 10.0.0.51 6379 2
sentinel down-after-milliseconds mymaster 3000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 18000
EOF
  • db02
#db02

mkdir -p /data/redis_cluster/redis_26379
mkdir -p /opt/redis_cluster/redis_26379/{conf,pid,logs}
cat > /opt/redis_cluster/redis_26379/conf/redis_26379.conf << EOF
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
sentinel monitor mymaster 10.0.0.51 6379 2
sentinel down-after-milliseconds mymaster 3000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 18000
EOF

#配置从库
echo 'slaveof 10.0.0.51 6379' >> /opt/redis_cluster/redis_6379/conf/redis_6379.conf
  • db03
#db03

mkdir -p /data/redis_cluster/redis_26379
mkdir -p /opt/redis_cluster/redis_26379/{conf,pid,logs}
cat > /opt/redis_cluster/redis_26379/conf/redis_26379.conf << EOF
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
sentinel monitor mymaster 10.0.0.51 6379 2
sentinel down-after-milliseconds mymaster 3000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 18000
EOF

#配置从库
echo 'slaveof 10.0.0.51 6379' >> /opt/redis_cluster/redis_6379/conf/redis_6379.conf

启动哨兵

#db01,db02,db03
redis-sentinel /opt/redis_cluster/redis_26379/conf/redis_26379.conf

查看配置文件的变化

  1. Sentinel节点自动发现了从节点,其余Sentinel节点
  2. 去掉了默认配置,例如parallel-syncs failover-timeout参数
  3. 添加了配置纪元相关参数
#配置文件有增有减主要是添加已知master节点和已知哨兵节点
cat /opt/redis_cluster/redis_26379/conf/redis_26379.conf

哨兵常用操作API

登录命令

redis-cli -h db01 -p 26379
redis-cli -h db02 -p 26379
redis-cli -h db03 -p 26379

Sentinel相关命令

#查看哨兵信息
Info Sentinel
#查看所有主节点信息
Sentinel masters
#查看主节点信息
Sentinel master <master name>
#查看从节点信息
Sentinel slaves <master name>
#查看主节点ip端口
Sentinel get-master-addr-by-name <master name>
#其他命令
Sentinel failover <master name>
Sentinel flushconfig

模拟故障转移

停掉其中1个节点,然后观察其他节点的日志变化,配置文件变化

#关闭网卡方式制造故障
systemctl stop network
#关闭进程方式制造故障
pkill redis

Redis Sentinel存在多个从节点时,如果想将指定的从节点晋升为主节点,可以将其他从节点的slavepriority配置为0,但是需要注意failover后,将slave-priority调回原值.

故障转移.png

  • CONFIG GET slave-priority : 查看权重
  • CONFIG SET slave-priority 0 : 设置权重为0
  • sentinel failover mymaster : 主动切换(主动触发故障转移)
#可以通过断网或者关闭进程使主节点不为db01,然后通过以下命令切回db01
#操作过程,因为主机互通以下操作可以在任意一台主机按顺序执行

#设置从节点权重为0
redis-cli -h db02 -p 6379 CONFIG SET slave-priority 0
redis-cli -h db03 -p 6379 CONFIG SET slave-priority 0
#主动触发故障转移
redis-cli -h db01 -p 26379 Sentinel failover mymaster
#将权重调回默认值
redis-cli -h db02 -p 6379 CONFIG SET slave-priority 100
redis-cli -h db03 -p 6379 CONFIG SET slave-priority 100
#查看结果
redis-cli -h db01 -p 26379 Sentinel masters