Redis 6 主從複製環境搭建
本篇基於 Red Hat Enterprise Linux release 8.1 進行 Redis 6.2.7 的安裝
目錄:
-
準備工作
-
安裝依賴包
-
創建用戶及目錄
-
Redis 安裝
-
編譯源碼
-
修改權限
-
編寫配置文件
-
啓動 Redis
-
查看 Redis
-
Redis 主從環境搭建
-
拓撲結構
-
環境配置
-
啓動 Redis
-
配置複製關係
-
查看複製關係
-
故障模擬
準備工作
安裝 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