1. 程式人生 > >redis的主從複製(讀寫分離)、哨兵(主從切換)配置

redis的主從複製(讀寫分離)、哨兵(主從切換)配置

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

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

配置檔案(redis.conf):

master配置修改埠:

    port 6000
    requirepass 123456

(PS:最好加上:masterauth 123456 ,便於master宕機切換為slave時,無需另修改配置

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  

啟動從機:(PS:後臺啟動要把daemonize改為yes

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

我這裡遇到一個報錯:(error) MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk. Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option). Please check the Redis logs for details about the RDB error.

原因:強制關閉Redis快照導致不能持久化。

解決方法:127.0.0.1:6379> config set stop-writes-on-bgsave-error no

產看啟動程序,輸入:

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"

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

PS:若主從複製不成功,從庫報錯:Opening the temp file needed for MASTER <-> SLAVE synchronization: Permission denied

原因:多半是因為從庫上啟動redis-server時不是root使用者啟動,而普通使用者無法對redis目錄進行寫操作,導致無法在redis安裝目錄產生dump.rdb

解決方法:

1、從庫上用root啟動redis

2、更改redis安裝目錄為啟動使用者可寫

但是萬一主機掛了怎麼辦,這是個麻煩事情,所以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宕機,才會去執行主從切換的功能。