Redis 6 主從複製環境搭建

本篇基於 Red Hat Enterprise Linux release 8.1 進行 Redis 6.2.7 的安裝

目錄:

  1. 準備工作

  2. 安裝依賴包

  3. 創建用戶及目錄

  4. Redis 安裝

  5. 編譯源碼

  6. 修改權限

  7. 編寫配置文件

  8. 啓動 Redis

  9. 查看 Redis

  10. Redis 主從環境搭建

  11. 拓撲結構

  12. 環境配置

  13. 啓動 Redis

  14. 配置複製關係

  15. 查看複製關係

  16. 故障模擬

準備工作

安裝 Redis 之前需檢查依賴包是否安裝,若沒有安裝則進行安裝,同時,爲了更好的管理,建議創建對應的用戶和目錄。

安裝依賴包

使用 root 用戶安裝 redis 所需的依賴包:

yum install make
yum install gcc

創建用戶及目錄

使用 root 用戶登錄創建 redis 用戶和組以及對應的目錄:

groupadd -g 3001 redis
useradd -u 3001 -g redis redis
mkdir -p /bankapp/redis
mkdir -p /bankapp/redis/rd5410/conf
mkdir -p /bankapp/redis/rd5410/data
mkdir -p /bankapp/redis/rd5410/log
chown -R redis:redis /bankapp/redis/

下載並上傳安裝文件至 / tmp 目錄:

下載地址:https://download.redis.io/releases/

Redis 安裝

Redis 安裝需要進行源碼編譯、配置文件編寫等,具體如下:

編譯源碼

使用 redis 用戶切換至對應的目錄進行源碼編譯:

tar xvf /tmp/redis-6.2.7.tar.gz -C /bankapp/redis/
cd /bankapp/redis/
mv redis-6.2.7 base
cd base/
make

安裝報錯:fatal error: jemalloc/jemalloc.h: No such file or directory

解決:make distclean

修改權限

爲安全控制目錄及可執行程序,做出以下權限控制:

ln -s /bankapp/redis/base/src/redis-server /bankapp/redis/base/redis-server
ln -s /bankapp/redis/base/src/redis-cli /bankapp/redis/base/redis-cli
ln -s /bankapp/redis/base/src/redis-sentinel /bankapp/redis/base/redis-sentinel
echo "REDIS_HOME=/bankapp/redis/base/" >> /home/redis/.bash_profile
echo "PATH=\$REDIS_HOME:\$PATH" >> /home/redis/.bash_profile
source /home/redis/.bash_profile
chmod g-w /bankapp/redis/base/src
chmod o-x /bankapp/redis/base/src
chmod 740 /bankapp/redis/base/src/redis-sentinel
chmod 740 /bankapp/redis/base/src/redis-server
chmod 750 /bankapp/redis/base/src/redis-cli
chmod 750 /bankapp/redis/base/src/redis-trib.rb
chmod 750 /bankapp/redis/base/src/redis-benchmark
chmod 750 /bankapp/redis/base/src/redis-check-aof
chmod 750 /bankapp/redis/base/src/redis-check-rdb

編寫配置文件

以 redis 用戶編寫配置文件:

cd /bankapp/redis/rd5410/conf/
cat redis.conf
daemonize yes
pidfile "/bankapp/redis/rd5410/log/redis.pid"
port 5410
tcp-backlog 511
bind * -::*
timeout 0
tcp-keepalive 0
loglevel notice
logfile "/bankapp/redis/rd5410/log/redis.log"
databases 16
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename "dump5410.rdb"
dir "/bankapp/redis/rd5410/data"
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
# rename-command FLUSHDB       xxxxx
# rename-command FLUSHALL
# rename-command KEYS
# rename-command CONFIG
# rename-command SHUTDOWN
maxmemory 7GB
maxmemory-policy volatile-lru
appendonly no
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
lua-time-limit 5000
# cluster-enabled yes
# cluster-config-file nodes-5410.conf
# cluster-node-timeout 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
masterauth "redispwd"
requirepass "redispwd"

啓動 Redis

以 redis 用戶啓動 Redis:

redis-server /bankapp/redis/rd5410/conf/redis.conf

查看 Redis

以 redis 用戶登錄,如果 Redis 做了認證,需通過 auth 命令輸入密碼,若使用非默認端口,則需通過 - p 選項指定端口號:

[redis@r01 rd5410]$ redis-cli -p 5410
127.0.0.1:5410> auth redispwd
OK
127.0.0.1:5410> info
# Server
redis_version:6.2.7

Redis 主從複製環境安裝

拓撲結構

這裏將搭建一主兩從的複製架構,具體如下:

在生產環境中,各個 redis 實例應該部署在不同的服務器上。

環境配置

以 redis 用戶在原來實例的基礎上,創建另外兩個目錄:

cd /bankapp/redis/
cp -R rd5410 rd5411
cp -R rd5410 rd5412

分別進入對應的目錄,修改 redis 配置文件,以 rd5411 目錄爲例,修改如下配置:

vim rd5411/conf/redis.conf
:%s/5410/5411/g

啓動 Redis

分別啓動 Redis 實例:

redis-server /bankapp/redis/rd5410/conf/redis.conf
redis-server /bankapp/redis/rd5411/conf/redis.conf
redis-server /bankapp/redis/rd5412/conf/redis.conf

查看 redis 進程:

[redis@r01 ~]$ ps -ef|grep redis
redis     3495     1  0 21:07 ?        00:00:00 redis-server *:5410
redis     3501     1  0 21:07 ?        00:00:00 redis-server *:5411
redis     3507     1  0 21:07 ?        00:00:00 redis-server *:5412

配置複製關係

在端口 5411 配置複製關係:

[redis@r01 ~]$ redis-cli -p 5411
127.0.0.1:5411> auth redispwd
OK
127.0.0.1:5411> replicaof 192.168.56.104 5410
OK
127.0.0.1:5411> info replication
# Replication
role:slave
master_host:192.168.56.104
master_port:5410
master_link_status:up
master_last_io_seconds_ago:7
master_sync_in_progress:0
slave_read_repl_offset:126
slave_repl_offset:126
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:d94c2d2fcae4ac39a001c2c6a5fc5d65a6f6b8e2
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:126
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:126

同樣的方式,配置端口 5412:

[redis@r01 ~]$ redis-cli -p 5412
127.0.0.1:5412> auth redispwd
OK
127.0.0.1:5412> replicaof 192.168.56.104 5410
OK

查看複製關係

在端口 5410 查看複製關係,可以看到有 2 個從庫:

[redis@r01 ~]$ redis-cli -p 5410
127.0.0.1:5410> auth redispwd
OK
127.0.0.1:5410> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.56.104,port=5411,state=online,offset=364,lag=1
slave1:ip=192.168.56.104,port=5412,state=online,offset=364,lag=1
master_failover_state:no-failover
master_replid:d94c2d2fcae4ac39a001c2c6a5fc5d65a6f6b8e2
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:364
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:364

在端口 5411 查看複製關係,可以看到其作爲從庫:

127.0.0.1:5411> info replication
# Replication
role:slave
master_host:192.168.56.104
master_port:5410
master_link_status:up
master_last_io_seconds_ago:9
master_sync_in_progress:0
slave_read_repl_offset:420
slave_repl_offset:420
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:d94c2d2fcae4ac39a001c2c6a5fc5d65a6f6b8e2
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:420
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:420

在端口 5412 查看複製關係,可以看到其作爲從庫:

127.0.0.1:5412> info replication
# Replication
role:slave
master_host:192.168.56.104
master_port:5410
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_read_repl_offset:518
slave_repl_offset:518
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:d94c2d2fcae4ac39a001c2c6a5fc5d65a6f6b8e2
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:518
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:281
repl_backlog_histlen:238

故障模擬

在主節點 5410 模擬故障:

kill -9 3495

查看從節點 5411,觀察其主從關係,發現其仍是從庫:

127.0.0.1:5411> info replication
# Replication
role:slave
master_host:192.168.56.104
master_port:5410
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_read_repl_offset:990
slave_repl_offset:990
master_link_down_since_seconds:33
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:d94c2d2fcae4ac39a001c2c6a5fc5d65a6f6b8e2
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:990
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:990

查看從節點 5412,觀察其主從關係,發現其仍是從庫:

127.0.0.1:5412> info replication
# Replication
role:slave
master_host:192.168.56.104
master_port:5410
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_read_repl_offset:990
slave_repl_offset:990
master_link_down_since_seconds:80
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:d94c2d2fcae4ac39a001c2c6a5fc5d65a6f6b8e2
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:990
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:281
repl_backlog_histlen:710

當主節點宕機後,兩個從節點都不會自動提升爲主節點,仍是從節點,當啓動原主節點後,其仍是主節點:

[redis@r01 ~]$ redis-server /bankapp/redis/rd5410/conf/redis.conf
[redis@r01 ~]$ redis-cli -p 5410
127.0.0.1:5410> auth redispwd
OK
127.0.0.1:5410> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.56.104,port=5411,state=online,offset=14,lag=1
slave1:ip=192.168.56.104,port=5412,state=online,offset=14,lag=1
master_failover_state:no-failover
master_replid:7740797d25f5a02f0938fec819e234a502896c2b
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:14
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:14

由此可見,在使用主從複製環境搭建 Redis 時,當主節點宕機後,從節點不能自動選主,需要手動干預,那麼有沒有好的方案可以自動選主呢,有,那就是使用哨兵,通過主從複製 + 哨兵機制,可大大提升 Redis 的可用性,也減輕運維的複雜性。

Alen 的數據庫學習筆記 數據庫技術分享,做一個認真的分享者。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/84DaDah6pE6WTvke-57UfA