操作系統(tǒng) | 主機(jī)IP | 功能 |
---|---|---|
centos 7 | 10.211.55.8 | Master:6379 / Sentinel : 26379 |
centos 7 | 10.211.55.9 | Slave :6379 / Sentinel : 26379 |
centos 7 | 10.211.55.10 | Slave :6379 / Sentinel : 26379 |
1. Linux 下 redis 安裝
官網(wǎng)地址:http://redis.io/download
1.1 安裝GCC編譯器
// 查看是否安裝gcc編譯器
rpm -q gcc
// 安裝gcc編譯器
yum -y install gcc
1.2 安裝Redis
cd /xiyou/software/
wget http://download.redis.io/releases/redis-5.0.5.tar.gz
tar zxvf redis-5.0.5.tar.gz //將下載的源碼包進(jìn)行解壓縮
cd redis-5.0.5 //進(jìn)入解壓縮目錄
make //編譯源程序
cd src && make install //切換到redis的src目錄并進(jìn)行編譯安裝
1.3 測(cè)試下是否安裝成功
## 啟動(dòng)redis服務(wù)
// The binaries that are now compiled are available in the src directory. Run Redis with:
$ src/redis-server
ps:如果需要將redis服務(wù)作為守護(hù)進(jìn)程(daemon)來(lái)運(yùn)行,須將redis.conf啟動(dòng)配置中的daemonize no修改daemonize yes 驱证。
--------------------------------------------------------------------------
## 啟動(dòng)redis客戶(hù)端
// You can interact with Redis using the built-in client:
$ src/redis-cli
redis> set foo bar
OK
redis> get foo
"bar"
--------------------------------------------------------------------------
## 停止Redis服務(wù)
./redis-cli shutdown
pkill redis-server
2.redis配置
2.1 redis.cnf配置
## redis.cnf文件目錄:/xiyou/software/redis-5.0.5/
## grep -Ev "^#|^$" redis.conf
## master:
bind 10.211.55.8
protected-mode no
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile "/var/log/redis/redis-server.log"
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir "/xiyou/software/redis-5.0.5/rdbs"
masterauth "123456"
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
requirepass "123456"
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
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
------------------------------------------------------------------------
slave:
## 與master結(jié)點(diǎn)的配置相同泛粹,最后添加一行
slaveof 10.211.55.8 6379
## bind 根據(jù)IP變換一下
2.2 sentinel.cnf 配置
## 3個(gè)結(jié)點(diǎn)的sentinel.cnf配置相同
protected-mode no
port 26379
daemonize yes
pidfile /var/run/redis-sentinel.pid
logfile "/var/log/redis/redis-sentinel.log"
dir "/xiyou/software/redis-5.0.5/sentinel-tmp"
sentinel monitor mymaster 10.211.55.8 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
2.3 創(chuàng)建對(duì)應(yīng)目錄
[root@centos-7-node2 log]# mkdir -p /var/log/redis/
[root@centos-7-node2 log]# mkdir -p /xiyou/software/redis-5.0.5/sentinel-tmp
[root@centos-7-node2 log]# mkdir -p /xiyou/software/redis-5.0.5/rdbs
2.4 啟動(dòng)服務(wù)
[root@centos-7-node4 redis-5.0.5]# cd /xiyou/software/redis-5.0.5/src/
[root@centos-7-node4 src]# ./redis-server ../redis.conf
[root@centos-7-node4 src]# ./redis-sentinel ../sentinel.conf
2.5 查看集群
## master:
[root@centos-7-node2 src]# redis-cli -h 10.211.55.8 -p 6379 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
10.211.55.8:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=10.211.55.9,port=6379,state=online,offset=16850,lag=1
slave1:ip=10.211.55.10,port=6379,state=online,offset=16850,lag=1
master_replid:b47bd7b2524ce8ca3264503eb22a1c06f45016e9
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:16850
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:16850
-----------------------------------------------------------------------------------
## slave
root@centos-7-node3 src]# redis-cli -h 10.211.55.9 -p 6379 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
10.211.55.9:6379> info replication
# Replication
role:slave
master_host:10.211.55.8
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:26794
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:b47bd7b2524ce8ca3264503eb22a1c06f45016e9
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:26794
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:26794
-----------------------------------------------------------------------------------------
## slave
root@centos-7-node4 src]# redis-cli -h 10.211.55.10 -p 6379 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
10.211.55.10:6379> info replication
# Replication
role:slave
master_host:10.211.55.8
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:34540
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:b47bd7b2524ce8ca3264503eb22a1c06f45016e9
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:34540
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:8658
repl_backlog_histlen:25883
3. 測(cè)試
3.1 master宕機(jī)
在Master 主節(jié)點(diǎn)(10.211.55.8)上執(zhí)行 pkill redis-server 命令來(lái)模擬Master宕機(jī)的情況:
==> 單個(gè)哨兵主觀(guān)認(rèn)為 Master 宕機(jī)
==> 當(dāng)主觀(guān)認(rèn)為 Master 宕機(jī)的哨兵個(gè)數(shù)達(dá)到 quorum 設(shè)定值時(shí)艳丛,哨兵集群客觀(guān)認(rèn)為 Master 宕機(jī)
==> 開(kāi)始 failover
==> 收集候選節(jié)點(diǎn)列表
==> 根據(jù)候選節(jié)點(diǎn)的優(yōu)先級(jí)和運(yùn)行狀態(tài)綜合判斷锐借,選擇一個(gè) Slave 并將其提拔為新的 Master
==> 將新的 Master 主節(jié)點(diǎn)信息通知到其他節(jié)點(diǎn)竭沫,并更新各節(jié)點(diǎn)的配置文件
## 查看10.211.55.8的redis-sentinel.log
10725:X 03 Jul 2019 06:51:32.386 # +odown master mymaster 10.211.55.8 6379 #quorum 3/2
10725:X 03 Jul 2019 06:51:32.386 # Next failover delay: I will not start a failover before Wed Jul 3 06:57:33 2019
10725:X 03 Jul 2019 06:51:33.114 # +config-update-from sentinel f2c13ca3312dd0bc7e796119cbe61d3d2c1ed4b8 10.211.55.9 26379 @ mymaster 10.211.55.8 6379
10725:X 03 Jul 2019 06:51:33.114 # +switch-master mymaster 10.211.55.8 6379 10.211.55.9 6379
10725:X 03 Jul 2019 06:51:33.114 * +slave slave 10.211.55.10:6379 10.211.55.10 6379 @ mymaster 10.211.55.9 6379
10725:X 03 Jul 2019 06:51:33.114 * +slave slave 10.211.55.8:6379 10.211.55.8 6379 @ mymaster 10.211.55.9 6379
//可以看到在選舉新的10.211.55.9作為新的主結(jié)點(diǎn)
// 驗(yàn)證10.211.55.9及10.211.55.10狀態(tài)
---------------------------------------------------------------------------
10.211.55.9:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=10.211.55.10,port=6379,state=online,offset=66360,lag=1
master_replid:639bfe3151ab71dcb95e68e3b76d543415d21ff4
master_replid2:b47bd7b2524ce8ca3264503eb22a1c06f45016e9
master_repl_offset:66360
second_repl_offset:40489
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:66360
-----------------------------------------------------------------------------
10.211.55.10:6379> info replication
# Replication
role:slave
master_host:10.211.55.9
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:69258
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:639bfe3151ab71dcb95e68e3b76d543415d21ff4
master_replid2:b47bd7b2524ce8ca3264503eb22a1c06f45016e9
master_repl_offset:69258
second_repl_offset:40489
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:8658
repl_backlog_histlen:60601
3.2 master 恢復(fù)
//10.211.55.8成為了slave結(jié)點(diǎn)
## 重啟10.211.55.8的redis-server膀捷,10.211.55.8成為了集群的slave結(jié)點(diǎn)
[root@centos-7-node2 src]# redis-cli -h 10.211.55.8 -p 6379 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
10.211.55.8:6379> info replication
# Replication
role:slave
master_host:10.211.55.9
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:267575
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:639bfe3151ab71dcb95e68e3b76d543415d21ff4
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:267575
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:263268
repl_backlog_histlen:4308
---------------------------------------redis-sentinel.log-------------------
10093:X 03 Jul 2019 07:09:13.821 # -sdown slave 10.211.55.8:6379 10.211.55.8 6379 @ mymaster 10.211.55.9 6379
10093:X 03 Jul 2019 07:09:23.753 * +convert-to-slave slave 10.211.55.8:6379 10.211.55.8 6379 @ mymaster 10.211.55.9 6379
3.3 slave宕機(jī)
//此時(shí)的集群為
//master: 10.211.55.9
//slave: 10.211.55.8
//slave: 10.211.55.10
--------------------------------------------------------------------------------
## 在slave從節(jié)點(diǎn)(10.211.55.10)上執(zhí)行 pkill redis-server 命令來(lái)模擬slave宕機(jī)的情況
## 主結(jié)點(diǎn)的slave變成了一個(gè)結(jié)點(diǎn)10.211.55.8
10.211.55.9:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=10.211.55.8,port=6379,state=online,offset=420227,lag=1
master_replid:639bfe3151ab71dcb95e68e3b76d543415d21ff4
master_replid2:b47bd7b2524ce8ca3264503eb22a1c06f45016e9
master_repl_offset:420241
second_repl_offset:40489
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:420241
3.4 slave恢復(fù)
## [root@centos-7-node4 src]# ./redis-server ../redis.conf
## 主結(jié)點(diǎn)上又恢復(fù)了兩個(gè)從結(jié)點(diǎn)
10.211.55.9:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=10.211.55.8,port=6379,state=online,offset=449011,lag=0
slave1:ip=10.211.55.10,port=6379,state=online,offset=449300,lag=0
master_replid:639bfe3151ab71dcb95e68e3b76d543415d21ff4
master_replid2:b47bd7b2524ce8ca3264503eb22a1c06f45016e9
master_repl_offset:449300
second_repl_offset:40489
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:449300
4. 異結(jié)點(diǎn)備份及恢復(fù)
4.1 備份恢復(fù)測(cè)試
Redis是一個(gè)開(kāi)源(BSD許可),內(nèi)存存儲(chǔ)的數(shù)據(jù)結(jié)構(gòu)服務(wù)器拿穴,可用作數(shù)據(jù)庫(kù)泣洞,高速緩存和消息隊(duì)列代理。生產(chǎn)中我們主要用來(lái)存儲(chǔ)用戶(hù)的登錄信息默色,設(shè)備的詳情數(shù)據(jù)球凰,以及會(huì)員簽到點(diǎn)贊的信息等等。
提到redis備份腿宰,就不得不提及redis的持久化的兩種方式:RDB和AOF呕诉。
- RDB持久化方式能夠在指定的時(shí)間間隔能對(duì)你的數(shù)據(jù)進(jìn)行快照存儲(chǔ).
- AOF持久化方式記錄每次對(duì)服務(wù)器寫(xiě)的操作,當(dāng)服務(wù)器重啟的時(shí)候會(huì)重新執(zhí)行這些命令來(lái)恢復(fù)原始的數(shù)據(jù),AOF命令以redis協(xié)議追加保存每次寫(xiě)的操作到文件末尾.Redis還能對(duì)AOF文件進(jìn)行后臺(tái)重寫(xiě),使得AOF文件的體積不至于過(guò)大.
## 將10.211.55.5 作為備份恢復(fù)結(jié)點(diǎn)
## redis配置文件中關(guān)于dump.rdb的配置
vim redis.cnf
-------------------------------------------------------------------
save 900 1
save 300 10
save 60 10000
# 將DB同步到磁盤(pán),使用SAVE命令酗失,自動(dòng)同步的觸發(fā)條件: save <秒> <更新數(shù)>
# save 900 1 代表900秒內(nèi)有1個(gè)key發(fā)生改變就觸發(fā)save
# save 300 10 代表300秒內(nèi)有10個(gè)key發(fā)生改變就觸發(fā)save
# save 60 10000 代表300秒內(nèi)有10個(gè)key發(fā)生改變就觸發(fā)save
# 各條件之間是‘或’的關(guān)系义钉,也就是說(shuō)有一個(gè)條件滿(mǎn)足就會(huì)觸發(fā)save的操作
stop-writes-on-bgsave-error yes
# 當(dāng)后臺(tái)進(jìn)程執(zhí)行save出錯(cuò)時(shí),停止redis的寫(xiě)入操作规肴。
rdbcompression yes
# 將rdb文件進(jìn)行壓縮
rdbchecksum yes
# 對(duì)rdb文件進(jìn)行校驗(yàn)
dbfilename dump.rdb
# rdb文件命名
dir "/xiyou/software/redis-5.0.5/rdbs"
# rdb文件存儲(chǔ)目錄
## 其他配置可暫時(shí)不改捶闸,只是為了測(cè)試下備份恢復(fù)
SAVE VS BGSAVE
SAVE ----- 備份redis可以手動(dòng)使用SAVE命令,執(zhí)行SAVE命令會(huì)使用主進(jìn)程執(zhí)行快照操作拖刃,這意味著在SAVE的過(guò)程中删壮,會(huì)阻塞主進(jìn)程。
BGSAVE ---- 另一種操作是使用BGSAVE兑牡,使用BGSAVE的話(huà)redis會(huì)fork出一個(gè)子進(jìn)程來(lái)執(zhí)行快照操作央碟,而不影響主進(jìn)程。
1. 往redis的sentinel集群結(jié)點(diǎn)中寫(xiě)一堆數(shù)據(jù)并進(jìn)行保存均函,便于后續(xù)測(cè)試
10.211.55.10:6379> set name18 oo
OK
10.211.55.10:6379> set name19 pp
OK
10.211.55.10:6379> set name20 qq
OK
10.211.55.10:6379> bgsave
Background saving started
2. 關(guān)閉10.211.55.5的redis-server
pkill redis-server
3. 將源集群中的dump.rdb復(fù)制到目標(biāo)服務(wù)器的對(duì)應(yīng)路徑亿虽,查看下文件大小是否一致
[root@centos-7-node2 rdbs]# scp dump.rdb root@10.211.55.5:/xiyou/software/redis-5.0.5/rdbs/
4. 啟動(dòng)10.211.55.5的redis-server并用redis-cli登陸測(cè)試下
[root@CentOS_node1 src]# ./redis-server ../redis.conf
[root@CentOS_node1 rdbs]# ll
總用量 4
-rw-r--r-- 1 root root 399 7月 3 09:32 dump.rdb
[root@CentOS_node1 rdbs]# redis-cli -h 10.211.55.5 -p 6379
10.211.55.5:6379> get name20
"qq"
## 說(shuō)明能成功恢復(fù)沒(méi)有問(wèn)題!0病洛勉!
4.2 備份腳本
/xiyou/software/redis_bak/bak.sh
vim bak.sh
---------------------------------------------------------------------
#!/bin/bash
source_host="10.211.55.8"
dest_host="10.211.55.5"
port="6379"
pass="123456"
scp_pass="123456"
REDIS_DIR=/xiyou/software/redis-5.0.5/rdbs
REDIS_CMD=/xiyou/software/redis-5.0.5/src/"redis-cli -h $source_host -p $port -a $pass"
now="$(date -d'+0 day' +'%Y%m%d%H%M%S')"
$REDIS_CMD save
[ $? -eq 0 ] && {
cp $REDIS_DIR/dump.rdb $REDIS_DIR/dump_${now}.rdb
sshpass -p $scp_pass scp -r $REDIS_DIR/dump_${now}.rdb root@$dest_host:$REDIS_DIR
}
4.3 定時(shí)任務(wù)
5 0 * * * /bin/sh /xiyou/software/redis_bak/bak.sh &>/dev/null
那些年我們一起踩過(guò)的坑:
1. sshpass: command not found error
apt-get install sshpass ##ubuntu
-------------------------------
wget http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh epel-release-6-8.noarch.rpm
yum --enablerepo=epel -y install sshpass ##centos/redhat
##參考:https://stackoverflow.com/questions/38129835/sshpass-command-not-found-error
2. bash命名規(guī)范
中間不能有空格,可以使用下劃線(xiàn)(_)
##參考:http://www.runoob.com/linux/linux-shell-variable.html
待補(bǔ)充:redis集群連接
參考:
https://redis.io/topics/persistence
https://cloud.tencent.com/info/0420774e51445c7dbc75dcb1ff6fe49c.html
https://blog.csdn.net/pengjunlee/article/details/81429119