1. 程式人生 > >Redis 主從複製(讀寫分離)————哨兵(主從切換)配置(轉載)

Redis 主從複製(讀寫分離)————哨兵(主從切換)配置(轉載)

當資料量變得龐大的時候,讀寫分離還是很有必要的。同時避免一個redis服務宕機,導致應用宕機的情況,我們啟用sentinel(哨兵)服務,實現主從切換的功能。redis提供了一個master,多個slave的服務。

         準備三個redis服務,依次命名資料夾子master,slave1,slave2.這裡為在測試機上,不干擾原來的redis服務,我們master使用6000埠。

配置檔案(redis.conf):

master配置修改埠:

    port 6000
    requirepass 123456

slave1修改配置:

1

2

3

4

5

6

7

port 6001

slaveof 127.0.0.1 6000

masterauth 123456

requirepass 123456

slave2修改配置:  

1

2

3

4

5

6

7

port 6002

slaveof 127.0.0.1 6000

masterauth 123456

requirepass 123456

      requirepass:是認證密碼,應該之後要作主從切換,所以建議所有的密碼都一致。masterauth是從機對主機驗證時,所需的密碼(即主機的requirepass)。

啟動主機:

1

redis-server redis.conf  

啟動從機:

   redis-server redis1.conf
   redis-server redis2.conf

產看啟動程序,輸入:

ps -ef |grep redis
root      6617     1  0 18:34 ?        00:00:01 redis-server *:6000    
root      6647     1  0 18:43 ?        00:00:00 redis-server *:6001     
root      6653     1  0 18:43 ?        00:00:00 redis-server *:6002     
root      6658  6570  0 18:43 pts/0    00:00:00 grep redis

可以看到主,從機的redis已經相應啟動。

我們來驗證下主從複製:

master:

1

2

3

4

5

[[email protected] master]# redis-cli -p 6000

127.0.0.1:6000> auth 123456

OK

127.0.0.1:6000> set test chenqm

OK

slave1:

1

2

3

4

5

[[email protected] slave2]# redis-cli -p 6001

127.0.0.1:6001> auth 123456

OK

127.0.0.1:6001> get test

"chenqm"

slave2:

1

2

3

4

5

[[email protected] slave2]# redis-cli -p 6002

127.0.0.1:6002> auth 123456

OK

127.0.0.1:6002> get test

"chenqm"

可以看到主機執行寫命令,從機能同步主機的值,主從複製,讀寫分離就實現了。

但是萬一主機掛了怎麼辦,這是個麻煩事情,所以redis提供了一個sentinel(哨兵),以此來實現主從切換的功能,類似與zookeeper。

Redis哨兵(sentinel)實現主從切換:

我們配置兩個sentinel程序:

(1)

       vi sentinel.conf 

1

2

3

4

5

6

port 26379

sentinel monitor mymaster 127.0.0.1 6000 2

sentinel auth-pass mymaster 123456

(2)

1

vi sentinel.conf

1

2

3

4

5

port 26479

sentinel monitor mymaster 127.0.0.1 6000 2

sentinel auth-pass mymaster 123456

啟動sentinel服務(到對應的目錄執行相應的命令):

1

redis-server sentinel.conf --sentinel

 檢視日誌:

[7014] 11 Jan 19:42:30.918 # +monitor master mymaster 127.0.0.1 6000 quorum 2
[7014] 11 Jan 19:42:30.923 * +slave slave 127.0.0.1:6002 127.0.0.1 6002 @ mymaster 127.0.0.1 6000
[7014] 11 Jan 19:42:30.925 * +slave slave 127.0.0.1:6001 127.0.0.1 6002 @ mymaster 127.0.0.1 6000

從對應的日誌觀察到,一個master服務,兩個slave服務。

我們現在來kill master程序

1

2

3

4

5

6

7

8

[[email protected] slave1]# ps -ef|grep redis

root      6960     1  0 19:29 ?        00:00:02 redis-server *:6000   

root      6968     1  0 19:30 ?        00:00:01 redis-server *:6001    

root      6975     1  0 19:30 ?        00:00:01 redis-server *:6002    

root      7014  6570  0 19:42 pts/0    00:00:01 redis-server *:26479                

root      7017  6789  0 19:42 pts/5    00:00:01 redis-server *:26379                

root      7021  6729  0 19:46 pts/3    00:00:00 grep redis

[[email protected] slave1]# kill -9 6960

我們觀察日誌:

1

2

[7014] 11 Jan 19:43:41.463 # +sdown master mymaster 127.0.0.1 6000

[7014] 11 Jan 19:46:42.379 # +switch-master mymaster 127.0.0.1 6000 127.0.0.1 6001

master切換了,當6000埠的這個服務重啟的時候,他會變成6001埠服務的slave。

因為sentinel在切換master的時候,把對應的sentinel.conf和redis.conf檔案的配置修改。

期間我們還需要關注的一個問題:sentinel服務本身也不是萬能的,也會宕機,所以我們還得部署sentinel叢集,象我這樣多啟動幾個sentinel。

注意這個配置:

1

sentinel monitor mymaster 127.0.0.1 6000 2   //這個後面的數字2,是指當有兩個及以上的sentinel服務檢測到master宕機,才會去執行主從