redis5.0.0功能介紹以及主從叢集、哨兵搭建
這兩天突然想起redis,索性就再嘗試一下搭建最新版本的redis,過程有點艱辛呀,記錄一下,供自己和大家今後搭建做參考。
一、為什麼用Redis?
我自己總結了一下:
1、基於記憶體實現的key-value型別的儲存,速度快,效能好。
2、支援多種儲存型別,有Strings,Hashes,Sets,Lists,Sorted Sets型別。
3、支援資料持久化,有Snapshotting,Append-Only File模式的持久化。
4、支援叢集和哨兵。
5、支援主從複製。
6、支援簡單的事務控制。
7、支援訊息的釋出和訂閱。
8、安全性的支援。
9、支援資料過期。等等
二、Redis的應用場景
總結了以下幾點,應用場景特別多,大家根據其特性可類推其作用:
1、主要是用於熱點資料的儲存,比如Top100,最新10個數據。
2、時間過期(如簡訊驗證碼的過期時間等)。
3、計數器,由於Redis是單執行緒且命令的原子性,可用來構建計數器。
4、可用來構建佇列,Sorted Sets。
5、快取,為減輕資料庫訪問壓力。
6、分散式鎖,分散式session管理。
三、Redis主要功能介紹。
先介紹Redis的幾個主要功能。
1、不同資料型別的儲存。這個我在這裡就不講了。哈哈,大家去百度下都有了。
2、高階特性。在這裡,我通過redis的redis.conf配置檔案來給大家講解,只講經常會用到的,其餘配置,大家感興趣可自己學習下。
(1)、NETWORK,網路配置。
- bind:繫結伺服器的網絡卡IP,由於一個伺服器可能有多個網絡卡,配置這個bind屬性,可限制訪問該網絡卡IP才能訪問到Redis。注意:不是繫結外部訪問該伺服器的IP,網上很多地方都是錯誤講解的。我這邊搭建環境一般都是將其註釋掉,允許該伺服器所有IP都能訪問到Redis服務。預設是bind 127.0.0.1。
- protected-mode:Redis服務的保護模式,保護模式下,只能允許127.0.0.1 and ::1這種本地訪問,配置預設為開啟狀態protected-mode yes。這裡要注意保護模式的生效條件。根據配置檔案中註釋:
# When protected mode is on and if:1) The server is not binding explicitly to a set of addresses using the "bind" directive.2) No password is configured.
該模式在bind被註釋掉和沒有配置訪問密碼的時候才生效。一般可讓其為開啟狀態,同時配置訪問密碼,來實現Redis的服務安全性。
- port:配置Redis服務的埠。很重要哦。預設是6379。
(2)、GENERAL,常規配置。
- daemonize:服務是否後臺執行,預設是no,我們自己沒有改的話,啟動redis時候,會佔用當前連線。所以,大家記得改成yes,讓其在後臺執行。
- pidfile:配置Redis服務的PID號存在哪個檔案。由於可能在同一伺服器上啟動多個Redis服務,所以,大家最好指定具體的PID檔案,且不同的Redis服務的PID檔案不同。
如配置為:pidfile /var/run/redis_(埠).pid
- logfile:指定Redis服務的日誌路徑,大家記得也修改一下。
(3)、SNAPSHOTTING,快照型別的持久化配置,這裡說明下快照的原理:快照是Redis的預設持久化方式,這種方式就是以快照的方式將記憶體中的資料寫到二進位制檔案中,檔名為dump.rdb。介紹下快照儲存的步驟:1、redis呼叫fork,產生一個子程序。2、父程序繼續接受client的請求處理資料,利用copy on write,將執行快照動作時候的記憶體拷貝做成副本。3、子程序通過副本將資料寫入臨時檔案,並替換之前的dump.rdb檔案,然後退出。所以,快照持久化的資料是執行快照動作時的記憶體資料。Client可以通過呼叫save或者bgsave命令執行快照,不同點事save命令由redis主程序完成,會阻塞所以client請求,而bgsave是開啟子程序執行,不會阻塞其他client請求。需要注意的是,當Redis服務是作為大資料量的記憶體儲存時,呼叫快照,由於資料量較大,且是快照所有記憶體資料,這會造成大量磁碟IO動作,可能會嚴重影響效能。
- save 900 1
save 300 10
save 60 10000
save <seconds> <changes>,配置快照觸發的條件。解讀第一個sava:900秒內有一個key值變化,則會觸發快照。可配置多個條件,條件是獨立的。
- stop-writes-on-bgsave-error:這個配置預設為yes,是指Redis在後臺持久化失敗後,為了讓客戶感知到,會拒絕寫服務,直到後臺持久化恢復正常。如果需要在後臺持久化失敗後,希望能繼續服務。可將其設定為no。
- dbfilename:指定二進位制檔名,預設為dump.rdb。
- dir:指定rdb檔案路徑。配置為資料夾那一層。在一臺伺服器上啟動多個Redis服務時,注意修改為不同檔案路徑。
(4)、REPLICATION,主從模式的配置。注意,之前版本的redis,配置為slave of,現在改為REPLICATION。主從模式,可以是樹狀的,從服務屬於多臺主服務,且從服務也可以有從服務。主從模式,可實現讀寫分離;高可用模式下,主服務出現問題,也可以通過哨兵切換從服務為主服務;可實現主服務不用資料持久化,從服務進行持久化工作,減輕主服務負擔等等。
- replicaof <masterip> <masterport>:配置主服務的ip和埠。配置之後,就是這臺機器的小弟了。主服務也能知道誰是他的小弟。
- masterauth <master-password>:如果主服務需要密碼認證,這裡需要配置從服務連線主服務的密碼。
- replica-read-only:預設為yes,配置從服務預設為只讀模式。
(5)、SECURITY,安全配置。
- requirepass:配置連線該Redis服務需要的認證密碼。注意一下,由於redis的請求速度特別快,每秒150K,所以密碼強度一定要高一些,不然很快就會被破解。
(6)、CLIENTS,客戶端配置
- maxclients:配置最大客戶端連線數,最大支援10000個。超過了連線時,客戶端會收到超過最大連線數的提示。
(7)、MEMORY MANAGEMENT,記憶體管理配置。配置Redis服務佔用的最大記憶體,超過記憶體後,會將設定超時的key按超時時間來剔除,如果沒有可剔除的key後,那就報記憶體已滿。配置沒細細研究,下來研究一下補充。
(8)、APPEND ONLY MODE,aof模式的另一種持久化方式。這種模式,是為了彌補快照模式的不足。快照模式下,對於大記憶體資料時,快照嚴重影響效能,而且,快照是有觸發條件的時間間隔,這個間隔時間內,如果Redis服務Down掉,那這個時間段的資料就消失了。如果應用的資料一致性要求比較高,那就可以使用AOF模式。AOF模式是在收到寫命令後,通過write將命令追加到appendonly.aof檔案中。Redis重啟後,通過讀取該檔案中的命令來重新恢復記憶體資料(注意,如果同時存在aof和rdb檔案,Redis服務啟動時,優先讀取aof檔案)。注意:持久化檔案會越來越大,而且會有很多重複的命令,這也會導致不必要的記憶體影響,所以,Redis提供了bgrewriteaof命令來重建aof檔案,過程如下:1、主程序呼叫fork,產生子程序。2、Redis子程序通過當前資料的快照,往aof臨時檔案中寫入資料命令。3、redis主程序繼續接收命令,並存在快取中。4、子程序寫完快照命令後,通知主程序,主程序將快取中的命令也寫入臨時aof檔案中。5、寫完後,主程序用臨時的aof檔案替換之前的aof檔案。
- appendonly:預設為no,關閉aof模式,需要開啟則設定為yes。
- appendfilename :"appendonly.aof",指定aof檔名。
- appendfsync :always,每次寫操作時觸發aof。
appendfsync :everysec,每秒寫一次aof,預設設定,3個配置選一個就行。
appendfsync :no,依賴os系統,當系統想重新整理aof時,就執行aof。(任性,效能高,不穩定,和快照感覺差不多)。
(9)、REDIS CLUSTER,redis叢集配置。
- cluster-enabled:預設是註釋掉,不啟用叢集模式的。取消註釋即可開啟叢集模式。
- cluster-config-file:指定cluster的配置檔案,每個cluster的節點都需要這個配置檔案,會在簡歷叢集的時候自動填充內容,所以,需要指定為不同的檔案。
- cluster-node-timeout:超過這個時間,某個節點不能被連通,則視該節點為failover狀態。
(10)、其餘配置項大家自己研究一下。
四、Redis叢集及哨兵簡單介紹
叢集:叢集是一個提供在多Redis節點間共享資料的程式集。Redis叢集會把資料分配到不同的片區,引入了16384個雜湊槽,雜湊槽會分佈在叢集中的主節點,key通過CRC16校驗後,對16384取模,來決定資料落在哪個槽內,有利於新增或刪除節點,只需進行雜湊槽的重新分配。叢集通過主從模式,具有高可用性,某個主節點fail後,叢集會選取主節點下一個從節點作為新的主節點,並給它分配之前主節點的槽位,如果切換完成後,舊的主節點上線,它此時也只能作為新的主節點的從節點。注意,Redis5.0之前,部署叢集需要安裝ruby等,但在Redis5.0中,不需要安裝Ruby,直接使用redis-cli就可以建立叢集!
哨兵:主從模式下,為了使主從具備高可用性,就需要通過哨兵進行監控,在主節點下線後,會通過投票出新的主節點,在主節點上線後,也只能作為新主節點的從節點。哨兵在生產環境下,也需要具備高可用,所以哨兵一般也要配置為叢集。
五、搭建主從模式的Redis服務,並啟動多個哨兵進行監控
1、下載redis。下載地址:http://www.redis.cn/download.html。
2、解壓,編譯Redis。
(1)、新建一個資料夾放Redis服務相關的東西。
(2)、在該資料夾下解壓、編譯Redis。
tar -zxvf redis-5.0.0.tar.gz
make && make install
(3)、在解壓後的Redis資料夾中,找到redis.conf檔案,該檔案是啟動redis服務所需檔案,拿出來,我們這裡建三個redis服務,一主兩從,將檔案拷貝三份,分別命名為redis-7000.conf,redis-7001.conf,redis-7002.conf,分別編輯以下內容,注意如果配置的資料夾不存在,則需要新建好。其餘配置保持預設。我舉一個例子說明:
- #bind 127.0.0.1,將bind註釋掉。
- port 7000:改變其服務埠,三份檔案埠分別為7000,7001,7002,注意檢查埠是否被其他程式佔用。
- daemonize yes:修改服務為後臺執行。
- pidfile /var/run/redis_7000.pid:指定不同的pid檔案,注意三份配置檔案不同。
- logfile "/var/redis/7000.log":指定log日誌路徑,自己配,要求不同。
- dir /opt/redis-cluster/redis-7000:這個指定rdb檔案的路徑配置,要求改成不同。
- # replicaof <masterip> <masterport>:主服務這句話註釋,從服務配置的兩臺需要開啟。配置主服務的ip的port。
- masterauth ibethfy:都配上吧,從服務到主服務的認證密碼。
- requirepass ibethfy:三份檔案都配置,客戶端訪問需要密碼驗證。
(4)、配置好三份檔案後,使用redis-server redis-7000.conf,redis-server redis-7001.conf,redis-server redis-7002.conf啟動服務,注意我是在配置檔案路徑執行的命令。
使用ps -ef|grep redis檢視是否三個服務都正常啟動,使用redis-cli -h ip地址 -p 埠 -a 密碼,通過客戶端登陸,執行info replication,可以檢視到主從資訊。
(5)、搭建哨兵。新起一臺linux吧。同樣執行1,2步驟,安裝redis。拷貝sentinel.conf三份,分別為sentinel-26380.conf,sentinel-26381.conf,sentinel-26382.conf。
(6)、修改sentinel
- protected-mode no:關閉保護模式,使外網能訪問。
- port 26380:修改埠。三份檔案分別不同。
- daemonize yes:修改為後臺執行。
- pidfile /opt/redis-cluster/redis-sentinel-26380/sentinel.pid:指定不同pid檔案,注意資料夾不存在自己要新建。
- logfile "/opt/redis-cluster/redis-sentinel-26380/26380.log":配置哨兵日誌檔案。
- dir /opt/redis-cluster/redis-sentinel-26380:配置哨兵工作路徑。
- sentinel monitor master7000 192.167.3.145 7000 2:配置哨兵需要監控的主節點ip和埠,最後的2代表,如果有2個哨兵主觀認為主節點down了,那麼就客觀認為主節點down掉了,開始發起投票選舉新主節點的操作。多個主節點配置多個。
- sentinel auth-pass master7000 ibethfy:配置哨兵連線主節點的認證密碼。(主節點配置的requirepass)。
- sentinel down-after-milliseconds master7000 5000:配置多少毫秒後沒收到主節點的反饋,則主觀認為主節點down了。
- sentinel failover-timeout master7000 30000:failover過期時間。當failover開始後,在此時間內仍然沒有觸發任何failover操作,當前sentinel將會認為此次failoer失敗。
注意,配置前把之前的預設的mymaster開啟的配置全部登出掉!或者直接在其上修改!不然會出現問題!
(7)、在配置檔案目錄下執行redis-sentinel sentinel-26380.conf,redis-sentinel sentinel-26381.conf,redis-sentinel sentinel-26382.conf,分別啟動三個哨兵。
(8)、測試,kill掉7000埠的redis服務,一段時間後,登陸到其他埠的客戶端,檢視info replication,此時是否從節點的某一個已切換成主節點,另一個從節點屬於新主節點的從節點。並測試主節點再次上線後,是否是新主節點的從節點。
(9)、哨兵的細節問題,可參考:http://www.redis.cn/topics/sentinel.html。
六、叢集搭建
(1)、同樣解壓安裝、編譯Redis,拷貝redis.conf檔案,分別為7000-7008,共九個檔案。準備搭建1主2從的3套Redis。
(2)、配置檔案修改,同主從搭建的第三步,只是不需要配置服務的狀態了,將replicaof <masterip> <masterport>這個註釋掉。
- cluster-enabled yes:開啟叢集模式。
- cluster-config-file nodes-7000.conf:指定不同的叢集節點配置檔案,叢集會自己修改內容。
- cluster-node-timeout 15000:配置多少毫秒後,主節點失聯將會觸發節點切換。
(3)、使用redis-server redis-7000.conf等將所有節點啟動。
(4)、使用redis-cli配置叢集。命令和啟動成功的提示如下。過程中會讓你看下節點分配是否可以,輸入yes確定。通過日誌可以看到,主節點為7000,7001,7002,每個主節點各兩個從節點,replicates後面跟的是主節點的nodeid。Slots 0-5460表明各主節點分配到的槽位。
[[email protected] redis-cluster]# redis-cli --cluster create 192.167.3.145:7000 192.167.3.145:7001 192.167.3.145:7002 192.167.3.145:7003 192.167.3.145:7004 192.167.3.145:7005 192.167.3.145:7006 192.167.3.145:7007 192.167.3.145:7008 --cluster-replicas 2 -a ibethfy Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. >>> Performing hash slots allocation on 9 nodes... Master[0] -> Slots 0 - 5460 Master[1] -> Slots 5461 - 10922 Master[2] -> Slots 10923 - 16383 Adding replica 192.167.3.145:7003 to 192.167.3.145:7000 Adding replica 192.167.3.145:7004 to 192.167.3.145:7000 Adding replica 192.167.3.145:7005 to 192.167.3.145:7001 Adding replica 192.167.3.145:7006 to 192.167.3.145:7001 Adding replica 192.167.3.145:7007 to 192.167.3.145:7002 Adding replica 192.167.3.145:7008 to 192.167.3.145:7002 >>> Trying to optimize slaves allocation for anti-affinity [WARNING] Some slaves are in the same host as their master M: 35d56aab1045bded29a8b273dca0d8a9258b4182 192.167.3.145:7000 slots:[0-5460] (5461 slots) master M: 238c6ca906531cd0feeebaaa6ff2afb84b9cc072 192.167.3.145:7001 slots:[5461-10922] (5462 slots) master M: 144577204f66c0857920dd3ce91ad3248a16e426 192.167.3.145:7002 slots:[10923-16383] (5461 slots) master S: a98785183466cc59ae39599779196d986402c94a 192.167.3.145:7003 replicates 35d56aab1045bded29a8b273dca0d8a9258b4182 S: d80ffdfeef5a536e5e9aaa69aa175b42ca5b1f32 192.167.3.145:7004 replicates 238c6ca906531cd0feeebaaa6ff2afb84b9cc072 S: 43bf3f2f15cd963f2cb7cbc8427e3c5d70d8b9dc 192.167.3.145:7005 replicates 35d56aab1045bded29a8b273dca0d8a9258b4182 S: 0723dfeeb31015178791eba46f895076ca66bc05 192.167.3.145:7006 replicates 144577204f66c0857920dd3ce91ad3248a16e426 S: 603d61677a6044e57e415afb325d7a81501a78c8 192.167.3.145:7007 replicates 238c6ca906531cd0feeebaaa6ff2afb84b9cc072 S: 110918384563a4173bb17d36b6dd6958a3e97b3c 192.167.3.145:7008 replicates 144577204f66c0857920dd3ce91ad3248a16e426 Can I set the above configuration? (type 'yes' to accept): yes >>> Nodes configuration updated >>> Assign a different config epoch to each node >>> Sending CLUSTER MEET messages to join the cluster Waiting for the cluster to join .......... >>> Performing Cluster Check (using node 192.167.3.145:7000) M: 35d56aab1045bded29a8b273dca0d8a9258b4182 192.167.3.145:7000 slots:[0-5460] (5461 slots) master 2 additional replica(s) S: 603d61677a6044e57e415afb325d7a81501a78c8 192.167.3.145:7007 slots: (0 slots) slave replicates 238c6ca906531cd0feeebaaa6ff2afb84b9cc072 S: 0723dfeeb31015178791eba46f895076ca66bc05 192.167.3.145:7006 slots: (0 slots) slave replicates 144577204f66c0857920dd3ce91ad3248a16e426 M: 238c6ca906531cd0feeebaaa6ff2afb84b9cc072 192.167.3.145:7001 slots:[5461-10922] (5462 slots) master 2 additional replica(s) M: 144577204f66c0857920dd3ce91ad3248a16e426 192.167.3.145:7002 slots:[10923-16383] (5461 slots) master 2 additional replica(s) S: d80ffdfeef5a536e5e9aaa69aa175b42ca5b1f32 192.167.3.145:7004 slots: (0 slots) slave replicates 238c6ca906531cd0feeebaaa6ff2afb84b9cc072 S: 110918384563a4173bb17d36b6dd6958a3e97b3c 192.167.3.145:7008 slots: (0 slots) slave replicates 144577204f66c0857920dd3ce91ad3248a16e426 S: 43bf3f2f15cd963f2cb7cbc8427e3c5d70d8b9dc 192.167.3.145:7005 slots: (0 slots) slave replicates 35d56aab1045bded29a8b273dca0d8a9258b4182 S: a98785183466cc59ae39599779196d986402c94a 192.167.3.145:7003 slots: (0 slots) slave replicates 35d56aab1045bded29a8b273dca0d8a9258b4182 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
(5)、測試節點下線,這裡就不說明了。結論是主節點故障後,下掛從節點會有一個升級成主節點,並接替主節點的槽位。另一個從節點切換成作為新主節點的從節點。舊主節點上線後,也只能作為其從節點。
(6)、高階特性我這裡不說明了,太多了,給大家一個網址:http://www.redis.cn/topics/cluster-tutorial.html。