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連線的節點
檢視資訊:
節點以及分配的雜湊卡槽如下: