redis主从与哨兵模式
1、简述主从和哨兵的主要作用以及工作原理
1.1、Redis主从复制:
当用户往Master端写入数据时,通过Redis Sync机制将数据文件发送至Slave,Slave也会执行相同的操作确保数据一致。同时slave上还可以开启二级slave,三级slave从库。 Redis主从配置非常简单,只需要在Redis从库配置中指定slaveof ip port 即可,IP表示指定主库的ip,port表示redis监听端口
1.2、Redis哨兵模式:
redis主从虽然解决了单点导致的数据丢失问题,但是还是没有解决无缝的故障转移,也就是说在主库宕机后,从库无法自动切换为主库,需要手工去切换,在这一瞬间会对后端数据库造成极大的负载,可能直接导致后端数据宕机
环境:
master:192.168.146.131
slave: 192.168.146.132
2.1、搭建
#安装环境
yum install gcc-c++
#获取压缩包
wget http://download.redis.io/releases/redis-5.0.5.tar.gz
#解压
tar xf redis-5.0.5.tar.gz
#进入目录后开始安装
make PREFIX=/usr/local/redis install
#安装后的软件并没有自带配置文件,从源码包中获取一份拷贝至安装路径里并重命名进行分类:
mkdir /usr/local/reids/6379
cp redis-5.0.5/redis.conf /usr/local/redis/6379/6379.conf
#再用源码包里utils/install_server.sh的脚本定义端口及其相关文件路径
启动redis:/etc/init.d/redis_6379 start
停止redis:/etc/init.d/redis_6379 stop
重启redis:/etc/init.d/redis_6379 restart
进入redis:/usr/local/reids/bin/redis-cli
3.1、主从配置:
master配置:
###在配置文件中(/usr/local/redis/6379/6379.conf)修改守护进程是否在后台运行:
daemonize yes
##这里是设置当前系统所有的网卡都可以来访问redis服务,假设有两块网卡,就只能设置这两块网卡的IP地址,否则redis将无法启动
bind 0.0.0.0
#可选项:设置认证密码,从库需要指定master得密码才能完成同步,否则日志会有报错提示
requirepass "abc-123"
/etc/init.d/redis_6379 restart(重启redis服务)
slave配置:(配置文件)
###同master一样,配置守护进程后端运行与可连接redis的物理网卡IP地址
daemonize yes与bind 0.0.0.0
##假设master设置了认证密码,那么在配置文件中需要添加认证密码
masterauth "abc-123"
#在配置文件中写入隶属于master的主机IP地址及端口
slaveof 192.168.146.131 6379
或者
REPLICAOF 192.168.146.131 6379
#并重启redis服务
PS:也可在redis命令行中写入,直接生效,但服务重启后无效
再到redis的master中,用info replication查看,可以看出所连接到slave服务器的信息参数等
3.2、假设此时master中设置同步密码,而slave没有指定,则报以下错误:
3.3、日志分析
分析redis同步过程
4.1、哨兵模式:
master:192.168.146.131
slave: 192.168.146.132
slave: 192.168.146.133
4.1.1、配置主从
配置master,开启网卡监听,(可选设置密码):
vim /usr/local/redis/6379/6379.conf
bind 0.0.0.0
requirepass "abc-123"
##配置slave1,指定master
bind 0.0.0.0
replicaof 192.168.75.135 6379
masterauth " abc-123"
##配置slave2,指定master
bind 0.0.0.0
replicaof 192.168.75.135 6379
masterauth "abc-123"
#启动master和slave的redis服务:
/etc/init.d/redis_6379 restart
4.1.2、PS:此时做出启动、停止和重启操作将会出现下面情况
是因为redis启用安全认证,而配置了requirepass该配置后,对应也要修改启动和关闭的脚本,在脚本关闭处指定IP和密码参数,在修改redis配置文件服务脚本(vim etc/init.d/redis_6379)中,加入如下信息即可:(参数 -a 后是密码)
4.2、查看主从状态
详细:info replication
简略:role
输入密码后会出现一个警告,大致意思是在命令行界面上使用带有“-a”或“-u”选项的密码可能不安全,可以忽略,但有时候写脚本时,这串提醒会影响我们脚本的数据取值。这串告警,并不是普通的输出,通过head、tail、awk、sed等命令并不能过滤掉这行输出,问题原因:这串输出并不是普通输出,shell的标准输出包含两种,1(标准输出)2(标准错误)我们的命令,即包含1也包含2,2即是我们想要去除的提示。
解决办法:将标准错误去除,在尾部加入 2>/dev/null ,将标准错误丢弃即可
4.3、配置哨兵
master端配置sentinel:
将源码包中的哨兵配置文件( sentinel.conf)复制一份到redis文件路径中
修改配置文件:
vim /usr/local/redis/sentinel.conf
#绑定监听IP
bind 0.0.0.0
#监听端口
port 26379
# 后台运行
daemonize yes
pidfile /var/run/redis-sentinel.pid
# 哨兵得日志文件
logfile "sentinel.log"
# 日志文件存放路径
dir /usr/local/redis/
# 设置初始master以及法定认为下线人数:
sentinel monitor mymaster 192.168.75.135 6379 2
# master主观下线时间,默认30秒,30秒内没有回复pong,则认为下线了
sentinel down-after-milliseconds mymaster 30000
# 指定在故障转移期间,多少个slave向新的master同步得数量,如果slave
是提供查询服务,则应该设置小一点更好
sentinel parallel-syncs mymaster 1
# 指定故障转移超时时间,默认为3分钟
sentinel failover-timeout mymaster 180000
# 设置通知脚本,发生故障转移可以向管理员发送通知(可选)
sentinel notification-script mymaster
/usr/local/redis/notify.sh
# 禁止修改脚本,避免脚本重置
sentinel deny-scripts-reconfig yes
PS:/usr/local/redis/notify.sh(配置邮箱通知脚本)
4.4、master端配置sentinel
把配置好的sentinel配置文件直接复制过去,不要把启动后的配置文件发过去了:
启动哨兵:
/usr/local/redis/bin/redis-sentinel /usr/local/redis/sentinel.conf
4.5、登陆查看哨兵状态: