Centos

腳本在 50 台伺服器上執行。如何確保只有一個人執行特定步驟?

  • May 7, 2013

我有一些工作需要在 50 多台伺服器上完成。第一步是將某些原始碼的更新版本檢出到共享目錄中(假設都安裝了共享驅動器)。第二個是在每台伺服器上執行一些工作。

我希望這兩個腳本在每台伺服器上執行。所有 50 多台伺服器都是從一個磁碟映像中複製出來的,我無法自定義其中的任何一個。

當 50 個伺服器執行第一個腳本時,我只希望第一個嘗試執行它的伺服器實際執行它。其他我想簡單地退出。實際執行腳本的伺服器應該更新一個共享目錄,然後退出。然後,稍後,第二個腳本將根據第一個伺服器獲取的更新程式碼在所有伺服器上執行並執行工作。

最好的方法是什麼?我可以可靠地讓第一個腳本在一個伺服器上執行並創建一個文件或充當某種“信號量”或某種“鎖”的東西,從而使其他伺服器遠離嗎?

使這更複雜的是,我正在考慮讓腳本從每台伺服器上的相同 cron 文件執行——這意味著所有腳本都可以嘗試同時執行它,假設它們的所有時鐘設置相同。

我希望這些將從 bash 腳本執行。作為一種方法,這有意義嗎?

編輯:根據問題更新:

我們不希望每台伺服器都嘗試簽出這些文件的自己的副本——它們位於多 GB 的原始碼儲存庫中,對於我們的原始碼控制伺服器來說,同時簽出 50 多個該程式碼將是困難的(並且不可擴展到 100 多台伺服器)。

向 50 多台伺服器添加一個 cronjob 並不是什麼大問題,但是添加另一個具有自己配置的定制伺服器就更難了。我們已經複製了 50 台伺服器——維護一個單獨的伺服器只是為了檢查 50 多台伺服器的最新原始碼以供訪問,這似乎很浪費,而且會增加更多的成本,而不僅僅是向我們目前的伺服器添加腳本。

三種解決方案。

  1. 手動執行“結帳”步驟,或僅在其中一台伺服器上的單獨腳本中執行。這似乎是最好的方法——否則你可能會遇到競爭狀況。
  2. 如果您願意接受遇到競爭條件的機會,您當然可以嘗試在第一個腳本執行時創建一個特定的帶日期戳的文件。或者,如果日期足夠可靠,您可以嘗試檢查簽出文件的最後修改日期。
  3. 如果自定義確實是禁止的,那麼讓每個 VM 製作自己的文件副本以進行處理,而不是嘗試使用共享卷。

這些中的每一個都有權衡,但您並沒有真正明確為什麼要以這種方式設計解決方案。

引用自:https://serverfault.com/questions/505411