源代码编译安装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"