一、描述

1、关于gerrit

Gerrit,是利用网页浏览器,同一个团队的软件程序员,可以相互审阅彼此修改后的程序代码,决定是否能够提交,退回或者继续修改。Gerrit实际上底层是一个Git服务器,它为在其服务器上托管的Git仓库提供一系列权限控制,以及一个用来做Code Review是Web前台页面。当然,其主要功能就是用来做Code Review。架构如图(图来自网络):
Gerrit安装与做冷备份实战
另外gerrit是java开发,因此部署时需要有jdk环境。

2、本次实战

本次实战的背景,主要是因为公司日常通过gerrit进行代码管理与审计;由于业务逻辑多,代码库也比较多,依赖gerrit系统,gerrit基于公司域环境(lday)统一认证用户权限;目前只有一套在使用,考虑到如果这台gerrit代码管理系统岩机不可用时,就无法对代码进行有效管理,影响业务的开发与上线进度,因此需要提高gerrit可用性,又由于gerrit使用频繁,团队都在使用,不能中断,因此做主从,改动较大,最终决定做一个冷备,方案如下:
gerrit的配置(除gerrit本身安装后生成的文件,及etc外)通过lsyncd(rsync)实时增量同步到做冷备的新部署的gerrit上,
当现有的gerrit不可用时,启用冷备gerrit.因此我们需要先部署一套新的gerrit ,线上gerrit使用2.13.1,因此冷备份的gerrit 版本用2.13.11 保障大版本一致即可。

3、实战环境

CentOS6.x X64 / CentOS7.x
jdk version "1.8.0_171"
gerrit 2.13.11
ip 172.16.0.185

二、gerrit安装部署

1、下载安装

官方下载

2、安装jdk

由于gerrit是基于java开发的,因此我们需要安装java这里安装版本如下:
[git@gerrit_backup_185 gerrit_site]$ java -version
java version "1.8.0_171"
请到官方下载jdk这里使用jdk-8u171-linux-x64.rpm;据说openjdk也可以,我没有试!

3、添加git系统账号

# useradd git
# yum install epel-release -y
# yum install ca-certificates -y 
# rpm -ivh https://dl.iuscommunity.org/pub/ius/stable/CentOS/6/x86_64/ius-release-1.0-15.ius.centos6.noarch.rpm
#yum install git2u -y  #安装最新的git

4、本地host配置

# /etc/hosts配置
172.16.0186 git1.pkey.cn gerrit.pkey.cn      #主gerrit上保持一致
172.16.0.185 git2.pkey.cn gerrit2.pkey.cn     #新部署冷备的gerrit
172.16.0.26 pkey.local      # ldap主机
127.0.0.1 gerrit_backup_185   # 冷备的本地解析

5、安装gerrit

将下载好的gerrit.2.13.11.war 重命名为gerrit.war
安装过程如下:

# cp gerrrit.2.13.11.war gerrit.war
# su git
[git@gerrit-slave ~]$ mkdir gerrit_site
[git@gerrit-slave ~]$ cp gerrit.2.13.11.war /home/git
[git@gerrit-slave ~]$ java -jar gerrit.war init -d gerrit_site
Using secure store: com.google.gerrit.server.securestore.DefaultSecureStore
[2018-11-21 20:04:21,211] [main] INFO  com.google.gerrit.server.config.GerritServerConfigProvider : No /home/git/gerrit_site/etc/gerrit.config; assuming defaults
*** Gerrit Code Review 2.13.11
*** 
*** Git Repositories
*** 
Location of Git repositories   [git]: 
*** SQL Database
*** 
Database server type           [h2]: 
*** User Authentication
*** 
Authentication method          [OPENID/?]: **?**
       Supported options are:
         openid
         openid_sso
         http
         http_ldap
         client_ssl_cert_ldap
         ldap
         ldap_bind
         custom_extension
         development_become_any_account
         oauth
Authentication method          [OPENID/?]: **ldap**
LDAP server                    [ldap://localhost]: **ldap://pkey.local**
LDAP username                  : **postmaster** 
Change postmaster's password   [y/N]?** y**
postmaster's password          : 
              confirm password : 
Account BaseDN                 [DC=local]: **dc=pkey,dc=local**
Group BaseDN                   [dc=pkey,dc=local]: 
Enable signed push support     [y/N]? **y**

Gerrit Code Review is not shipped with Bouncy Castle Crypto Provider v152
**  This library is required for your configuration. **
Download and install it now [Y/n]? **y**
Downloading https://repo1.maven.org/maven2/org/bouncycastle/bcprov-jdk15on/1.52/bcprov-jdk15on-1.52.jar ... OK
Checksum bcprov-jdk15on-1.52.jar OK

Gerrit Code Review is not shipped with Bouncy Castle Crypto OpenPGP v152
**  This library is required for your configuration. **
Download and install it now [Y/n]? 
...... 以下省略 ... 
省略部分可以y也N, 因为最终所有的重要配置信息会在安装的目录配置文件中如:
/home/git/gerrit_site/etc/gerrit.config

至此gerrit基于ldap认证,自带H2数据库就安装好啦,so easy? 关键是要配置才能用不是?

6、gerrit配置

[git@gerrit_backup_185 gerrit_site]$ cat etc/gerrit.config 
[gerrit]
    basePath = git
    serverId = ad163546-8d99-4006-931b-39835fba6b40
    canonicalWebUrl = http://gerrit2.pkey.cn:8080/   ########这里是访问这台gerrit的域名做冷备请和主gerrit区分
[database]
    type = h2
    database = /home/git/gerrit_site/db/ReviewDB   # 默认自带的H2数据(我们用ldap认证后存入H2)
[auth]
    type = LDAP
[ldap]
    server = ldap://pkey.local
    username = gerritmaster
    accountBase = dc=pkey,dc=local
    groupBase = dc=pkey,dc=local
[receive]
    enableSignedPush = false
[sendemail]
    smtpServer = smtp.pkey.cn
    smtpUser = gerritmaster@pkey.cn
        smtpServerPort = 25
        smtpPass = PASSWORD, 
        sslVerify = false
        from=CodeReview<gerritmaster@pkey.cn>
[container]
    user = git
    javaHome = /usr/java/jdk1.8.0_171-amd64/jre
[sshd]
    listenAddress = 172.16.0.185:29418
[httpd]
    listenUrl = http://*:8080/
[cache]
    directory = cache
[plugins]
    allowRemoteAdmin = true

7、启动gerrit服务

[root@gerrit_backup_185 bin]# ./gerrit.sh start
Starting Gerrit Code Review: OK

[root@gerrit_backup_185 bin]# netstat -tnpl     
tcp        0      0 ::ffff:172.16.0.185:29418    :::*                        LISTEN      17632/GerritCodeRev       
tcp        0      0 :::8080                     :::*                        LISTEN      17632/GerritCodeRev
默认gerrit web 开放在8080端口;git 代码提交管理侦听在29418上;

部署gerrit不是本文章的目的,现在已经把gerrit部署安装好和现有gerrit都是采用ldap + H2数据认证,现在就可以把gerrit上的数据同步到这台冷备上启动,完成gerrit灾备;

二、同步gerrit数据做冷备

1、gerrit访问

本地访问时加入hosts解析
172.16.0.185 gerrit2.pkey.cn
如图:
Gerrit安装与做冷备份实战

2、手工同步数据到冷备gerrit

我们前文已经说过,需要把现有的gerrit上的数据同步到新部署的gerrit做冷备,有两种方式,手工同步,和rsync实时同步(增量方式 ):
先看下手工同步需要同步那些:

新gerrit服务需要先停
#cd /home/git/gerrit_site/bin 
# ./gerrit.sh stop
由于主gerrit上的文件备份在NFS上,因此我们冷备gerrit上也挂载NFS到/home/git_bak;
以下复制基于此
其中 :etc  bin  lib plugins目录不用, tmp(临时,不需要) static data两目录为空也不需要
cd /home/git/gerrit_site
cp -rf /home/git_bak/gerrit_site/git/bbs ./git/
cp -rf /home/git_bak/gerrit_site/git/pkey.com ./git/
cp -rf /home/git_bak/gerrit_site/tech-tools ./git/
cp -rf /home/git_bak/gerrit_site/git/tech-tools ./git/
cp -rf /home/git_bak/gerrit_site/git/www ./git/

cp -rf /home/git_bak/gerrit_site/index/* ./index/
cp -rf /home/git_bak/gerrit_site/cache/* ./cache/
cp -rf /home/git_bak/gerrit_site/db/* ./db/
chown git.git  ./*   -R
复制完启动gerrit 再次访问如图:
所有权限已经有了,因此直接用原有的gerritmaster登录看看,最终冷备数据同步完,登录如图:

Gerrit安装与做冷备份实战

手工同步只是做测试,为自动同步做准备,手动同步效率太低,太烦琐,因此接下来才是做冷备的正解。自动同步基于lsyncd服务,即rsync.

3、自动同步gerrit数据

1)、主gerrit安装lsyncd
# yum install epel-release -y
# yum install lsyncd -y
2)、配置lsyncd之添加不同步的排除文件
同上面手动同步时排除的文件一致
# touch /etc/rsyncd.d/rsync_exclude.lst 
# cat /etc/rsyncd.d/rsync_exclude.lst 
etc/*
lib/*
bin/*
plugins/*
tmp/*
logs/*
.tmp
3)、lsyncd主配置
# cat /etc/lsyncd.conf 
    settings {
        logfile      ="/var/log/lsyncd/lsyncd.log",
        statusFile   ="/var/log/lsyncd/lsyncd.status",
        inotifyMode  = "CloseWrite",
        maxProcesses = 4,
        -- nodaemon =true,
        }

    sync {
        default.rsync,
        source    = "/home/git/gerrit_site/",
        target    = "root@172.16.0.185:/home/git/gerrit_site",
        excludeFrom = "/etc/rsyncd.d/rsync_exclude.lst",
        maxDelays = 10,
        delay     = 35,
        rsync     = {
            binary    = "/usr/bin/rsync",
            archive   = true,
            compress  = true,
        -- bwlimit   = 800,
            rsh = "/usr/bin/ssh -p 60022 -o StrictHostKeyChecking=no",
            verbose   = true,
            -- _extra = {"--bwlimit=2000"},
            }
 }

4)、添加开机自启lsyncd
# chkconfig lsyncd on  #设置 开机启动

5)、配置root无密码私钥登录备份gerrit
这一步不详述,可自行看之前的文档;
大致步骤是生成私钥,把对应的公钥放到冷备的/root/.ssh/authorized_keys中 即可

6)、启动lsyncd服务启动数据同步
# service lsyncd start
如果启动失败记得查看日志,根据日志排错~
**如下表明同步正常,同步开启时,需要先关闭冷备gerrit服务** 
查看传输日志:
#tail -f /var/log/lsyncd/lsyncd.log
/index/changes_0032/open/_3620_2.liv
/index/changes_0032/open/
/index/changes_0032/
/index/
/
/index/changes_0032/open/pending_segments_nvm
sent 1413 bytes  received 34 bytes  964.67 bytes/sec
total size is 342138  speedup is 236.45
Fri Nov 23 11:10:56 2018 Normal: Finished a list after exitcode: 0
注意第一次是全同步的!需要一点时间,慢慢等,如果手功同步过,则比较快~

三、冷备gerrit切换步骤

当主gerrit服务不可用,网络可用,请先关闭lsyncd服务,防止错误的数据同步过来
如果网络直接不可用时,直接到冷备的gerrit上启动服务;并修改如下访问域名为gerrit.ickey.cn(hosts也要修改)
[gerrit]
basePath = git
serverId = ad163546-8d99-4006-931b-39835fba6b40
canonicalWebUrl = http://gerrit.pkey.cn:8080/

DNS解析 gerrit.pkey.cn 指向 172.16.0.185
/home/git/gerrit_site/etc/gerrit.config中修改成 gerrit.pkey.cn(这是主gerrit对外访问域名)
此时就可以启动冷备gerrit服务啦~

补充:
查看gerrit数据库:
停止gerrit 数据库管理
./bin/gerrit.sh stop
java -jar bin/gerrit.war gsql

以上主要是日常工作中的备忘,欢迎各位留言指正与交流,如果对你有用,记得点个赞~