1. Redis 6.x on Centos7.9 单实例
1.1. 主机设置
1.1.1. 创建用户
## 创建用户、用户组
groupadd redis && useradd -g redis redis
## 设置用户密码
echo "redis123"|passwd --stdin redis
## 配置环境变量
su - redis
echo "export PATH=\$PATH:/usr/local/redis/bin" >> ~/.bash_profile
1.1.2. 安装依赖
yum install -y gcc-c++ autoconf automaker
1.1.3. 主机优化
- 设置内存 OOM 策略
## 调整内核参数
cat >> /etc/sysctl.conf << EOF
net.core.somaxconn = 32768
vm.overcommit_memory = 1
EOF
## 生效配置
sysctl -p
- 设置 Redis 可利用的 open files
该参数可间接限制 Redis 最大客户端连接数(maxclients)。
maxclients = open files - 32
cat >> /etc/security/limits.conf << EOF
# For Redis
redis soft nproc 2047
redis hard nproc 16384
redis soft nofile 65535
redis hard nofile 65535
EOF
- 禁用 THP(Transparent Huge Pages)
## 查看 THP
cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
## 禁用 THP(重启生效)
echo "echo never > /sys/kernel/mm/transparent_hugepage/enabled" >> /etc/rc.local
## 验证修改
cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
针对 RedHat 需将 /sys/kernel/mm/transparent_hugepage/enabled 修改为 /sys/kernel/mm/redhat_transparent_hugepage/enable。
1.2. 安装 Redis
1.2.1. 编译安装
官方链接: https://download.redis.io/redis-stable.tar.gz
华为云镜像:https://repo.huaweicloud.com/redis/
## 1. 设置版本,根据需要修改版本号。
export VERSION=6.2.5
## 2. 下载源码包,针对安装版本,执行对应的 export
wget https://repo.huaweicloud.com/redis/redis-${VERSION}.tar.gz
## 3. 解压
tar -zxvf redis-${VERSION}.tar.gz
## 4. 编译
cd redis-${VERSION}/
## 5. 编译 redis
make
## 6. 安装
### 默认安装位置 /usr/local/bin/redis-server
make PREFIX=/usr/local/redis-${VERSION} install
1.2.2. 创建目录及软连接
- 创建数据目录
创建数据目录,用于保存 Redis 持久化数据、AOF 日志及运行日志。
export RDATA=/redis-data mkdir -p ${RDATA} chown -R redis:redis ${RDATA} chmod -R 755 ${RDATA}
- 创建软连接
为便于后续版本升级,为 Rdis 程序目录创建软连接。版本升级后,只需重建软连接即可。
export VERSION=6.2.5 ln -s /usr/local/redis-${VERSION} /usr/local/redis chown -R redis:redis /usr/local/redis* chmod -R 755 /usr/local/redis* [root@localhost redis-6.2.5]# tree -L 2 /usr/local/redis-${VERSION}/ /usr/local/redis-6.2.5/ └── bin ├── redis-benchmark ├── redis-check-aof -> redis-server ├── redis-check-rdb -> redis-server ├── redis-cli ├── redis-sentinel -> redis-server └── redis-server 1 directory, 6 files [root@localhost redis-6.2.5]# ll /usr/local/|grep redis lrwxrwxrwx. 1 redis redis 22 Sep 25 15:28 redis -> /usr/local/redis-6.2.5 drwxr-xr-x. 3 redis redis 4096 Sep 25 15:25 redis-6.2.5
1.2.3. 修改配置文件
- 准备配置文件模板
export RDATA=/redis-data export VERSION=6.2.5 cp ~/redis-${VERSION}/redis.conf ${RDATA}/redis.conf chown -R redis:redis ${RDATA}/redis.conf chmod -R 644 ${RDATA}/redis.conf
[root@localhost local]# ls -l ${RDATA} total 92 -rw-r--r-- 1 redis redis 93724 Sep 26 16:01 redis.conf
- 定制配置
export RPORT=5309 export RDATA=/redis-data sed -i 's|^bind|#bind|g' ${RDATA}/redis.conf sed -i 's|^daemonize.*$|daemonize yes|g' ${RDATA}/redis.conf sed -i 's|^#.requirepass.*$|requirepass redis123|g' ${RDATA}/redis.conf sed -i "s|^dir.*$|dir ${RDATA}/|g" ${RDATA}/redis.conf sed -i "s|^port.*$|port ${RPORT}|g" ${RDATA}/redis.conf sed -i "s|^logfile.*$|logfile ${RDATA}/redis.log|g" ${RDATA}/redis.conf
修改后的配置如下所示:
[root@localhost local]# grep -Ev '^\s*#|^$' ${RDATA}/redis.conf protected-mode yes port 5309 tcp-backlog 511 timeout 0 tcp-keepalive 300 daemonize yes pidfile /var/run/redis_6379.pid loglevel notice logfile /redis-data/redis.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 /redis-data/ replica-serve-stale-data yes replica-read-only yes repl-diskless-sync no repl-diskless-sync-delay 5 repl-diskless-load disabled repl-disable-tcp-nodelay no replica-priority 100 acllog-max-len 128 requirepass redis123 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" 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 lua-time-limit 5000 slowlog-log-slower-than 10000 slowlog-max-len 128 latency-monitor-threshold 0 notify-keyspace-events "" hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-size -2 list-compress-depth 0 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-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
1.2.4. 启停 Redis
1.2.4.1. 手动启停 Redis
## 1. 手动启动
su - redis
export RDATA=/redis-data
cd /usr/local/redis/bin
./redis-server $RDATA/redis.conf
## 2. 查看 redis 进程
[redis@localhost bin]$ ps -ef|grep redis
root 1899 1835 0 16:06 pts/1 00:00:00 su - redis
redis 1900 1899 0 16:06 pts/1 00:00:00 -bash
redis 1922 1 0 16:06 ? 00:00:00 ./redis-server *:5309
redis 1927 1900 0 16:06 pts/1 00:00:00 ps -ef
redis 1928 1900 0 16:06 pts/1 00:00:00 grep --color=auto redis
## 3. 连接 redis,密码为 redis123
/usr/local/redis/bin/redis-cli -c -h 127.0.0.1 -p 5309 -a "redis123"
## 4. 停止 redis
/usr/local/redis/bin/redis-cli -c -h 127.0.0.1 -p 5309 -a "redis123" shutdown
1.2.4.2. 配置开启自启
- 创建
redis-server.service文件(root 用户执行)
export RDATA=/redis-data cat > /etc/systemd/system/redis-server.service << EOF [Unit] Description=The redis-server Process Manager After=syslog.target network.target [Service] Type=forking User=redis LimitNOFILE=65536 ExecStart=/usr/local/redis/bin/redis-server $RDATA/redis.conf [Install] WantedBy=multi-user.target EOF
- 加载 service 文件
systemctl daemon-reload
- 开机自启
systemctl enable redis-server.service systemctl start redis-server.service systemctl status redis-server.service
[root@localhost local]# systemctl status redis-server.service ● redis-server.service - The redis-server Process Manager Loaded: loaded (/etc/systemd/system/redis-server.service; enabled; vendor preset: disabled) Active: active (running) since Mon 2022-09-26 16:11:29 CST; 1s ago Process: 2034 ExecStart=/usr/local/redis/bin/redis-server /redis-data/redis.conf (code=exited, status=0/SUCCESS) Main PID: 2035 (redis-server) CGroup: /system.slice/redis-server.service └─2035 /usr/local/redis/bin/redis-server *:5309 Sep 26 16:11:28 localhost.localdomain systemd[1]: Starting The redis-server Process Manager... Sep 26 16:11:29 localhost.localdomain systemd[1]: Started The redis-server Process Manager.
- 其他命令
## 启用开机自启
systemctl enable redis-server.service
## 启动 redis 守护进程
systemctl start redis-server.service
## 停止 redis 守护进程
systemctl stop redis-server.service
## 重启 redis 守护进程
systemctl restart redis-server.service
## 查看 redis 守护进程
systemctl status redis-server.service
1.3. 运行信息及配置
1.3.1. 运行信息
[redis@localhost ~]$ /usr/local/redis/bin/redis-cli -c -h 127.0.0.1 -p 5309 -a "redis123"
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:5309> info all
# Server
redis_version:6.2.5
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:c16d483e131bda9
redis_mode:standalone
os:Linux 3.10.0-1160.71.1.el7.x86_64 x86_64
-- 省略部分内容
# Clients
connected_clients:1
cluster_connections:0
maxclients:10000
client_recent_max_input_buffer:16
client_recent_max_output_buffer:0
# Memory
used_memory:873832
used_memory_human:853.35K
used_memory_rss:2920448
used_memory_rss_human:2.79M
used_memory_peak:931928
used_memory_peak_human:910.09K
used_memory_peak_perc:93.77%
-- 省略部分内容
# Persistence
loading:0
current_cow_size:0
current_cow_size_age:0
current_fork_perc:0.00
current_save_keys_processed:0
current_save_keys_total:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
--省略部分内容
# Stats
total_connections_received:2
total_commands_processed:4
instantaneous_ops_per_sec:0
total_net_input_bytes:113
total_net_output_bytes:40658
instantaneous_input_kbps:0.00
instantaneous_output_kbps:0.00
-- 省略部分内容
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:667dd0cf5be24c10cc19c690fd8a64b98ac62ffd
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
-- 省略部分内容
# CPU
used_cpu_sys:0.065823
used_cpu_user:0.078772
used_cpu_sys_children:0.000000
used_cpu_user_children:0.000000
used_cpu_sys_main_thread:0.065105
used_cpu_user_main_thread:0.079211
# Modules
# Commandstats
cmdstat_command:calls=2,usec=889,usec_per_call=444.50,rejected_calls=0,failed_calls=0
cmdstat_auth:calls=2,usec=31,usec_per_call=15.50,rejected_calls=0,failed_calls=0
# Errorstats
# Cluster
cluster_enabled:0
# Keyspace
1.3.2. 配置获取
[redis@localhost ~]$ /usr/local/redis/bin/redis-cli -c -h 127.0.0.1 -p 5309 -a "redis123"
## 获取日志级别
127.0.0.1:5309> config get loglevel
1) "loglevel"
2) "notice"
## 获取日志文件名
127.0.0.1:5309> config get logfile
1) "logfile"
2) "/usr/local/redis/log/redis.log"
## 获取监听端口
127.0.0.1:5309> config get port
1) "port"
2) "5309"
## 获取验证密码
127.0.0.1:5309> config get requirepass
1) "requirepass"
2) "redis123"
## 获取绑定 IP
127.0.0.1:5309> config get bind
1) "bind"
2) ""
## 获取所有配置
127.0.0.1:5309> config get *
1) "rdbchecksum"
2) "yes"
3) "daemonize"
4) "yes"
5) "io-threads-do-reads"
6) "no"
7) "lua-replicate-commands"
-- 省略部分内容
289) "slaveof"
290) ""
291) "notify-keyspace-events"
292) ""
293) "bind"
294) ""
295) "oom-score-adj-values"
296) "0 200 800"
127.0.0.1:5309>
1.3.3. 配置修改
可直接修改 redis.conf 配置文件,也可通过 redis-cli 的 config set <配置项> <配置值> 命令修改。通过 CONFIG SET 命令修改的配置,可立即生效,但是不会持久化到 redis.conf 配置文件中,因此服务重启后即失效。
127.0.0.1:5309> config set loglevel warning OK 127.0.0.1:5309> config get loglevel 1) "loglevel" 2) "warning"
1.3.4. 常用配置项说明
| 配置项 | 可选值 | 说明 |
|---|---|---|
daemonize no |
no, yes |
默认 no,redis 不以守护进程方式运行;yes redis 以守护进程方式运行。 |
pidfile /var/run/redis.pid |
Redis 以守护进程方式运行时,默认将 PID 文件写入该文件。 | |
port 6379 |
指定 Redis 的监听端口 | |
bind 127.0.0.1 |
0.0.0.0或具体 IP |
指定 Redis 的监听地址;0.0.0.0 指监听所有 IP |
timeout 300 |
0 | 当客户端闲置多长时间后关闭连接,如果指定为 0,表示关闭该功能 |
loglevel verbose |
debug、verbose、notice、warning | 指定日志记录级别 |
logfile stdout |
可指定具体的日志文件 | 指定日志记录方式,默认为标准输出。若配置 Redis 为守护进程方式运行,则日志默认将会发送给 /dev/null。 |
databases 16 |
设置数据库的数量,默认数据库为 0。可以使用 SELECT <dbid> 命令在连接上指定数据库 id。 |
|
save 900 1save 300 10 save 60 10000 |
指定数据持久化到数据文件的策略,即多少秒内,多少次更新操作,就触发数据持久化。可指定多个条件配合,默认为 3 个。 |
|
rdbcompression yes |
yes,no |
指定持久化到书文件时是否压缩(压缩算法为 LZF)数据,默认为 yes |
dbfilename dump.rdb |
指定本地持久化的数据文件名,默认值为 dump.rdb。 |
|
dir ./ |
指定持久化数据文件的存放目录默认位置 ./ 为 Redis 的 bin 目录。 |
|
slaveof <masterip> <masterport> |
指定当本机为 Slave 服务时,设置 Master 服务的 IP 地址及端口,在 Redis 启动时,它会自动从 master 进行数据同步。 | |
masterauth <master-password> |
指定当 Master 服务设置了密码保护时,Slave 服务连接 Master 的密码。 | |
requirepass foobared |
默认无密码 | 指定 Redis 的连接密码。若配置了连接密码,客户端在连接 Redis 时需通过 AUTH <password>命令提供密码,默认关闭。 |
maxclients 0 |
默认为0表示无限制 | 用于限制最大的客户端网络连接数,默认为0表示无限制。对 Linux 系统来说,这些网络连接都是文件句柄。因此,最大连接数还受 open files 所限制。当 open files 为4096时,由于 Redis 内部会使用 32 个句柄,因此最大客户端连接数 maxclients 为 4064(即4096-32)。 |
maxmemory <bytes> |
指定 Redis 最大内存限制。Redis 在启动时会将数据加载到内存中,达到最大限制后,Redis 会先尝试清除已到期或即将到期的 Key。当此方法处理后,仍然达到最大内存,将提供只读操作。Redis 新的 VM 机制,会把 Key 存放内存,Value 存放到 Swap 区。 | |
appendonly no |
默认为 no,不记录日志。 | 指定是否在每次更新操作后进行日志记录。Redis 在默认情况下是异步的把数据写入磁盘。若不开启日志记录,在断电时可能会丢失一段时间内的数据。 |
appendfilename appendonly.aof |
指定记录更新操作的日志文件名,默认为 appendonly.aof。 |
|
appendfsync everysec |
no快,不安全always 慢,安全 everysec 折衷 |
指定AOF日志写硬盘的策略。 Always:每次写操作执行完后,同步将 AOF 日志数据写回硬盘。 No:每次写操作执行完后,先将命令写入AOF缓冲区,再由操作系统决定何时将缓冲区写入磁盘。 Everysec:每次写操作执行完后,先将命令写入AOF缓冲区,然后每隔1秒,将缓冲区数据写入磁盘。 |
vm-enabled no |
指定是否启用虚拟内存机制,默认值为 no。VM 机制将数据分页存放,由 Redis 将访问量较少的页(即冷数据) swap 到磁盘上,访问多的页面存放在内存中。 | |
vm-swap-file /tmp/redis.swap |
指定虚拟内存文件路径,默认值为 /tmp/redis.swap,不可多个 Redis 实例共享。 |
|
vm-max-memory 0 |
将所有大于 vm-max-memory 的数据存入虚拟内存(磁盘)。所有的 Key 数据都存储在内存中,不受 vm-max-memory 配置项的限制。也就是说,当 vm-max-memory = 0时,所有 Value 都存在于磁盘(虚拟内存)。 |
|
vm-page-size 32 |
Redis 将Swap 文件分成多个 Page,一个对象可存储在多个 Page 上面,但一个 Page 上不能被存储多个对象。若存储很多小对象,可将 Page 设置为 32 或 64 bytes;若存储很大的大对象,则可使用更大的 Page。若无法确定,则采用默认值。 | |
vm-pages 134217728 |
设置 swap 文件中的 page 数量,由于页表(一种表示页面空闲或使用的 bitmap)是在放在内存中的,在磁盘上每 8 个 pages 将消耗 1byte 的内存。 | |
vm-max-threads 4 |
设置访问 swap 文件的线程数,最好不要超过机器的核数。若设置为 0,那么所有对 Swap 文件的操作都是串行的,可能造成延迟。 | |
glueoutputbuf yes |
指定在向客户端应答时,是否将多个较小的包合并为一个包发送,默认为开启。 | |
hash-max-zipmap-entries 64 |
指定元素在超过一定的数量时,将启用哈希算法 | |
hash-max-zipmap-value 512 |
指定最大的元素大小超过此限制值(默认512字节)时,将启用哈希算法 | |
activerehashing yes |
指定是否激活重置哈希,默认为开启 | |
include /path/to/local.conf |
指定包含其它的配置文件,可以在同一主机上多个 Redis 实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件 |
1.4. 部署 FAQ
1.4.1. maximum open files 过低
- 警告内容
You requested maxclients of 10000 requiring at least 10032 max file descriptors. Server can't set maximum open files to 10032 because of OS error: Operation not permitted. Current maximum open files is 4096. maxclients has been reduced to 4064 to compensate for low ulimit. If you need higher maxclients increase 'ulimit -n'.
- 解决办法
cat >> /etc/security/limits.conf << EOF
# For Redis
redis soft nproc 2047
redis hard nproc 16384
redis soft nofile 65535
redis hard nofile 65535
EOF
# 若 limits.conf 无效果,可修改 system 文件
vim /etc/systemd/system/redis-server.service
[Service]
..............
LimitNOFILE=65536
- 验证效果
[root@localhost 944]# systemctl daemon-reload
[root@localhost 944]# systemctl restart redis-server.service
[root@localhost 944]# ps -ef|grep redis
root 1491 1470 0 23:28 pts/1 00:00:00 tail -f /usr/local/redis/log/redis.log
redis 1785 1 0 23:34 ? 00:00:00 /usr/local/redis/bin/redis-server *:5309
root 1940 1212 0 23:37 pts/0 00:00:00 grep --color=auto redis
## 通过进程号,验证 redis 进程的 max open files 限制值
[root@localhost 944]# cat /proc/1785/limits
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 8388608 unlimited bytes
Max core file size 0 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 15064 15064 processes
Max open files 65536 65536 files <====== 修改已生效
Max locked memory 65536 65536 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 15064 15064 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us
1.4.2. somaxconn
- 告警内容
34685:M 23 Jun 2020 10:47:00.901 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
- 解决方案
echo "net.core.somaxconn = 32768" >> /etc/sysctl.conf sysctl -p
最后修改时间:2022-09-27 14:18:11
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




