redis哨兵主從配置
- 環境描述
操作系統:CentOS 5.10 x64
硬件配置:阿裏雲8核8G100G硬盤。
IP地址:10.253.2.32 【默認主】
IP地址:10.253.5.158【默認從】
版本號:redis-2.8 - Redis安裝部署
Redis是一種高級key-value數據庫。它跟memcached類似,不過數據可以持久化,而且支持的數據類型很豐富。有字符串,鏈表,集 合和有序集合。支持在服務器端計算集合的並,交和補集.
(difference)等,還支持多種排序功能。所以Redis也可以被看成是一個數據結構服務 器。
Redis的所有數據都是保存在內存中,然後不定期的通過異步方式保存到磁盤上(這稱為“半持久化模式”);也可以把每一次數據變化都寫入到一個append only file(aof)裏面(這稱為“全
安裝 tcl
下載tcl 包 http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz
--解壓包
tar xzvf tcl8.6.1-src.tar.gz -C /usr/local/
--進入目錄
cd /usr/local/tcl8.6.1/unix/
--安裝前檢查
./configure
--編譯
make
--運行
make install安裝時間比較花時間
安裝redis
1. 下載地址:
$ wget http://redis.io/download
2. 解壓縮
$ tar xzf redis-2.8.19.tar.gz
3. 編譯
$ cd redis-2.8.19
$make install
或者指定目錄安裝
$ make PREFIX=/home/redis/redis install
$cp redis.conf /etc/
參數介紹:
make install命令執行完成後,會在/usr/local/bin目錄下生成個可執行文件,分別是redis-server、redis-cli、redis-benchmark、redis-check-aof 、redis-check-dump,它們的作用如下:
redis-server:Redis服務器的daemon啟動程序
redis-cli:Redis命令行操作工具。也可以用telnet根據其純文本協議來操作
redis-benchmark:Redis性能測試工具,測試Redis在當前系統下的讀寫性能
redis-check-dump:檢查導出工具
4. 修改系統配置文件,執行命令
a) echo vm.overcommit_memory=1 >> /etc/sysctl.conf
b) sysctl vm.overcommit_memory=1 或執行echo vm.overcommit_memory=1 >>/proc/sys/vm/overcommit_memory
使用數字含義:
0,表示內核將檢查是否有足夠的可用內存供應用進程使用;如果有足夠的可用內存,內存申請允許;否則,內存申請失敗,並把錯誤返回給應用進程。
1,表示內核允許分配所有的物理內存,而不管當前的內存狀態如何。
2,表示內核允許分配超過所有物理內存和交換空間總和的內存
5. 修改redis配置文件
a) $ cd /etc/
b) vi redis.conf
c) 修改daemonize yes---目的使進程在後臺運行
參數介紹:
daemonize:是否以後臺daemon方式運行
pidfile:pid文件位置
port:監聽的端口號
timeout:請求超時時間
loglevel:log信息級別
logfile:log文件位置
databases:開啟數據庫的數量
save :保存快照的頻率,第一個表示多長時間,第三個表示執行多少次寫操作。在一定時間內執行一定數量的寫操作時,自動保存快照。可設置多個條件。
rdbcompression:是否使用壓縮
dbfilename:數據快照文件名(只是文件名,不包括目錄)
dir:數據快照的保存目錄(這個是目錄)
appendonly:是否開啟appendonlylog,開啟的話每次寫操作會記一條log,這會提高數據抗風險能力,但影響效率。
appendfsync:appendonlylog如何同步到磁盤(三個選項,分別是每次寫都強制調用fsync、每秒啟用一次fsync、不調用fsync等待系統自己同步)
6. 啟動redis
a) $ cd /usr/local/bin
b) ./redis-server /etc/redis.conf
7. 檢查是否啟動成功
a) $ ps -ef | grep redis
b) redis-cli -p 8086
127.0.0.1:6379> set foo bat
OK
127.0.0.1:6379> set foo bar
OK
127.0.0.1:6379> get foo
"bar"
127.0.0.1:6379> get bat - Redis主從配置
僅需要在slave node上修改配置:
找到slaveof這行,參考下面的修改(填上master node的ip和端口就完事了)
slaveof 10.253.2.332 8086 //哨兵主從配置,第一次必須人工定義好主從。後續哨兵記住了同一網絡中存在的所有redis服務器,會自動刪除掉此配置。
另外註意下 slave-read-only yes 這行,這表示slave只讀不寫,也是推薦設置【在哨兵主從這個參數不需要配置,因為從機我們還需要提升為master】 -
哨兵的配置
redis提供了sentinel(哨兵)機制,通過sentinel模式啟動redis後,自動監控master/slave的運行狀態,基本原理是:心跳機制+投票裁決。每個sentinel會向其它sentinal、master、slave定時發送消息,以確認對方是否“活”著,如果發現對方在指定時間(可配置)內未回應,則暫時認為對方已掛(所謂的“主觀認為宕機” Subjective Down,簡稱SDOWN)。
若“哨兵群”中的多數sentinel,都報告某一master沒響應,系統才認為該master"徹底死亡"(即:客觀上的真正down機,Objective Down,簡稱ODOWN),通過一定的vote算法,從剩下的slave節點中,選一臺提升為master,然後自動修改相關配置。
在2臺redis服務器上分別創建sentinel.conf文件
安裝redis之後,其安裝目錄為/usr/loca/bin/
在此目錄下,創建conf文件夾,然後在conf文件夾創建sentinel.conf,內容如下:
port 7050 //哨兵監聽的端口號
dir /usr/local/bin/ //redis的主目錄
sentinel monitor mymaster 10.253.2.32 8086 1 //默認的主服務器。 1表示只要一個哨兵監聽到主服務器ODOWN,就開始failover.
sentinel down-after-milliseconds mymaster 5000 //哨兵監聽redis主服務器沒有響應超過5秒,就認為是SDOWN了。
sentinel parallel-syncs mymaster 1 //新master啟動之後,只允許同一時刻一臺從服務器更新同步數據
sentinel failover-timeout mymaster 15000 //哨兵監聽redis主服務器沒有響應超過15秒,就開始進行failover,進行選舉新的master。
啟動redis
./redis-server /etc/redis.conf
啟動哨兵
./redis-sentinel conf/sentinel.conf
確認主機
在2臺機器上同時確認主機信息
./redis-cli -p 7050 sentinel masters
) 1) "name"
2) "mymaster"
3) "ip"
4) "10.253.2.32"
5) "port"
6) "8086"
7) "runid"
8) "3bad76dd51566847d8b0603865310b87584201f9"
9) "flags"
10) "master"
11) "pending-commands"
12) "0"
13) "last-ping-sent"
14) "0"
15) "last-ok-ping-reply"
16) "351"
17) "last-ping-reply"
18) "351"
19) "down-after-milliseconds"
20) "5000"
21) "info-refresh"
22) "8559"
23) "role-reported"
24) "master"
25) "role-reported-time"
26) "44678013"
27) "config-epoch"
28) "8"
29) "num-slaves"
30) "1"
31) "num-other-sentinels"
32) "1"
33) "quorum"
34) "1"
35) "failover-timeout"
36) "15000"
37) "parallel-syncs"
38) "1"
關閉掉主服務器
./redis-cli -p 8086 shutdown
再次確認主機信息
./redis-cli -p 7050 sentinel masters
) 1) "name"
2) "mymaster"
3) "ip"
4) "10.253.5.158"
5) "port"
6) "8086"
7) "runid"
8) "3bad76dd51566847d8b0603865310b87584201f9"
9) "flags"
10) "master"
11) "pending-commands"
12) "0"
13) "last-ping-sent"
14) "0"
15) "last-ok-ping-reply"
16) "351"
17) "last-ping-reply"
18) "351"
19) "down-after-milliseconds"
20) "5000"
21) "info-refresh"
22) "8559"
23) "role-reported"
24) "master"
25) "role-reported-time"
26) "44678013"
27) "config-epoch"
28) "8"
29) "num-slaves"
30) "1"
31) "num-other-sentinels"
32) "1"
33) "quorum"
34) "1"
35) "failover-timeout"
36) "15000"
37) "parallel-syncs"
38) "1"
查看哨兵的配置
port 7050
dir "/usr/local/bin"
sentinel monitor mymaster 10.253.2.32 8086 1
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 15000Generated by CONFIG REWRITE
sentinel config-epoch mymaster 8
sentinel leader-epoch mymaster 8
sentinel known-slave mymaster 10.253.5.158 8086
sentinel known-sentinel mymaster 10.253.5.158 3306 8f27d969797b27e89da6ed2156ba9f1cebfdc885 //哨兵記錄了網絡中存在的這臺redis服務器,在10.253.2.32 down掉之後,通過選舉把10.253.5.158定義為主服務器。同時,記錄了這臺redis服務器的信息在自己的配置文件中。2臺服務器上的哨兵配置都會記錄。
sentinel current-epoch 8 - 生產項目配置redis
配置文件application.yml
spring:
redis:
sentinel:
master: mymaster
nodes: 10.253.2.32:3306,10.253.5.158:3306
redis哨兵主從配置