编译安装 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 yum -y groupinstall "Development Tools" yum -y install tcl wget http://download.redis.io/releases/redis-5.0.5.tar.gz tar xf redis-5.0.5.tar.gz cd redis-5.0.5/ make MALLOC=libc make install # 安装完之后会生成几个文件 redis-server:Redis服务器的daemon启动程序 redis-cli:Redis命令行操作工具。也可以用telnet根据其纯文本协议来操作 redis-benchmark:Redis性能测试工具,测试Redis在当前系统下的读写性能 redis-check-aof:数据修复 redis-check-dump:检查导出工具 redis-server # 启动 redis-cli # 进入redis命令行 redis> PING # 可以测试客户端和服务器连接是否正常、服务是否正常 # 内核参数,使内核分配所有物理内存 echo vm.overcommit_memory=1 >> /etc/sysctl.conf 0表示会申请,如果内存不够就拒绝 1表示允许超出物理内存 2表示允许超过物理内存和swap内存
redis自带的二进制命令
1 2 3 4 5 6 redis-benchmark 基准性能测试工具 redis-check-aof aof持久化时,对有问题的aof文件进行修复 redis-check-rdb rdb持久化时,对有问题的rdb文件进行修复 reids-sentinel 哨兵模式节点启动命令 redis-cli 客户端命令行工具 redis-server redis数据库启动命令
redis参数 /etc/redis.conf文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 bind 127.0.0.1 # 指定接受信息的网卡ip,这里是lo protected-mode yes # 禁止公网直接访问redis 如果要启用redis对外连接1.关闭protected-mode 2.启用时,配置访问密码或bind IP tcp-backlog 511 #tcp连接中已完成队列的长度;首先该值不能大于/proc/sys/net/core/somaxconn值 对于负载很大的服务程序来说,默认128太少。一般会将它修改为2048或者更大。在/etc/sysctl.conf中添加net.core.somaxconn = 2048,然后sysctl -p daemonize yes 是否以后台守护经常方式运行 pidfile /var/run/redis.pid pid文件路径 port 6379 监听端口,默认为6379 timeout 300 超时时间,如果为0就不会主动断开连接 loglevel verbose 日志级别,共支持四个级别,debug、verbose、notice、warning,默认为verbose Logfile "/var/log/redis/redis-8000.log" 日志记录方式,默认为标准输出,可指定文件 databases 16 开启的数据库数量,默认为16 save 持久化策略设置参数(将内存的数据写入磁盘) 需要根据实际情况进行修改 save 900 1 # 900 秒内如果至少有 1 个 key 的值变化,则保存 save 300 10 # 300 秒内如果至少有 10 个 key 的值变化,则保存 save 60 10000 # 60 秒内如果至少有 10000 个 key 的值变化,则保存 rdbcompression yes 存储至本地数据库时是否压缩数据,默认开启,使用LZF压缩 开启会消耗cpu时间,关闭会导致数据库文件变大 dbfilename dump.rdb 保存的数据文件(数据快照类型),.rdb就是redis的持久化的数据文件 dir ./ 数据快照存放的目录 slaveof 当本机为slave时,设置master的IP和port,redis启动时,会自动从master进行数据同步 appendonly no 是否开启appendonlylog,默认为no。 如果开启,每次写操作都会记录一条log到aof文件中,提高数据抗风险能力(更安全),但消耗大量CPU资源 redis默认情况下异步写入磁盘,如果不开启,可能在断电时导致一段时间内的数据丢失。因为redis本身同步数据是按照里面的save同步 appendfilename 指定更新日志的文件名,默认为appendnoly.aof appendfsync everysec 更新日志的方式,可选三种 no 使用操作系统进行数据缓存同步到磁盘——快速 always 每次更新后手动使用fsync()将数据写入磁盘——慢,安全 everysec 每秒同步一次 maxmemory 8G redis最大内存限制 redis启动时会将数据加载到内存中,达到最大内存后,redis会尝试清楚已到期的key,如果依然到达最大内存值,就无法进行写入 redis新的vm机制会把key放在内存,value存放到swap 由于bgsave的使用,所以一般不大于为机器物理内存的一半 maxclients 128 同一时间最大客户端连接数,默认无限制
redis操作 redis的订阅和发布 相当于是实时的生产者消费者模型,频道channel发布信息,通过subcribe方法来订阅
1 2 3 4 5 6 7 8 订阅一个频道 subcribe channel-1 在一个频道中发布信息 publish channel-1 11111 publish channel-1 wangsheng 所有订阅的频道都能收到发布的信息
redis慢查询
慢查询顾名思义就是很慢的查询,可能会导致客户端超时,所以要避免
慢查询日志:
慢查询日志是Redis服务端在命令执行前后计算每条命令的执行时长,当超过某个阈值是记录下来的日志。日志中记录了慢查询发生的时间,还有执行时长、具体什么命令等信息,它可以用来帮助开发和运维人员定位系统中存在的慢查询。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 获取慢查询日志 slowlog get slowlog get <number> 查询慢查询日志的条数 获取慢查询日志长度 slowlog len 相关参数: 记录的慢查询的阈值(单位微秒) slowlog-log-slower-than 默认值10000us即10ms,对于高ops场景建议设置1ms 慢查询日志存放的上限个数 slowlog-max -len 在线上环境中建议调大,比如到1000
save bgsave的区别 save同步回写 是一种阻塞主进程的连接方式 执行save时,客户端无法连接redis
bgsave异步回写 在执行时,会fork一个redis子进程 执行不影响redis对外连接,运行完成后会通知主进程来关闭子进程 这个子进程需要的内存与主进程一致,也就是双倍的内存
redis-cli info运行状态 redis-cli info会返回八大Server、Clients、Memory、Persistence、Stats、Replication、CPU、Keyspace 8个部分
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 # Server redis_version:5.0.5 # 版本 redis_git_sha1:00000000 redis_git_dirty:0 redis_build_id:c6c0379eeb4e9ac redis_mode:standalone os:Linux 3.10.0-1160.108.1.el7.x86_64 x86_64 # 内核版本 arch_bits:64 multiplexing_api:epoll atomicvar_api:atomic-builtin gcc_version:4.8.5 # gcc版本 process_id:5686 # redis的PID run_id:6f44cf692f2927c19eaa320f8690f25d057f8969 tcp_port:6379 uptime_in_seconds:52145 # 运行时间 uptime_in_days:0 # 运行天数 hz:10 configured_hz:10 lru_clock:8786470 executable:/root/redis-server config_file: # Clients connected_clients:1 # 连接的客户端数 client_recent_max_input_buffer:2 client_recent_max_output_buffer:0 blocked_clients:0 # 阻塞的客户端数 # Memory used_memory:912264 #redis分配器分配的内存总量 used_memory_human:890.88K used_memory_peak:912264 #redis消耗内存峰值 used_memory_peak_human:890.88K used_memory_lua:37888 # lua脚本占用的内存 used_memory_lua_human:37.00K mem_fragmentation_ratio:3.07 #内存碎片比率 mem_fragmentation_bytes:1784912 mem_not_counted_for_evict:0 mem_replication_backlog:0 mem_clients_slaves:0 mem_clients_normal:49694 mem_aof_buffer:0 mem_allocator:libc active_defrag_running:0 lazyfree_pending_objects:0 # Persistence 持久化状态 loading:0 rdb_changes_since_last_save:0 #上次rdb保存后改变key的次数 rdb_bgsave_in_progress:0 #当前是否在进行bgsave操作 rdb_last_save_time:1720010357 #上次保存rdb文件的时间戳 rdb_last_bgsave_status:ok #上次保存的状态 rdb_last_bgsave_time_sec:-1 #上次保存的耗时 rdb_current_bgsave_time_sec:-1 #保存rdb花费的时间 rdb_last_cow_size:0 #是否开启了aof功能 aof_enabled:0 aof_rewrite_in_progress:0 aof_rewrite_scheduled:0 aof_last_rewrite_time_sec:-1 aof_current_rewrite_time_sec:-1 aof_last_bgrewrite_status:ok aof_last_write_status:ok # aof_last_cow_size:0 # Stats total_connections_received:3 #连接过客户端总数量 total_commands_processed:4 #执行过的命令总数量 instantaneous_ops_per_sec:0 total_net_input_bytes:76 total_net_output_bytes:26170 instantaneous_input_kbps:0.00 instantaneous_output_kbps:0.00 rejected_connections:0 sync_full:0 sync_partial_ok:0 sync_partial_err:0 expired_keys:0 #过期的key总数量 expired_stale_perc:0.00 expired_time_cap_reached_count:0 evicted_keys:0 #删除过的key总数量 keyspace_hits:0 #命中的key数量 keyspace_misses:0 #未命中的key的数量 pubsub_channels:0 #使用中的频道数量 pubsub_patterns:0 #使用中的模式数量 latest_fork_usec:0 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 #当前是master还是slave # CPU used_cpu_sys:24.848952 #系统占用的cpu时间 used_cpu_user:16.777310 #用户占用的cpu时间 used_cpu_sys_children:0.000000 used_cpu_user_children:0.000000 # Keyspace 各个数据库的key的数量
对于内存 的监控,为used_memory(redis分配的内存)和 used_memory_peak(内存消耗峰值)设定报警阈值 对于rdb文件 的监控,为rdb_last_save_time(最近一次save操作时间),rdb_changes_since_last_save(举例上次save的时间)监控来计算丢失的数据量
内存不足导致数据丢失 硬件配置为4核,8G内存。redis持久话方案是RDB。redis使用的最大内存配置为6GB,在一次重启之后,redis只恢复了部分数据,这时查看redis.log文件。看见了如下的错误 [23635] 25 Jul 08:30:54.059【 # Can’t save in background: fork: Cannot allocate memory fork就说明使用bgsave
重启后redis启动时的警告: WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add ‘vm.overcommit_memory = 1’ to /etc/sysctl.conf and then reboot or run the command ‘sysctl vm.overcommit_memory=1’ for this to take effect.
原因 设置maxmemory为6G,使用bgsave时fork子进程,内存使用量最大到达12G 如果要过量使用内存,需要设置vm.overcommit_memory = 1
,并运行sysctl vm.overcommit_memory=1
,此时他会使用交换内存解决 修改maxmemory小于物理内存的一半;增加物理内存