💢欢迎来到张胤尘的开源技术站
💥开源如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥
文章目录
Redis 服务搭建
在 Linux 上安装 redis
服务可以通过两种方式进行:源代码编译安装、docker
容器化安装。
源代码编译安装
获取源码
下载指定版本的源代码压缩包:Download Redis Releases
wget http://download.redis.io/releases/redis-6.2.17.tar.gz
tar -xzf redis-6.2.17.tar.gz
cd redis-6.2.17
安装依赖
编译工作开始之前,需要确保当前操作系统已经安装如下依赖:
Ubuntu
sudo apt-get update
sudo apt-get install -y build-essential tcl
Centos
sudo yum -y install gcc tcl make
Fedora
sudo dnf install -y gcc tcl make
编译
在源代码目录下执行以下命令进行编译:
make
如果编译过程中没有报错,编译完成后会在 src
目录下生成可执行文件。
安装
将编译生成的可执行文件安装到系统路径中:
sudo make install
测试(可选)
运行 redis
的测试套件可以验证编译后的 redis
是否在系统上正常运行。(测试套件的执行时长在 3~5 分钟左右)
make test
执行完毕后会显示如下的提示信息:
\o/ All tests passed without errors!
Cleanup: may take some time... OK
如果测试失败,可以尝试以下步骤进行调试:
- 查看日志:测试失败时,会生成日志文件,位于
tests
目录中。检查这些日志文件可以获取更多信息。 - 检查依赖:确保所有必要的依赖库都已正确安装。
- 检查配置:确保
redis
的配置文件没有错误。
配置文件
将源代码目录中的 redis.conf
文件复制到合适的位置,如:/etc/redis.conf
sudo cp redis.conf /etc/
然后根据实际的需求编辑配置文件,例如:
bind
:绑定的IP
地址,例如bind 127.0.0.1
。port
:监听端口,默认为6379
。requirepass
:设置密码,例如requirepass yourpassword
。dir
:指定数据文件存储目录,例如:/var/lib/redis
。logfile
:指定日志文件路径,例如:/var/lib/redis/redis.log
。
配置 redis
服务
服务文件
添加 redis
服务系统文件:
cat <<EOF | sudo tee /etc/systemd/system/redis.service
[Unit]
Description=Redis In-Memory Data Store
Documentation=https://github.com/redis/redis
After=network.target
[Service]
ExecStart=/usr/local/bin/redis-server /etc/redis.conf
ExecStop=/usr/local/bin/redis-cli shutdown
Restart=always
User=redis
Group=redis
Type=forking
[Install]
WantedBy=multi-user.target
EOF
创建用户和用户组
使用 groupadd
命令创建一个名为 redis
的用户组:
sudo groupadd redis
使用 useradd
命令创建一个名为 redis
的用户,并将其添加到 redis
用户组中。同时,可以设置该用户无法登录系统:
sudo useradd -g redis -s /sbin/nologin -d /var/lib/redis redis
-g redis
:指定用户所属的用户组。-s /sbin/nologin
:设置用户无法登录系统。-d /var/lib/redis
:指定用户的主目录。
设置目录权限
确保 redis
的数据目录和配置文件归新创建的用户和组所有,并设置正确的权限:
sudo mkdir -p /var/lib/redis
sudo chown -R redis:redis /var/lib/redis
sudo chmod -R 770 /var/lib/redis
sudo chown redis:redis /etc/redis.conf
启动服务
sudo systemctl daemon-reload
sudo systemctl enable redis
sudo systemctl start redis
检查服务状态
sudo systemctl status redis
其他问题
文件描述符限制问题
# 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'.
redis
的 maxclients
参数指定了 redis
服务器能够同时处理的最大客户端连接数(默认是 10000)。每个客户端连接都需要一个文件描述符,因此 maxclients
的值取决于系统允许的最大文件描述符数量。
首先在当前会话中,临时增加文件描述符限制,运行以下命令:
ulimit -n 10032
然后编辑 /etc/security/limits.conf
文件,添加以下内容:
* soft nofile 10032
* hard nofile 10032
然后操作系统,运行以下命令验证文件描述符限制:
ulimit -n
另外,如果采用 systemd
来管理 redis
服务,那么 systemd
也会限制程序打开文件描述符的数量。可以通过以下命令查看服务的实际文件描述符限制:
systemctl show redis --property=LimitNOFILE
在 [Service]
部分,添加或修改 LimitNOFILE
配置项,指定服务允许的最大文件描述符数量。例如:
LimitNOFILE=10032
修改服务单元文件后,需要重新加载 systemd
配置,以便更改生效:
sudo systemctl daemon-reload
内存过提交设置问题
# WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. 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.
在 Linux 系统中,内存过提交是一种内存管理策略,允许进程分配的内存总量超过系统实际可用的物理内存和交换空间。这在某些情况下可以提高系统的灵活性和性能,但也可能带来风险。
- 启用内存过提交:
vm.overcommit_memory = 1
:内核允许分配的内存总量超过实际可用的物理内存和交换空间。这可以提高系统的灵活性,但可能会导致在内存不足时,某些进程被终止。vm.overcommit_memory = 2
:内核会根据实际可用的物理内存和交换空间来限制内存分配。这可以防止系统过度分配内存,但可能会导致某些进程在需要大量内存时无法分配到足够的内存。
- 禁用内存过提交 (
vm.overcommit_memory = 0
):内核会根据实际可用的物理内存和交换空间来限制内存分配,并且会更加严格地检查内存分配请求。这可以防止系统过度分配内存,但可能会导致某些进程在需要大量内存时无法分配到足够的内存。
为什么 redis
需要内存过提交 ?
redis
在某些操作中(如后台保存或复制)可能需要分配大量内存。如果没有启用内存过提交,redis
可能会在内存不足时无法完成这些操作,从而导致失败。即使在内存充足的情况下,禁用内存过提交也可能导致 redis
在某些情况下无法正常运行。为了确保 redis
能够正常运行,建议启用内存过提交。
为什么启用内存过提交是安全的 ?
虽然启用内存过提交可能会导致某些进程在内存不足时被终止,但在实际使用中,这种情况很少发生。大多数现代系统都有足够的物理内存和交换空间来满足 redis
的需求。此外,redis
本身也会根据配置和系统资源来限制内存使用,从而降低内存不足的风险。
以下是配置的具体步骤:
- 首先临时启用内存过提交,运行以下命令:
sysctl vm.overcommit_memory=1
- 编辑
/etc/sysctl.conf
文件,添加以下内容:
vm.overcommit_memory = 1
- 运行以下命令使更改生效:
sysctl -p
- 再次运行以下命令验证内存过提交设置:
$ sysctl vm.overcommit_memory
vm.overcommit_memory = 1
TCP backlog 设置问题
# WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
当 redis
服务启动时,它会尝试将全连接队列的长度设置为 tcp-backlog
指定的值。如果系统的 somaxconn
值低于 redis
的 tcp-backlog
值, redis
就会发出警告,因为它无法将队列长度设置为期望的值。
somaxconn
是一个重要的 Linux 内核参数,用于控制 全连接队列 的最大长度。如果全连接队列满了,新的连接请求将被拒绝。因此,somaxconn
的值直接影响系统能够处理的并发连接数量。
另外需要注意的是:在许多 Linux 系统中,
somaxconn
的默认值是 128 或 256,这取决于内核版本和配置。这个默认值在低并发场景下通常足够,但在高并发场景下可能需要调整。
首先临时增加 TCP backlog,运行以下命令:
sysctl net.core.somaxconn=511
编辑 /etc/sysctl.conf
文件,添加以下内容:
net.core.somaxconn = 511
运行以下命令使更改生效:
sysctl -p
再次运行以下命令验证 TCP backlog 设置:
$ sysctl net.core.somaxconn
net.core.somaxconn = 511
docker
容器化安装
拉取官方镜像
从 Docker Hub 拉取 redis
的官方镜像。例如,拉取最新版本的 redis
:
docker pull redis:latest
或者指定特定版本:
docker pull redis:6.2.17
拉取完成后,查看镜像信息:
$ sudo docker images
redis 6.2.17 725947326e8e 2 months ago 106MB
启动 redis
容器
sudo docker run -d --name redis \
--restart=always \
--user $(id -u):$(id -g) \
-p 6379:6379 \
-v /configPath/redis.conf:/usr/local/bin/redis.conf \
-v /dataPath/data:/data \
redis:6.2.17 \
/usr/local/bin/redis.conf
-d
:后台运行容器。--name redis
:为容器指定名称redis
。--restart=always
:设置容器的重启策略为always
。这意味着无论容器因何种原因退出(正常退出或异常退出),都会自动重启该容器。--user $(id -u):$(id -g)
:指定容器运行的用户和用户组。采用当前宿主机用户和用户组。-p 6379:6379
:将容器的redis
服务端口(6379)映射到宿主机的 6379 端口。-v /configPath/redis.conf:/usr/local/bin/redis.conf
:自定义的redis
配置文件传递给容器,容器将使用该配置文件启动redis
服务。(configPath
需要根据实际环境配置)-v /dataPath/data:/data
:自定义数据目录,redis
容器中使用该数据目录启动服务。(dataPath
需要根据实际环境配置)redis:6.2.17
:使用的redis
镜像名称和版本信息。/usr/local/bin/redis.conf
:传入启动redis
服务需要使用的配置文件。
需要注意的是,当使用自定义配置文件启动 redis
容器时,需要将配置文件中的 daemonize
参数设置为 no
(非守护进程方式运行),否则 redis
容器会退出。
验证
检查 redis
容器是否成功启动:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0f10a5a53f15 redis:6.2.17 "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp redis
使用 redis-cli
命令验证 redis
是否正常运行:
$ sudo docker exec -it redis redis-cli -a 123456 ping
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
PONG
🌺🌺🌺撒花!
如果本文对你有帮助,就点关注或者留个👍
如果您有任何技术问题或者需要更多其他的内容,请随时向我提问。