簡介
Gerrit 是一款code review 開源軟體,在叢集化的大趨勢下,master 與 slave 之間的同步工作,就是根據 Gerrit 的插件 replication.jar 完成的。
/gerrit-site/etc/replication.config 是一個 Git 風格的配置檔案,它控制着 replication 插件運作的方式。
檔案内容由一個或多個 remote 部分組成,每個remote 又包含一個或多個目标URL的正常配置。
在進行 replication 操作是,每個 remote 使用各自獨立的線程池,這樣設計的獲益良多,靈活度高。例如使用者可以根據不同的網絡連接配接類型,将URL集合歸類,LAN 和 Public Internet 可以分開放在不同的remote裡。
配置參數舉例
列舉幾個配置項
gerrit.sshCommandTimeout: 執行指令的逾時設定。預設值為0,沒有逾時限制。
gerrit.sshConnectionTimeout :ssh 連接配接的逾時時間,預設值為 2 分鐘。設定 0 則沒有逾時限制。
remote.NAME.receivepack : 預設值 ‘git-reveive-pack’
remote.NAME.uploadpack : 預設值 ‘git-upload-pack’
remote.NAME.push:表示要同步的,設定為 +refs/heads/:refs/heads/ * 将會同步active的分支代碼,而不是refs/changes/下的 change 或 refs/tags/下的 tag
remote.NAME.timeout:遠端無響應後最大等待時長;預設為0,無限期等待
remote.NAME.replicationDelay :gerrit 特有設定,等待多長時間後開始進行遠端push,0表示立即開始,預設是15秒
啟動前準備
開啟前確定~/.ssh/known_host中有remote機器的key,
如果僅運作一次replication,則最快捷的添加 host key的方法:
sudo su -c 'ssh mirror1.us.some.org echo' gerrit2
注意:本地的使用者 ssh key設定生成的格式是PEM,方法:
replication 配置格式
[remote "host-one"]
url = [email protected]:/some/path/${name}.git
[remote "pubmirror"]
url = mirror1.us.some.org:/pub/git/${name}.git
url = mirror2.us.some.org:/pub/git/${name}.git
url = mirror3.us.some.org:/pub/git/${name}.git
push = +refs/heads/*:refs/heads/*
push = +refs/tags/*:refs/tags/*
threads = 3
authGroup = Public Mirror Group
authGroup = Second Public Mirror Group
replication 配置熱加載
ssh -p 29418 [email protected] gerrit plugin reload replication
replication 手動觸發方式
ssh -p @[email protected] @[email protected] @[email protected] start
[--now]
[--wait]
{--url <PATTERN> | [--url <PATTERN>] --all | [--url <PATTERN>] <PROJECT PATTERN> ...}
–now : Start replicating right away without waiting the per remote replication delay.
–wait : Wait for replication to finish before exiting.
–all : Schedule replication for all projects.
–url : 包含 PATTEN 的 URL 節點. 适用于給某個特定的節點進行備份,例如新增的節點。
-
#同步所有 project $ ssh -p @[email protected] @[email protected] @[email protected] start --all # 隻同步到 srv02 $ ssh -p @[email protected] @[email protected] @[email protected] start --url srv2 --all # 同步到 slave1 上名稱包含 vendor 的檔案夾 $ ssh -p @[email protected] @[email protected] @[email protected] start --url slave1 ^(|.*/)vendor(|/.*) # 同步到一個指定的目标 URL $ ssh -p @[email protected] @[email protected] @[email protected] start --url https://example.com/tools/gerrit.git
- 線上實際操作舉例
$ ssh -p 29418 [email protected] replication start --url upgrade --all # 檢視備份log,确認 remote 為 upgrade 的 5 台機器是否開始全量同步
replication.config 示例
[remote "slave01"]
adminUrl = ssh://create-idc04/home/work/hdd1/git/code/miui/${name}.git
adminUrl = ssh://create-idc07/home/work/gerrit/repositories/miui/${name}.git
adminUrl = ssh://create-idc08/home/work/repositories/miui/${name}.git
url = git://10.172.xx.xx/miui/${name}.git
url = git://10.142.xx.xx/miui/${name}.git
url = git://10.142.xx.xx/miui/${name}.git
push = +refs/*:refs/*
threads = 12
mirror = true
timeout = 50
replicationDelay = 2
[remote "slave02"]
adminUrl = ssh://create-nanjing103/home/work/git/code/miui/${name}.git
adminUrl = ssh://create-nanjing113/home/work/git/code/miui/${name}.git
url = git://10.234.xx.xx/miui/${name}.git
url = git://10.234.xx.xx/miui/${name}.git
push = +refs/*:refs/*
timeout = 50
threads = 8
mirror = true
replicationDelay = 2