如何學會在合適的場景使用合適的技術方案,這值得思考。html
因爲本地環境的使用,因此搭建一個本地的Redis集羣,本篇講解Redis主從複製集羣的搭建,使用的平臺是Windows,搭建的思路和Linux上基本一致!
(精讀閱讀本篇可能花費您15分鐘,略讀需5分鐘左右)git
爲了使得集羣在一部分節點下線或者沒法與集羣的大多數節點進行通信的狀況下, 仍然能夠正常運做, Redis 集羣對節點使用了主從複製功能: 集羣中的每一個節點都有 1 個至 N 個複製品(replica), 其中一個複製品爲主節點(master), 而其他的 N-1 個複製品爲從節點(slave)。[ 摘自 Redis 集羣中的主從複製 ]github
那麼上面是主從複製呢,簡單的來講就是一個主節點master能夠擁有一個甚至多個從節點的slave,而一個slave又能夠擁有多個slave,如此下去,造成了強大的多級服務器集羣架構。
redis
其中主節點以寫爲主(可寫也能夠讀),從節點只能讀不可寫入!【讀寫分離場景】
其中主節點寫入的數據會同步(不是準實時的)到salve上,這樣若是主節點出現故障,數據丟失,則能夠經過salve進行恢復。【容災恢復場景,注:由於數據不是實時同步的,可能會存在從salve恢復數據後有數據丟失問題】數據庫
綜上:下面是關於redis主從複製的一些特色:
1.一個master能夠有多個slave
2.除了多個slave連到相同的master外,slave也能夠鏈接其餘slave造成圖狀結構
3.主從複製不會阻塞master。也就是說當一個或多個slave與master進行初次同步數據時,master能夠繼續處理client發來的請求。相反slave在初次同步數據時則會阻塞不能處理client的請求。
4.主從複製能夠用來提升系統的可伸縮性,咱們能夠用多個slave 專門用於client的讀請求,好比sort操做可使用slave來處理。也能夠用來作簡單的數據冗餘
5.能夠在master禁用數據持久化,只須要註釋掉master 配置文件中的全部save配置,而後只在slave上配置數據持久化。
6.能夠用於讀寫分離和容災恢復。windows
本次主要介紹一主二僕,和反客爲主的操做,薪火相傳不作介紹。哨兵模式後面專門寫一篇進行介紹!緩存
Redis For Windows Download
或者
Redis For Windows GitHub服務器
解壓收的目錄以下圖:
網絡
我本身本地修改了名稱,複製後文件夾名稱顯示以下:架構
Redis-x64-3.2.100-6379 Redis-x64-3.2.100-6380 Redis-x64-3.2.100-6381
6379文件夾,不作修改!
6380文件夾,修改以下:
port 6380 # slaveof <masterip> <masterport> slaveof 127.0.0.1 6379
6381文件夾,修改以下:
port 6381 slaveof 127.0.0.1 6379
我默認你們是知道redis.xx.conf的相關配置的!若是不知道,請看:
Redis學習——redis.conf 配置文件介紹
在對應的redis文件夾下面新建
startRedisServer.bat
腳本的內容爲:
@echo off redis-server.exe redis.windows.conf @pause
而後在redis文件夾同級的目錄下在新建
start6379.cmd
@echo off cd Redis-x64-3.2.100-6379 startRedisServer.bat
而後6380和6381和上面操做同樣,操做完成後以下圖:
啓動規則:先啓動主節點,而後在啓動從節點!
進入相應的文件夾目錄,使用啓動命令:
redis-server.exe
如上面圖片,分別執行start6379.cmd,
start6380.cmd,start6381.cmd。
先啓動Master。使用客戶端登陸,查看信息如圖:
而後啓動6380和6381,而後能夠看到:如圖
在此查看6378的主從複製信息:如圖
在登陸6380和6381的客戶端,查看節點信息:如圖
測試讀寫,【主節點可讀可寫,從節點只能讀不可寫】,以下圖:
測試當主節點shutdown後,從節點的狀態【從節點可讀,從節點也不會升級爲主節點】:
127.0.0.1:6381> info replication # Replication role:slave master_host:127.0.0.1 master_port:6379 master_link_status:up master_last_io_seconds_ago:1 master_sync_in_progress:0 slave_repl_offset:15 slave_priority:100 slave_read_only:1 connected_slaves:0 master_repl_offset:0 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 127.0.0.1:6381> 127.0.0.1:6381> get hello "world"
測試當主節點從新啓動後,從節點的狀態【從節點依然能夠鏈接主節點】:
127.0.0.1:6379> info replication # Replication role:master connected_slaves:2 slave0:ip=127.0.0.1,port=6380,state=online,offset=43,lag=0 slave1:ip=127.0.0.1,port=6381,state=online,offset=43,lag=0 master_repl_offset:43 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:42 127.0.0.1:6379>
小插曲【反客爲主】
測試當主節點shutdown後,使用slaveof no one 是的6380成爲主節點,可是也只是主節點,沒有任何從節點!:如圖
127.0.0.1:6381> info replication # Replication role:slave master_host:127.0.0.1 master_port:6379 master_link_status:down master_last_io_seconds_ago:-1 master_sync_in_progress:0 slave_repl_offset:155 master_link_down_since_seconds:jd slave_priority:100 slave_read_only:1 connected_slaves:0 master_repl_offset:0 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 127.0.0.1:6381> 127.0.0.1:6381> 127.0.0.1:6381> slave no one (error) ERR unknown command 'slave' 127.0.0.1:6381> slaveof no one OK 127.0.0.1:6381> info replication # Replication role:master connected_slaves:0 master_repl_offset:0 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 127.0.0.1:6381> set test 11 OK 127.0.0.1:6381> get test "11" 127.0.0.1:6381>
詳細能夠參考 Redis主從複製 中的內容!
當設置好slave服務器後,slave會創建和master的鏈接,而後發送sync命令。不管是第一次同步創建的鏈接仍是鏈接斷開後的從新鏈接,master都會啓動一個後臺進程,將數據庫快照保存到文件中,同時master主進程會開始收集新的寫命令並緩存起來。後臺進程完成寫文件 後,master就發送文件給slave,slave將文件保存到磁盤上,而後加載到內存恢復數據庫快照到slave上。接着master就會把緩存的命令轉發給slave。並且後續master收到的寫命令都會經過開始創建的鏈接發送給slave。從master到slave的同步數據的命令和從 client發送的命令使用相同的協議格式。當master和slave的鏈接斷開時slave能夠自動從新創建鏈接。若是master同時收到多個 slave發來的同步鏈接命令,只會使用啓動一個進程來寫數據庫鏡像,而後發送給全部slave。
圖片內容來源網絡:
Redis 主從同步有兩種方式(或者所兩個階段):全同步和部分同步。
主從剛剛鏈接的時候,進行全同步;全同步結束後,進行部分同步。固然,若是有須要,Slave 在任什麼時候候均可以發起全同步。Redis 策略是,不管如何,首先會嘗試進行部分同步,如不成功,要求從機進行全同步,並啓動 BGSAVE……BGSAVE 結束後,傳輸 RDB 文件;若是成功,容許從機進行部分同步,並傳輸積壓空間中的數據。
IO劇增
每次slave斷開之後(不管是主動斷開,仍是網路故障)再鏈接master都要將master所有dump出來rdb,在aof,即同步的過程都要從新執行一遍;因此要記住多臺slave不要一下都啓動起來,不然master可能IO劇增(間隔1-2分)
可用性不高
當有主節點發生異常狀況,就會致使不能寫入,致使業務出錯![解決方法是可使用Redis-Sentinel模式,詳情見系列文章第二篇]
注意:
Redis 集羣不保證數據的強一致性(strong consistency)Redis 集羣的一致性保證(guarantee): 在特定條件下, Redis 集羣可能會丟失已經被執行過的寫命令。
若是想直接使用本篇講解使用的主從配置!我已經打包好了 點擊 下載地址 進行下載!
第一篇:Redis集羣主從複製(一主兩從)搭建配置教程【Windows環境】
第二篇:Redis高可用集羣-哨兵模式(Redis-Sentinel)搭建配置教程【Windows環境】
若是您以爲這篇博文對你有幫助,請點個贊,謝謝!
若是帥氣(美麗)、睿智(聰穎),和我同樣簡單善良的你看到本篇博文中存在問題,請指出,我虛心接受你讓我成長的批評,謝謝閱讀!
祝你今天開心愉快!
歡迎訪問個人csdn博客,咱們一同成長!
"無論作什麼,只要堅持下去就會看到不同!在路上,不卑不亢!"