简介
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,方法:
ssh-keygen -m PEM -t rsa -C "your_email@example.com"
replication 配置格式
[remote "host-one"]
url = gerrit2@host-one.example.com:/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 gerrit@localhost gerrit plugin reload replication
replication 手动触发方式
ssh -p @SSH_PORT@ @SSH_HOST@ @PLUGIN@ 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 @SSH_PORT@ @SSH_HOST@ @PLUGIN@ start --all # 只同步到 srv02 $ ssh -p @SSH_PORT@ @SSH_HOST@ @PLUGIN@ start --url srv2 --all # 同步到 slave1 上名称包含 vendor 的文件夹 $ ssh -p @SSH_PORT@ @SSH_HOST@ @PLUGIN@ start --url slave1 ^(|.*/)vendor(|/.*) # 同步到一个指定的目标 URL $ ssh -p @SSH_PORT@ @SSH_HOST@ @PLUGIN@ start --url https://example.com/tools/gerrit.git
-
线上实际操作举例
$ ssh -p 29418 gerrit@localhost 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