编译安装redis6.2.13集群-哨兵模式

发布时间 2023-07-19 14:20:38作者: 奔跑的运维

下载并编译Redis

虽然使用SLES15进行编译,但是理论上在其它系统上也是可行的,我们把编译所需要的依赖包安装即可。

Redis我们选择6.2.13这个版本, 我们先随便找个节点进行编译产生二进制文件

#首先安装依赖包
zypper ref && zypper install gcc make systemd-devel    #SLES/SUSE
yum install gcc make systemd-devel                     #CentOS
apt install gcc make libsystemd-dev                    #Debian
#下载解压编译
curl -LO https://download.redis.io/releases/redis-6.2.13.tar.gz
tar -zcf redis-6.2.13.tar.gz
cd redis-6.2.13
make BUILD_WITH_SYSTEMD=yes USE_SYSTEMD=yes MALLOC=libc
#重新tar下包,在其它机器上直接使用
cd ..
mv redis-6.2.13 redis-6.2.13-bin
tar -zcf redis-6.2.13-bin.tgz redis-6.2.13-bin

安装哨兵集群

集群节点信息

IP ROLE Port
192.168.168.121 Master 6379 + 26379
192.168.168.122 Slave 6379 + 26379
192.168.168.123 Slave 6379 + 26379

将上面的redis-6.2.13-bin.tgz拷贝并上传到上面的所有节点,并在所有节点执行下面的命令

#使用非root用户运行redis
groupadd -r redis
useradd -r -s /sbin/nologin -d /var/lib/redis -g redis -c 'Redis Server Account' redis
mkdir /var/lib/redis /var/log/redis /etc/redis
#解压redis-6.2.13-bin.tgz并分发文件
cd redis-6.2.13-bin/src
cp redis-server redis-sentinel redis-cli redis-benchmark redis-check-aof redis-check-rdb redis-trib.rb /usr/bin/
touch /etc/redis/redis.conf /etc/redis/sentinel.conf
chown -Rf redis:redis /etc/redis /var/lib/redis /var/log/redis

配置redis服务自启动和redis-sentinel服务自启动, 我们使用systemd管理服务的启动与停止,在所有节点执行下面的动作

新增/usr/lib/systemd/system/redis-server.service, 增加下面的内容

[Unit]
Description=Advanced key-value store
After=network.target
Documentation=http://redis.io/documentation, man:redis-server(1)

[Service]
Type=notify
ExecStart=/usr/bin/redis-server /etc/redis/redis.conf
ExecStop=/bin/kill -s TERM $MAINPID
PIDFile=/run/redis/redis.pid
TimeoutStopSec=0
Restart=always
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=2755

UMask=007
PrivateTmp=yes
LimitNOFILE=65535
PrivateDevices=yes
ProtectHome=yes
ReadOnlyDirectories=/
ReadWriteDirectories=-/var/lib/redis
ReadWriteDirectories=-/var/log/redis
ReadWriteDirectories=-/run/redis

NoNewPrivileges=true
CapabilityBoundingSet=CAP_SETGID CAP_SETUID CAP_SYS_RESOURCE
RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX
MemoryDenyWriteExecute=true
ProtectKernelModules=true
ProtectKernelTunables=true
ProtectControlGroups=true
RestrictRealtime=true
RestrictNamespaces=true

# redis-server can write to its own config file when in cluster mode so we
# permit writing there by default. If you are not using this feature, it is
# recommended that you replace the following lines with "ProtectSystem=full".
ProtectSystem=true
ReadWriteDirectories=-/etc/redis

[Install]
WantedBy=multi-user.target

新增/usr/lib/systemd/system/redis-sentinel.service, 增加下面的内容

[Unit]
Description=Advanced key-value store
After=network.target redis.service
Documentation=http://redis.io/documentation, man:redis-sentinel(1)

[Service]
Type=notify
ExecStart=/usr/bin/redis-sentinel /etc/redis/sentinel.conf
ExecStop=/bin/kill -s TERM $MAINPID
PIDFile=/run/sentinel/redis-sentinel.pid
TimeoutStopSec=0
Restart=always
User=redis
Group=redis
RuntimeDirectory=sentinel
RuntimeDirectoryMode=2755

UMask=007
PrivateTmp=yes
LimitNOFILE=65535
PrivateDevices=yes
ProtectHome=yes
ReadOnlyDirectories=/
ReadWriteDirectories=-/var/lib/redis
ReadWriteDirectories=-/var/log/redis
ReadWriteDirectories=-/run/sentinel

NoNewPrivileges=true
CapabilityBoundingSet=CAP_SETGID CAP_SETUID CAP_SYS_RESOURCE
RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX
MemoryDenyWriteExecute=true
ProtectKernelModules=true
ProtectKernelTunables=true
ProtectControlGroups=true
RestrictRealtime=true
RestrictNamespaces=true

# redis-sentinel can write to its own config file when in cluster mode so we
# permit writing there by default. If you are not using this feature, it is
# recommended that you replace the following lines with "ProtectSystem=full".
ProtectSystem=true
ReadWriteDirectories=-/etc/redis

[Install]
WantedBy=multi-user.target

配置Master

在Mater节点,编辑/etc/redis/redis.conf 文件, 清理原先内容,增加下面的内容

bind 0.0.0.0
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
supervised systemd
pidfile /run/redis/redis.pid
loglevel notice
logfile "/var/log/redis/redis.log"
databases 16
always-show-logo no
set-proc-title yes
proc-title-template "{title} {listen-addr} {server-mode}"
save 900 1
save 300 100
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
rdb-del-sync-files no
dir /var/lib/redis
masterauth 123456
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-diskless-load disabled
repl-disable-tcp-nodelay no
replica-priority 100
min-replicas-to-write 1
acllog-max-len 128
requirepass 123456
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
lazyfree-lazy-user-del no
lazyfree-lazy-user-flush no
oom-score-adj no
oom-score-adj-values 0 200 800
disable-thp yes
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
jemalloc-bg-thread yes

配置Slave

在所有Slave节点,编辑/etc/redis/redis.conf 文件, 清理原先内容,增加下面的内容

bind 0.0.0.0
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
supervised systemd
pidfile /run/redis/redis.pid
loglevel notice
logfile "/var/log/redis/redis.log"
databases 16
always-show-logo no
set-proc-title yes
proc-title-template "{title} {listen-addr} {server-mode}"
save 900 1
save 300 100
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
rdb-del-sync-files no
dir /var/lib/redis
replicaof 192.168.168.121 6379
masterauth 123456
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-diskless-load disabled
repl-disable-tcp-nodelay no
replica-priority 100
min-replicas-to-write 1
acllog-max-len 128
requirepass 123456
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
lazyfree-lazy-user-del no
lazyfree-lazy-user-flush no
oom-score-adj no
oom-score-adj-values 0 200 800
disable-thp yes
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
jemalloc-bg-thread yes

配置哨兵

在所有节点,编辑/etc/redis/redis-sentinel.conf 文件, 清理原先内容,增加下面的内容

port 26379
daemonize yes
supervised systemd
pidfile /run/sentinel/redis-sentinel.pid
logfile "/var/log/redis/redis-sentinel.log"
dir /var/lib/redis
sentinel monitor mymaster 192.168.168.121 6379 2
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 30000
acllog-max-len 128
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
SENTINEL resolve-hostnames no
SENTINEL announce-hostnames no

启动集群

# 先启动master上的redis, 再启动slave上的redis
systemctl enable --now redis-server.service
# 在所有节点启动redis-sentinel哨兵
systemctl enable --now redis-sentinel.service