一、描述
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.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 = [email protected]
smtpServerPort = 25
smtpPass = PASSWORD,
sslVerify = false
from=CodeReview
[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/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/*
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 = "[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
以上主要是日常工作中的备忘,欢迎各位留言指正与交流,如果对你有用,记得点个赞~