4 min read

源代码编译安装redis

源代码编译安装redis

一、系统环境

  • OS: Openeuler 24.03 LTS
  • Redis版本:7.2.12
  • 架构:哨兵模式
  • 目录规划:
  • /data/redis/DATA
  • /data/redis/LOGS

二、系统配置

2.1 前置配置

1、系统内核

echo 65535 > /proc/sys/net/core/somaxconn
echo 1 > /proc/sys/vm/overcommit_memory

sysctl -w net.core.somaxconn=65535
sysctl -w vm.overcommit_memory=1
echo "net.core.somaxconn = 65535" | tee -a /etc/sysctl.d/99-redis.conf
echo "vm.overcommit_memory = 1" | tee -a /etc/sysctl.d/99-redis.conf

2、安装系统依赖包

yum -y install yum install make gcc gcc-c++

3、创建用户

id redis || useradd -u 6379 redis -s /sbin/nologin -M

4、创建数据目录

install -d /data/redis/DATA \
           /data/redis/LOGS \
           -o redis \
           -g redis

2.2 Redis 编译安装

1、下载

export version=7.2.12
wget http://download.redis.io/releases/redis-${version}.tar.gz
tar axvf redis-${version}.tar.gz
cd redis-${version}

2、编译安装

make distclean
make BUILD_TLS=no -j $(nproc --all)
make PREFIX=/usr/local/redis-${version} install
cd /usr/local/ && ln -svf redis-${version} redis
默认使用jemalloc分配器,所以先安装jemalloc内存管理器
cd deps/jemalloc
./configure && make -j 8 && make install

3、完成后使用以下检测版本

./redis-server --version                                                               
Redis server v=7.2.12 sha=00000000:0 malloc=jemalloc-5.3.0 bits=64 build=67aa91aee02876f6

4、创建系统环境变量

cat >/etc/profile.d/redis.sh<<EOF
export PATH=\$PATH:/usr/local/redis/bin
EOF

5、创建配置文件

cat >/etc/redis.conf <<EOF
### GENERAL CONFIGURATION
bind 0.0.0.0
port 6379
maxclients 20000
daemonize no
supervised no
protected-mode no
dir "/data/redis/DATA"
pidfile /var/run/redis_6379.pid
loglevel notice
logfile "/data/redis/LOGS/redis.log"
databases 16
always-show-logo yes
maxmemory 0
maxmemory-policy volatile-lru
appenddirname "appenddir"
appendfilename "appendonly.aof"

### Snapshot settings
save 900 1
save 300 10
save 60 10000

### SAFE CONFIGURE
# 禁止使用FLUSHALL
rename-command FLUSHALL ""

# 至少需要1台健康的从节点,主节点才能写入
min-replicas-to-write 1
# 延迟小于5秒slave才判定为健康slave
min-replicas-max-lag 5

### REPLICATION
replica-serve-stale-data yes
replica-read-only yes

#replicaof 172.20.5.11 6379
#slave-announce-port 6379
#slave-announce-ip 10.96.200.25
EOF

6、创建systemd文件

cat >/usr/lib/systemd/system/redis.service<<EOF
[Unit]
Description=redis-server
After=network.target

[Service]
Type=simple
User=redis
Group=redis
ExecStart=/usr/local/redis/bin/redis-server /etc/redis.conf \
                                            --daemonize no \
                                            --supervised systemd
ExecStop=/usr/local/redis/bin/redis-cli shutdown
LimitNOFILE=65535
NoNewPrivileges=yes
OOMScoreAdjust=-900
TimeoutStartSec=infinity
TimeoutStopSec=infinity
UMask=0077
WorkingDirectory=/data/redis

[Install]
WantedBy=multi-user.target
EOF

7、启动服务

# systemctl enable redis --now

三、Sentinel架构配置

3.1 创建配置文件

1、写入sentinel配置文件

cat >/etc/redis-sentinel.conf<<EOF
protected-mode no       
supervised systemd
port 26379
daemonize no
maxclients 10000
pidfile "/var/run/redis-sentinel.pid"
loglevel notice
logfile "/data/redis/LOGS/sentinel.log"
dir "/tmp"

sentinel monitor mymaster 110.10.2.41 6379 2
sentinel auth-pass mymaster vqiu@8848

sentinel down-after-milliseconds mymaster 10000
sentinel failover-timeout mymaster 15000
EOF

2、创建systemd文件

cat >/usr/lib/systemd/system/redis-sentinel.service<<EOF
[Unit]
Description=Redis Sentinel
After=network.target
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=root
Group=root
ExecStart=/usr/local/redis/bin/redis-sentinel /etc/redis-sentinel.conf --supervised systemd
ExecStop=/usr/local/redis/bin/redis-cli -p 26379 shutdown
LimitNOFILE=10240

[Install]
WantedBy=multi-user.target
EOF

3.2 启动服务

systemctl restart redis-sentinel

3.3 测试

# redis-cli -p 26379 sentinel master mymaster
# redis-cli -p 26379 sentinel slaves mymaster
# redis-cli -p 26379 sentinel sentinels mymaster
# redis-cli -p 26379 sentinel get-master-addr-by-name mymaster

四、使用Haproxy代理[可选]

在哨兵前面添置一个haproxy,来兼顾支持非哨兵模式的应用。

cat >/etc/haproxy/haproxy.cfg<<EOF
frontend Redis
    bind            0.0.0.0:6379  name redis-server
    mode            tcp
    log             global
    timeout client  30000
    default_backend redis_backend

backend redis_backend
    mode            tcp
    timeout connect 30000
    timeout server  30000
    retries         3
    option          tcp-check
    tcp-check       connect
    tcp-check       send AUTH\ vqiu@8848\r\n
    tcp-check       send PING\r\n
    tcp-check       expect string +PONG
    tcp-check       send info\ replication\r\n
    tcp-check       expect string role:master
    tcp-check       send QUIT\r\n
    tcp-check       expect string +OK
    server          r1 172.20.5.11:6379 check inter 1000 maxconn 4096
    server          r2 172.20.5.12:6379 check inter 1000 maxconn 4096
    server          r3 172.20.5.13:6379 check inter 1000 maxconn 4096

frontend stats
    mode            http
    bind            *:8848
    stats           enable
    stats           uri /stats
    stats           refresh 10s
    timeout connect 30000
    timeout server  30000

测试

127.0.0.1:6379> SET domain vqiu.cn
OK
127.0.0.1:6379> get domain
"vqiu.cn"

参考引用