Redis-Sentinel搭建
1.简单介绍:
Redis sentinel自2.4+版本以后就自带了sentinel这个配置文件,sentinel主要功能就是为Redis M-S(master,slaves)集群提供了
1. master存活检测
2. 集群中M-S服务监控
3. 自动故障转移,M-S角色转换等能力,从一个方面说是提高了redis集群的可用性
解压: tar xf redis-3.0.2.tar.gz
编译:cd redis-3.0.2 make && make install
2.2 修改配置文件
cat /etc/redis/9400.conf
daemonize yes #后台运行
pidfile /var/run/redis_9400.pid #pid文件存放位置
port 9400 #端口号
bind 127.0.0.1 #绑定的主机IP地址
timeout 0 #当客户端闲置多长时间,关闭连接
tcp-keepalive 0 #tcp心跳检测,官方建议60秒
loglevel notice #日志等级
logfile /var/log/redis_9400.log #日志存放位置
databases 16 #设置数据库的数量
save 900 1 #900秒(15分钟)内有1个更改
save 300 10 #300秒(5分钟)内有10个更改
save 60 10000 #60秒(1分钟)内有10000个更改
stop-writes-on-bgsave-error yes #如果保存RDB失败则停止写操作
rdbcompression yes #指定本地存储是否压缩
rdbchecksum yes #是否效验rdb文件
dbfilename dump_9400.rdb #rdb保存文件的名字
dir /etc/redis/dump #rdb保存文件的目录
slave-serve-stale-data yes #当主挂了,从仍然应答,但数据可能是过时的。
slave-read-only yes #slave只读
slave-priority 100 #优先级
appendonly yes #aof是否开启
appendfilename “appendonly.aof” #aof文件名
appendfsync everysec #aof每秒同步一次
no-appendfsync-on-rewrite no #aof或rdb正在执行时重写,server是否支持同步
auto-aof-rewrite-percentage 100 #当前写入日志文件的大小占到初始日志文件大小的某个百分比时触发Rewrite
auto-aof-rewrite-min-size 64mb #本次Rewrite最小的写入数据量
lua-time-limit 5000 #执行一个LUA脚本时的最大时间
slowlog-log-slower-than 10000 #配置记录慢日志的条件,单位是微妙,当是负值时,关闭慢日志记录,当是0时,记录所有操作
slowlog-max-len 128 #配置记录慢查询的最大条数
hash-max-ziplist-entries 512 #指定在超过一定数量或者最大的元素超过某一临界值时,采用特用的Hash算法
hash-max-ziplist-value 64
list-max-ziplist-entries 512 #相同哈希值的列表可以用特殊的表示方式存储,以节约空间
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128 #节约内存
zset-max-ziplist-value 64
activerehashing yes #是否激活重置hash
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60 #slave客户端 buffer硬限制为256M,软限制为64MB/60秒就断开连接
client-output-buffer-limit pubsub 32mb 8mb 60
aof-rewrite-incremental-fsync yes #aof-rewrite过程中,是否采取增量文件同步策略,rewrite过程中,每32M数据进行一次文件同步,这样可以减少aof大文件写入对磁盘的操作次数
repl-backlog-size 1mb #slave增加备份,在buffer里用1M的空间记录同步的ID
repl-backlog-ttl 3600
repl-disable-tcp-nodelay yes #如果选择 "no" ,则发送数据到 slave 端的延迟会降低,但将使用更多的带宽用于复制,如果网络带宽比较大,可以设置No
2.3 修改从机的redis配置文件
pidfile "/var/run/redis9401.pid" daemonize yes port 9401 tcp-backlog 511 timeout 0 tcp-keepalive 0 loglevel notice logfile "/etc/redis/log/9401.log" databases 16 save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes rdbchecksum yes dbfilename "dump9401.rdb" dir "/etc/redis/dump" slaveof 127.0.0.1 9400 #主是9400端口 slave-serve-stale-data yes slave-read-only yes repl-diskless-sync no repl-disable-tcp-nodelay no slave-priority 100 appendonly no appendfilename "appendonly.aof" appendfsync everysec no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb aof-load-truncated yes lua-time-limit 5000 client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 aof-rewrite-incremental-fsync yes
2.4 查看redis集群状态
2.5 修改sentinel配置文件
redis本身就自带sentinel,所以不需要安装
cat /etc/redis/sentinel.conf port 5000 sentinel monitor mymaster 192.168.241.150 9400 2 #192.168.241.150是redis主的IP地址和端口,2是代表2个sentinel检测到异常,才判断是real fail. Mymaster主机组的名称可以随便定义 sentinel down-after-milliseconds mymaster 30000 #指定sentinel监控到redis实例持续异常多长时间后,会判决其状态为down。若实际业务需要sentinel尽快判决出redis实例异常,则可适当配小,单位是毫秒 sentinel can-failover mymaster yes #在sentinel检测到O_DOWN后,是否对这台redis启动failover机制 sentinel parallel-syncs mymaster 1 #执行故障转移时,最多可以有多少个从服务器同时对新的主服务器进行同步,这个数字越小,完成故障转移所需的时间就越长,但越大就意味着越多的从服务器因为复制而不可用。可以通过将这个值设为 1 来保证每次只有一个从服务器处于不能处理命令请求的状态。 sentinel failover-timeout mymaster 900000 #若sentinel在该配置值内未能完成failover操作(即故障时master/slave自动切换),则认为本次failover失败 sentinel auth-pass master1 rot@minunix #当redis访问都需要密码的时候,即在redis.conf有配置requirepass项的时候,需要定义此项 sentinel notification-script master1 /data/scripts/send_mail.sh #当sentinel触发时,切换主从状态时,需要执行的脚本。当主down的时候可以通知当事人, #sentinel notification-script: 为固定格式 #minunix: 为master-name ,可以随意定义,但在此文件中必须统一一致; #/data/scripts/send_mail.sh:脚本路径。
3.安装Sentinel
3.1 查看redis服务器主的在哪个IP上
可以发现主机在151的9402端口上,下面进行down端口切换测试
发现主机在151的9401端口上了,前后时差1秒的时间就切换过来了,非常的快
3.2 常用sentinel命令:
redis-cli -h 192.168.241.144 -p 5000 sentinel masters
redis-cli -p 5000 SENTINEL get-master-addr-by-name master1
SENTINEL get-master-addr-by-name master1
下面两个参数是在redis主从切换时,发挥的作用。
(1).如果你的Redis是作为缓存,在主从切换时,客户端仍然能够向Redis写,即使它的数据丢失。
(2).如果你的Redis是作为存储,在主从切换时,你需要配置系统以部分防止这个问题。
min-slaves-to-write 1
min-slaves-max-lag 10
3.3 Redis命令解释:
redis-server:Redis服务器的daemon启动程序
redis-cli:Redis命令行操作工具。也可以用telnet根据其纯文本协议来操作
redis-benchmark:Redis性能测试工具,测试Redis在当前系统下的读写性能
redis-check-aof:数据修复
redis-check-dump:检查导出工具
记得修改echo vm.overcommit_memory=1 >> /etc/sysctl.conf
使用数字含义:
0,表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1,表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2,表示内核允许分配超过所有物理内存和交换空间总和的内存
4. python程序测试redis
>>> from redis.sentinel import Sentinel >>> sentinel = Sentinel([('localhost',5000)], socket_timeout=0.1) >>> sentinel.discover_master('master1') ('192.168.241.151', 9402) >>> sentinel.discover_slaves('master1') [('192.168.241.151', 9401), ('192.168.241.151', 9400)] >>> master = sentinel.master_for('master1', socket_timeout=0.1) >>> slave = sentinel.slave_for('master1', socket_timeout=0.1) >>> master.set('foo', 'bar') True >>> slave.get('foo') 'bar' >>> slave.get('foo') 'bar' >>> sentinel.discover_master('master1') ('192.168.241.151', 9401)
Sentinel官方文档:http://redis.io/topics/sentinel