哨兵模式搭建圖片伺服器
A. redis sentinel 哨兵模式
Redis 集群可以在一組 redis 節點之間實現高可用性和 sharding。在集群中會有 1 個 master 和多個 slave 節點。當 master 節點失效時,應選舉出一個 slave 節點作為新的 master。然而 Redis 本身(包括它的很多客戶端)沒有實現自動故障發現並進行主備切換的能力,需要外部的監控方案來實現自動故障恢復。
Redis Sentinel 是官方推薦的高可用性解決方案。它是 Redis 集群的監控管理工具,可以提供節點監控、通知、自動故障恢復和客戶端配置發現服務。
搭建一主兩從環境,docker-compose.yml 配置如下:
我們至少需要創建三個 Sentinel 服務,docker-compose.yml 配置如下:
需要三份 sentinel.conf 配置文件,分別為 sentinel1.conf,sentinel2.conf,sentinel3.conf,配置文件內容相同
進入 Sentinel 容器,使用 Sentinel API 查看監控情況:
B. Redis 學習總結(3) Redis 哨兵模式
在實際開發中不會僅僅部署一個 Redis 伺服器,為了獲得高可用,Redis 哨兵模式 則是高可用的一種選擇。
本文先介紹下 哨兵模式,再介紹了如何在 springboot 項目中使用。
這意味著使用 Sentinel (哨兵模式),您可以創建一個 Redis 部署,它可抵抗某些類型的故障(進行故障遷移)而無需人工干預。
它有這些功能:
Sentinel 的分布式特性
Redis Sentinel 是一個分布式系統,多個 Sentinel 進程協同工作,有這些優勢:
部署前需要了解:
三個節點的基本配置
法定人數和仲裁
在配置 哨兵模式時,要指定一個 quorum,它可理解為「法定人數」。
假設有3 個 哨兵,法定人數為2。那麼:
哨兵和副本的自動發現
Sentinel 與其他 Sentinel 保持連接,以便相互檢查彼此的可用性並交換消息。
但是,您不需要在您運行的每個 Sentinel 實例中配置其他 Sentinel 地址的列表,因為 Sentinel 使用 Redis 實例的 Pub/Sub 功能來發現正在監視相同主節點和副本的其他 Sentinel。
類似地,您不需要配置附加到主伺服器的副本地址在哪裡,因為 Sentinel 會通過查詢 Redis 自動發現它們。
參考我的另一篇文章:
一般需要三個節點,每個節點有一個 redis 和一個哨兵。
下面再分別描述。
我這里按三個 節點,先配置 redis 的主從復制。1個節點作為 master ,2個副本。
配置節點1:master
這里的 redis 作為 master 主redis,其他兩個節點作為從節點。
我的文件夾名字叫 box1,這里編輯一個 box1/redis.conf 文件,主要配置內容如下:
配置節點2:副本
編輯一個 box2/redis.conf 文件,主要配置內容如下:
配置節點3:副本
編輯一個 box3/redis.conf 文件,主要配置內容如下:
分別啟動這三個redis
命令行執行 redis-server ,並指定 配置文件的路徑參數。
如何查看「主從復制」是否配置成功?
使用 info replication 命令,操作如下:
副本節點設置為只讀?
從 Redis 2.6 開始,副本已被默認設置為 只讀,無需額外配置。.
一般情況下,至少會需要三個哨兵對redis 進行監控,我們可以通過修改埠啟動多個sentinel 服務。
第一個哨兵:
哨兵的 默認埠是 26379 ,這里不改。
第二個哨兵:
修改哨兵埠。
第三個哨兵:
修改哨兵埠。
啟動哨兵
使用 redis-sentinel 命令,分別啟動這三個哨兵
哨兵的自動發現
當三個哨兵都啟動後,在各個哨兵的列印日誌里可以看到, 三個哨兵已互相發現了彼此的存在 。
至此,配置完畢了,我們有三個 redis,和三個哨兵,看下截圖。
模擬 master 宕機
按 ctrl+c 停止 master ,其位於 6379 。停止後,從日誌可以看到,哨兵和 redis副本先努力繼續連接 6379,反復幾次失敗後,開始選舉出新的 master。截圖如下:
至此,配置完畢。
我們看下 springboot 項目的客戶端如何配置 以訪問 哨兵模式的 redis。
Redis 哨兵支持
對於處理高可用Redis,Spring Data Redis 已經支持Redis Sentinel,使用RedisSentinelConfiguration,如下例所示:
Jedis 和 Lettuce 兩種 redis 驅動都可以支持。
RedisSentinelConfiguration 也可以用可以 通過 PropertySource 來設置,它允許您設置以下屬性:
配置application.yml
比如我這里修改我的 application.yml 文件如下:
我的配置文件示例: https://github.com/vir56k/java_demo/tree/master/redis-sentinel
我的 springboot 配置實例: https://github.com/vir56k/java_demo/tree/master/redis-sentinel/springboot_redis_demo
Redis官網 sentinel 介紹
https://redis.io/topics/sentinel
spring-data/data-redis
https://docs.spring.io/spring-data/data-redis/docs/current/reference/html/#redis:sentinel
https://www.cnblogs.com/jaycekon/p/6237562.html
END
C. Redis哨兵(Sentinel)模式
主從切換技術的方法是:當主伺服器宕機後,需要手動把一台從伺服器切換為主伺服器,這就需要人工干預,費事費力,還會造成一段時間內服務不可用。 這不是一種推薦的方式,更多時候,我們優先考慮 哨兵模式 。
哨兵模式是一種特殊的模式,首先Redis提供了哨兵的命令,哨兵是一個獨立的進程,作為進程,它會獨立運行。其原理是 哨兵通過發送命令,等待Redis伺服器響應,從而監控運行的多個Redis實例。
這里的哨兵有兩個作用
然而一個哨兵進程對Redis伺服器進行監控,可能會出現問題,為此,我們可以使用多個哨兵進行監控。各個哨兵之間還會進行監控,這樣就形成了多哨兵模式。
用文字描述一下 故障切換(failover) 的過程。假設主伺服器宕機,哨兵1先檢測到這個結果,系統並不會馬上進行failover過程,僅僅是哨兵1主觀的認為主伺服器不可用,這個現象成為 主觀下線 。當後面的哨兵也檢測到主伺服器不可用,並且數量達到一定值時,那麼哨兵之間就會進行一次投票,投票的結果由一個哨兵發起,進行failover操作。切換成功後,就會通過發布訂閱模式,讓各個哨兵把自己監控的從伺服器實現切換主機,這個過程稱為 客觀下線 。這樣對於客戶端而言,一切都是透明的。
配置3個哨兵和1主2從的Redis伺服器來演示這個過程。
首先配置Redis的主從伺服器,修改redis.conf文件如下
上述內容主要是配置Redis伺服器,從伺服器比主伺服器多一個slaveof的配置和密碼。
配置3個哨兵,每個哨兵的配置都是一樣的。在Redis安裝目錄下有一個sentinel.conf文件,一份進行修改
上述關閉了保護模式,便於測試。
有了上述的修改,我們可以進入Redis的安裝目錄的src目錄,通過下面的命令啟動伺服器和哨兵
注意啟動的順序。 首先是主機(192.168.11.128)的Redis服務進程,然後啟動從機的服務進程,最後啟動3個哨兵的服務進程。
上面是通過Jedis進行使用的,同樣也可以使用Spring進行配置RedisTemplate使用。
sentinel down-after-milliseconds配置項只是一個哨兵在超過規定時間依舊沒有得到響應後,會自己認為主機不可用。對於其他哨兵而言,並不是這樣認為。哨兵會記錄這個消息,當擁有認為主觀下線的哨兵達到sentinel monitor所配置的數量時,就會發起一次投票,進行failover,此時哨兵會重寫Redis的哨兵配置文件,以適應新場景的需要。
D. Redis詳解九(哨兵模式)
配置3個哨兵和1主2從的Redis伺服器來演示這個過程。
多哨兵監控Redis
首先配置Redis的主從伺服器,修改redis.conf文件如下
上述內容主要是配置Redis伺服器,從伺服器比主伺服器多一個slaveof的配置和密碼。
配置3個哨兵,每個哨兵的配置都是一樣的。在Redis安裝目錄下有一個sentinel.conf文件,一份進行修改。
上述關閉了保護模式,便於測試。
有了上述的修改,我們可以進入Redis的安裝目錄的src目錄,通過下面的命令啟動伺服器和哨兵
注意啟動的順序。 首先是主機(192.168.11.128)的Redis服務進程,然後啟動從機的服務進程,最後啟動3個哨兵的服務進程。
如果主機宕機後,啟用新的主機,原來的主機回歸後,會作為從機。
從單個實例配置到哨兵:
E. linux下安裝配置redis詳細教程,並配置哨兵模式
redis版本為redis-3.2.12,使用工具將安裝包上傳到data目錄。
在data目錄下創建文件夾redis,將redis安裝在此目錄。
第一步:解壓。
第二步:安裝,PREFIX=/data/redis用來設置安裝目錄。
到此,redis已經安裝完成,剩下就是配置和啟動服務。
進入redis目錄, 創建配置文件conf、日誌logs、資料庫mp、進程號pid四個目錄,用來存放對應的文件,這四個目錄也可以存放在其他文件夾,只要與配置文件中的配置一致即可,否則在啟動服務時會報錯。 其中bin目錄就是redis安裝成功後的一些命令文件。
redis服務配置一主二從,哨兵模式。注意:如果在實際開發中用不到哨兵模式,redis服務配置一主一從即可。
主Redis配置:redis_6379.conf
從Redis配置,redis_6380.conf和redis_6381.conf,與主Redis配置基本上一樣,不一樣的地方在於 埠、資料庫、日誌、pid文件名稱 ,都以6380或6381為標志, 最重要的地方是建立主從關系和同步驗證。
注意: 對只使用redis服務 ,只需要在主Redis裡面配置requirepass,在從Redis裡面配置masterauth,密碼保持一致,密碼盡可能復雜,以免被攻擊破解。
注意: 對只使用redis服務 ,如果從Redis也有必要加入訪問驗證,也可以設置requirepass,而且密碼可以與主Redis密碼不同。
將配置文件放置到/data/redis/conf目錄下,然後就可以啟動服務了。
啟動服務要按照主從順序依次啟動。
查看服務啟動情況:
也可以通過查看日誌文件來確認服務是否正常啟動。
通過客戶端登錄Redis驗證數據同步情況:
主Redis登錄驗證,設置數據:
從Redis登錄,獲取數據:從Redis並沒有設置密碼,所以無需驗證就可以操作。
配置哨兵模式:
Redis Sentinel集群通常由3到5個節點組成,如果個別節點掛了,集群還可以正常運作。Sentinel負責監控Redis集群的 健康 情況。
如果主Redis掛掉,Sentinel集群會通過投票選擇一個新的主Redis。 當原來的主Redis恢復時,它會被當做新的主Redis的從Redis重新加入Redis集群。
設置連接master和slave的密碼,需要注意的是sentinel不能分別為master和slave設置不同的密碼,因此master和slave的密碼必須設置相同。也就是說主Redis和從Redis都必須設置requirepass和masterauth,而且密碼必須相同。
sentinel.conf配置信息:
將該配置文件放置到/data/redis/conf目錄下,啟動sentinel服務:
驗證sentinel是否起作用,可以手工shutdown掉主Redis。
這時從Redis想要訪問主Redis同步數據就會提示錯誤信息:
sentinel在監測到主Redis宕機之後,通過選舉,將一個從Redis選定為新的主Redis。通過查看sentinel日誌可以發現,選定6380為新的主Redis,同時將另外兩個Redis作為從Redis。
注意:選定6380為主Redis後,所有的配置文件都會被修改,主要是重新建立主從關系。
6379會新增:slaveof 127.0.0.1 6380
6380會刪掉:slaveof 127.0.0.1 6379
6381會修改:slaveof 127.0.0.1 6380
由於6379服務已經關掉,所以雖然sentinel將6379作為6380的從服務,但是沒有真正的建立。
重新啟動6379服務,這時sentinel會重建建立一次主從關系:
F. SpringBoot連接redis哨兵模式
設置 sentinel-26377.conf 的 protected-mode no ;默認是該欄位值是yes
修改問題[1]中為redis集群master節點的真實地址;
修改問題[2]中為 bind 0.0.0.0
【注】redisTemplate實際上是對其他框架的的封裝,springboot2.x以上底層實現由jedis變為了lettuce。而且lettuce會根據配置自動選擇是否用單機或者哨兵模式。
【1】 Redis 哨兵模式 設置密碼
【2】 sentinel搭建redis集群經驗總結
【3】SpringBoot2.x使用Lettuce連接redis哨兵報錯:RedisConnectionException: Unable to connect to 127.0.0.1:16379]: https://blog.csdn.net/repAgell/article/details/106600960
【4】解決使用jedis連接是報DENIED Redis is running in protected mode錯誤: https://www.cnblogs.com/lonecloud/p/9084761.html
G. docker-compose搭建Redis哨兵模式
環境:Ubuntu 20.04 64版/Centos7
docker版本:20.10.16
docker-compose版本:1.25.1
redis鏡像版本:docker.io/redis:6.2.5-alpine
Docker從1.13.x開始分為社區版CE和企業版EE,版本號也改為按照時間線來發布,比如17.03就是2017年3月。
Docker的linux發行版的軟體倉庫目前為https://download.docker.com, 軟體包名字改為docker-ce和docker-ee。
Docker的社區版(Docker Community Edition)叫做docker-ce。老版本的Docker包叫做docker或者docker-engine,docker官網推薦的安裝方式都是下載docker安裝腳本安裝。
卸載舊版docker (若未安裝過可省略此步):
sudo apt-get remove docker docker.io docker-engine
安裝最新版本docker: curl -sSL https://get.docker.com/ | sh
或者
curl -fsSL get.docker.com -o get-docker.sh
sudo sh get-docker.sh
確認Docker安裝成功,拉取一個單機版本redis的docker:
docker run -d -p 6379:6379 -v ~/redisdata:/data redis:6.2.5 redis-server --appendonly yes
安裝軟體包
yum install -y yum-utils device-mapper-persistent-data lvm2
設置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
查看有哪些版本可以裝(知道要安裝的版本號可直接跳過)
yum list docker-ce --showplicates | sort -r
安裝docker,注意需要輸入完整的版本號
yum install docker-ce-20.10.9-3.el8
安裝完成後,將docker加入開機自啟動
systemctl start docker
systemctl enable docker
檢查是否安裝成功
docker version
cloud下載最新版的docker-compose文件
sudo curl -L https://get.cloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/ docker-compose
從github上下載docker-compose二進制文件安裝
github.com下載最新版的docker-compose文件
sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
添加可執行許可權
sudo chmod +x /usr/local/bin/docker-compose
測試安裝結果
docker-compose --version
2.pip安裝
sudo pip install docker-compose
建立文件目錄: mkdir -p /redisMasterSlave
創建文件 docker-compose.yml
啟動命令:docker-compose -f docker-compose.yml -p redisMima1 up -d
查看實例中的redis角色的命令
docker exec redis_master redis-cli -a redisMima1 info replication
不用進到容器里看,直接在shell下執行即可, 其中redis_master為容器名, -a指定redis密碼
哨兵模式是基於主從的, 建立文件目錄如下
只需要准備三件事
docker-compose.yml配置與主從模式一樣,可直接拷貝
redis_sentinel.yml配置如下
注意networks配是主從模式的網路, 查看主從的任意一台實例可知網路, 查看命令
結果如下 ip為 172.19.0.4
以下的是sentinel1#下的sentinel.conf
sentinel2#與sentinel3#下的配置文件的port分別改為26380, 26381, 其它一樣
注意其中的172.19.0.2是master的docker網路的ip
啟動命令
完成後查看容器運行情況 docker ps
啟動主從docker-compose: ./run_REDIS up1
啟動哨兵docker-compose: ./run_REDIS up2
啟動主從容器: ./run_REDIS start1
啟動哨兵容器: ./run_REDIS start2
停止主從與哨兵所有容器: ./run_REDIS stop
停止主從容器: ./run_REDIS stop1
停止哨兵容器: ./run_REDIS stop2
清除主從與哨兵所有容器: ./run_REDIS clear
清除主從所有容器: ./run_REDIS clear1
清除哨兵所有容器: .run_REDIS clear2
現在可以很方便地試錯了~
H. Redis中的哨兵模式
哨兵模式是一種自動選擇老大的模式,即在老大宕機之後,哨兵模式會根據哨兵們的內部投票,自動的重新選出一個新的老大。哨兵模式是一種特殊的模式,首先Redis提供了哨兵的命令,哨兵是一個獨立的進程,作為進程,它會獨立運行。其原理是哨兵通過發送命令,等待Redis伺服器響應,如果Redis伺服器一直沒有響應,說明這個Redis伺服器可能已經宕機了,從而監控運行的多個Redis實例。
這里的哨兵有兩個作用
1、通過發送命令,讓Redis伺服器返回監控其運行狀態,包括主伺服器和從伺服器。
2、當哨兵監測到master宕機,會自動將slave切換成master,然後通過發布訂閱模式通知其他的從伺服器,修改配置文件,讓它們切換主機。
然而一個哨兵進程對Redis伺服器進行監控,可能會出現問題,為此,我們可以使用多個哨兵進行監控。各個哨兵之間還會進行監控,這樣就形成了多哨兵模式。
用文字描述一下故障切換(failover)的過程。假設主伺服器宕機,哨兵1先檢測到這個結果,系統並不會馬上進行failover過程,僅僅是哨兵1主觀的認為主伺服器不可用,這個現象成為主觀下線。當後面的哨兵也檢測到主伺服器不可用,並且數量達到一定值時,那麼哨兵之間就會進行一次投票,投票的結果由一個哨兵發起,進行failover操作。切換成功後,就會通過發布訂閱模式,讓各個哨兵把自己監控的從伺服器實現切換主機,這個過程稱為客觀下線。這樣對於客戶端而言,一切都是透明的。如果有三個哨兵,不僅每個哨兵會監視主機和從機,而且哨兵之間也會互相監視,如下圖:
配置哨兵配置文件sentinel.conf,如下
當哨兵模式的配置文件配置好之後,就可以啟動哨兵模式了,如下圖
測試在哨兵模式下如果主機崩了的話會不會從從機中自動選出一個老大,先關閉主機,讓主機宕機,如下圖:
看看主機宕機之後,哨兵模式中輸出日誌的新的內容是什麼,如下圖:
哨兵模式自動選舉一個主機這個過程是怎樣實現自動化的?哨兵自動選舉之前的某個從機為老大,所有的從機都會稱新選出的從機為老大,以及原本的老大也會稱新選出的老大為老大,這個過程是怎麼自動化實現的呢?是通過在對應的redis伺服器的配置文件中寫內容來實現的,比方說,讓我們看一下新老大也即是埠號是6381的redis伺服器的配置文件中是怎樣改寫的,如下圖:
再來看一下從機即埠號是6380的redis伺服器對應的配置文件是怎樣改寫的,如下圖:
最後看一下原本的主機即埠號是6379的redis伺服器的配置文件是怎樣改寫的。我檢查了一下,發現在重新啟動原本的老大即重啟已經宕機的埠號是6379的redis伺服器之前,它對應的配置文件中沒有發生任何改變,但是一旦重新啟動原本的老大,它對應的配置文件就會發生變化,如下圖:
哨兵模式中的主機關閉之後需要特別注意的一個易錯點:就是因為現在老大已經換了,所以老大的認證密碼也換了,因此需要在現任老大的所有從機裡面配置主機的認證密碼,這個哨兵模式是不會幫我們自動配置的,需要我們自動配置,如下圖:
測試哨兵模式結果,如下圖:
1、哨兵集群,基於主從復制模式,所有的主從配置優點,它全有。
2、主從可以切換,故障可以轉移,系統的可用性就會更好。
3、哨兵模式就是主從模式的升級,手動到自動,更加健壯。
1、集群容量一旦到達上限,在線擴容十分麻煩。
2、實現哨兵模式的配置其實是很麻煩的,裡面有很多選擇。
當Redis集群的主節點故障時,Sentinel集群將從剩餘的從節點中選舉一個新的主節點,有以下步驟:
Sentinel集群的每一個Sentinel節點會定時對Redis集群的所有節點發心跳包檢測節點是否正常。如果一個節點在down-after-milliseconds時間內沒有回復Sentinel節點的心跳包,則該Redis節點被該Sentinel節點主觀下線。
當節點被一個Sentinel節點記為主觀下線時,並不意味著該節點肯定故障了,還需要Sentinel集群的其他Sentinel節點共同判斷為主觀下線才行。
該Sentinel節點會詢問其他Sentinel節點,如果Sentinel集群中超過quorum數量的Sentinel節點認為該Redis節點主觀下線,則該redis客觀下線。
如果客觀下線的redis節點是從節點或者是Sentinel節點,則操作到此為止,沒有後續的操作了;如果客觀下線的Redis節點為主節點,則開始故障轉移,從從節點中選舉一個節點升級為主節點。
如果需要從redis集群選舉一個節點為主節點,首先需要從Sentinel集群中選舉一個Sentinel節點作為Leader。
每一個Sentinel節點都可以成為Leader,當一個Sentinel節點確認redis集群的主節點主觀下線後,會請求其他Sentinel節點要求將自己選舉為Leader。被請求的Sentinel節點如果沒有同意過其他Sentinel節點的選舉請求,則同意該請求(選舉票數+1),否則不同意。
如果一個Sentinel節點獲得的選舉票數達到Leader最低票數(quorum和Sentinel節點數/2+1的最大值),則該Sentinel節點選舉為Leader;否則重新進行選舉。
當Sentinel集群選舉出Sentinel Leader後,由Sentinel Leader從redis從節點中選擇一個redis節點作為主節點:
詳解redis集群選舉機制
I. 使用seaweedfs搭建一個圖片伺服器 (上)
https://github.com/chrislusf/seaweedfs/releases
經典論文翻譯導讀之《Finding a needle in Haystack: Facebook』s photo storage》
http://www.importnew.com/3292.html
下面一張圖總結下相互關系:
weed master 創建的是一個master伺服器。
參數:
-defaultReplication string 備份策略(詳細見 https://github.com/chrislusf/seaweedfs/wiki/Replication )
-ip string
-mdir string 選項用於配置保存生成的序列文件id的文件夾
-port int (default 9333)
-volumeSizeLimitMB uint 自定義不能大於30000(default 30000)
-whiteList string 白名單,ip地址用逗號隔開
master伺服器可以創建多個來實現故障轉移主伺服器,詳細見 https://github.com/chrislusf/seaweedfs/wiki/Failover-Master-Server
參數:
-dir string 數據保存的路徑,如果master的mdir沒有指定會使用這個,如果filer的dir沒有指定會新增並使用該目錄下的filer目錄
-ip string
-mserver string (default "localhost:9333")
-port
-dataCenter string
-rack string
-whiteList string
weed volume會創建一個 datanode ,可以指定所屬的 datacenter rack和master ,會根據配置存儲文件,默認一開始沒有volume,當開始存儲文件的時候才會創建一個volume,當這一個volume大小超過了volumeSizeLimitMB 就會新增一個volume,當volume個數超過了max則該datanode就不能新增數據了。那就需要在通過weed volume命令新增一個datanode。
weed filer
參數
-collection string 所有數據將存儲在此集合中
-dataCenter string 更傾向於在這個數據中心寫入卷
-dirListLimit int limit sub dir listing size (default 100000)
-ip string
-master string
-port int(default 8888)
更詳細的說明請見: https://mp.csdn.net/mdeditor/85049078#
或者訪問官網wiki : https://github.com/chrislusf/seaweedfs/wiki
出現如下提示說明啟動成功
執行下面的命令:
出現DataCenters是null的原因是沒有執行weed volume創建DataCenter。
" 這里說一下抽象概念":
我們抽象的認為我們的圖片伺服器,一個master需要兩個datacenter叫imgdatacenter1,imgdatacenter2;imgdatacenter1需要兩個rack叫imgrack1,imgrack2;然後imgrack1需要兩個datanode1,datanode2;
創建datanode時 ,統一設置每個datanode包含10個volume即可。當datanode裡面的volume滿了以後再創建 新的datanode即可,方便擴展,並且不同datanode可以在不同磁碟位置;
(imgdatacenter1的imgrack2和imgdatacenter2按照上面的方式創建即可,見附錄 )
目前我們只是用imgdatacenter1->imgrack1->datanode1中的datanode1 :
創建datanode1的時候 master命令行會列印,提示leader新增child imgdatacenter1成功;imgdatacenter1新增child imgrack1成功;imgdatacenter1,imgrack1新增child 9991成功;volume server在9991埠。
此時再執行查看master狀態的命名;
DataCenters Racks DataNodes都存在了;
但是名為localhost:9991的datanode中的volumes為0,明明我們設置了10啊;
因為沒有上傳文件之前不會創建volume,volume會在上傳文件的時候根據實際情況創建。
這里注意下layouts,現在是null,當上傳文件的時候會出現一個名為""的collection,裡面的writables就是volume 的id數組,如果你自定義了collection,name你自定義的collection也會出現在這里,並且所有collection的volume個數之和小於等於我們設置的10;
collection刪除後再新增,裡面的volume的id會一直遞增,不會使用原先刪除的volume id。
此時我們可以上傳文件了。
上傳文件有多種方式,這里我們先說明兩個
1.先向master申請文件id,然後用文件id向datanode上傳文件:
修改只需要在fid上傳別的文件即可
上傳成功後訪問,只需要拼接url即可: localhost:9991/1,015b7256d5
2.直接向master上傳文件,master自己生成文件id,並向datanode上傳文件,然後返回結果:
此時你再查看狀態發現volume就創建了10個。
此時查看datanode的狀態:
因為我1.jpg上傳了兩次,而且第一次在id為1的volume中,第二次在id為3的volume中,所有你會發現這兩個id的volume的FileCount都為1
並發的上傳文件:
一個卷伺服器一次只寫一個卷。如果需要增加並發性,可以預先分配大量卷。下面是例子。您還可以組合所有不同的選項。狀態詳情見附錄
刪除文件:
文件的刪除不是實時的,因為weed默認有個閾值,超過這個閾值才會清理沒使用的空間,如果你一時間內刪除了大量文件,想立馬生效,可以用這種方式清理未使用的空間:
此時文件通過url的增刪改查都可以了,下面把服務映射成文件系統來操作,可以方便的操作本地的大量文件
filer是將文件以文件目錄的方式上傳到圖片服務,然後你根據文件目錄的方式訪問
默認使用leveldb保存映射關系,打開filer.toml文件修改保存映射文件的文件夾為ftmp(自定義)
然後啟動filer服務
master列印如下信息說明成功
自身的log
直接往weed filer中拷貝目錄或者文件(-include是文件模式通配符前使用??)
weed filer. nginxdir http://localhost:8888/aaa 把nginxdir拷貝到aaa目錄下
weed filer. -include *.go . http://localhost:8888/github/
詳細請見 https://github.com/chrislusf/seaweedfs/wiki/Filer-Server-API
然而我們時長會有這樣的需求,批量把照片保存成圖片文件備份起來,而不是備份一個bat文件;
或者我們想以目錄結構的方式通過本地訪問,而不是通過web訪問?
此時最簡單有效的方法就是把filer伺服器mount到本地,然後直接操作文件系統:
weed mount 像訪問本地目錄一樣訪問文件系統,前提是開啟了 master volume filer
(它使用bazil.org/FUSE,它允許在Linux和OSX上編寫FUSE文件系統。在OSX上,它需要OSXFUSE)
可以指定 collection
關閉掛在需要關閉mount並且手動umont ~/mdir目錄,如果一般用戶失敗請使用root用戶
一個場景:
如果本地已經有很多文件了,如何快速的遷移到seaweedfs中呢?
1.啟動master、volume、filer
2.啟動mount
3.手動拷貝到mount目錄中(單線程的)
4.使用weed filer. file_or_dir1 [file_or_dir2 file_or_dir3] http://localhost:8888/path/to/a/folder/ (多線程且繞過fuse層)
aws s3 兼容
Each bucket is stored in one collection, and mapped to folder /buckets/<bucket_name> by default
可以通過刪除collection來快速刪除一個bucket
非同步復制
應該有兩個SeawideFileSystems運行,可能跨數據中心運行。每個伺服器都應該有自己的文件伺服器、主伺服器和卷伺服器。
這是我執行了(curl " http://localhost:9333/vol/grow?collection=imgcoll&count=3 " )的結果
詳細文檔請見官方wiki
https://github.com/chrislusf/seaweedfs/wiki/Getting-Started
J. Redis哨兵模式(主從從)
參考源碼配置文件:/root/redis-4.0.8/sentinel.conf
vim /etc/sentinel.conf
從庫啟動哨兵服務: