1、服务器配置
| IP | 配置 | 操作系统 | 主机名 | 角色 |
|---|---|---|---|---|
| 172.16.10.141 | 2C4G | CentOS 7 | component1 | 主节点/哨兵 |
| 172.16.10.142 | 2C4G | CentOS 7 | component2 | 从节点/哨兵 |
| 172.16.10.143 | 2C4G | CentOS 7 | component3 | 从节点/哨兵 |
2、基础环境配置
systemctl stop firewalld
systemctl disable firewalld
sed -i 's/=enforcing/=disabled/g' /etc/sysconfig/selinux
setenforce 0
3、部署redis主从集群
3.1 redis源码下载
mkdir -p /data/pkg && cd /data/pkg
wget https://download.redis.io/releases/redis-8.4.0.tar.gz
tar xf redis-8.4.0.tar.gz
cd redis-8.4.0
3.2 编译redis
make && make PREFIX=/data/redis install
ls /data/redis/bin
看到该页面代表已经编译redis完成,查看/data/redis编译目录成功生成redis的相关二进制命令


3.3 redis.conf配置
3.3.1 master
mkdir -p /data/redis/logs
vim /etc/redis/redis.conf
#主要以下配置
#监听ip
bind 127.0.0.1 172.16.10.141 -::1
#开启持久化
daemonize yes
#redis进程id
pidfile /data/redis/redis_6379.pid
#redis日志
logfile "/data/redis/logs/redis_6379.log"
#持久化方式
appendonly yes
#密码配置
requirepass 123456
#主节点密码配置
masterauth 123456
完整配置预览
bind 127.0.0.1 172.16.10.141 -::1
protected-mode no
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
pidfile /data/redis/redis_6379.pid
loglevel notice
logfile "/data/redis/logs/redis_6379.log"
requirepass 123456
databases 16
always-show-logo no
set-proc-title yes
proc-title-template "{title} {listen-addr} {server-mode}"
locale-collate ""
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
rdb-del-sync-files no
dir ./
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync yes
repl-diskless-sync-delay 5
repl-diskless-sync-max-replicas 0
repl-diskless-load disabled
repl-disable-tcp-nodelay no
replica-priority 100
acllog-max-len 128
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"
appenddirname "appendonlydir"
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
aof-timestamp-enabled no
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-listpack-entries 512
hash-max-listpack-value 64
list-max-listpack-size -2
list-compress-depth 0
set-max-intset-entries 512
set-max-listpack-entries 128
set-max-listpack-value 64
zset-max-listpack-entries 128
zset-max-listpack-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
3.3.2 slave
mkdir -p /data/redis/logs
vim /etc/redis/redis.conf
#主要以下配置
#监听ip,改成对应的172.16.10.142和172.16.10.143
bind 127.0.0.1 172.16.10.142 -::1
#开启持久化
daemonize yes
#redis进程id
pidfile /data/redis/redis_6379.pid
#redis日志
logfile "/data/redis/logs/redis_6379.log"
#持久化方式
appendonly yes
#配置master关系
replicaof 172.16.10.141 6379
#密码配置
requirepass 123456
#主节点密码连接
masterauth 123456
完整配置预览
bind 127.0.0.1 172.16.10.143 -::1
protected-mode no
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
pidfile /data/redis/redis_6379.pid
loglevel notice
logfile "/data/redis/logs/redis_6379.log"
requirepass 123456
databases 16
always-show-logo no
set-proc-title yes
proc-title-template "{title} {listen-addr} {server-mode}"
locale-collate ""
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
rdb-del-sync-files no
dir ./
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync yes
repl-diskless-sync-delay 5
repl-diskless-sync-max-replicas 0
repl-diskless-load disabled
repl-disable-tcp-nodelay no
replica-priority 100
acllog-max-len 128
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"
appenddirname "appendonlydir"
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
aof-timestamp-enabled no
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-listpack-entries 512
hash-max-listpack-value 64
list-max-listpack-size -2
list-compress-depth 0
set-max-intset-entries 512
set-max-listpack-entries 128
set-max-listpack-value 64
zset-max-listpack-entries 128
zset-max-listpack-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
replicaof 172.16.10.141 6379
masterauth 123456
3.4 配置systemd服务
ln -s /data/redis/bin/* /usr/local/bin/
mkdir /etc/redis
cp /data/pkg/redis-8.4.0/redis.conf /etc/redis/
cat > /etc/systemd/system/redis.service << EOF
[Unit]
Description=Redis
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
[Install]
WantedBy=multi-user.target
EOF
3.5 启动redis
#三节点执行
systemctl daemon-reload
systemctl enable redis --now
systemctl status redis

3.6 验证主从状态
#主节点执行,172.16.10.141
redis-cli
127.0.0.1:6379> auth 123456
127.0.0.1:6379> info replication

4、部署哨兵集群
4.1 哨兵配置
#三节点执行
#创建哨兵目录
mkdir -p /data/redis/sentinel
cat > /etc/redis/sentinel.conf << EOF
protected-mode no
daemonize yes
port 6380
dir /data/redis/sentinel
sentinel monitor mymaster 172.16.10.141 6379 2
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 60000
logfile "/data/redis/logs/sentinel.log"
EOF
4.2 配置systemd服务
#三节点执行
cat > /etc/systemd/system/sentinel.service << EOF
[Unit]
Description=Redis
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/bin/redis-sentinel /etc/redis/sentinel.conf
[Install]
WantedBy=multi-user.target
EOF
4.3 启动哨兵集群
#三节点启动哨兵集群
systemctl daemon-reload
systemctl enable sentinel --now
systemctl status sentinel

5、故障转移测试
5.1 原master状态
原master:172.16.10.141
[root@component1 redis]# redis-cli
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.16.10.142,port=6379,state=online,offset=92857,lag=1
slave1:ip=172.16.10.143,port=6379,state=online,offset=92857,lag=0
master_failover_state:no-failover
master_replid:80f3b390fa44e444276c11405bc093b60b467125
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:92857
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:92857
127.0.0.1:6379>

5.2 模拟故障
#master节点停止redis
systemctl stop redis
观察172.16.10.142,非master,角色不变
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:172.16.10.141
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_read_repl_offset:115434
slave_repl_offset:115434
replica_full_sync_buffer_size:0
replica_full_sync_buffer_peak:0
master_current_sync_attempts:12
master_total_sync_attempts:13
master_link_down_since_seconds:12
total_disconnect_time_sec:12
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:80f3b390fa44e444276c11405bc093b60b467125
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:115434
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:29
repl_backlog_histlen:115406
127.0.0.1:6379>

观察172.16.10.143,由此可见,改节点已从slave升级为master节点
[root@component3 ~]# redis-cli
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=172.16.10.142,port=6379,state=online,offset=126657,lag=0
master_failover_state:no-failover
master_replid:cc0c78dc25811a80c55bcdec6af4734cc78981f4
master_replid2:80f3b390fa44e444276c11405bc093b60b467125
master_repl_offset:126937
second_repl_offset:115435
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:43
repl_backlog_histlen:126895
127.0.0.1:6379>

5.3 重新启动原master
#172.16.10.141,已从master降为slave
systemctl start redis

查看master集群状态,172.16.10.143执行
[root@component3 logs]# redis-cli
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.16.10.142,port=6379,state=online,offset=376300,lag=1
slave1:ip=172.16.10.141,port=6379,state=online,offset=376440,lag=0
master_failover_state:no-failover
master_replid:cc0c78dc25811a80c55bcdec6af4734cc78981f4
master_replid2:80f3b390fa44e444276c11405bc093b60b467125
master_repl_offset:376440
second_repl_offset:115435
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:43
repl_backlog_histlen:376398
127.0.0.1:6379>

至此,redis主从集群、哨兵故障转移集群已成功部署
评论区