gitlab搭建之互备模式

 

gitlab搭建之互备模式

前言:gitlab目前默认的部署方式是本地单机部署,为了提高gitlab环境的可靠性和稳定性,必须构建一套互备搭建方案:借助gitolilte的mirror功能可以实现此功能;

搭建环境:

2台服务器 -- RedHat 5.4

内核版本 -- linux 2.6.18 x86_64

概要:

1. 搭建两套gitlab标准环境

2. 构建互备模式

1. 搭建两套gitlab标准环境

  参考之前博文:http://www.cnblogs.com/lenolix/archive/2013/02/06/2906466.html

这里假设两台gitlab环境分别是A和B,在下文中,$A:代表在A机中操作,$B:代表在B机中操作

2. 配置A、B环境的互访权限

关于gitolite的mirror功能请参考官方文档:http://gitolite.com/gitolite/mirroring.html

1. 克隆本地的gitolite-admin.git

$A: sudo -u gitlab -H git clone git@localhost:gitolite-admin.git  /home/gitlab/gitolite-admin
$B: sudo -u gitlab -H git clone git@localhost:gitolite-admin.git /home/gitlab/gitolite-admin

  2. 修改.gitolilte.rc 设置hostname

$A: sudo -u git -H vi /home/git/.gitolite.rc
修改 HOSTNAME => 'hostA', $B: sudo -u git -H vi /home/git/.gitolite.rc
修改 HOSTNAME => 'hostB',

  3. 更新gitolite的配置,添加A、B主机的互访权限

#更新A、B主机上gitlab账户的配置,这一步很重要,因为A、B的gitolite账户体系中都有gitlab账户,但是其ssh-key是不一样的,如果同步成相同的值,会影响其中一套gitlab环
#境的运行,解决方案是给gitlab账户更换用户名,并且在A、B上都添加gitlab账户,避免同步覆盖
$A: sudo -u git mv /home/git/.gitolite/keydir/gitlab.pub /home/git/.gitolite/keydir/gitlab-hostA.pub
$A: sudo -u git scp /home/git/.gitolite/keydir/gitlab-hostA.pub git@hostB:/home/git/.gitolite/keydir/
$A: sudo -u git vi /home/git/.gitolite/conf/gitolite.conf
添加:
      repo gitolite-admin
           RW+ = gitlab-hostA
           RW+ = gitlab-hostB
$B: sudo -u git mv /home/git/.gitolite/keydir/gitlab.pub /home/git/.gitolite/keydir/gitlab-hostB.pub
$B: sudo -u git scp /home/git/.gitolite/keydir/gitlab-hostB.pub git@hostA:/home/git/.gitolite/keydir
$B: sudo -u git vi /home/git/.gitolite/conf/gitolite.conf
添加:
      repo gitolite-admin
           RW+ = gitlab-hostA
           RW+ = gitlab-hostB
 
#添加A、B主机上git账户的互访权限
$A: sudo -u git -H ssh-keygen
$A: sudo cp /home/git/.ssh/id_rsa.pub /tmp/server-hostA.pub
$A: sudo -u git -H cp /tmp/server-hostA.pub /home/git/.gitolite/keydir/
$A: sudo scp /tmp/server-hostA.pub git@B:home/git/.gitolite/keydir/
$A: sudo -u git -H vi /home/git/.gitolite/conf/gitolite.conf
添加:
repo @all
RW+ = gitlab-host47
RW+ = gitlab-host48
RW+ = server-host47
RW+ = server-host48
$B: sudo -u git -H ssh-keygen
$B: sudo cp /home/git/.ssh/id_rsa.pub /tmp/server-hostB.pub
$B: sudo -u git-H cp /tmp/server-hostB.pub /home/git/.gitolite/keydir
$B: sudo scp /tmp/server-hostB.pub git@A:home/gitlab/.gitolite/keydir/
$B: sudo -u git -H vi /home/git/.gitolite/conf/gitolite.conf
添加:
repo @all
RW+ = gitlab-host47
RW+ = gitlab-host48
RW+ = server-host47
RW+ = server-host48
#重新安装gitolite,更新conf
$A: sudo -u git /home/git/bin/gitolite setup
$B: sudo -u git /home/git/bin/gitolite setup #安装ssh key,很奇怪,用setup只能更新授权配置,却不能更新keydir中的key,没办法,这里只能再搞一次
$A: sudo cd /home/gitlab/gitolite-admin
$A: sudo -u gitlab -H git pull (这里你会发现更新之后,conf/gitolite.conf已经更新了,但是keydir/里面却没有新添的文件)
$A: sudo cp /home/git/.gitolite/keydir/* keydir/
$A: sudo chown -R gitlab:git keydir/
$A: sudo -u gitlab git add keydir/*
$A: sudo -u gitlab git commit -m "update"
$A: sudo -u gitlab git push
$B: sudo cd /home/gitlab/gitolite-admin
$B: sudo -u gitlab -H git pull
$B: sudo cp /home/git/.gitolite/keydir/* keydir/
$B: sudo chown -R gitlab:git keydir/
$B: sudo -u gitlab git add keydir/*
$B: sudo -u gitlab git commit -m "update"
$B: sudo -u gitlab git push

4. 配置ssh的config文件

$A: sudo -u git -H vi /home/git/.ssh/config
host hostB
user git
hostname hostB's ip/hostname
port 22
identityfile ~/.ssh/id_rsa
$A: sudo -u git -H chmod 644 /home/git/.ssh/config $B: sudo -u git -H vi /home/git/.ssh/config
host hostA
user git
hostname hostA's ip/hostname
port 22
identityfile ~/.ssh/id_rsa
$B: sudo -u git -H chmod 644 /home/git/.ssh/config

  测试连通性

$A: sudo -u git ssh hostB
$B: sudo -u git ssh hostA

  如果出现 " hello server-hostA/B, this is ..." 就表示A、B的连通性没有问题

测试gitlab账户的配置

$A :sudo -u gitlab -H git clone git@localhost:gitolite-admin.git /tmp/gitolite-admin
$A: rm -rf /tmp/gitolite-admin $B :sudo -u gitlab -H git clone git@localhost:gitolite-admin.git /tmp/gitolite-admin
$B: rm -rf /tmp/gitolite-admin

  如果能正常clone,说明配置正确

3. 借助post-receive hooks,实现实时同步

$A: sudo -u git -H vi home/git/.gitolite/hooks/common/post-receive
添加:
repo_name=`pwd`
repo_name=${repo_name#*/home/git/repositories/}
repo_name=${repo_name%.git*}
/home/git/bin/gitolite mirror push hostB $repo_name > /dev/null 2>&1 $B: sudo -u git -H vi home/git/.gitolite/hooks/common/post-receive
添加:
repo_name=`pwd`
repo_name=${repo_name#*/home/git/repositories/}
repo_name=${repo_name%.git*}
/home/git/bin/gitolite mirror push hostA $repo_name > /dev/null 2>&1

  修改下gitolite的代码,去除一个权限限制:

$A: sudo -u git /home/git/gitolite/src/commands/mirror
修改:
sub valid_slave {
my ( $host, $repo ) = @_;
_die "invalid repo '$repo'" unless $repo =~ $REPONAME_PATT;
#注释掉下面几行
#my $ref = git_config( $repo, "^gitolite-options\\.mirror\\.slaves.*" );
#my %list = map { $_ => 1 } map { split } values %$ref; #_die "'$host' not a valid slave for '$repo'" unless $list{$host};
}

4. 测试

  在A的环境上创建一个仓库 root/p1, 然后提交代码,你会发现B上面也创建了/root/p1仓库,然后通过B修改仓库代码,可以发现A上面的代码也修改了.

如果这个测试可以通过,那么恭喜你,gitlab的互备模式已经构建成功了!

5. 后续

待解决问题:

  1. 虽然仓库可以同步,但是satellites不能同步,这样的话在线提交的功能就不能用。

暂时解决方案:在主备切换的时候,需要手动执行下 rake gitlab:enable_automerge RAILS_ENV=production, 重新生成satellites

2. 主备模式的缺点是资源利用率低,总是有一台服务器处于空闲状态

优化方案:在互备模式的基础上实现分布式部署,在通过VIP做LoadBlance,提供机器利用率和系统性能 。(进行中...)

3. 数据库目前是主备模式(master-master),但是没有实现主备的自动切换,需要手动支持。

6. 补充问题

1. 在使用Http协议提交代码的时候,发现很奇怪的问题,我将错误输出重定向到/tmp/mirror.log

vi /home/git/.gitolite/hooks/common/post-receive

/home/git/bin/gitolite mirror push hostA $repo_name >/tmp/mirror.log 2>&1

发现错误信息:

FATAL: errors found before logfile could be created

FATAL:unknown host hostA

。。。

通过跟踪gitolite的mirror命令执行过程,发现问题所在:

http协议提交代码的功能是gilab的web服务器支持的,而gitlab的WEB服务是以gitlab的用户身份运行的,导致post-receive这个钩子脚本也是以gitlab的用户身份调用的,这样就会以gitlab用户的上下文环境来执行脚本,所以会触发很过奇怪的问题

解决方案:

vi /home/git/.gitolite/hooks/common/post-receive

更改:

#强制指定HOME变量
export HOME=/home/git
repo_name=`pwd`
repo_name=${repo_name#*/home/git/repositories/}
repo_name=${repo_name%.git*}
#这里也明确指定ssh的host地址,不能使用git账户的ssh/config配置
/home/git/bin/gitolite mirror push git@hostA's ip $repo_name > /dev/null 2>&1

vi /home/git/gitolite/src/lib/Gitolite/Common.pm

更改gitolite源码,修改日志文件的访问权限,允许git组账户可写

sub gl_log {
# the log filename and the timestamp come from the environment. If we get
# called even before they are set, we have no choice but to dump to STDERR
# (and probably call "logger"). # tab sep if there's more than one field
my $msg = join( "\t", @_ );
$msg =~ s/[\n\r]+/<<newline>>/g; my $ts = gen_ts();
my $tid = $ENV{GL_TID} ||= $$; my $fh;
logger_plus_stderr( "errors found before logging could be setup", "$msg" ) if not $ENV{GL_LOGFILE};
chmod 0664,$ENV{GL_LOGFILE}; #更改日志访问属性
open my $lfh, ">>", $ENV{GL_LOGFILE}
or logger_plus_stderr( "errors found before logfile could be created", "$msg" );
print $lfh "$ts\t$tid\t$msg\n";
close $lfh;
}

gitlab搭建之互备模式的更多相关文章

  1. (转)MySQL主主互备结合keepalived实现高可用

    MySQL主主互备结合keepalived实现高可用 原文:http://7424593.blog.51cto.com/7414593/1741717 试验环境: master:192.168.1.2 ...

  2. centos7 搭建双网卡bond1(主备模式)实例

    前景须知: 在redhat6 中网卡叫bond,在redhat7及centos7中改名team,此处只记录centos7中双网卡主备搭建过程. 应用情景:实现网络的高可用,防止一条网线或交换机故障影响 ...

  3. Mysql双主互备+keeplived高可用架构介绍

    一.Mysql双主互备+keeplived高可用架构介绍 Mysql主从复制架构可以在很大程度保证Mysql的高可用,在一主多从的架构中还可以利用读写分离将读操作分配到从库中,减轻主库压力.但是在这种 ...

  4. [Mysql高可用]——双主互备+keepalived

    实验架构图    实验环境 主机名 操作系统 Mysql版本 keepalived版本 主机IP VIP lyj1(Master/Slave) Red Hat release 6.5 Mysql5.6 ...

  5. Centos7.6部署k8s v1.16.4高可用集群(主备模式)

    一.部署环境 主机列表: 主机名 Centos版本 ip docker version flannel version Keepalived version 主机配置 备注 master01 7.6. ...

  6. MySQL主主互备不同步的解决方法

    MySQL主主互备不同步 首先在服务器上执行show slave satus;可以看到很多同步的参数: Master_Log_File: SLAVE中的I/O线程当前正在读取的主服务器二进制日志文件的 ...

  7. linux系统——Redis集群搭建(主从+哨兵模式)

    趁着这几天刚好有点空,就来写一下redis的集群搭建,我跟大家先说明,本文的redis集群因为linux服务器只是阿里云一台服务器,所以集群是redis启动不同端口,但是也能达到集群的要求.其实不同服 ...

  8. MySQL集群搭建(2)-主主从模式

    1 环境准备 上次我们搭建了主备架构,如下所示 这次我们的搭建目标是 具体配置信息 IP 系统 端口 MySQL版本 节点 读写 说明 192.168.41.83 Centos6.8 3306 5.7 ...

  9. MySQL集群搭建(1)-主备搭建

    数据库在任何业务中都是最重要的环节之一,这就对数据库架构提出的较高的要求.单点数据库永远不应该出现在生产环境,我们已经目睹过太多由于单点.备份缺失造成的损失,所以,搭建高可用 MySQL 集群是非常有 ...

随机推荐

  1. 阶段3 2.Spring_06.Spring的新注解_2 spring的新注解-Bean

    下面要解决第二部分的配置问题 这两行一出场,就表示可以通过调用构造函数实例化.因为这都是newInstance 上面的需要加上参数,下面的没有任何参数 下面这俩实现的效果不一样. 下面这个除了会创建对 ...

  2. Java Map集合 遍历 五种方式(包含 Lambda 表达式遍历)

    示例代码如下: package com.miracle.luna.lambda; import java.util.HashMap; import java.util.Iterator; import ...

  3. Python中常见的异常总结

    Python中常见的异常总结 当Python检测到一个错误时,解释器就会指出当前流已经无法继续执行下去,这时候就出现了异常. 一.异常错误    a.语法错误     错误一:     if     ...

  4. MariaDB 连接查询,视图,事物,索引,外键

    1.连接查询 --创建学生表 create table students ( id int unsigned not null auto_increment primary key, name var ...

  5. 【java基础之异常】死了都要try

    目录 1.异常 1.1 异常概念 1.2 异常体系 1.3 异常分类 1.4 异常的产生过程解析 2. 异常的处理 2.1 抛出异常throw 2.2 Objects非空判断 2.3 声明异常thro ...

  6. CSS3 —— 文本 背景 列表 渐变

    <span>标签 作用 ——  能让某几个文字或者某个词语凸显出来 候选字体 p {font-family: Times, TimesNR, 'New Century Schoolbook ...

  7. Java重写祖先类方法equals示例

    Java中很重要的一个知识点就是所有类都默认继承Object类,所以创建的每一个类都继承了Object的方法,所有类都可以向上转型为Object类对象,当然可以重写Object里面的常用方法,有时候重 ...

  8. python的并发GIL 了解

    gil  又称 global interpreter lock (全局解释器锁) #python 中一个线程对应于c语言中的一个线程 #gil使得同一个时刻只有一个线程在一个cpu上执行字节码,无法将 ...

  9. 简单而粗暴的方法画任意阶数Bezier曲线

    简单而粗暴的方法画任意阶数Bezier曲线 虽然说是任意阶数,但是嘞,算法原理是可以到任意阶数,计算机大概到100多阶就会溢出了 Bezier曲线介绍] [本文代码] 背景 在windows的Open ...

  10. 如何用item pipeline(管道)清洗数据

    版权声明:本文为博主原创文章,转载请注明出处:如果博客中有错误之处抑或有可以改进的地方,欢迎在评论区留言. https://blog.csdn.net/f156207495/article/detai ...