Redis 急速部署
前言:
需求的出现
在Web应用发展的初期,那时关系型数据库受到了较为广泛的关注和应用,原因是因为那时候Web站点基本上访问和并发不高、交互也较少。而在后来,随着访问量的提升,使用关系型数据库的Web站点多多少少都开始在性能上出现了一些瓶颈,而瓶颈的源头一般是在磁盘的I/O上。而随着互联网技术的进一步发展,各种类型的应用层出不穷,这导致在当今云计算、大数据盛行的时代,对性能有了更多的需求,主要体现在以下四个方面:
- 低延迟的读写速度:应用快速地反应能极大地提升用户的满意度
- 支撑海量的数据和流量:对于搜索这样大型应用而言,需要利用PB级别的数据和能应对百万级的流量
- 大规模集群的管理:系统管理员希望分布式应用能更简单的部署和管理
- 庞大运营成本的考量:IT部门希望在硬件成本、软件成本和人力成本能够有大幅度地降低
为了克服这一问题,NoSQL应运而生,它同时具备了高性能、可扩展性强、高可用等优点,受到广泛开发人员和仓库管理人员的青睐。
Redis是个啥
Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库,其具备如下特性:
- 基于内存运行,性能高效
- 支持分布式,理论上可以无限扩展
- key-value存储系统
- 开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API
相比于其他数据库类型,Redis具备的特点是:
- C/S通讯模型
- 单进程单线程模型
- 丰富的数据类型
- 操作具有原子性
- 持久化
- 高并发读写
- 支持lua脚本
应用场景?
Redis 的应用场景包括:缓存系统(“热点”数据:高频读、低频写)、计数器、消息队列系统、排行榜、社交网络和实时系统。
示范环境
centos 7
X.调优
| cat >>/etc/security/limits.conf <<EOF |
| * - nofile 10240 |
| EOF |
| |
| cat >>/etc/sysctl.conf <<EOF |
| net.core.somaxconn = 10240 |
| vm.overcommit_memory = 1 |
| EOF |
| |
| sysctl -p |
| |
| echo never > /sys/kernel/mm/transparent_hugepage/enabled |
| echo never > /sys/kernel/mm/transparent_hugepage/defrag |
| |
| |
| |
| if test -f /sys/kernel/mm/transparent_hugepage/enabled; then |
| echo never > /sys/kernel/mm/transparent_hugepage/enabled |
| fi |
| if test -f /sys/kernel/mm/transparent_hugepage/defrag; then |
| echo never > /sys/kernel/mm/transparent_hugepage/defrag |
| fi |
A.下载&& 编译
| mkdir /opt/source_package && cd /opt/source_package |
| wget https://github.com/redis/redis/archive/7.0.11.tar.gz && tar -zxvf redis*.tar.gz |
| cd redis-7.0.11 && make |
B.拷贝二进制文件与config文件
| mkdir -p /usr/local/redis/{config,bin,logs,run} |
| mkdir -p /data/redis-6379/ |
| cp src/redis-* /usr/local/redis/bin/ |
| rm -f /usr/local/redis/bin/*.c /usr/local/redis/bin/*.o |
| cp redis.conf /usr/local/redis/config/ |
C.版本检查
| /usr/local/redis/bin/redis-server --version |
| /usr/local/redis/bin/redis-cli --version |
| ln -s /usr/local/redis/bin/redis-cli /usr/local/bin/ |
| ln -s /usr/local/redis/bin/redis-server /usr/local/bin/ |
| ln -s /usr/local/redis/bin/redis-sentinel /usr/local/bin/ |
| redis-cli --version |
D.配置设定
| mkdir /usr/local/redis/config/bak |
| cp /usr/local/redis/config/*.conf /usr/local/redis/config/bak |
| |
| cat >/usr/local/redis/config/redis.conf <<EOF |
| protected-mode no |
| port 6379 |
| tcp-backlog 511 |
| timeout 0 |
| tcp-keepalive 300 |
| daemonize yes |
| pidfile /usr/local/redis/run/redis_6379.pid |
| loglevel notice |
| logfile "/usr/local/redis/logs/6379.log" |
| databases 16 |
| always-show-logo no |
| set-proc-title yes |
| proc-title-template "{title} {listen-addr} {server-mode}" |
| stop-writes-on-bgsave-error yes |
| rdbcompression yes |
| rdbchecksum yes |
| dbfilename dump.rdb |
| rdb-del-sync-files no |
| dir /data/redis-6379/ |
| replica-serve-stale-data yes |
| replica-read-only yes |
| repl-diskless-sync yes |
| repl-diskless-sync-delay 5 |
| repl-diskless-sync-max-replicas 0 |
| repl-diskless-load disabled |
| repl-disable-tcp-nodelay no |
| replica-priority 100 |
| acllog-max-len 128 |
| requirepass UvENxDe5MwjC5hTeYoJqKPfEstbcro5e |
| maxmemory 3071000000 |
| lazyfree-lazy-eviction no |
| lazyfree-lazy-expire no |
| lazyfree-lazy-server-del no |
| replica-lazy-flush no |
| lazyfree-lazy-user-del no |
| lazyfree-lazy-user-flush no |
| oom-score-adj no |
| oom-score-adj-values 0 200 800 |
| disable-thp yes |
| appendonly no |
| appendfilename "appendonly.aof" |
| appenddirname "appendonlydir" |
| appendfsync everysec |
| no-appendfsync-on-rewrite no |
| auto-aof-rewrite-percentage 100 |
| auto-aof-rewrite-min-size 64mb |
| aof-load-truncated yes |
| aof-use-rdb-preamble yes |
| aof-timestamp-enabled no |
| |
| slowlog-log-slower-than 10000 |
| slowlog-max-len 128 |
| latency-monitor-threshold 0 |
| notify-keyspace-events "" |
| hash-max-listpack-entries 512 |
| hash-max-listpack-value 64 |
| list-max-listpack-size -2 |
| list-compress-depth 0 |
| set-max-intset-entries 512 |
| zset-max-listpack-entries 128 |
| zset-max-listpack-value 64 |
| hll-sparse-max-bytes 3000 |
| stream-node-max-bytes 4096 |
| stream-node-max-entries 100 |
| activerehashing yes |
| client-output-buffer-limit normal 0 0 0 |
| client-output-buffer-limit replica 256mb 64mb 60 |
| client-output-buffer-limit pubsub 32mb 8mb 60 |
| hz 10 |
| dynamic-hz yes |
| aof-rewrite-incremental-fsync yes |
| rdb-save-incremental-fsync yes |
| jemalloc-bg-thread yes |
| EOF |
E.启动脚本
| #!/bin/bash |
| |
| start(){ |
| cd /usr/local/redis/bin |
| ./redis-server ../config/redis.conf |
| pid=`ss -anplt| awk -F ',' '/redis/{print $2}'|egrep -o '[0-9]{4}' |uniq` |
| [[ -n `ss -anplt | grep redis` ]] && echo -e "redis start suceefully\npid is $pid"; |
| [[ -z `ss -anplt | grep redis` ]] && echo "redis start failed" |
| } |
| |
| stop(){ |
| pid=`ss -anplt| awk -F ',' '/redis/{print $2}'|egrep -o '[0-9]{4}' |uniq` |
| kill -9 $pid 1>&2 2>/dev/null |
| [[ -z `ss -anplt | grep redis` ]] && echo "redis is stoped" |
| } |
| |
| restart(){ |
| stop |
| start |
| } |
| |
| |
| |
| if [[ $1 == "start" ]];then |
| if [[ -n `ss -anplt| awk -F ',' '/redis/{print $2}'|egrep -o '[0-9]{4}' |uniq` ]];then |
| echo "redis 6379 was exist";exit |
| else |
| start |
| fi |
| elif [[ $1 == "stop" ]];then |
| stop |
| elif [[ $1 == "restart" ]];then |
| restart |
| else |
| echo "Usage : redis [start|stop|restart] " |
| fi |
F.哨兵模式
f1-架构预览
概述
监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过API向管理员或者其他应用程序发送通知。
自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时,Sentinel会开始一次自动故障转移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器。
当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址,使得集群可以使用新主服务器代替失效服务器。

F 大节的演示将以图例的架构、部署3个节点/实例的集群
sentinel 集群是至少三个节点的。
192.168.8.82:6379 |
Master |
192.168.8.82:6380 |
Slave |
192.168.8.82:6381 |
Slave |
f2.redis 单、多节点的实例准备
f2-0.单节点部署
多开很简单,可以用redis-server指定不同的配置文件来启动多个实例,实现应用多开。
| cd /usr/local/redis/bin && ./redis-server ../config/redis-6379.conf |
| cd /usr/local/redis/bin && ./redis-server ../config/redis-6380.conf |
| cd /usr/local/redis/bin && ./redis-server ../config/redis-6381.conf |
| ··· |
也可以直接拷贝多份redis,修改配置文件后分别启动
| cp -rfp /usr/local/redis/ /usr/local/redis-6380 |
| cp -rfp /usr/local/redis/ /usr/local/redis-6381 |
| |
| vim /usr/local/redis-6380/config/redis.conf |
| vim /usr/local/redis-6381/config/redis.conf |
f2-1.多节点部署
不同节点部署、把正常运行的redis目录整个拷贝到对端、并修改配置文件即可
如果对端是不同架构的操作系统、则重复 X 、A、B、C、D、E 节的操作即可
f3.配置准备
| |
| cd /usr/local |
| cp -rfp redis/ redis-6379 |
| cp -rfp redis-6379/ redis-6380 |
| cp -rfp redis-6379/ redis-6381 |
| |
| |
| scp -r /usr/local/redis/ node_host@USER:/usr/local/ |
note:
master端做好requirepass 即可,其余不怎么需要更改、注意bind地址和端口就可以;slave端需要将requirepass 改成masterauth、增加slaveof项
| |
| vim /usr/local/redis-6380/config/redis.conf |
| vim /usr/local/redis-6381/config/redis.conf |
| |
| |
| daemonize yes |
| protected-mode no |
| pid |
| logs |
| dir |
| port xxxx |
| bind xxx.xxx.xxx.xxx |
| slaveof master_ip master_port |
| masterauth xxxxxxxxxxxxxxxxxxxxxxxxxxx |
f4.cluster 启动
启动实例
命令:redis-server /实例配置文件路径/redis.conf
| |
| |
| cd /usr/local/redis-6379/bin && ./redis-server ../config/redis.conf |
| cd /usr/local/redis-6380/bin && ./redis-server ../config/redis.conf |
| cd /usr/local/redis-6381/bin && ./redis-server ../config/redis.conf |
| |
| |
| cd /usr/local/redis/bin && ./redis-server ../config/redis.conf |
| |
| |
| |
| LISTEN 0 511 *:6379 *:* users:(("redis-server",pid=11394,fd=6)) |
| LISTEN 0 511 *:6381 *:* users:(("redis-server",pid=12303,fd=6)) |
| LISTEN 0 511 *:6380 *:* users:(("redis-server",pid=12270,fd=6)) |
| LISTEN 0 511 [::]:6379 [::]:* users:(("redis-server",pid=11394,fd=7)) |
| LISTEN 0 511 [::]:6381 [::]:* users:(("redis-server",pid=12303,fd=7)) |
| LISTEN 0 511 [::]:6380 [::]:* users:(("redis-server",pid=12270,fd=7)) |
验证master检查集群状态
命令:redis-cli -h master_地址 -p master_端口 -a 认证密码
命令:INFO replication
| redis-cli -h 192.168.8.82 -p 6379 -a UvENxDe5MwjC5hTeYoJqKPfEstbcro5e |
| 192.168.8.82:6379> INFO replication |
| |
| |
| role:master |
| connected_slaves:2 |
| slave0:ip=192.168.8.82,port=6380,state=online,offset=238,lag=0 |
| slave1:ip=192.168.8.82,port=6381,state=online,offset=238,lag=1 |
| master_failover_state:no-failover |
| master_replid:31c52d075d24425cf1259d6d36a583f74344df5f |
| master_replid2:0000000000000000000000000000000000000000 |
| master_repl_offset:238 |
| second_repl_offset:-1 |
| repl_backlog_active:1 |
| repl_backlog_size:1048576 |
| repl_backlog_first_byte_offset:1 |
| repl_backlog_histlen:238 |
| |
| |
f5.sentinel 部署
f5-1.配置文件编写
note: 配置大致是一样的、先配置好一个,然后分发给其它节点上做微调,单点多实例的配置注意区别端口!
| mkdir /data/{redis-26379,redis-26380,redis-26381} |
| cat >> /usr/local/redis-6379/config/sentinel.conf <<EOF |
| |
| protected-mode no |
| port 26379 |
| daemonize yes |
| pidfile /usr/local/redis-6379/run/redis-sentinel.pid |
| dir /data/redis-26379 |
| logfile /usr/local/redis-6379/logs/redis-sentinel.log |
| |
| |
| |
| sentinel monitor mymaster 192.168.8.82 6379 2 |
| |
| |
| sentinel auth-pass mymaster UvENxDe5MwjC5hTeYoJqKPfEstbcro5e |
| |
| |
| sentinel down-after-milliseconds mymaster 3000 |
| |
| |
| sentinel parallel-syncs mymaster 1 |
| |
| EOF |
f5-2.哨兵、启动!
命令:redis-sentinel /配置文件路径/sentinel.conf
| 启动全部实例: |
| cd /usr/local/redis-6379/bin && redis-sentinel ../config/sentinel.conf |
| cd /usr/local/redis-6380/bin && redis-sentinel ../config/sentinel.conf |
| cd /usr/local/redis-6381/bin && redis-sentinel ../config/sentinel.conf |
| |
| [root@redis bin] |
| LISTEN 0 511 *:26379 *:* users:(("redis-sentinel",pid=17832,fd=6)) |
| LISTEN 0 511 *:26381 *:* users:(("redis-sentinel",pid=17937,fd=6)) |
| LISTEN 0 511 *:26380 *:* users:(("redis-sentinel",pid=17911,fd=6)) |
| LISTEN 0 511 [::]:26379 [::]:* users:(("redis-sentinel",pid=17832,fd=7)) |
| LISTEN 0 511 [::]:26381 [::]:* users:(("redis-sentinel",pid=17937,fd=7)) |
| LISTEN 0 511 [::]:26380 [::]:* users:(("redis-sentinel",pid=17911,fd=7)) |
f5-3.sentinel 集群检查
命令:redis-cli -h master_地址 -p master_端口
| redis-cli -h 192.168.8.82 -p 26379 |
| |
| |
| # 检查master |
| sentinel master mymaster |
| |
| # 检查slaves |
| sentinel slavers mymaster |
| |
| # 检查sentinels |
| sentinel sentinels mymaster |
G.常用命令
| PING - 这个命令简单的返回 PONE。 |
| SENTINEL masters - 展示监控的 master 清单和它们的状态。 |
| SENTINEL master [master name] - 展示指定 master 的状态和信息。 |
| SENTINEL slaves [master name] - 展示 master 的 slave 清单和它们的状态。 |
| SENTINEL sentinels [master name] - 展示 master 的 sentinel 实例的清单和它们的状态。 |
| SENTINEL get-master-addr-by-name [master name] - 返回 master 的 IP 和端口。如果故障转移在处理中或成功终止,返回晋升的 slave 的 IP 和端口。 |
| SENTINEL reset [pattern] - 这个命令将重置所有匹配名字的 masters。参数是 blog 风格的。重置的过程清空 master 的所有状态,并移除已经发现和关联 master 的所有 slave 和 sentinel。 |
| SENTINEL failover [master name] - 如果 master 不可到达,强制执行一个故障转移,而不征求其他 Sentinel 的同意。 |
| SENTINEL ckquorum [master name] - 检查当前的 Sentinel 配置是否能够到达故障转移需要的法定人数,并且需要授权故障转移的多数。这个命令应该用于监控系统检查部署是否正确。 |
| SENTINEL flushconfig - 强制 Sentinel 在磁盘上重写它的配置,包括当前的 Sentinel 状态。通常 Sentinel 每次重写配置改变它的状态。然而有时由于操作错误、硬盘故障、包升级脚本或配置管理器可能导致配置文件丢失。在这种情况下收到强制 Sentinel 重写配置文件。这个命令即使上面的配置文件完全不见了。 |
Z.附录
z1.redis配置详解
z1-0.NETWORK
| # |
| |
| # 指定 redis 只接收来自于该IP地址的请求,如果不进行设置,那么将处理所有请求 |
| bind 127.0.0.1 |
| |
| #是否开启保护模式,默认开启。要是配置里没有指定bind和密码。 |
| protected-mode yes |
| |
| #redis监听的端口号 |
| port 6379 |
| |
| #此参数确定了TCP连接中已完成队列(完成三次握手之后)的长度, 当然此值必须不大于Linux系统定义的/proc/sys/net/core/somaxconn值,默认是511,而Linux的默认参数值是128。 |
| tcp-backlog 511 |
| |
| #此参数为设置客户端空闲超过timeout,服务端会断开连接,为0则服务端不会主动断开连接,不能小于0 |
| timeout 0 |
| |
| #tcp keepalive参数。如果设置不为0,就使用配置tcp的SO_KEEPALIVE值,使用keepalive有两个好处:检测挂掉的对端。降低中间设备出问题而导致网络看似连接却已经与对端端口的问题。在Linux内核中,设置了keepalive,redis会定时给对端发送ack。 |
| tcp-keepalive 300 |
| |
| #是否在后台执行,yes:后台运行;no:不是后台运行 |
| daemonize yes |
| |
| #redis的进程文件 |
| pidfile /var/run/redis/redis.pid |
| |
| #指定了服务端日志的级别。级别包括:debug(很多信息,方便开发、测试),verbose(许多有用的信息,但是没有debug级别信息多),notice(适当的日志级别,适合生产环境),warn(只有非常重要的信息) |
| loglevel notice |
| |
| #指定了记录日志的文件。空字符串的话,日志会打印到标准输出设备。后台运行的redis标准输出是/dev/null |
| logfile /usr/local/redis/var/redis.log |
| |
| |
| #是否打开记录syslog功能 |
| # syslog-enabled no |
| |
| #syslog的标识符。 |
| # syslog-ident redis |
| |
| #日志的来源、设备 |
| # syslog-facility local0 |
| |
| #数据库的数量,默认使用的数据库是0。可以通过”SELECT 【数据库序号】“命令选择一个数据库,序号从0开始 |
| databases 16 |
z1-1.SNAPSHOTTING
| # |
| |
| #RDB核心规则配置 save <指定时间间隔> <执行指定次数更新操作>,满足条件就将内存中的数据同步到硬盘中。 |
| #若不想用RDB方案,可以把 save "" 的注释打开,下面三个注释 |
| save 900 1 |
| save 300 10 |
| save 60 10000 |
| |
| #当RDB持久化出现错误后,是否依然进行继续进行工作,yes:不能进行工作,no:可以继续进行工作,可以通过info中的rdb_last_bgsave_status了解RDB持久化是否有错误 |
| stop-writes-on-bgsave-error yes |
| |
| #配置存储至本地数据库时是否压缩数据,默认为yes。Redis采用LZF压缩方式,但占用了一点CPU的时间。 |
| rdbcompression yes |
| |
| #是否校验rdb文件;从rdb格式的第五个版本开始,在rdb文件的末尾会带上CRC64的校验和。 |
| rdbchecksum yes |
| |
| #指定本地数据库文件名,一般采用默认的 dump.rdb |
| dbfilename dump.rdb |
| |
| #数据目录,数据库的写入会在这个目录。rdb、aof文件也会写在这个目录 |
| dir /usr/local/redis/var |
z1-2.REPLICATION
| # |
| |
| # 复制选项,slave复制对应的master。 |
| # replicaof <masterip> <masterport> |
| |
| #如果master设置了requirepass,那么slave要连上master,需要有master的密码才行。 |
| #masterauth就是用来配置master的密码,这样可以在连上master后进行认证。 |
| # masterauth <master-password> |
| |
| #当从库同主机失去连接或者复制正在进行,从机库有两种运行方式: |
| #1) 如果slave-serve-stale-data设置为yes(默认设置),从库会继续响应客户端的请求。 |
| #2) 如果slave-serve-stale-data设置为no,INFO,replicaOF, AUTH, PING, SHUTDOWN, REPLCONF, ROLE, CONFIG,SUBSCRIBE, UNSUBSCRIBE, |
| #PSUBSCRIBE, PUNSUBSCRIBE, PUBLISH, PUBSUB,COMMAND, POST, HOST: and LATENCY命令之外的任何请求都会返回一个错误”SYNC with master in progress”。 |
| replica-serve-stale-data yes |
| |
| #作为从服务器,默认情况下是只读的(yes),可以修改成NO,用于写(不建议) |
| #replica-read-only yes |
| |
| # 是否使用socket方式复制数据。目前redis复制提供两种方式,disk和socket。 |
| #如果新的slave连上来或者重连的slave无法部分同步,就会执行全量同步,master会生成rdb文件。 |
| #有2种方式: |
| #disk方式是master创建一个新的进程把rdb文件保存到磁盘,再把磁盘上的rdb文件传递给slave。disk方式的时候,当一个rdb保存的过程中,多个slave都能共享这个rdb文件。 |
| #socket是master创建一个新的进程,直接把rdb文件以socket的方式发给slave。socket的方式就的一个个slave顺序复制。 |
| #在磁盘速度缓慢,网速快的情况下推荐用socket方式。 |
| repl-diskless-sync no |
| #diskless复制的延迟时间,防止设置为0。一旦复制开始,节点不会再接收新slave的复制请求直到下一个rdb传输。 |
| 所以最好等待一段时间,等更多的slave连上来 |
| repl-diskless-sync-delay 5 |
| |
| #slave根据指定的时间间隔向服务器发送ping请求。时间间隔可以通过 repl_ping_slave_period 来设置,默认10秒。 |
| # repl-ping-slave-period 10 |
| |
| # 复制连接超时时间。master和slave都有超时时间的设置。 |
| # repl-timeout 60 |
| |
| #是否禁止复制tcp链接的tcp nodelay参数,可传递yes或者no。默认是no,即使用tcp nodelay。 |
| repl-disable-tcp-nodelay no |
| |
| #复制缓冲区大小,这是一个环形复制缓冲区,用来保存最新复制的命令。 |
| # repl-backlog-size 1mb |
| |
| # master没有slave一段时间会释放复制缓冲区的内存,repl-backlog-ttl用来设置该时间长度。单位为秒。 |
| # repl-backlog-ttl 3600 |
| |
| # 当master不可用,Sentinel会根据slave的优先级选举一个master。 |
| replica-priority 100 |
| |
| #redis提供了可以让master停止写入的方式,如果配置了min-replicas-to-write,健康的slave的个数小于N,mater就禁止写入。 |
| # min-replicas-to-write 3 |
| |
| # 延迟小于min-replicas-max-lag秒的slave才认为是健康的slave |
| # min-replicas-max-lag 10 |
| |
| # min-replicas-max-lag 设置1或设置0禁用这个特性。 |
| # Setting one or the other to 0 disables the feature. |
| # By default min-replicas-to-write is set to 0 (feature disabled) and |
| # min-replicas-max-lag is set to 10. |
z1-3.SECURITY
| #requirepass配置可以让用户使用AUTH命令来认证密码,才能使用其他命令。 |
| # requirepass foobared |
| #把危险的命令给修改成其他名称。比如CONFIG命令可以重命名为一个很难被猜到的命令,这样用户不能使用,而内部工具还能接着使用 |
| # rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52 |
| #设置成一个空的值,可以禁止一个命令 |
| # rename-command CONFIG "" |
z1-4.CLIENTS
z1-5.MEMORY MANAGEMENT
| #设置redis使用内存字节数,当达到内存最大值时,redis会根据选择的逐出策略尝试删除key(详细参阅maxmemory策略) |
| #redis配置的最大内存容量。当内存满了,需要配合maxmemory-policy策略进行处理。 |
| #内存容量超过maxmemory后的处理策略。 |
| #volatile-lru:利用LRU算法移除设置过过期时间的key。 |
| #volatile-random:随机移除设置过过期时间的key。 |
| #volatile-ttl:移除即将过期的key,根据最近过期时间来删除(辅以TTL) |
| #allkeys-lru:利用LRU算法移除任何key。 |
| #allkeys-random:随机移除任何key。 |
| #noeviction:不移除任何key,只是返回一个写错误。 |
| #上面的这些驱逐策略,如果redis没有合适的key驱逐,对于写命令,还是会返回错误。 |
| # maxmemory-policy noeviction |
| # lru检测的样本数。使用lru或者ttl淘汰算法,从需要淘汰的列表中随机选择sample个key,选出闲置时间最长的key移除 |
| # maxmemory-samples 5 |
| # 是否开启salve的最大内存 |
| # replica-ignore-maxmemory yes |
z1-6.LAZY FREEING
| |
| |
| lazyfree-lazy-eviction no |
| lazyfree-lazy-expire no |
| lazyfree-lazy-server-del no |
| replica-lazy-flush no |
z1-7.APPEND ONLY MODE
| |
| 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 |
| |
| |
| |
| aof-use-rdb-preamble yes |
z1-8.LUA SCRIPTING
| # 如果达到最大时间限制(毫秒),redis会记个log,然后返回error。 |
| #当一个脚本超过了最大时限。只有SCRIPT KILL和SHUTDOWN NOSAVE可以用。 |
| #第一个可以杀没有调write命令的东西。要是已经调用了write,只能用第二个命令杀 |
| lua-time-limit 5000 |
z1-9.REDIS CLUSTER
| # 集群开关,默认是不开启集群模式 |
| # cluster-enabled yes |
| |
| #集群配置文件的名称,每个节点都有一个集群相关的配置文件,持久化保存集群的信息。 |
| # cluster-config-file nodes-6379.conf |
| |
| #节点互连超时的阀值。集群节点超时毫秒数 |
| # cluster-node-timeout 15000 |
| |
| #在进行故障转移的时候,全部slave都会请求申请为master,但是有些slave可能与master断开连接一段时间了,导致数据过于陈旧,这样的slave不应该被提升为master。 |
| #比较slave断开连接的时间和(node-timeout * slave-validity-factor) + repl-ping-slave-period |
| #如果节点超时时间为三十秒, 并且slave-validity-factor为10,假设默认的repl-ping-slave-period是10秒,即如果超过310秒slave将不会尝试进行故障转移 |
| # cluster-replica-validity-factor 10 |
| |
| # master的slave数量大于该值,slave才能迁移到其他孤立master上,如这个参数若被设为2,那么只有当一个主节点拥有2 个可工作的从节点时,它的一个从节点会尝试迁移 |
| # cluster-migration-barrier 1 |
| |
| #默认情况下,集群全部的slot有节点负责,集群状态才为ok,才能提供服务。 |
| # cluster-require-full-coverage yes |
z1-10.CLUSTER DOCKER/NAT support
z1-11.SLOW LOG
| # slog log是用来记录redis运行中执行比较慢的命令耗时。 |
| #当命令的执行超过了指定时间,就记录在slow log中,slog log保存在内存中,所以没有IO操作。 |
| #执行时间比slowlog-log-slower-than大的请求记录到slowlog里面,单位是微秒,所以1000000就是1秒。 |
| #注意,负数时间会禁用慢查询日志,而0则会强制记录所有命令。 |
| slowlog-log-slower-than 10000 |
| |
| #慢查询日志长度。当一个新的命令被写进日志的时候,最老的那个记录会被删掉。 |
| #这个长度没有限制。只要有足够的内存就行。 |
| #你可以通过 SLOWLOG RESET 来释放内存 |
| slowlog-max-len 128 |
| |
z1-12.LATENCY MONITOR
| |
| |
| |
| latency-monitor-threshold 0 |
z1-13.EVENT NOTIFICATION
| #键空间通知使得客户端可以通过订阅频道或模式,来接收那些以某种方式改动了 Redis 数据集的事件。因为开启键空间通知功能需要消耗一些 CPU ,所以在默认配置下,该功能处于关闭状态。 |
| #notify-keyspace-events 的参数可以是以下字符的任意组合,它指定了服务器该发送哪些类型的通知: |
| # |
| # |
| # |
| # |
| # |
| # |
| # |
| # |
| # |
| # |
| # |
| #输入的参数中至少要有一个 K 或者 E,否则的话,不管其余的参数是什么,都不会有任何 通知被分发。详细使用可以参考http://redis.io/topics/notifications |
| |
| notify-keyspace-events "" |
z1-14.ADVANCED CONFIG
| # 数据量小于等于hash-max-ziplist-entries的用ziplist,大于hash-max-ziplist-entries用hash |
| hash-max-ziplist-entries 512 |
| |
| # value大小小于等于hash-max-ziplist-value的用ziplist,大于hash-max-ziplist-value用hash |
| hash-max-ziplist-value 64 |
| |
| #-5:最大大小:64 KB<--不建议用于正常工作负载 |
| #-4:最大大小:32 KB<--不推荐 |
| #-3:最大大小:16 KB<--可能不推荐 |
| #-2:最大大小:8kb<--良好 |
| #-1:最大大小:4kb<--良好 |
| list-max-ziplist-size -2 |
| |
| #0:禁用所有列表压缩 |
| #1:深度1表示“在列表中的1个节点之后才开始压缩, |
| #从头部或尾部 |
| #所以:【head】->node->node->…->node->【tail】 |
| #[头部],[尾部]将始终未压缩;内部节点将压缩。 |
| #2:[头部]->[下一步]->节点->节点->…->节点->[上一步]->[尾部] |
| #2这里的意思是:不要压缩头部或头部->下一个或尾部->上一个或尾部, |
| #但是压缩它们之间的所有节点。 |
| #3:[头部]->[下一步]->[下一步]->节点->节点->…->节点->[上一步]->[上一步]->[尾部] |
| list-compress-depth 0 |
| |
| # 数据量小于等于set-max-intset-entries用iniset,大于set-max-intset-entries用set |
| set-max-intset-entries 512 |
| |
| #数据量小于等于zset-max-ziplist-entries用ziplist,大于zset-max-ziplist-entries用zset |
| zset-max-ziplist-entries 128 |
| |
| #value大小小于等于zset-max-ziplist-value用ziplist,大于zset-max-ziplist-value用zset |
| zset-max-ziplist-value 64 |
| |
| #value大小小于等于hll-sparse-max-bytes使用稀疏数据结构(sparse),大于hll-sparse-max-bytes使用稠密的数据结构(dense)。 |
| hll-sparse-max-bytes 3000 |
| |
| #宏观节点的最大流/项目的大小。在流数据结构是一个基数 |
| #树节点编码在这项大的多。利用这个配置它是如何可能 |
| #最大项目数,这可能包含了在切换到新节点的时候 |
| # appending新的流条目。如果任何以下设置来设置 |
| # ignored极限是零,例如,操作系统,它有可能只是一集通过设置限制最大 |
| stream-node-max-bytes 4096 |
| stream-node-max-entries 100 |
| |
| #Redis将在每100毫秒时使用1毫秒的CPU时间来对redis的hash表进行重新hash,可以降低内存的使用。 |
| activerehashing yes |
| |
| # |
| #对于normal client,第一个0表示取消hard limit, |
| client-output-buffer-limit normal 0 0 0 |
| |
| #对于slave client和MONITER client,如果client-output-buffer一旦超过256mb,又或者超过64mb持续60秒,那么服务器就会立即断开客户端连接 |
| client-output-buffer-limit replica 256mb 64mb 60 |
| |
| #对于pubsub client,如果client-output-buffer一旦超过32mb,又或者超过8mb持续60秒,那么服务器就会立即断开客户端连接 |
| client-output-buffer-limit pubsub 32mb 8mb 60 |
| |
| # 这是客户端查询的缓存极限值大小 |
| # client-query-buffer-limit 1gb |
| |
| #在redis协议中,批量请求,即表示单个字符串,通常限制为512 MB。但是您可以更改此限制。 |
| # proto-max-bulk-len 512mb |
| |
| #redis执行任务的频率为1s除以hz |
| hz 10 |
| |
| #当启用动态赫兹时,实际配置的赫兹将用作作为基线,但实际配置的赫兹值的倍数 |
| #在连接更多客户端后根据需要使用。这样一个闲置的实例将占用很少的CPU时间,而繁忙的实例将反应更灵敏 |
| dynamic-hz yes |
| |
| #在aof重写的时候,如果打开了aof-rewrite-incremental-fsync开关,系统会每32MB执行一次fsync。 |
| aof-rewrite-incremental-fsync yes |
| |
| #在rdb保存的时候,如果打开了rdb-save-incremental-fsync开关,系统会每32MB执行一次fsync。 |
| rdb-save-incremental-fsync yes |
z.1-15 ACTIVE DEFRAGMENTATION
| # 已启用活动碎片整理 |
| # activedefrag yes |
| # 启动活动碎片整理的最小碎片浪费量 |
| # active-defrag-ignore-bytes 100mb |
| # 启动活动碎片整理的最小碎片百分比 |
| # active-defrag-threshold-lower 10 |
| # 我们使用最大努力的最大碎片百分比 |
| # active-defrag-threshold-upper 100 |
| # 以CPU百分比表示的碎片整理的最小工作量 |
| # active-defrag-cycle-min 5 |
| # 在CPU的百分比最大的努力和碎片整理 |
| # active-defrag-cycle-max 75 |
| #将从中处理的set/hash/zset/list字段的最大数目 |
| #主词典扫描 |
| # active-defrag-max-scan-fields 1000 |
z2.sentinel配置文件
| |
| |
| |
| port 26379 |
| |
| |
| dir /tmp |
| |
| |
| |
| |
| |
| |
| sentinel monitor mymaster 127.0.0.1 6379 2 |
| |
| |
| |
| |
| sentinel auth-pass mymaster MySUPER--secret-0123passw0rd |
| |
| |
| |
| sentinel down-after-milliseconds mymaster 30000 |
| |
| |
| |
| sentinel parallel-syncs mymaster 1 |
| |
| |
| |
| |
| |
| |
| |
| |
| sentinel failover-timeout mymaster 180000 |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| sentinel notification-script mymaster /var/redis/notify.sh |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| sentinel client-reconfig-script mymaster /var/redis/reconfig.sh |
z3.常见问题
z3-0.击穿
概念:在Redis获取某一key时, 由于key不存在, 而必须向DB发起一次请求的行为, 称为“Redis击穿”。
原因
方案
| 服务器启动时, 提前写入 |
| 规范key的命名, 通过中间件拦截 |
| 对某些高频访问的Key,设置合理的TTL或永不过期 |
z3-1.雪崩
概念:Redis缓存层由于某种原因宕机后,所有的请求会涌向存储层,短时间内的高并发请求可能会导致存储层挂机,称之为“Redis雪崩”。
方案
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律