1. 程式人生 > >redis的主從複製和高可用、叢集,以及用redis做mysql快取

redis的主從複製和高可用、叢集,以及用redis做mysql快取

一、redis的安裝

先在下載安裝包

解壓後進入目錄應為已經有Makefile了所以直接make編譯

這裡會報錯,需要gcc編譯器

安裝好gcc,再次make編譯,還是會報錯;這個錯誤根據 Readme 可知需要執行 make MALLOC=libc

make完成後,提示去到 src 目錄下

到src目錄後執行按提示執行make test,會報錯提示安裝tcl工具

完成後 make install 完成安裝

注意進入utils目錄,執行install_server.sh,不然指令碼會報錯,提示找不到相應檔案。指令碼執行時,會有幾個設定config等的問題,預設回車即可

至此redis已經安裝完畢

二、redis的主從複製和高可用

1、redis的主從複製

1)編輯redis的配置檔案,配置檔案位置如下圖

2)註釋bind 127.0.0.1

在配置檔案redis.conf中,預設的bind 介面是127.0.0.1,也就是本地迴環地址。這樣的話,訪問redis服務只能通過本機的客戶端連線,而無法通過遠端連線,這樣可以避免將redis服務暴露於危險的網路環境中,防止一些不安全的人隨隨便便通過遠端,但是我們做主從複製。

但是搭建主從複製,需要另一臺redis端連線到本機,所以要將其註釋。

2)關閉保護模式

3)另一臺redis端在其配置檔案做同樣操作,並且需要指定master端ip和埠,如圖

如上操作所示,已經完成redis的主從複製,測試:在master端server3:set name  kk,在server3檢視


完成主從複製

2、redis高可用

高可用原理:

自動故障遷移(Automatic failover): 當一個主伺服器不能正常工作時, Sentinel 會開始一次自動故障遷移操作, 它會將失效主伺服器的其中一個從伺服器升級為新的主伺服器, 並讓失效主伺服器的其他從伺服器改為複製新的主伺服器; 當客戶端試圖連線失效的主伺服器時, 叢集也會向客戶端返回新主伺服器的地址, 使得叢集可以使用新主伺服器代替失效伺服器。

配置環境:三臺虛擬機器安裝 redis 服務
Server3: 172.25.77.3 (先做 master)
Server4:172.25.77.4

Server5:172.25.77.5

按主從複製先配置好一主兩從

1)在安裝包中將 sentinel 檔案複製到/etc/redis/下


2)編輯 sentinel.conf 如下圖

關閉保護模式

配置指示 Sentinel 去監視一個名為 mymaster 的主伺服器,這個主伺服器的IP 地址為 172.25.77.3,埠號為 6379 ,而將這個主伺服器判斷為失效至少需要 2 個 Sentinel 同意(只要同意 Sentinel 的數量不達標,自動故障遷移就不會執行)

down-after-milliseconds 選項指定了 Sentinel 認為伺服器已經斷線所需的毫秒數。如果伺服器在給定的毫秒數之內, 沒有返回 Sentinel 傳送的 PING 命令的回覆, 或返回一個錯誤, 那麼 Sentinel 將這個伺服器標記為主觀下線

完成後將 sentinel 配置檔案傳送 server4 和 sevrer5

3)三臺 redis 啟動 Sentinel 服務


+slave 表示 :一個新的從伺服器已經被 Sentinel 識別並關聯。可以看到片此時 master 是 server3;server4 和 server5 是 slave。

4)測試:master 端 server3 info 檢視 replication 資訊:

檢視後 shotdown

此時:server4 監聽如下圖


+switch-master :配置變更,主伺服器的 IP 和地址已經改變。
+sdown :給定的例項 server3 現在處於主觀下線狀態。
根據資訊我們可以看到此時 master 為 server5,我們在 server5 檢視info 資訊如下圖,server5成為master,只有一個slave是server4


如上操作,實現了高可用即自動故障遷移

三、用redis做mysql快取

Gearman+PHP+MySQL UDF的組合非同步實現MySQL到Redis的資料複製。

用redis作為Mysql資料庫的快取,在查詢的時候,首先查詢redis快取,如果找到則返回結果;如果在redis中沒有找到,那麼查詢Mysql資料庫,找到的花則返回結果並且更新redis;如果沒有找到則返回空。對於寫入的情況,直接寫入mysql資料庫,mysql資料庫通過觸發器及UDF機制自動把變更的內容更新到redis中。採用MySQL作為資料儲存引擎,Redis則作為Cache

mysql讀寫資料都需要從磁碟讀取 。磁碟的容量,頻寬的大小就影響了網站的訪問速度,讀取的方式,也就是sql語句,次數和效率也會影響讀取效率。

redis和mc都是快取,並且都是駐留在記憶體中執行的,這大大提升了高資料量web訪問的訪問速度。然而mc只是提供了簡單的資料結構,比如 string儲存;redis卻提供了大量的資料結構,比如string、list、set、hashset、sorted set這些,這使得使用者方便了好多,畢竟封裝了一層實用的功能,同時實現了同樣的效果,當然用redis而慢慢捨棄mc。

1、先做主從同步  server5為master server3為slave   server4為應用層

2、server4做lnmp架構安裝nginx和php,編輯www.conf配置檔案,將user和group改成nginx

3、在vim /etc/php.ini改時區

4、在/etc/nginx/conf.d編輯default.conf檔案

5、在/usr/share/nginx/html下編輯php釋出目錄,完成啟動ngixn服務

完成後檢視

6、為php增加redis擴充套件庫,在/etc/php.d/目錄下新增extension=redis.so

7、編寫php檢驗指令碼,redis->connect寫redis的masterf端ip,mysql寫mysql服務端的ip

8、在mysql服務端安裝mysql-serevr,並進行授權

將編寫好的庫檔案匯入

檢視

網頁檢視

重新整理redis檢視

9、此時,更新資料庫,檢視redis並沒有改變

10、1)在server4安裝如下安裝包

通常,多語言多系統之間的整合是個大問題,一般來說,人們多半會採用 WebService 的方式來處理此類整合問題,但不管採用何種風格的 WebService,如 RPC 風格,或者 REST 風格,其本身都有一定的複雜性。相比之下,Gearman 也能實現類似的作用,而且更簡單易用。

2)開啟服務,檢視埠

3)為php增加gearman擴充套件庫,在/etc/php.d/目錄下新增extension=gearman.so

4)安裝lib_mysqludf_json

使用lib_mysqludf_json的原因是因為Gearman只接受字串作為入口引數,可以通過lib_mysqludf_json將MySQL中的資料編碼為JSON字串


可以看到重新編譯生成了 lib_mysqludf_json.so 檔案,將檔案複製到MySQL的外掛安裝路徑


5)可以檢視mysql外掛安裝路徑,並登入MySQL執行語句註冊UDF函式:


6)安裝gearman-mysql-udf

提示需要libgearman

編譯安裝

和上面類似:生成了 libgearman_mysql_udf.so 檔案插入到MySQL的外掛安裝路徑

註冊udf函式,檢視

指定Gearman伺服器的資訊:

7)通過MySQL觸發器實現資料同步

同步哪些資料,同步的條件,還是需要根據實際情況決定,比如我希望將資料表data的資料在每次更新時同步,那麼編寫Trigger如下:完成後匯入資料庫


檢視triggers資訊

8)編寫一個Gearman Worker:redis_worker.php

指定redis的master

最後需要將Worker在後臺執行:

測試:在mysql更新資料,redis檢視:


經測試通過這種方式將MySQL資料複製到Redis,單Worker基本可以瞬時完成。

四、redis-cluster叢集

redis-cluster叢集,Redis-Cluster採用無中心結構,每個節點儲存資料和整個叢集狀態,每個節點都和其他所有節點連線。

配置環境:一臺伺服器 我這裡ip為:172.25.77.5

 1、redis cluster節點分配

   假設現在我們是三個主節點分別是:A, B, C 三個節點,它們可以是一臺機器上的三個埠,也可以是三臺不同的伺服器。那麼,採用雜湊槽 (hash slot)的方式來分配16384個slot 的話,它們三個節點分別承擔的slot 區間是:

節點A覆蓋0-5460;

節點B覆蓋5461-10922;

節點C覆蓋10923-16383.

獲取資料:

     如果存入一個值,按照redis cluster雜湊槽的演算法: CRC16('key')384 = 6782。 那麼就會把這個key 的儲存分配到 B 上了。同樣,當我連線(A,B,C)任何一個節點想獲取'key'這個key時,也會這樣的演算法,然後內部跳轉到B節點上獲取資料

新增一個主節點:

      新增一個節點D,redis cluster的這種做法是從各個節點的前面各拿取一部分slot到D上,大致就會變成這樣: 

    節點A覆蓋1365-5460

    節點B覆蓋6827-10922

    節點C覆蓋12288-16383

    節點D覆蓋0-1364,5461-6826,10923-12287

同樣刪除一個節點也是類似,移動完成後就可以刪除這個節點了。

2、redis-cluster的主從模式

 redis cluster 為了保證資料的高可用性,加入了主從模式,一個主節點對應一個或多個從節點,主節點提供資料存取,從節點則是從主節點拉取資料備份,當這個主節點掛掉後,就會有這個從節點選取一個來充當主節點,從而保證叢集不會掛掉。
      上面那個例子裡, 叢集有ABC三個主節點, 如果這3個節點都沒有加入從節點,如果B掛掉了,我們就無法訪問整個叢集了。A和C的slot也無法訪問。
     所以我們在叢集建立的時候,一定要為每個主節點都添加了從節點, 比如像這樣, 叢集包含主節點A、B、C, 以及從節點A1、B1、C1, 那麼即使B掛掉系統也可以繼續正確工作。
     B1節點替代了B節點,所以Redis叢集將會選擇B1節點作為新的主節點,叢集將會繼續正確地提供服務。 當B重新開啟後,它就會變成B1的從節點。 不過需要注意,如果節點B和B1同時掛了,Redis叢集就無法繼續正確地提供服務了。

3、下面開始搭建

1)停掉redis服務,在/usr/local下建立6個目錄


配置redis.conf如圖

複製檔案到每個目錄下,只用修改埠號


然後啟動節點

完成後檢視如下圖:

2)redis-trib.rb是redis官方推出的管理redis叢集的工具,整合在redis的原始碼src目錄下,是基於redis提供的叢集命令封裝成簡單、便捷、實用的操作工具。

執行redis-trib.rb

提示沒有ruby工具,yum安裝,再次執行,提示需要rubygems


安裝完後,還需要redis-gem翻譯器

安裝的時候提示ruby版本要>=2.2.2,剛才使用yum安裝,導致版本沒更上,問題不大,需要什麼找什麼安裝什麼

翻譯器安裝完成gem list檢視

此時redis-trib.rb也可以使用

使用redis-trib.rb建立叢集

./redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 

上面顯示建立成功,有3個主節點,3個從節點,每個節點都是成功連線狀態

4)測試:-c表示連線 -p連線的節點

檢視資訊:

 節點以及分配的雜湊卡槽如下: