Redis的幾種高可用集群方案


Redis的高可用方式及常用集群方式一般有:

  1. 主從模式
  2. 哨兵模式
  3. 集群模式

當然也有第三方代理模式,如codis等,這種不在這里討論之列。

我剛好學習到這里,我就簡單記錄下這幾種模式的配置 。老鳥及不感興趣的,可以就此飄過。

Redis的安裝及單實例的啟動,這里就不再贅述了,確實比較簡單。

一 主從模式

這個模式就是解決單台機器的內存性能問題,可以把主實例和從實例放到不同的機器上面。從機器可以作備份使用,當master主機出現故障后,可以將某一台slave提升為master。一定程度上提高緩存的高性能,如果能接受一定的延遲,也可以做一個主從分離,所有的讀都從slave上來,提高性能。

配置很簡單,可以在配置文件或命令行中配置,直接加上 slaveof host:ip

redis-6380.conf

Slaveof 127.0.0.1:6379

127.0.0.1:6380>127.0.0.1:6379

然后分別啟動Redis的主從實例就行了。

主從模式,雖然比單實例的可用性要好一些,但是生產環境基本上是不太會用的。因為他沒有故障轉移和監測。如果master掛了,還需要手動切到slave上面去。你的應用程序連接地址也得做相應的改動。這確實有點麻煩,所以感覺這個模式有點尷尬。

二 哨兵模式

這個模式呢,和主從模式有點像,他是基於主從模式的。他提供了對master的監控和故障轉移,當master節點出現故障后,可以自動通過選舉選出一台slave做master,待master故障恢復后,再切回來,這就大大提高了可用性了,且哨兵之間也可以做集群部署,相互監測。防止單個哨兵死掉的情況。

在redid-sentinel.conf

sentinel monitor mymaster 127.0.0.1 6379 1

上面的配置加上就行了,6379后面那個1表示需要幾個哨兵節點同意后,才啟動故障轉移。

哨兵模式的啟動模式有兩種方式:

redis-sentinel sentinel-26379.conf
redis-server sentinel-26379.conf --sentinel

因為哨兵模式也是一種特殊的Redis節點,所以可以使用redis-cli連接

redis-cli -p 26379

127.0.0.1:26379> info sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=odown,address=127.0.0.1:6379,slaves=1,sentinels=1

要求不高的場合下,其實哨兵模式一般的公司用就足夠了。

三 集群模式

許多不同的主從實例組成大的集群,多主多從,一個主從實例死掉后,內部可以轉到其它的主從實例上面。至少需要三個主節點才能讓集群正常運行起來。

先配置幾台機器出來,我本地用的偽集群模式,就是只有一台機器,然后用不同的端口來啟動。

建立一個目錄,比如叫redis-cluster。然后在這個目錄下面建立6381-6386子目錄。

在6381中建立配置文件redis.conf,內容如下:

daemonize yes

pidfile redis_6381.pid

logfile redis_6381.log

appendonly yes

bind 127.0.0.1

port 6381

cluster-enabled yes

cluster-config-file nodes-6381.conf

cluster-node-timeout 15000

cluster-slave-validity-factor 10

cluster-migration-barrier 1

cluster-require-full-coverage yes

其中cluster開頭的這些,是集群的一些配置,同理,在其它目錄也加上上面的配置,只不過,將6381換成相應的端口就行了。

然后再分別啟動6381-6386的單實例

redis-server 6381/redis.conf

redis-server 6382/redis.conf

驗證有無啟動成功

ps -ef | grep redis

redis-server 127.0.0.1:6381 [cluster]

后面帶[cluster]這個就表示行了。

上面只是啟動了幾台實例,要變成集群模式,還需要最后一步,使用redis-trib,不過我本地用的是redis5.0,已經推薦用redis-cli這種方式了,如果用redis-trib,這個還需要安裝ruby環境。我這里就以redis-cli為例了

redis-cli --cluster create --cluster-replicas 1  127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385 127.0.0.1:6386

出現如下的輸出,表示集群就創建成功了。

這個命令我簡單說下,通過上面那個命令就可以將剛才我們的機器變成集群模式,且配置了主從。主要就是cluster-replicas后面那個1, 這個1表示主從實例的一個比值(主/從),比如上面的就是主從為1:1,那么6381-6383為主,6383為6381的從,其它依次類推。

測試一下,我這里用Go簡單的試了下集群的設置和讀取,用的是go-redis包。

package main

import (
   "fmt"
   "github.com/go-redis/redis"
   "time"
)

func testClient() {
   client := redis.NewClusterClient(&redis.ClusterOptions{
      Addrs:[]string{"127.0.0.1:6381","127.0.0.1:6382","127.0.0.1:6383","127.0.0.1:6384","127.0.0.1:6385","127.0.0.1:6386",},
   })
   statuscmd :=client.Set("name","lc",60 *  time.Second)
   if statuscmd.Err() != nil {
      fmt.Println(statuscmd.Err())
   }
   stringcmd :=client.Get("name")
   fmt.Println(stringcmd.String())
}

func main() {
   testClient()
}

到這里,幾種模式的配置就完了,其實還是挺簡單的,如果要深入了解更高級的,就自已去參照相應的文檔了,我也是記錄我的學習過程,更高級的也沒有研究過。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM