過程
slave 配置復制(Replication)策略後,會向master 主動發送一個SYNC命令。Master將啟動後台存盤進程,同時收集所有接收到的用於修改數據集的命令,在後台進程執行完畢後,Master將傳送整個 數據庫文件到Slave,以完成一次完全同步。而Slave服務器在接收到數據庫文件數據之後將其存盤並加載到內存中。此後,Master繼續將所有已經 收集到的修改命令,和新的修改命令依次傳送給Slaves,Slave將在本次執行這些數據修改命令,從而達到最終的數據同步。如果Master和 Slave之間的鏈接出現斷連現象,Slave可以自動重連Master,但是在連接成功之後,又會完全同步數據,不是"增量"的。
配置
redis的主從很簡單,master 幾乎不用配置,主要配置 slave ,1個mater 可以有N個slave(若干個) ,而且當master遇到問題時,可以切換某一個slave 為master ,避免單點故障 ,保證數據完整性。
筆記本虛擬機內存有限,我就在不同的端口開啟redis服務,達到不同機器(ip)開啟redis的效果。
master port: 6379
slave 1 port: 6380
slave 2 port: 6381
[root@localhost redis]# ll total 160 drwxr-xr-x. 2 root root 4096 Mar 26 20:57 bin -rw-r--r--. 1 root root 120602 Mar 29 22:36 dump.rdb -rw-r--r--. 1 root root 36028 Mar 29 22:35 redis.conf [root@localhost redis]# ps -ef |grep redis root 2141 1 0 Mar29 ? 00:00:56 ./bin/redis-server *:6379 root 4986 4959 0 18:40 pts/0 00:00:00 grep redis [root@localhost redis]# kill -9 2141 [root@localhost redis]# cp redis.conf redis6380.conf [root@localhost redis]# vim redis6380.conf ## 將 # slaveof <masterip> <masterport> 改為 slaveof 127.0.0.1 6379 保存退出。 [root@localhost redis]# bin/redis-server ./redis6380.conf [root@localhost redis]# bin/redis-server ./redis.conf [root@localhost redis]# bin/redis-cli 127.0.0.1:6379> keys * 1) "name" 2) "fasdff" 3) "fasdfasf" 4) "counter:__rand_int__" 5) "faffffff" 6) "age" 7) "key:__rand_int__" 8) "faff" 9) "fafffssssdfafff" 10) "mylist"
這是上次的數據,6379有數據了,重開個終端,連接 6380端口。
[root@localhost redis]# ./bin/redis-cli -h 127.0.0.1 -p 6380 127.0.0.1:6380> keys * 1) "name" 2) "faffffff" 3) "counter:__rand_int__" 4) "fasdfasf" 5) "fasdff" 6) "key:__rand_int__" 7) "age" 8) "mylist" 9) "faff" 10) "fafffssssdfafff"
數據太亂了,我在6379 端口執行flushdb ,在6380端口的數據也沒了。
人工更改配置文件很 low , 請出哨兵( sentinel )
復制sentinel.conf
[root@localhost redis]# cp /usr/local/src/redis-2.8.19/sentinel.conf /usr/local/redis/ [root@localhost redis]# ls bin dump.rdb redis6380.conf redis.conf sentinel.conf [root@localhost redis]# vim sentinel.conf [root@localhost redis]# grep -v ^# sentinel.conf | tee sentinel.conf #不顯示配置的說明文件,重定向到sentinel.conf port 26379 dir /tmp sentinel monitor mymaster 127.0.0.1 6379 2 sentinel down-after-milliseconds mymaster 30000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 180000
6380 和 6381 都是6379的slave:將各自配置文件slaveof設置為 slaveof 127.0.0.1 6379 並且端口改為各自端口。
sentinel.conf 我們這裡只設置和6379(master)端口對應的哨兵sentinel,每個端口都可以設置哨兵。
[root@localhost redis]# ll total 120 drwxr-xr-x. 2 root root 4096 Mar 26 20:57 bin -rw-r--r--. 1 root root 40 Mar 30 21:37 dump.rdb -rw-r--r--. 1 root root 36085 Mar 30 21:37 redis6380.conf -rw-r--r--. 1 root root 36109 Mar 30 21:37 redis6381.conf -rw-r--r--. 1 root root 36028 Mar 29 22:35 redis.conf -rw-r--r--. 1 root root 824 Mar 30 21:37 sentinel.conf [root@localhost redis]# cat sentinel.conf #sentinel的端口 port 26379 dir “/tmp”自定義服務器名 mymater
3.啟動各個端口服務。
[root@localhost redis]# bin/redis-server ./redis6380.conf [root@localhost redis]# bin/redis-server ./redis6381.conf [root@localhost redis]# bin/redis-server ./redis.conf
啟動哨兵
[root@localhost redis]# bin/redis-server ./sentinel.conf --sentinel
5.重新開啟個終端,殺死6379端口的服務,或者shutdown,這樣等會兒就能切換優先級搞得slave作為master了。
[5780] 31 Mar 00:52:31.266 # +try-failover master mymaster 127.0.0.1 6380 [5780] 31 Mar 00:52:31.269 # +vote-for-leader 86d663c9700709770705bdb758337364eb82a102 3 [5780] 31 Mar 00:52:31.269 # +elected-leader master mymaster 127.0.0.1 6380
6380成為master了。