集群-缓存-Redis
Redis
简介:
Redis(全称:Remote Dictionary Server 远程字典服务)是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
Redis是一个key-value存储系统。
Redis 是一个高性能的key-value数据库。
Redis支持主从同步。
Redis的官网地址,非常好记,是redis.io。
redis作为缓存,不用太大的硬盘空间,但内存要大,假设tomcat要mysql数据,数据在redis缓存里有,可以直接要数据(百度)。硬盘装个系统就可以。
Redis哨兵(Sentinel)模式
哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。
假设主服务器宕机,哨兵1先检测到这个结果,系统并不会马上进行failover过程,仅仅是哨兵1主观的认为主服务器不可用,这个现象成为主观下线。当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行failover操作。切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为客观下线。这样对于客户端而言,一切都是透明的。
实验准备
在centos7环境部署redis哨兵集群:
172.16.0.51 redis1
172.16.0.52 redis2
172.16.0.53 redis3
[root@redis1 ~]# tail -3 /etc/hosts
172.16.0.51 redis1.up.com redis1
172.16.0.52 redis2.up.com redis2
172.16.0.53 redis3.up.com redis3
1. 安装redis
[root@redis1 ~]# lftp 172.16.0.99
lftp 172.16.0.99:~> cd scripts/
lftp 172.16.0.99:/scripts> get redis-3.0.5.sh
[root@redis1 ~]# chmod +x redis-3.0.5.sh
[root@redis1 ~]# ./redis-3.0.5.sh
2 3 同上
2. 修改配置文件
[root@redis1 ~]# cd /etc/redis/
[root@redis1 /etc/redis]# ls
6379.conf
[root@redis1 /etc/redis]# vim 6379.conf
71 bind 172.16.0.51 <---改
193 dir /var/lib/redis/6379 <---不需要改(264)
##落盘的目录
219 masterauth redhat <---改(294)
##master的验证密码
398 requirepass redhat <---改(508)
##redis的访问密码,可以复杂一点
510 appendonly yes <---改(700)
562 no-appendfsync-on-rewrite yes <---改(752)
在redis1上部署哨兵
[root@redis1 ~]# lftp 172.16.0.99
lftp 172.16.0.99:~> cd tar
cd ok, cwd=/tar
lftp 172.16.0.99:/tar> get redis-3.0.5.tar.gz
[root@redis1 ~]# tar zxf redis-3.0.5.tar.gz
[root@redis1 ~/redis-3.0.5]# cp sentinel.conf /etc/redis/
##配置文件
[root@redis1 ~/redis-3.0.5/src]# cp redis-sentinel /bin/
##启动命令
[root@redis1 ~/redis-3.0.5/src]# scp redis-sentinel 172.16.0.52:/bin/
[root@redis1 ~/redis-3.0.5/src]# scp redis-sentinel 172.16.0.53:/bin/
修改哨兵配置文件
[root@redis1 /etc/redis]# vim sentinel.conf
53 sentinel monitor master 172.16.0.51 6379 1 <---改 名字--IP--SLAVE数量(84)
##监控masterIP,集群存活的slave的最少数量是1个
73 sentinel auth-pass master redhat <---改(103)
##写入master的验证密码 <---对应上边设置的密码
82 sentinel down-after-milliseconds master 30000 <---改(113)
##master被哨兵认定为失效的时间间隔,ms
90 sentinel parallel-syncs master 1 <---改
##允许1个slave指向新的master
115 sentinel failover-timeout master 180000 <---改
##失效切换的超时时间,ms
将编辑好的配置文件发送给另外两台节点
[root@redis1 /etc/redis]# scp sentinel.conf 172.16.0.52:/etc/redis/
[root@redis1 /etc/redis]# scp sentinel.conf 172.16.0.53:/etc/redis/
[root@redis1 /etc/redis]# scp 6379.conf 172.16.0.52:/etc/redis/
[root@redis1 /etc/redis]# scp 6379.conf 172.16.0.53:/etc/redis/
redis2 修改配置文件:
[root@redis2 /etc/redis]# vim 6379.conf
71 bind 172.16.0.52 <---改成本机的IP(70)
212 slaveof 172.16.0.51 6379 <---改成redismaster的IP (287?)
redis3 修改配置文件:
[root@redis3 /etc/redis]# vim 6379.conf
71 bind 172.16.0.53 <---改成本机的IP
212 slaveof 172.16.0.51 6379 <---改成redismaster的IP
启动服务
[root@redis1 ~]# /etc/init.d/redis_6379 restart
[root@redis2 ~]# /etc/init.d/redis_6379 restart
[root@redis3 ~]# /etc/init.d/redis_6379 restart
[root@redis1 ~]# echo "/etc/init.d/redis_6379 restart" >> /etc/rc.local
[root@redis2 ~]# echo "/etc/init.d/redis_6379 restart" >> /etc/rc.local
[root@redis3 ~]# echo "/etc/init.d/redis_6379 restart" >> /etc/rc.local
启动哨兵:
master --> slave1 --> slave2
[root@redis1 ~]# /bin/redis-sentinel /etc/redis/sentinel.conf &
[root@redis2 ~]# /bin/redis-sentinel /etc/redis/sentinel.conf &
[root@redis3 ~]# /bin/redis-sentinel /etc/redis/sentinel.conf &
[root@redis1 ~]# echo "/bin/redis-sentinel /etc/redis/sentinel.conf &" >> /etc/rc.local
[root@redis2 ~]# echo "/bin/redis-sentinel /etc/redis/sentinel.conf &" >> /etc/rc.local
[root@redis3 ~]# echo "/bin/redis-sentinel /etc/redis/sentinel.conf &" >> /etc/rc.local
[root@redis1 ~]# chmod +x /etc/rc.d/rc.local
[root@redis2 ~]# chmod +x /etc/rc.d/rc.local
[root@redis3 ~]# chmod +x /etc/rc.d/rc.local
测试
查看3个redis的状态:
[root@redis1 ~]# redis-cli -h 172.16.0.51 -p 6379
172.16.0.51:6379> auth redhat <---验证账号
OK
172.16.0.51:6379> info replication <---查看主从信息
# Replication
role:master
connected_slaves:2
slave0:ip=172.16.0.52,port=6379,state=online,offset=125316,lag=1
slave1:ip=172.16.0.53,port=6379,state=online,offset=125316,lag=0
master_repl_offset:125316
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:125315
[root@redis2 ~]# redis-cli -h 172.16.0.52 -p 6379
[root@redis3 ~]# redis-cli -h 172.16.0.53 -p 6379
172.16.0.52:6379> auth redhat
OK
172.16.0.52:6379> info replication
# Replication
role:slave
master_host:172.16.0.51
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
牢固性测试
关掉master–redis1
其它节点中会有滚屏提示,然后某一节点会自动接管master;
再次启动redis1,redis1变为slave
配置文件说明
sentinel端口
port
#工作路径
dir "/usr/local/redis-6380"
# 守护进程模式
daemonize yes
# 指明日志文件名
logfile "./sentinel.log"
#哨兵监控的master,主从配置一样,在进行主从切换时6379会变成当前的master端口,
sentinel monitor mymaster
# master或slave多长时间(默认30秒)不能使用后标记为s_down状态。
sentinel down-after-milliseconds mymaster
#若sentinel在该配置值内未能完成failover操作(即故障时master/slave自动切换),则认为本次failover失败。
sentinel failover-timeout mymaster
#设置master和slaves验证密码
sentinel auth-pass mymaster
#哨兵程序自动添加的部分
# Generated by CONFIG REWRITE
sentinel config-epoch mymaster
sentinel leader-epoch mymaster
###指明了当前群集的从库的ip和端口,在主从切换时该值会改变
sentinel known-slave mymaster
###除了当前的哨兵还有哪些监控的哨兵
sentinel known-sentinel mymaster 7a88891a6147e202a53601ca16a3d438e9d55c9d
sentinel current-epoch
如果遇到主从不切换的情况
修改配置文件中115 sentinel failover-timeout master 180000 值
将180000缩小即可
Redis关闭方法有两种
第一种
ps -ef | grep -i redis
kill -9 PID
第二种
./bin/redis shutdown
centos7 启动时报“a start job is running for /etc/rc.d/rc.local compatibility”错误的问题
重启虚拟机 在引导界面按“e” 编辑第一个启动项,在“quiet”后加 systemd.unit=rescue.target (切换到单用户模式启动),按ctrl+x 启动 输入root密码 编辑一下rc.local,问题解决!