Redis 服务搭建

发布于:2025-03-23 ⋅ 阅读:(24) ⋅ 点赞:(0)

💢欢迎来到张胤尘的开源技术站
💥开源如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥

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'.

redismaxclients 参数指定了 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 值低于 redistcp-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

拉取官方镜像

从 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

🌺🌺🌺撒花!

如果本文对你有帮助,就点关注或者留个👍
如果您有任何技术问题或者需要更多其他的内容,请随时向我提问。
在这里插入图片描述