您的位置:首页 > 数据库 > Redis

redis总结3-持久化rdb,aof,运维命令,Sentinel监控

2017-09-29 23:49 696 查看
redis总结1-Redis简介、安装、集群

redis总结2-Redis六种数据类型命令总结(附命令实例)

redis总结3-持久化rdb,aof,运维命令,Sentinel监控

redis总结4-KEY设计技巧,常见问题

一.简介

1.1 NoSQL简介

1.1.2 NoSQL特点

1.1.3 NoSQL适用场景

1.2 Redis简介

1.2.1 简介

1.2.2 Redis具体适用场合

1.2.3 redis和memcached相比

1.2.4 redis,mysql,mongodb对比

二.安装

2.1 单机安装

2.2 设值环境变量及服务

2.3 安装后的目录结构

2.4 配置详解

2.5 集群

三 Redis命令

3.1 连接命令

3.1 Redis通用命令

3.2 Redis字符串操作

3.4 set集合相关命令

3.5 order set 有序集合

3.6 Hash哈希

四 Redis的持久化-RDB,AOF

4.1 持久化

持久化: 即把数据存储于断电后不会丢失的设备中,通常是硬盘.

常见的持久化方式:

主从:通过从服务器保存和持久化,如mongoDB的replication sets配置

日志记录:操作生成相关日志,并通过日志来恢复数据;

日志本身:couchDB对于数据内容,不修改,只追加,则文件本身就是日志,不会丢失数据.

4.2 redis持久化

Redis的持久化有2种方式:

1: 快照RDB (Redis DataBase)

2: 日志AOF (Append-only file)

Redis在早起的版本还存在虚拟内存的方法,现在已经被废弃

4.2.1 快照RDB

RDB 是在某个时间点将数据写入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的文件,达到数据恢复。(内存数据映像到硬盘上,持久化方法也通常叫做snapshots) .

4.2.1.1 RDB工作原理:

snapshot触发的时机,是有“间隔时间”和“变更次数”共同决定,同时符合时间和次数2个条件(每隔N分钟或N次写操作后)才会触发snapshot,否则“变更次数”会被继续累加到下一个“间隔时间”上。snapshot过程中并不阻塞客户端请求。从内存dump数据形成rdb文件(压缩与否),snapshot首先将数据写入临时文件,当成功结束后,将临时文件重名为dump.rdb,并放在备份目录。

4.2.1.2 优缺点

优点:使用单独子进程来进行持久化,主进程不会进行任何IO操作,保证了redis的高性能.

缺点:RDB是间隔一段时间进行持久化,如果持久化之间redis发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候.(如:在2个保存点之间,断电,将会丢失1-N分钟的数据)

4.2.1.3 RDB快照的配置选项(conf中)

//可以查看redis总结1中的conf配置

##snapshot触发的时机,save <seconds> <changes>
save 900 1      // 900内,有1条写入,则产生快照
save 300 1000   // 如果300秒内有1000次写入,则产生快照
save 60 10000  // 如果60秒内有10000次写入,则产生快照
(这3个选项都屏蔽,则rdb禁用)

dbfilename dump.rdb  //导出来的rdb文件名
dir ./  //rdb的放置路径
rdbcompression yes    // 导出的rdb文件是否压缩,默认为“yes”,压缩往往意味着“额外的cpu消耗”,同时也意味这较小的文件尺寸以及较短的网络传输时间

//后台备份进程出错时,主进程停不停止写入;当snapshot时出现错误无法继续时,是否阻塞客户端“变更操作”,“错误”可能因为磁盘已满/磁盘故障/OS级别异常等
stop-writes-on-bgsave-error yes
Rdbchecksum   yes //  导入rbd恢复时数据时,要不要检验rdb的完整性


4.2.1.4 RDB客户端命令:

//前台进行存储,
./redis-cli -h ip -p port save
./redis-cli  save   //本机操作
//后台进行存储,
./redis-cli -h ip -p port bgsave
./redis-cli  bgsave //本机操作

//由于redis是用一个主线程来处理所有client的请求,这种方式会阻塞所有client请求。所以不推荐使用。另一点需要注意的是,每次快照持久化都是将内存数据完整写入到磁盘一次,并不是增量的只同步脏数据。如果数据量大的话,而且写操作比较多,必然会引起大量的磁盘io操作,可能会严重影响性能。


出于对持久化的更精细要求,redis增添了aof方式 append only file

4.2.2 AOF

4.2.2.1 AOF工作原理

    Append-only file: 将“操作 + 数据”以格式化指令的方式追加到操作日志文件的尾部,在append操作返回后

(已经写入到文件或者即将写入),才进行实际的数据变更,“日志文件”保存了历史所有的操作过程;当server需要数据恢复时,可以直接replay此日志文件,即可还原所有的操作过程。AOF相对可靠,它和MySQL中bin.log、apache.log、zookeeper中txn-log简直异曲同工。AOF文件内容是字符串,非常容易阅读和解析。

  我们可以简单的认为AOF就是日志文件,此文件只会记录“变更操作”(例如:set/del等),如果server中持续的大量变更操作,将会导致AOF文件非常的庞大,意味着server失效后,数据恢复的过程将会很长;事实上,一条数据经过多次变更,将会产生多条AOF记录,其实只要保存当前的状态,历史的操作记录是可以抛弃的;因为AOF持久化模式还伴生了“AOF rewrite”。

    AOF的特性决定了它相对比较安全,如果你期望数据更少的丢失,那么可以采用AOF模式。如果AOF文件正在被写入时突然server失效,有可能导致文件的最后一次记录是不完整,你可以通过手工或者程序的方式去检测并修正不完整的记录,以便通过aof文件恢复能够正常;同时需要提醒,如果你的redis持久化手段中有aof,那么在server故障失效后再次启动前,需要检测aof文件的完整性。

4.2.2.2 AOF优缺点

优点:可以保持更高的数据完整性,如果设置追加file的时间是1s,如果redis发生故障,最多会丢失1s的数据;且如果日志写入不完整支持redis-check-aof来进行日志修复;AOF文件没被rewrite之前(文件过大时会对命令进行合并重写),可以删除其中的某些命令(比如误操作的flushall)。

缺点:AOF文件比RDB文件大,且恢复速度慢。

4.2.2.3 AOF的配置选项(conf中)

##是否打开 aof日志功能;##只有在“yes”下,aof重写/文件同步等特性才会生效
appendonly no
##指定aof文件名称
appendfilename appendonly.aof

##同步策略-三种
##指定aof操作中文件同步策略,有三个合法值:always everysec no,默认为everysec
##同步策略1-每1个命令,都立即同步到aof. 安全,速度慢
#每一条aof记录都立即同步到文件,这是最安全的方式,也以为更多的磁盘操作和阻塞延迟,是IO开支较大。
appendfsync always

##同步策略2-每秒同步一次,性能和安全都比较中庸的方式,也是redis推荐的方式。如果遇到物理服务器故障,有可能导致最近一秒内aof记录丢失(可能为部分丢失)。
# 折衷方案,每秒写1次
appendfsync everysec

##同步测了3-redis并不直接调用文件同步,而是交给操作系统来处理,操作系统可以根据buffer填充情况/通道空闲时间等择机触发同步;这是一种普通的文件操作方式。性能较好,在物理服务器故障时,数据丢失量会因OS配置有关。
# 写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到aof. 同步频率低,速度快,
appendfsync no

##在aof-rewrite期间,appendfsync是否暂缓文件同步,"no"表示“不暂缓”,“yes”表示“暂缓”,默认为“no”
no-appendfsync-on-rewrite  yes:

##aof文件rewrite触发的最小文件尺寸(mb,gb),只有大于此aof文件大于此尺寸是才会触发rewrite,默认“64mb”,建议“512mb”(aof文件,至少超过64M时,重写)
auto-aof-rewrite-min-size 64mb

##相对于“上一次”rewrite,本次rewrite触发时aof文件应该增长的百分比。
#aof文件大小比起上次重写时的大小,增长率100%时,重写
##每一次rewrite之后,redis都会记录下此时“新aof”文件的大小(例如A),那么当aof文件增长到A*(1 + p)之后
##触发下一次rewrite,每一次aof记录的添加,都会检测当前aof文件的尺寸。
auto-aof-rewrite-percentage 100


4.2.2.5 AOF rewrite

AOF rewrite 操作就是“压缩”AOF文件的过程,当然redis并没有采用“基于原aof文件”来重写的方式,而是采取了类似snapshot的方式:基于copy-on-write,全量遍历内存中数据,然后逐个序列到aof文件中。因此AOF rewrite能够正确反应当前内存数据的状态,这正是我们所需要的;rewrite过程中,对于新的变更操作将仍然被写入到原AOF文件中,同时这些新的变更操作也会被redis收集起来(buffer,copy-on-write方式下,最极端的可能是所有的key都在此期间被修改,将会耗费2倍内存),当内存数据被全部写入到新的aof文件之后,收集的新的变更操作也将会一并追加到新的aof文件中,此后将会重命名新的aof文件为appendonly.aof,此后所有的操作都将被写入新的aof文件。如果在rewrite过程中,出现故障,将不会影响原AOF文件的正常工作,只有当rewrite完成之后才会切换文件,因为rewrite过程是比较可靠的。

  触发rewrite的时机可以通过conf配置文件来声明,同时redis中可以通过bgrewriteaof指令人工干预。

redis-cli -h ip -p port bgrewriteaof


  因为rewrite操作/aof记录同步/snapshot都消耗磁盘IO,redis采取了“schedule”策略:无论是“人工干预”还是系统触发,snapshot和rewrite需要逐个被执行。

AOF rewrite过程并不阻塞客户端请求。系统会开启一个子进程来完成。

4.2.3 总结及常见问题

4.2.3.1 优缺点总结

AOF和RDB各有优缺点,这是有它们各自的特点所决定:

1) AOF更加安全,可以将数据更加及时的同步到文件中,但是AOF需要较多的磁盘IO开支,AOF文件尺寸较大,文件内容恢复数度相对较慢。

2) RDB,安全性较差,它是“正常时期”数据备份以及master-slave数据同步的最佳手段,文件尺寸较小,恢复数度较快。

4.2.3.2 使用建议

  a). 可以通过配置文件来指定它们中的一种,或者同时使用它们(不建议同时使用),或者全部禁用,在架构良好的环境中,master通常使用AOF,slave使用rdb,主要原因是master需要首先确保数据完整性,它作为数据备份的第一选择slave提供只读服务(目前slave只能提供读取服务),它的主要目的就是快速响应客户端read请求;

  b). 但是如果你的redis运行在网络稳定性差/物理环境糟糕情况下,建议你master和slave均采取AOF,这个在master和slave角色切换时,可以减少“人工数据备份”/“人工引导数据恢复”的时间成本;

  c).如果你的环境一切非常良好,且服务需要接收密集性的write操作,那么建议master采取rdb,而slave采用AOF。

4.2.3.2 常见问题

注: 在dump RDB,AOF如果停止同步,会不会丢失?

答: 不会,所有的操作缓存在内存的队列里, dump完成后,统一操作.

注: AOF重写是指什么?

答: AOF重写是指把内存中的数据,逆化成命令,写入到.aof日志里.

以解决 aof日志过大的问题.

问: 如果RDB文件,和AOF文件都存在,优先用谁来恢复数据?

答: AOF

问: 2种是否可以同时用?

答: 可以,而且推荐这么做

问: 恢复时RDB和AOF哪个恢复的快

答: RDB快,因为其是数据的内存映射,直接载入到内存,而AOF是命令,需要逐条执行

五.redis运维命令

5.1 常用命令

命令说明备注
time服务器端命令显示服务器时间:第一行时间戳(秒),第二行是该秒经过了的微秒数
dbsize当前数据库的key的数量
LASTSAVE上次保存时间
BGREWRITEAOF后台进程重写AOF
BGSAVE后台保存rdb快照
SAVE保存rdb快照
Flushall清空所有库所有键
Flushdb清空当前库所有键
Showdown[save/nosave]
Info [Replication/CPU/Memory..]查看redis服务器的信息
Config get 配置项获取配置项如:slowlog-log-slower-than
Config set 配置项 值设置配置项(特殊的选项,不允许用此命令设置,如slave-of, 需要用单独的slaveof命令来设置)
Slaveof master-Host port把当前实例设为master的slave
SLOWLOG显示服务器信息
MONITOR打开控制台
SYNC主从同步
CLIENT LIST客户端列表
CLIENT KILL关闭某个客户端
CLIENT SETNAME为客户端设置名字
CLIENT GETNAME获取客户端名字

5.2 注意事项及重要参数说明

5.2.1 如果不小心运行了flushall, 怎么办?

立即 shutdown nosave ,关闭服务器, 然后 手工编辑aof文件, 去掉文件中的 “flushall ”相关行, 然后开启服务器,就可以导入回原来数据. 如果,flushall之后,系统恰好bgrewriteaof了,那么aof就清空了,数据丢失.

5.2.2 怎么显示慢查询,多慢才叫慢?

答: Slowlog 显示慢查询,慢查询由slowlog-log-slower-than 10000 ,来指定,(单位是微秒)

5.2.3 服务器储存多少条慢查询的记录?

答: 由 slowlog-max-len 128 ,来做限制

5.2.4 通过命令设置的参数服务重启后还会生效吗?

答:不会,如果配置参数在conf中存在,然后通过config set 又重新设置了.如果redis服务重启,会使用conf配置文件中的配置. 不会使用config set的参数.

5.2.5 运行时更改master-slave

修改一台slave(设为A)为new master

1) 命令该服务不做其他redis服务的slave

命令: slaveof no one

2) 修改其readonly为yes

其他的slave再指向new master A

1) 命令该服务为new master A的slave

命令格式 slaveof IP port

5.2.6 Redis运维时需要注意的参数

1: 内存

Memory

used_memory:859192 数据结构的空间

used_memory_rss:7634944 实占空间

2: 主从复制

Replication

role:slave

master_host:192.168.1.128

master_port:6379

master_link_status:up

3:持久化

Persistence

rdb_changes_since_last_save:0

rdb_last_save_time:1375224063

4: fork耗时

Status

latest_fork_usec:936 上次导出rdb快照,持久化花费微秒

注意: 如果某实例有10G内容,导出需要2分钟,

每分钟写入10000次,导致不断的rdb导出,磁盘始处于高IO状态.

5: 慢日志

config get/set slowlog-log-slower-than

CONFIG get/SET slowlog-max-len

slowlog get N 获取慢日志

5.3 命令总结:

[root@bogon bin]# ./redis-cli
127.0.0.1:6379> time
1) "1504193711" //第一个字符串是当前时间(以 UNIX 时间戳格式表示)
2) "215301"     //而第二个字符串是当前这一秒钟已经逝去的微秒数。
127.0.0.1:6379>
127.0.0.1:6379> dbsize
(integer) 4
127.0.0.1:6379> lastsave
(integer) 1503825557
127.0.0.1:6379> BGREWRITEAOF
Background append only file rewriting started
127.0.0.1:6379> BGSAVE
Background saving started
127.0.0.1:6379>
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> flushall
OK
127.0.0.1:6379>
127.0.0.1:6379> shutdown
not connected> info [section]
[root@bogon bin]# ./redis-cli
Could not connect to Redis at 127.0.0.1:6379: Connection refused
Could not connect to Redis at 127.0.0.1:6379: Connection refused
not connected>

[root@bogon bin]# ./redis-cli
127.0.0.1:6379> info default //返回默认选择的信息
//注意info all 会多列出Commandstats,而info不会列出Commandstats信息
127.0.0.1:6379> info all
127.0.0.1:6379> info
# Server
redis_version:4.0.1 // Redis 服务器版本
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:4eb7abcd4e2d679
redis_mode:standalone
os:Linux 2.6.32-642.3.1.el6.x86_64 x86_64   // Redis 服务器的宿主操作系统
arch_bits:64    // 架构(32 或 64 位)
multiplexing_api:epoll  // Redis 所使用的事件处理机制
atomicvar_api:sync-builtin
gcc_version:4.4.7   //编译 Redis 时所使用的 GCC 版本
process_id:8723 //服务器进程的 PID
run_id:4679c264bd6214e740403ead64136ac725f49912 // Redis 服务器的随机标识符(用于 Sentinel 和集群)
tcp_port:6379 //TCP/IP 监听端口
uptime_in_seconds:390661    //自 Redis 服务器启动以来,经过的秒数
uptime_in_days:4 //自Redis 服务器启动以来,经过的天数
hz:10
lru_clock:11021702  //以分钟为单位进行自增的时钟,用于 LRU 管理
executable:/usr/local/redis/bin/redis-server
config_file:/usr/local/redis/conf/6379.conf

# Clients
connected_clients:1 //已连接客户端的数量(不包括通过从属服务器连接的客户端)
client_longest_output_list:0    // 当前连接的客户端当中,最长的输出列表
client_biggest_input_buf:0  //当前连接的客户端当中,最大输入缓存
blocked_clients:0   //正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客户端的数量

# Memory
used_memory:827824  //由Redis 分配器分配的内存总量,以字节(byte)为单位
used_memory_human:808.42K   //以人类可读的格式返回 Redis 分配的内存总量
used_memory_rss:5861376 //从操作系统的角度,返回 Redis 已分配的内存总量(俗称常驻集大小)。这个值和 top 、 ps 等命令的输出一致。
used_memory_rss_human:5.59M //人类刻度常驻内存大小
used_memory_peak:889912 //Redis 的内存消耗峰值(以字节为单位)
used_memory_peak_human:869.05K //人类可读峰值
used_memory_peak_perc:93.02%
used_memory_overhead:815246
used_memory_startup:765616
used_memory_dataset:12578
used_memory_dataset_perc:20.22%
total_system_memory:1036374016
total_system_memory_human:988.36M
used_memory_lua:37888   //Lua 引擎所使用的内存大小(以字节为单位)
used_memory_lua_human:37.00K//人类可读lua
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:7.08 //used_memory_rss 和 used_memory 之间的比率
mem_allocator:jemalloc-4.0.3// 在编译时指定的, Redis 所使用的内存分配器。可以是 libc 、 jemalloc 或者 tcmalloc 。
active_defrag_running:0
lazyfree_pending_objects:0

###
注意:
used_memory_rss 的值应该只比 used_memory 稍微高一点儿。
当 rss > used ,且两者的值相差较大时,表示存在(内部或外部的)内存碎片。
内存碎片的比率可以通过 mem_fragmentation_ratio 的值看出。
当 used > rss 时,表示 Redis 的部分内存被操作系统换出到交换空间了,在这种情况下,操作可能会产生明显的延迟。
当 Redis 释放内存时,分配器可能会,也可能不会,将内存返还给操作系统。
如果 Redis 释放了内存,却没有将内存返还给操作系统,那么 used_memory 的值可能和操作系统显示的 Redis 内存占用并不一致。
查看 used_memory_peak 的值可以验证这种情况是否发生。
###

# Persistence   //RDB 和 AOF 的相关信息
loading:0
rdb_changes_since_last_save:5   //上次rdb之后修改了几条信息
rdb_bgsave_in_progress:0
rdb_last_save_time:1504193912   //上次rdb的时间
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:0
rdb_current_bgsave_time_sec:-1
rdb_last_cow_size:4370432
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:0
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
aof_last_cow_size:4300800

# Stats//一般统计信息
total_connections_received:10
total_commands_processed:76
instantaneous_ops_per_sec:0
total_net_input_bytes:2593
total_net_output_bytes:103047
instantaneous_input_kbps:0.01
instantaneous_output_kbps:6.20
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:0
evicted_keys:0
keyspace_hits:16
keyspace_misses:5
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:1589   //上次导出rdb快照,持久化花费微秒
migrate_cached_sockets:0
slave_expires_tracked_keys:0
active_defrag_hits:0
active_defrag_misses:0
active_defrag_key_hits:0
active_defrag_key_misses:0

# Replication   // 主/从复制信息
role:master
connected_slaves:0
master_replid:81d07a765e5767c47c10c21014e88f9d01d7dbfe
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

# CPU   // CPU 计算量统计信息
used_cpu_sys:11.99
used_cpu_user:5.32
used_cpu_sys_children:0.21
used_cpu_user_children:0.02

# Commandstats
cmdstat_set:calls=1,usec=20,usec_per_call=20.00
cmdstat_keys:calls=1,usec=15,usec_per_call=15.00
cmdstat_auth:calls=4,usec=12,usec_per_call=3.00
cmdstat_psync:calls=2,usec=1583,usec_per_call=791.50
cmdstat_replconf:calls=1903323,usec=3283980,usec_per_call=1.73
cmdstat_info:calls=5,usec=17552,usec_per_call=3510.40
cmdstat_config:calls=1,usec=42,usec_per_call=42.00
cmdstat_time:calls=1,usec=3,usec_per_call=3.00

# Cluster   //Redis 集群信息
cluster_enabled:0

# Keyspace  //数据库相关的统计信息
127.0.0.1:6379>

///查看设置值,配置参数值
127.0.0.1:6379> config get slowlog-log-slower-than
1) "slowlog-log-slower-than"
2) "10000"
127.0.0.1:6379> config set slowlog-log-slower-than 15000
OK
127.0.0.1:6379>
127.0.0.1:6379> config get slowlog
(empty list or set)
127.0.0.1:6379> slowlog get 10
(empty list or set)
127.0.0.1:6379> config get slowlog-max-len
1) "slowlog-max-len"
2) "128"
127.0.0.1:6379> config set slowlog-max-len 256
OK
127.0.0.1:6379> config get slowlog-max-len  //注,这样配置在conf中也存在
1) "slowlog-max-len"
2) "256"
127.0.0.1:6379> config get slowlog-max-len  //注,这样配置在conf中也存在
1) "slowlog-max-len"
2) "256"
127.0.0.1:6379> config get appendaof
(empty list or set)
127.0.0.1:6379> config get timeout
1) "timeout"
2) "0"


5.4 config配置列表

Config get 配置项|获取配置项|如:slowlog-log-slower-than

Config set 配置项 值 |设置配置项|(特殊的选项,不允许用此命令设置,如slave-of, 需要用单独的slaveof命令来设置)

配置也在conf中存在如下:

# There is no limit to this length. Just be aware that it will consume memory.
# You can reclaim memory used by the slow log with SLOWLOG RESET.
slowlog-max-len 128


注意: 命令设置的参数,在服务重启后重新以conf配置为准.

[root@bogon bin]# ./redis-cli
127.0.0.1:6379> config get *
1) "dbfilename"
2) "dump.rdb"
3) "requirepass"
4) ""
5) "masterauth"
6) ""
7) "cluster-announce-ip"
8) ""
9) "unixsocket"
10) ""
11) "logfile"
12) ""
13) "pidfile"
14) ""
15) "slave-announce-ip"
16) ""
17) "maxmemory"
18) "0"
19) "maxmemory-samples"
20) "5"
21) "timeout"
22) "0"
23) "active-defrag-threshold-lower"
24) "10"
25) "active-defrag-threshold-upper"
26) "100"
27) "active-defrag-ignore-bytes"
28) "104857600"
29) "active-defrag-cycle-min"
30) "25"
31) "active-defrag-cycle-max"
32) "75"
33) "auto-aof-rewrite-percentage"
34) "100"
35) "auto-aof-rewrite-min-size"
36) "67108864"
37) "hash-max-ziplist-entries"
38) "512"
39) "hash-max-ziplist-value"
40) "64"
41) "list-max-ziplist-size"
42) "-2"
43) "list-compress-depth"
44) "0"
45) "set-max-intset-entries"
46) "512"
47) "zset-max-ziplist-entries"
48) "128"
49) "zset-max-ziplist-value"
50) "64"
51) "hll-sparse-max-bytes"
52) "3000"
53) "lua-time-limit"
54) "5000"
55) "slowlog-log-slower-than"
56) "10000"
57) "latency-monitor-threshold"
58) "0"
59) "slowlog-max-len"
60) "128"
61) "port"
62) "6379"
63) "cluster-announce-port"
64) "0"
65) "cluster-announce-bus-port"
66) "0"
67) "tcp-backlog"
68) "511"
69) "databases"
70) "16"
71) "repl-ping-slave-period"
72) "10"
73) "repl-timeout"
74) "60"
75) "repl-backlog-size"
76) "1048576"
77) "repl-backlog-ttl"
78) "3600"
79) "maxclients"
80) "10000"
81) "watchdog-period"
82) "0"
83) "slave-priority"
84) "100"
85) "slave-announce-port"
86) "0"
87) "min-slaves-to-write"
88) "0"
89) "min-slaves-max-lag"
90) "10"
91) "hz"
92) "10"
93) "cluster-node-timeout"
94) "15000"
95) "cluster-migration-barrier"
96) "1"
97) "cluster-slave-validity-factor"
98) "10"
99) "repl-diskless-sync-delay"
100) "5"
101) "tcp-keepalive"
102) "300"
103) "cluster-require-full-coverage"
104) "yes"
105) "no-appendfsync-on-rewrite"
106) "no"
107) "slave-serve-stale-data"
108) "yes"
109) "slave-read-only"
110) "yes"
111) "stop-writes-on-bgsave-error"
112) "yes"
113) "daemonize"
114) "no"
115) "rdbcompression"
116) "yes"
117) "rdbchecksum"
118) "yes"
119) "activerehashing"
120) "yes"
121) "activedefrag"
122) "no"
123) "protected-mode"
124) "yes"
125) "repl-disable-tcp-nodelay"
126) "no"
127) "repl-diskless-sync"
128) "no"
129) "aof-rewrite-incremental-fsync"
130) "yes"
131) "aof-load-truncated"
132) "yes"
133) "aof-use-rdb-preamble"
134) "no"
135) "lazyfree-lazy-eviction"
136) "no"
137) "lazyfree-lazy-expire"
138) "no"
139) "lazyfree-lazy-server-del"
140) "no"
141) "slave-lazy-flush"
142) "no"
143) "maxmemory-policy"
144) "noeviction"
145) "loglevel"
146) "notice"
147) "supervised"
148) "no"
149) "appendfsync"
150) "everysec"
151) "syslog-facility"
152) "local0"
153) "appendonly"
154) "no"
155) "dir"
156) "/usr/local/redis/bin"
157) "save"
158) "3600 1 300 100 60 10000"
159) "client-output-buffer-limit"
160) "normal 0 0 0 slave 268435456 67108864 60 pubsub 33554432 8388608 60"
161) "unixsocketperm"
162) "0"
163) "slaveof"
164) ""
165) "notify-keyspace-events"
166) ""
167) "bind"
168) ""
127.0.0.1:6379>

//查看集群信息
127.0.0.1:6379> info replication
#Replication
role:master
connected slaves:0


六. 运维监控 sentinel

6.1 概述

  Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端)都没有实现自动进行主备切换,而Redis-sentinel本身也是一个独立运行的进程,它能监控多个master-slave集群,发现master宕机后能进行自懂切换。

6.1.1 功能特点

不时地监控redis是否按照预期良好地运行;

如果发现某个redis节点运行出现状况,能够通知另外一个进程(例如它的客户端);

能够进行自动切换。当一个master节点不可用时,能够选举出master的多个slave(如果有超过一个slave的话)中的一个来作为新的master,其它的slave节点会将它所追随的master的地址改为被提升为master的slave的新地址。

6.1.2 原理

sentinel不断与master通信,获取master的slave信息.

监听master与slave的状态

如果某slave失效,直接通知master去除该slave.

如果master失效,,是按照slave优先级(可配置), 选取1个slave做 new master

,把其他slave–> new master

注意:sentinel没有独立的进程,功能是在和redis-server中启动的.

6.2 操作步骤

原本6379master;6380和6381都是6379的slave.

然后6379down掉,然后6380变为master,6381变为6380的slave

6.2.1 手工操作步骤

#如何从slave变为maseter
#1.从slave变为不是slave
127.0.0.1:6379>slaveof no one
OK
##2.1查看slave的读功能
127.0.0.1:6379>config get slave-read-only
1) "slave-read-only"
2) "yes"
##2.2修改readonly为no
127.0.0.1:6379>config set slave-read-only no
OK
##2.3查看确认
127.0.0.1:6379>config get slave-read-only
1) "slave-read-only"
2) "no"
## 2其它slave再指向新的master(new master A)
## 在其它slave上执行
>slaveof localhsot 6380


这么操作,但是需要人操作,Sentinel实现的就是自动完成这个过程.

6.2.2 Sentinel操作配置

////sentinel在slave中来监控master的.所以可以有一个权限
////配置entinel can-failover def_master的值为yes

//监控配置,监视127.0.0.1的6379端口.
//2和下面的30秒配合使用,如果2次发现30秒还连接失效才算失效.
//注意:def_master是为127.0.0.1 6379起的别名,后面的配置都会用到该别名.
sentinel monitor def_master 127.0.0.1 6379 2

sentinel auth-pass def_master 012_345^678-90

##master被当前sentinel实例认定为“失效”的间隔时间
##如果当前sentinel与master直接的通讯中,在指定时间内没有响应或者响应错误代码,那么
##当前sentinel就认为master失效(SDOWN,“主观”失效)
##<mastername> <millseconds>
##默认为30秒
sentinel down-after-milliseconds def_master 30000

##当前sentinel实例是否允许实施“failover”(故障转移)
##no表示当前sentinel为“观察者”(只参与"投票".不参与实施failover),
##全局中至少有一个为yes
sentinel can-failover def_master yes

#如果master挂了.然后会选择一个slave为master.如果其它(多个)slave同时指向新的master,
#那么新的master会负载过高,压力过大.该配置为执行同时几台slave来指向新的master,
#该配置为1,则为1台1台的来指向新的master
sentinel parallel-syncs mymas1ter 1

#做完这些事情的时间,如果不行,则执行脚本(脚本可以告警短信或邮件等通知).
sentinel failover-timeout mymaster 180000
##sentinel notification-script mymaster /var/redis/notify.sh

#多个slave时优先哪个为master挂了之后的心的maseter
#配置redis.conf(不是sentinel.conf配置)
#slave-priority 越小越优先,默认100
slave-priority 10


sentinel启动模式

##以哨兵模式启动redis服务.用sentinel.conf的哨兵配置
./bin/redis-server ./sentinel.conf --sentinel


配置解释:

port 26379 # 端口
sentinel monitor mymaster 127.0.0.1 6379 2 ,
给主机起的名字(不重即可), 当2个sentinel实例都认为master失效时,正式失效
sentinel down-after-milliseconds mymaster 30000  多少毫秒后连接不到master认为断开
sentinel can-failover mymaster yes #是否允许sentinel修改slave->master. 如为no,则只能监控,无权修改./
sentinel parallel-syncs mymaster 1 , 一次性修改几个slave指向新的new master.
sentinel client-reconfig-script mymaster /var/redis/reconfig.sh ,# 在重新配置new master,new slave过程,可以触发的脚本


6.2.3 配置实例

sentinel.conf

疑问: sentinel与master通信,如果某次因为master IO操作频繁,导致超时,此时,认为master失效,很武断.

解决: sentnel允许多个实例看守1个master, 当N台(N可设置)sentinel都认为master失效,才正式失效.

参考文章(包含sentinel集群)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  nosql redis