1. 程式人生 > >CentOS 6.5 -- Redis 4.0.2讀寫分離☞主從架構

CentOS 6.5 -- Redis 4.0.2讀寫分離☞主從架構

講之前,我先來隨性的扯一扯什麼是redis,大多說法是快取資料庫,但是如果只說是快取,給人的感覺就是資料放在記憶體中隨時會因為系統斷電而造成資料的丟失,如果說是資料庫,又給人感覺這和MSSQL、Mysql以及Oracle又有什麼區別呢?事實上,redis也不能單獨的作為資料庫來使用,因為它支援的資料型別有限,想向常規資料庫那樣存放表結構的資料,顯得有些無力,當然不是不行,但我們為什麼要用redis做這些事情呢?

能和資料庫沾邊的,redis肯定具有儲存資料的能力(持久化),和快取沾邊,說明redis讀寫資料快,你想想,你直接從記憶體中取出資料快啊,還是,先進行I/O操作,將資料載入到記憶體,再從記憶體中讀取快呢?當然,是前者,沒錯,redis就是這麼幹的,它就好比多一個多功能的冰箱

,假如我們把常用的變化不是很頻繁的資料比作是美味的話,我們需要的時候,從redis中直接get key('美味')就行,而且取出來我們發現還是熱的。但是如果是MSSql或者是Mysql資料庫的話,同樣我們也能取出來美味,但是我們發現,美味是涼的,然後我們還要拿去加熱一下,隨後才能享用,這就不划算了;

而且,在redis中,我們可以設定持久化資料的方式,選擇對美味進行保鮮(冷凍),怎麼理解這種保鮮功能呢?就是,防止美味變質,留到下次或者下下次或者下下下次我們再享用,用redis的話說就是,資料我先持久化到磁碟檔案(預設快照Snapshotting持久化方式,將記憶體中的資料以快照的方式寫入到二進位制檔案中,預設檔名為

dump.rdb),等下次redis服務啟動的時候,再把這些持久化到磁碟檔案裡面的資料再載入到記憶體中,這就使得,資料達到一種複用的效果,有人會想,我怎麼知道哪些資料我想複用,哪些資料我不想複用呢?萬一,持久化的資料檔案太大了影響redis效能怎麼辦?  不用擔心好吧,這些都是可以配置的,大不了,你直接將redis持久化到本地磁碟的資料檔案直接幹掉,哈哈,那你可真是厲害了。

以上純粹就是個人觀點,淺顯的理解了一下redis,我覺得,要想學好(可不是精通啊)一門技術,首先,就是要理解,不管你理解的官方不官方,起碼,你拿到 了開啟這門技術的鑰匙,至於,開啟的是哪一扇門,看個人造化了!

看一下官方的redis詞條:

Redis是一個開源的使用ANSI C語言編寫、支援網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API 本篇我們將結合redis的一種資料架構---->主從架構來講一下,如何避免redis單點故障和redis的讀寫分離(啟動多redis例項)

另一個數據架構是主從從架構,這個比主從架構複雜一點,博文裡,我就不講了,可以作為興趣自行進行配置和測試。

主從架構關係圖(從庫還可以有更多,但是開多了,一方便會影響redis效能另一方面會增加伺服器的開銷)


(1)redis單點故障

A.如果只使用一臺伺服器,作為redis的部署節點的話,萬一這臺機子掛掉了,是不是我們的redis就癱瘓了,這種顯然不夠友好;

B.因此,redis給我們提供了主--從關係,主庫用master表示,從庫用slave表示,當然,主從架構中,主庫master只能有一個,從庫可以有多個,主庫和從庫之間通過相互通訊,進行資料同步,並且做RDB持久化操作;

C.主庫節點如果掛掉了,redis有個哨兵(sentinel)配置,可以監控整個主-從架構中的故障節點,並從剩下的從庫中選舉出一個節點來當主庫,並調整架構中的主從關係,最後,哨兵會等待發生故障的主庫節點恢復,當然,如果這個宕機的主庫節點恢復過來了,那麼,它將會被哨兵重新分配成從庫,而不是主庫!

D.如果是從庫節點掛掉了,不用擔心好吧,一方面這不會影響架構中的主從關係,另一方面,等這個從庫故障點恢復的時候,直接又連線上了主庫節點,同時從主庫獲得同步資料,所以這種情況,是比較友好的!

(2)redis的讀寫分離

A.如果redis例項是主庫master性質的,那麼它具有讀和寫的許可權

B.如果redis例項是從庫slave性質的,  那麼它預設是不具有寫許可權的,當然你可以設定從庫slave具有寫許可權,一般不推薦這樣做!

一、我們目前只建立了一個redis例項,埠6379,我們將這個例項設為master節點


我們還需要兩個slave節點(兩個演示主---從架構足夠了)

二、我們直接將6379目錄整體copy成兩個新的目錄,一個是6380,一個是6381

(還記得上一篇說的嗎,目錄的名稱代表了當前redis例項使用的埠號,因為,使用的是一臺虛擬機器,只能從Port上區別不同的例項)

A.建立6380例項

cp -R 6379 6380/


修改6380對應的redis.conf,只需替換裡面的   6379 ---> 6380 就行,指定主從關係,我們稍後再講

vim redis.conf

:%s/6379/6380/g    -----> 做全域性字串替換

儲存並退出後,啟動6380例項


B.建立6381例項

cd .. (注意目錄的切換)

cp -R 6379 6381/

和建立6380例項的步驟一樣,這裡就不細說了,配置好後,啟動6381例項如下


C.常看所有後臺執行的redis例項

ps -ef | grep redis


三、建立主從關係

我們一開始說了,6379例項作為master主庫節點,6380和6381分別作為從庫節點,而redis.conf是根據

slaveof <masterip> <masterport>這個配置節點資訊,配置主從關係的,預設這個節點是註釋狀態

masterip     :主庫IP,本篇就是一臺機子上,bind 就是 127.0.0.1,因此,所有IP都是127.0.0.1

masterport:主庫的埠號,比如,從庫是6380,則配置它的主庫節點應該這樣寫:slaveof 127.0.0.1 6379

我們不採用直接改conf檔案的方式指定主從關係,我們通過,redis-cli連線對應的例項,直接在例項中通過slaveof指定主從關係

A.沒有指定主從關係之前

例項6379中,檢視例項 INFO屬性

redis-cli

INFO replication

在當前例項下,建立一個數據(key-value)

set abc 123

然後退出,再切換到6380例項

設定6380的主從屬性,指定主庫為 例項6379

slaveof 127.0.0.1 6379

這時候,是否可以在從庫6380例項裡面查詢到主庫例項6379裡面的資料嗎(假設不知道主從資料是否已經同步過來了)?試一試

注意:這個同步是有時間間隔的,如果你建立了主從關係後,立馬在從庫裡面進行key查詢,可能查不到資料,不要慌,這時候,只是主從庫之間還沒有完成資料同步而已。

我們再嘗試著,在從庫6380例項裡面寫入一個數據試試

set name appleyk


顯然,從庫預設是不能寫的,如果你非要寫,可以修改對應例項的redis.conf,裡面有個只讀屬性可以進行設定

這不是重點,重點是,主從進行同步資料的時候,會進行資料的持久化操作嗎?

我們退出當前例項的連線,進入主庫6379例項的目錄ll一下

咦,怎麼會有個dump.rdb檔案呢?我們在上一篇中不是已經關閉了預設的持久化方式嗎,怎麼在例項6379的目錄下會有這個檔案呢?當然,這個檔案在從庫例項6380的目錄下面也是有的,因為主從之間有資料同步


為什麼會這樣呢?

我們看一下 主從資料複製過程的原理

1、 當從庫和主庫建立M-S關係後,會向主資料庫傳送SYNC命令;

2、 主庫接收到SYNC命令後會開始在後臺儲存快照RDB持久化過程),並將期間接收到的寫命令快取起來;

3、 當快照完成後Redis會將快照檔案和所有快取的命令傳送給從Redis

4、 Redis接收到後會載入快照檔案並且執行收到的快取的命令

5、 之後Redis每當接收到寫命令時就會將命令傳送從Redis從而保證資料的一致


剩下的那個6381例項,道理和6380是一樣的,這裡就不再繼續做說明了。

未完待續!