1. 程式人生 > >Gerrit安裝與做冷備份實戰

Gerrit安裝與做冷備份實戰

所有權 bcp install strong archive 最新 download ext director

一、描述

1、關於gerrit

Gerrit,是利用網頁瀏覽器,同一個團隊的軟件程序員,可以相互審閱彼此修改後的程序代碼,決定是否能夠提交,退回或者繼續修改。Gerrit實際上底層是一個Git服務器,它為在其服務器上托管的Git倉庫提供一系列權限控制,以及一個用來做Code Review是Web前臺頁面。當然,其主要功能就是用來做Code Review。架構如圖(圖來自網絡):
技術分享圖片
另外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.10 X64
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 = [email protected]
        smtpServerPort = 25
        smtpPass = PASSWORD, 
        sslVerify = false
        from=CodeReview<[email protected]>
[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
如圖:
技術分享圖片

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/logs/* ./logs
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登錄看看,最終冷備數據同步完,登錄如圖:

技術分享圖片

手工同步只是做測試,為自動同步做準備,手動同步效率太低,太煩瑣,因此接下來才是做冷備的正解。自動同步基於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/*
.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    = "[email protected]:/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

以上主要是日常工作中的備忘,歡迎各位留言指正與交流,如果對你有用,記得點個贊~

Gerrit安裝與做冷備份實戰