安装Redis

1.主机环境配置

  • Redis启动的日志中会有WARNING提示设置一些OS内核层面的参数调整
  • 主要包括: 内存分配策略禁用交换分区Tcp队列长度禁用透明内存大页

1.1内存分配策略

  • 程序运行需要申请内存,Linux允许对大部分申请内存的请求,以便能运行更多的程序
  • 因此程序申请内存后并不会马上使用,这种技术叫做:Overcommit
  • LinuxOvercommit有三种策略:
vlaue 说明
0 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程
1 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2 表示内核允许分配超过所有物理内存和交换空间总和的内存
  • RedisDump数据时会fork一个子进程执行操作,子进程理论上所占用的内存与父进程一样
  • 因此需要调整Overcommit1,允许进程超量使用内存空间
  • 推荐Redismaxmemory不超过主机内存75%,预留25%~30%为宜
  • 避免出现Redis持久化失败等问题
  • 如何设置:
    • echo "vm.overcommit_memory=1" >> /etc/sysctl.conf
    • sysctl vm.overcommit_memory=1

1.2禁用交换分区

  • Redis得益于
    • 完全基于内存
    • 高效的数据结构
    • 单线程
    • 基于IO多路复用
  • 因此需要避免Redis的数据被交换低效交换分区
  • 如何设置:
    • echo vm.swapiness=0 >> /etc/sysctl.conf
    • swapoff -a

1.3TCP队列长度

  • Redis基于IO多路复用来支持高并发
  • 因此需要调整内核参数来支持更多的clientRedis建立连接
  • 众所周知,TCP需要三次握手才能建立连接
  • 三次握手的过程中,Server端会建立两个队列存放半连接全连接
  • 半连接队列:(Incomplete connection queue),又称 SYN 队列
  • 全连接队列(Completed connection queue),又称 Accept 队列
    • 半连接队列: 当客户端发起 SYN 到服务端,服务端收到以后会回 ACK 和自己的 SYN。这时服务端这边的 TCP 从 listen 状态变为 SYN_RCVD (SYN Received),此时会将这个连接信息放入「半连接队列」,半连接队列也被称为 SYN Queue,存储的是 "inbound SYN packets"
    • 全连接队列: 全连接队列包含了服务端所有完成了三次握手,但是还未被应用调用 accept 取走的连接队列。此时的 socket 处于 ESTABLISHED 状态。每次应用调用 accept() 函数会移除队列头的连接。如果队列为空,accept() 通常会阻塞。全连接队列也被称为 Accept 队列
  • 因此调整半连接队列全连接队列的大小就可以支持更多的TCP链接
  • 半连接队列默认是2048: cat /proc/sys/net/ipv4/tcp_max_syn_backlog
  • 全连接队列默认是128: /proc/sys/net/core/somaxconn
  • 显然全连接队列默认的128有点小,一般需要增大至512~2048
  • 全连接队列的值受tcp-backlogsomaxconn共同控制的,取两者的最小值
  • 所以你可以在redis.conf配置tcp-backlog同时配置somaxconn
  • 如何设置:
    • tcp-backlog: 1024
    • echo 2048 > /proc/sys/net/core/somaxconn

1.4透明内存大页

  • 我们知道内存在实际使用时是以的形式进行分配的,在开始时系统默认页大小为: 4k
  • 但随着物理内存容量暴涨,过多的分页会产生较多的TLB缺页中断
  • 因此也就有了现在的大页 Huge pages来适应越来越大的系统内存
  • Huge pages 有两种格式大小:2MB1GB2MB页块大小适合用于GB大小的内存1GB页块大小适合用于TB级别的内存;2MB是默认的页大-Huge pages 优点`:

    • 无需交换,不存在页面由于内存空间不足而换入换出的问题
    • 减轻 TLB Cache 的压力,也就是降低了 CPU Cache可缓存的地址映射压力
    • 降低 Page Table的负载
    • 消除Page Table地查找负载
    • 提高内存的整体性能
  • Transparent Huge pages THP,透明大页:

Transparent Huge pages(THP,透明大页) 自 RHEL 6 开始引入。由于传统的 Huge pages 很难手动的管理,对于程序而言,可能需要修改很多的代码才能有效的使用。THP 的引入就是为了便于系统管理员和开发人员使用大页内存。THP 是一个抽象层,能够自动创建、管理和使用传统大页。操作系统将大页内存看作是一种系统资源,在 THP 开启的情况下,其他的进程也可以申请和释放大页内存。

Huge pages 和 Transparent Huge pages 在大页内存的使用方式上存在区别,前者是预分配的方式,而后者则是动态分配的方式,显然后者更适合程序使用。需要注意的是,THP 虽然方便,但在某些场景种仍然会建议我们关闭,这个需要结合实际应用场景慎重考虑。

1.5Redis为什么禁用透明大页

  • Redis持久化过程中会fork一个子进程dump数据
  • 这涉及到Linuxfork过程的CopyOnWrite机制
  • CopyOnWrite机制: 在fork子进程后,与父进程共享内存空间,两者只是虚拟空间不同,但是其对应的物理空间是同一个
  • 父进程的有写入更改数据时,会触发页异常中断,内核会将异常复制一份,此时子父进程各自持有独立的一份
  • 很明显如果持久化过程中,Redis有大量的写入则会有大量页面要修改,就要拷贝一个个2MB大页
  • 会大幅增加重Redis写期间父进程内存消耗,同时每次写命令引起的复制内存页单位为2MB,会拖慢写操作的执行时间,导致大量写操作慢查询
  • 如何禁用:
echo never > /sys/kernel/mm/transparent_hugepage/enabled

vim  /etc/rc.local
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
  echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi

2.编译安装

  • 官网有完整的安装文档,推荐参考官网文档安装
  • 大致流程: 安装编译工具 --> 下载源码包 --> 解压 --> 编译 --> systemd托管
  • 1.安装编译工具: yum install make gcc gcc-c++
  • 2.下载源码包: 最新Stable版本历史版本
  • 3.解压: tar -xf redis-X.X.XX.tar.gz
  • 4.编译: make
# Redis默认使用jemalloc分配器,如果没有安装就会报错
# 默认的是 jemalloc, 因为 jemalloc 被证明 有更少的 fragmentation problems 比libc
# 两种解决方式
# 1. 安装 jemalloc
    + yum install https://rpmfind.net/linux/epel/7/x86_64/Packages/j/jemalloc-3.6.0-1.el7.x86_64.rpm
    + yum install https://rpmfind.net/linux/epel/7/x86_64/Packages/j/jemalloc-devel-3.6.0-1.el7.x86_64.rpm
# 2. 使用 libc 分配器
    + make MALLOC=libc

# 报错如下:
zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目录
 #include <jemalloc/jemalloc.h>
  • 5.systemd托管
# 创建Redis用户
groupadd redis
useradd -g redis -M -s /usr/sbin/nologin

# systemd
cat /usr/lib/systemd/system/redis.service
[Unit]
Description=Redis persistent key-value database
After=network.target

[Service]
ExecStart=/path/to/redis/bin/redis-server /path/to/redis/redis.conf  --daemonize no --supervised systemd
ExecStop=/path/to/redis/bin/redis-cli shutdown
Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755

[Install]
WantedBy=multi-user.target

3.Yum安装

  • Epel源中默认是3.2.12版本的,如果需要其他版本的建议自己源码编译安装
  • Epel:
yum install epel-release
yum clean
yum makecache

yum install redis
Copyright by SKYNE all right reserved,powered by Gitbook 2022-01-06

results matching ""

    No results matching ""