天天看點

Gerrit-Replication工作原理

簡介

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
           

繼續閱讀