目錄
- 一、單節(jié)點(diǎn)實(shí)例
- 二、主從模式(master/slaver)
- 三、sentinel 模式
- 四、cluster 模式
一、單節(jié)點(diǎn)實(shí)例
單節(jié)點(diǎn)實(shí)例還是比較簡(jiǎn)單的,平時(shí)做個(gè)測(cè)試,寫個(gè)小程序如果需要用到緩存的話,啟動(dòng)一個(gè)
Redis 還是很輕松的,做為一個(gè) key/value 數(shù)據(jù)庫(kù)也是可以勝任的
二、主從模式(master/slaver)
redis 主從模式配置
主從模式:
redis 的主從模式,使用異步復(fù)制,slave 節(jié)點(diǎn)異步從 master 節(jié)點(diǎn)復(fù)制數(shù)據(jù),master
節(jié)點(diǎn)提供讀寫服務(wù),slave 節(jié)點(diǎn)只提供讀服務(wù)(這個(gè)是默認(rèn)配置,可以通過(guò)修改配置文件
slave-read-only 控制)。master 節(jié)點(diǎn)可以有多個(gè)從節(jié)點(diǎn)。配置一個(gè) slave 節(jié)點(diǎn)只需要在
redis.conf 文件中指定 slaveof master-ip master-port 即可。
從節(jié)點(diǎn)開啟主從復(fù)制,有 3 種方式:
配置文件
在從服務(wù)器的配置文件中加入:slaveofmasterip>masterport>
啟動(dòng)命令
redis-server 啟動(dòng)命令后加入:slaveofmasterip>masterport>
客戶端命令
Redis 服務(wù)器啟動(dòng)后直接通過(guò)客戶端執(zhí)行命令:slaveofmasterip>masterport>,則該 Redis
實(shí)例成為從節(jié)點(diǎn)。
上述 3 種方式是等效的,下面以客戶端命令的方式為例,看一下當(dāng)執(zhí)行了 slaveof 后,Redis
主節(jié)點(diǎn)和從節(jié)點(diǎn)的變化。
本示例:一個(gè) master 節(jié)點(diǎn)有兩個(gè) slave 節(jié)點(diǎn)
配置:
1,cd /usr/local/redis/redis-4.0.2
切換到當(dāng)前 redis 安裝路徑
2, mkdir config
新建一個(gè)文件夾,存放 redis 的配置文件
3,在 config 下,新建三個(gè)配置文件,如下:
cd config
vi master-6739.conf
bind 0.0.0.0
port 6379
logfile "6379.log"
dbfilename "dump-6379.rdb"
daemonize yes
rdbcompression yes
vi slave-6380.confbind 0.0.0.0
port 6380
logfile "6380.log"
dbfilename "dump-6380.rdb"
daemonize yes
rdbcompression yes
slaveof 192.168.81.135 6379
vi slave-6381.conf
bind 0.0.0.0
port 6381
logfile "6381.log"
dbfilename "dump-6381.rdb"
daemonize yes
rdbcompression yes
slaveof 192.168.81.135 6379
master-6739.conf,為主節(jié)點(diǎn)配置文件,slave-6380.conf,slave-6381.conf為從節(jié)點(diǎn)配置文件
在從節(jié)點(diǎn)的配置文件中使用:slaveof 指定 master 節(jié)點(diǎn)
4,啟動(dòng)三臺(tái) reids 服務(wù)
[root@localhost redis-4.0.2]# ./src/redis-server config/master-6379.conf
[root@localhost redis-4.0.2]# ./src/redis-server config/slave-6380.conf
[root@localhost redis-4.0.2]# ./src/redis-server config/slave-6381.conf
查看一下 redis 服務(wù)
測(cè)試主從模式
a,先分別連上三臺(tái) Redis 服務(wù),獲取 key 為 name 的值,通過(guò)-p 指定連接那個(gè)端口的 redis 服務(wù)
[root@localhost redis-4.0.2]# ./src/redis-cli -p 6379
127.0.0.1:6379> get name
(nil)
[root@localhost redis-4.0.2]# ./src/redis-cli -p 6380
127.0.0.1:6380> get name
(nil)
[root@localhost redis-4.0.2]# ./src/redis-cli -p 6381
127.0.0.1:6381> get name
(nil)
#獲取的值都為空
b,給 master 節(jié)點(diǎn) set 一個(gè) key
[root@localhost redis-4.0.2]# ./src/redis-cli -p 6379
127.0.0.1:6379> set name cmy
OK
127.0.0.1:6379> get name
"cmy"
c,slave 節(jié)點(diǎn)直接讀取 key 為 name 的值
[root@localhost redis-4.0.2]# ./src/redis-cli -p 6380
127.0.0.1:6380> get name
"cmy"
[root@localhost redis-4.0.2]# ./src/redis-cli -p 6381
127.0.0.1:6381> get name
"cmy"
d,slave 節(jié)點(diǎn)只提供讀服務(wù),不能進(jìn)行寫入操作
127.0.0.1:6381> set age 23
(error) READONLY You can't write against a read only slave.
注意
使用主從模式時(shí)應(yīng)注意 matser 節(jié)點(diǎn)的持久化操作,matser 節(jié)點(diǎn)在未使用持久化的情況詳情
下如果宕機(jī),并自動(dòng)重新拉起服務(wù),從服務(wù)器會(huì)出現(xiàn)丟失數(shù)據(jù)的情況。
首先,禁止 matser 服務(wù)持久化
127.0.0.1:6379> CONFIG SET save ""
OK
在 master 節(jié)點(diǎn) set 一個(gè)值
127.0.0.1:6379> set age 23
OK
slave 節(jié)點(diǎn)可以 get 到 age 的值
127.0.0.1:6380> get age
"23"
關(guān)掉 master 節(jié)點(diǎn)服務(wù)
127.0.0.1:6379> shutdown
not connected>
slave 節(jié)點(diǎn)此時(shí)仍可以 get 到 age 的值
127.0.0.1:6380> get age
"23"
重啟 master 服務(wù),此時(shí)獲取不到 age 的值
[root@localhost redis-4.0.2]# ./src/redis-server config/master-6379.conf
[root@localhost redis-4.0.2]# ./src/redis-cli -p 6379
127.0.0.1:6379> get age
(nil)
slave 節(jié)點(diǎn)此時(shí)在獲取 age 的值為空,數(shù)據(jù)丟失
[root@localhost redis-4.0.2]# ./src/redis-cli -p 6380
127.0.0.1:6380> get age
(nil)
數(shù)據(jù)丟失的原因:因?yàn)?master 服務(wù)掛了之后,重啟服務(wù)后,slave 節(jié)點(diǎn)會(huì)與 master 節(jié)點(diǎn)進(jìn)行
一次完整的重同步操作,所以由于 master 節(jié)點(diǎn)沒有持久化,就導(dǎo)致 slave 節(jié)點(diǎn)上的數(shù)據(jù)也會(huì)
丟失掉。所以在配置了 Redis 的主從模式的時(shí)候,應(yīng)該打開主服務(wù)器的持久化功能。
到這,redis 的主從模式就已經(jīng)完成了
談?wù)勎艺J(rèn)為主從模式的必要性:
主從模式的一個(gè)作用是備份數(shù)據(jù),這樣當(dāng)一個(gè)節(jié)點(diǎn)損壞(指不可恢復(fù)的硬件損壞)時(shí),數(shù)據(jù)因?yàn)橛袀浞荩梢苑奖慊謴?fù)。
另一個(gè)作用是負(fù)載均衡,所有客戶端都訪問(wèn)一個(gè)節(jié)點(diǎn)肯定會(huì)影響 Redis 工作效率,有了主從以后,查詢操作就可以通過(guò)查詢從節(jié)點(diǎn)來(lái)完成。
對(duì)主從模式必須的理解(結(jié)論已經(jīng)驗(yàn)證過(guò),可以自行驗(yàn)證):
一個(gè) Master 可以有多個(gè) Slaves
默認(rèn)配置下,master 節(jié)點(diǎn)可以進(jìn)行讀和寫,slave 節(jié)點(diǎn)只能進(jìn)行讀操作,寫操作被禁止
不要修改配置讓 slave 節(jié)點(diǎn)支持寫操作,沒有意義,原因一,寫入的數(shù)據(jù)不會(huì)被同步到其他節(jié)點(diǎn);原因二,當(dāng) master 節(jié)點(diǎn)修改同一條數(shù)據(jù)后,slave 節(jié)點(diǎn)的數(shù)據(jù)會(huì)被覆蓋掉
slave 節(jié)點(diǎn)掛了不影響其他 slave 節(jié)點(diǎn)的讀和 master 節(jié)點(diǎn)的讀和寫,重新啟動(dòng)后會(huì)將數(shù)據(jù)從master 節(jié)點(diǎn)同步過(guò)來(lái),master 節(jié)點(diǎn)掛了以后,不影響 slave 節(jié)點(diǎn)的讀,Redis 將不再提供寫服務(wù),master 節(jié)點(diǎn)啟動(dòng)后 Redis 將重新對(duì)外提供寫服務(wù)。master 節(jié)點(diǎn)掛了以后,不會(huì) slave 節(jié)點(diǎn)重新選一個(gè) master
對(duì)有密碼的情況說(shuō)明一下,當(dāng) master 節(jié)點(diǎn)設(shè)置密碼時(shí):
客戶端訪問(wèn) master 需要密碼
啟動(dòng) slave 需要密碼,在配置中進(jìn)行配置即可
客戶端訪問(wèn) slave 不需要密碼
主從節(jié)點(diǎn)的缺點(diǎn)
主從模式的缺點(diǎn)其實(shí)從上面的描述中可以得出:
master 節(jié)點(diǎn)掛了以后,redis 就不能對(duì)外提供寫服務(wù)了,因?yàn)槭O碌?slave 不能成為 master
這個(gè)缺點(diǎn)影響是很大的,尤其是對(duì)生產(chǎn)環(huán)境來(lái)說(shuō),是一刻都不能停止服務(wù)的,所以一般的生產(chǎn)壞境是不會(huì)單單只有主從模式的。所以有了下面的 sentinel 模式。
三、sentinel 模式
Redis 哨兵模式,用現(xiàn)在流行的話可以說(shuō)就是一個(gè)“哨兵機(jī)器人”,給“哨兵機(jī)器人”進(jìn)行相應(yīng)的配置之后,這個(gè)"機(jī)器人"可以 7*24 小時(shí)工作,它能能夠自動(dòng)幫助你做一些事情,如監(jiān)控,提醒,自動(dòng)處理故障等。
Redis-sentinel 簡(jiǎn)介
Redis-sentinel 是 Redis 的作者 antirez,因?yàn)?Redis 集群的被各大公司使用,每個(gè)公司要寫自 己的集群管理工具,于是 antirez 花了幾個(gè)星期寫出了 Redis-sentinel。
Redis 的 Sentinel 系統(tǒng)用于管理多個(gè) Redis 服務(wù)器(instance),Redis 的 Sentinel 為 Redis 提供了高可用性。使用哨兵模式創(chuàng)建一個(gè)可以不用人為干預(yù)而應(yīng)對(duì)各種故障的 Redis 部署。
該系統(tǒng)執(zhí)行以下三個(gè)任務(wù):
監(jiān)控(Monitoring):Sentinel 會(huì)不斷地檢查你的主服務(wù)器和從服務(wù)器是否允許正常。
提醒(Notification):當(dāng)被監(jiān)控的某個(gè) Redis 服務(wù)器出現(xiàn)問(wèn)題時(shí),Sentinel 可以通過(guò) API 向管 理員或者其他應(yīng)用程序發(fā)送通知。
自動(dòng)故障遷移(Automatic failover):
(1)當(dāng)一個(gè)主服務(wù)器不能正常工作時(shí),Sentinel 會(huì)開始一次自動(dòng)故障遷移操作,他會(huì)將失效主服務(wù)器的其中一個(gè)從服務(wù)器升級(jí)為新的主服務(wù)器,
并讓失效主服務(wù)器的其他從服務(wù)器改為復(fù)制新的主服務(wù)器;
(2)客戶端試圖連接失敗的主服務(wù)器時(shí),集群也會(huì)向客服端返回新主服務(wù)器的地址,是的集群可以使用新主服務(wù)器代替失效服務(wù)器。
sentinel 的分布式特性
Redis Sentinel 是一個(gè)分布式系統(tǒng),
你可以在一個(gè)架構(gòu)中運(yùn)行多個(gè) Sentinel 進(jìn)程(progress), 這些進(jìn)程使用流言協(xié)議(gossip protocols)來(lái)接收關(guān)于主服務(wù)器是否下線的信息, 并使用投 票協(xié)議(agreement protocols)來(lái)決定是否執(zhí)行自動(dòng)故障遷移, 以及選擇哪個(gè)從服務(wù)器作為 新的主服務(wù)器。
單個(gè) sentinel 進(jìn)程來(lái)監(jiān)控 redis 集群是不可靠的,當(dāng) sentinel 進(jìn)程宕掉后(sentinel 本身也有單 點(diǎn)問(wèn)題,single-point-of-failure)整個(gè)集群系統(tǒng)將無(wú)法按照預(yù)期的方式運(yùn)行。所以有必要將sentinel 集群,這樣有幾個(gè)好處:
有一些 sentinel 進(jìn)程宕掉了,依然可以進(jìn)行 redis 集群的主備切換;
如果只有一個(gè) sentinel 進(jìn)程,如果這個(gè)進(jìn)程運(yùn)行出錯(cuò),或者是網(wǎng)絡(luò)堵塞,那么將無(wú)法實(shí)現(xiàn) redis集群的主備切換(單點(diǎn)問(wèn)題);
如果有多個(gè) sentinel,redis 的客戶端可以隨意地連接任意一個(gè) sentinel 來(lái)獲得關(guān)于 redis 集群 中的信息一個(gè)健壯的部署至少需要三個(gè)哨兵實(shí)例。三個(gè)哨兵實(shí)例應(yīng)該放置在客戶使用獨(dú)立方式確認(rèn)故障的計(jì)算機(jī)或虛擬機(jī)中。例如不同的物理機(jī)或不同可用區(qū)域的虛擬機(jī)。【本次講解是一個(gè)機(jī)器上進(jìn)行搭建,和多級(jí)是一個(gè)道理背景
最近項(xiàng)目需求,接觸到了 Redis 的搭建,簡(jiǎn)單記錄下搭建過(guò)程中遇到的坑
總體配置
192.168.1.100:6379 -> master
192.168.1.101:6379 -> slave
192.168.1.102:6379 -> slave
192.168.1.100:26379 -> sentinel
192.168.1.101:26379 -> sentinel
192.168.1.102:26379 -> sentinel
搭建步驟
1.安裝 redis
# 解壓
tar -xvf /usr/local/redis-3.2.11.tar.gz
mkdir -p /usr/local/redis/bin
cp
/usr/local/redis/src/{redis-benchmark,redis-check-aof,redis-check-rdb,redis-cli,redis-sentinel,redi
s-server,redis-trib.rb} /usr/local/redis/bin
mkdir -p /u01/redis/{6379/{log,data,pid,conf},26379/{log,data,pid,conf}
# 添加環(huán)境變量
echo "export PATH=/usr/local/redis/bin:$PATH" >> /etc/profile
source /etc/profile
2.redis-6379 配置
redis 節(jié) 點(diǎn) 配 置 基 本 如 下 , 把 如 下 配 置 分 別 cp 到 三 臺(tái) 虛 擬 機(jī) 的
/u01/redis/6379/conf/redis_6379.conf
bind 0.0.0.0
protected-mode no
daemonize yes
pidfile "/u01/redis/6379/pid/redis_6379.pid"
port 6379
tcp-backlog 511
timeout 0tcp-keepalive 0
loglevel notice
logfile "/u01/redis/6379/log/redis_6379.log"
databases 16
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename "dump.rdb"
dir "/u01/redis/6379/data"
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
min-slaves-to-write 1
min-slaves-max-lag 10
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
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-entries 512
啟動(dòng)服務(wù)
# 在三臺(tái)虛擬機(jī)上分別執(zhí)行
redis-server /u01/redis/6379/conf/redis_6379.conf
建立主從關(guān)系
# 在 192.168.1.101
redis-cli -p 6379 SLAVEOF 192.168.1.100 6379
# 在 192.168.1.102
redis-cli -p 6379 SLAVEOF 192.168.1.100 6379查看 Replication
192.168.1.101:6379> info replication
# Replication
role:master
connected_slaves:2
min_slaves_good_slaves:2
slave0:ip=192.168.1.102,port=6379,state=online,offset=9577826,lag=1
slave1:ip=192.168.1.103,port=6379,state=online,offset=9577965,lag=0
master_repl_offset:9577965
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:8529390
repl_backlog_histlen:1048576
192.168.1.102:6379> info replication
# Replication
role:slave
master_host:192.168.1.101
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:9600220
slave_priority:100
slave_read_only:1
connected_slaves:0
min_slaves_good_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
192.168.1.103:6379> info replication
# Replication
role:slave
master_host:192.168.1.101
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:9612675slave_priority:100
slave_read_only:1
connected_slaves:0
min_slaves_good_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
3.sentinel-6379 配置
sentinel 節(jié) 點(diǎn) 配 置 基 本 如 下 , 把 如 下 配 置 分 別 cp 到 三 臺(tái) 虛 擬 機(jī) 的
/u01/redis/26379/conf/sentinel_26379.conf
sentinel monitor mymaster 后監(jiān)控的是 redis 中的 master 節(jié)點(diǎn),也就是 192.168.1.100,所以這個(gè)文件在三臺(tái)機(jī)器上是相同的
port 26379
bind 0.0.0.0
daemonize yes
protected-mode no
dir "/u01/redis/26379/tmp"
logfile "/u01/redis/26379/log/sentinel_26379.log"
sentinel monitor mymaster 192.168.1.100 6379 1
等待啟動(dòng)完畢后觀察/u01/redis/26379/conf/sentinel_26379.conf 文件變化
查看 sentinel 狀態(tài)用 info sentinel
redis-cli -h 192.168.1.100 -p 26379 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=zhuanche01,status=ok,address=192.168.1.100:6379,slaves=2,sentinels=3
總結(jié)
我搭建的時(shí)候遇到了 192.168.1.101、192.168.1.102 上的 sentinel 啟動(dòng)后一段時(shí)間出錯(cuò)的問(wèn)題,
后來(lái)發(fā)現(xiàn)是沒有監(jiān)控 master
再就是出問(wèn)題了多看 log
四、cluster 模式
cluster 的出現(xiàn)是為了解決單機(jī) Redis 容量有限的問(wèn)題,將 Redis 的數(shù)據(jù)根據(jù)一定的規(guī)則分配
到多臺(tái)機(jī)器。對(duì) cluster 的一些理解:
cluster 可以說(shuō)是 sentinel 和主從模式的結(jié)合體,通過(guò) cluster 可以實(shí)現(xiàn)主從和 master 重選功能,所以如果配置兩個(gè)副本三個(gè)分片的話,就需要六個(gè) Redis 實(shí)例。
因?yàn)?Redis 的數(shù)據(jù)是根據(jù)一定規(guī)則分配到 cluster 的不同機(jī)器的,當(dāng)數(shù)據(jù)量過(guò)大時(shí),可以新增機(jī)器進(jìn)行擴(kuò)容
這種模式適合數(shù)據(jù)量巨大的緩存要求,當(dāng)數(shù)據(jù)量不是很大使用 sentinel 即可。
以上就是詳解Redis集群搭建的三種方式的詳細(xì)內(nèi)容,更多關(guān)于Redis集群搭建的三種方式的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
您可能感興趣的文章:- Redis可視化客戶端小結(jié)
- 詳解基于redis實(shí)現(xiàn)分布式鎖
- 深入理解redis中multi與pipeline
- 詳解Redis基本命令與使用場(chǎng)景
- 硬核 Redis 高頻面試題解析