gitlab主备部署方案

服务架构

通过域名访问代码仓库(域名格式建议:codeclub.tryrus.com),gitlab使用keepalived做高可用性,使用drbd 做数据同步。

设备规格

名称

规格

系统盘

数据盘

数量

IP

Dt-Gitlab

8C16G

60G

200G

2

3

部署步骤

前提条件,两个节点同时配置。

#关闭防火墙和SELINUX
systemctl stop firewalld.service #关闭防火墙
systemctl disable firewalld.service #禁止开机启动

vi /etc/selinux/config
SELINUX=disabled

#重启节点
reboot

安装brdb

两个节点都需要配置

安装elrepo源

rpm -Uvh http://elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm

或者先下载后再安装

wget http://elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm
rpm -ivh elrepo-release-7.0-4.el7.elrepo.noarch.rpm

安装drbd

yum -y install drbd90-utils kmod-drbd90

加载drbd模块到内核

modprobe drbd
lsmod |grep drbd

  

设置开机启动

systemctl enable drbd
echo "modprobe drbd" >> /etc/rc.local
tail -1 /etc/rc.local
 

分区,不需要挂载。

加载分区表

partprobe /dev/sdb
lsblk

配置文件

主配置文件 

cat /etc/drbd.conf

# You can find an example in  /usr/share/doc/drbd.../drbd.conf.example
include "drbd.d/global_common.conf";
include "drbd.d/*.res";

通用配置文件

cat /etc/drbd.d/global_common.conf

global {
  usage-count no;         #是否参加DRBD使用者统计,默认是参加
  udev-always-use-vnr;
}

common {
  protocol C;      #指定复制协议,复制协议共有三种,为协议A,B,C,默认协议为协议C
  handlers {       #该配置段用来定义一系列处理器,用来回应特定事件。
  }

  startup {    ##DRBD同步时使用的验证方式和密码。该配置段用来更加精细地调节DRBD属性,它作用于配置节点在启动或重启时。常用选项有:
    wfc-timeout 15;  #该选项设定一个时间值,单位是秒。在启用DRBD块时,初始化脚本DRBD会阻塞启动进程的运行,直到对等节点的出现。该选项就是用来限制这个等待时间的,默认为0,即不限制,永远等待。
    degr-wfc-timeout 15;  #该选项也设定一个时间值,单位为秒。也是用于限制等待时间,只是作用的情形不同:它作用于一个降级集群(即那些只剩下一个节点的集群)在重启时的等待时间。
    outdated-wfc-timeout 15;  #同上,也是用来设定等待时间,单位为秒。它用于设定等待过期节点的时间
  }

  options {
  }

  disk {
    on-io-error detach; #发生I/O错误的节点将放弃底层设备,以diskless mode继续工作。在diskless mode下,只要还有网络连接,DRBD将从secondary node读写数据,而不需要failover(故障转移)。该策略会导致一定的损失,但好处也很明显,DRBD服务不会中断。官方推荐和默认策略。
  }

  net {
  }
}

资源配置文件

cat /etc/drbd.d/gitlab.res

resource gitlab {
    meta-disk internal;
    device /dev/drbd0; #device指定的參数最后必须有一个数字,用于global的minor-count,否则会报错。device指定drbd应用层设备。
    on gitlab-service-01 {    #注意:drbd配置文件里。机器名大写和小写敏感。
        address 192.168.137.133:7779;
        disk /dev/sdb1;    #新建的分区磁盘
    }

    on gitlab-service-02 {
        address 192.168.137.135:7779;
        disk /dev/sdb1;
    }
}

在两个节点上初始化DRBD元数据

drbdadm create-md gitlab

启动drbd

 启动drbd服务 

systemctl start drbd

查看drbd状态

systemctl status drbd

查看资源组状态

drbdadm status gitlab
drbdadm role gitlab

两个节点状态都变成UpToDate才算正常

验证主备

gitlab-service-01 主节点创建测试数据

drbdadm  primary gitlab
mkfs.xfs /dev/drbd0 -f
mkdir /data
echo "test" > /data/test.txt

主节点切换:先将01设置为备节点,再将02设置为主节点。

gitlab-service-01节点

umount /data
drbdadm  secondary gitlab

gitlab-service-02节点

drbdadm  primary gitlab
mkdir /data
mount /dev/drbd0 /data
cat /data/test.txt
test
echo "test2" >> /data/test.txt

再切换gitlab-service-01为主节点,gitlab-service-02为备节点

gitlab-service-02节点

umount /data
drbdadm  secondary gitlab

gitlab-service-01节点

drbdadm  primary gitlab
mount /dev/drbd0 /data
cat /data/test.txt
test
test2

安装gitlab

从以下地址下载最新版本

https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/

安装依赖

yum -y install policycoreutils-python

安装gitlab

rpm -ivh gitlab-ce-13.9.4-ce.0.el7.x86_64.rpm

修改配置

vim /etc/gitlab/gitlab.rb 

external_url 'http://域名' 
gitlab_rails['gitlab_email_from'] = '发送邮件的邮箱地址'
git_data_dirs({
   "default" => {
   "path" => "/data/git-data"
   }
})
postgresql['data_dir'] = "/data/postgresql/data"
postgresql['dir'] = "/data/postgresql"
postgresql['home'] = "/data/postgresql"

刷新配置

gitlab-service-01节点

gitlab-ctl stop
gitlab-ctl reconfigure # 刷新配置
gitlab-ctl stop

# 之前测试drbd时已将gitlab-service-01节点设置为primary
umount /data
drbdadm  secondary gitlab
 

gitlab-service-02节点

drbdadm  primary gitlab
mount /dev/drbd0 /data
gitlab-ctl stop
gitlab-ctl reconfigure

# 使用域名登陆web界面修改root密码
gitlab-ctl stop
umount /data
drbdadm  secondary gitlab
 

安装keepalived

使用yum安装

yum install keepalived.x86_64 -y

加入开机启动,只需要在备节点上配置。

systemctl enable keepalived

配置文件

cat /etc/keepalived/keepalived.conf

# 全局配置
global_defs {
   # 邮件通知信息
   notification_email {
     # 定义收件人
     tryrus@tryrus.com
   }

   # 定义发件人
   notification_email_from tryrus@tryrus.com

   # SMTP服务器地址
   smtp_server 127.0.0.1
   smtp_connect_timeout 30

   # 路由器标识,一般不用改,也可以写成每个主机自己的主机名---备份节点需修改
   router_id gitlab-service-01
}

# 定义用于实例执行的脚本内容,比如可以在线降低优先级,用于强制切换,只在主节点配置
vrrp_script check_gitlab {
  
  # 脚本路径
  script "/etc/keepalived/check_gitlab.sh"

  # 执行时间间隔为每2秒执行一次
  interval 2

  # 超时时长为2秒
  timeout 2

  # 如果脚本执行失败(退出码非0)就把对应节点的优先级降低20,降低后的优先级要小于备份节点优先级
  weight -20

  # 脚本执行连续3次检测都为成功状态(脚本退出码都为0),则keepalived就标记该实例为OK状态,并会一直检测下去
  rise 3

  # 如果连续3次检查都为失败状态(退出码非0),则标记对应实例为KO状态;
  # 一旦标记对应实例为失败状态就会触发当前节点的优先级降低;
  # 从而在通告心跳时,会通告降低后的优先级,从而实现备份节点接管VIP来完成vip转移;
  fall 3
}



# 一个vrrp_instance就是定义一个虚拟路由器的,实例名称
vrrp_instance VI_1 {
    # 定义初始状态,可以是MASTER或者BACKUP---备份节点需修改为BACKUP
    state MASTER

    # 工作接口,通告选举使用哪个接口进行
    interface eth0

    # 虚拟路由ID,如果是一组虚拟路由就定义一个ID,如果是多组就要定义多个,而且这个虚拟
    # ID还是虚拟MAC最后一段地址的信息,取值范围0-255
    virtual_router_id 51

    # 如果你上面定义了MASTER,这里的优先级就需要定义的比其他的高---备份节点需修改为90
    priority 100

    # 通告频率,单位为秒
    advert_int 1

    # 通信认证机制,这里是明文认证还有一种是加密认证

    authentication {
      auth_type PASS
      auth_pass codeclub.dute
    }

    # 设置虚拟VIP地址,一般就设置一个

    virtual_ipaddress {
      192.168.137.254/24 brd 192.168.137.255 dev eth0 label eth0:1

    }

    # 工作模式,nopreempt表示工作在非抢占模式,默认是抢占模式 preempt
    # 如果是抢占默认则可以设置等多久再抢占,默认5分钟,设置1分钟
    preempt delay 300

    # 追踪脚本,通常用于去执行上面的vrrp_script定义的脚本内容,只在主节点配置
    track_script {
      check_gitlab
    }

    # 三个指令,如果主机状态变成Master|Backup|Fault之后会去执行的通知脚本,脚本要自己写
    notify_master "/etc/keepalived/change_drbd.sh master"
    notify_backup "/etc/keepalived/change_drbd.sh backup"
    notify_fault ""

}

检查gitlab状态的脚本

cat /etc/keepalived/check_gitlab.sh

#!/bin/bash
eth0_ip=192.168.137.133 #主节点IP
return_num=$(curl -I "http://$eth0_ip/users/sign_in" 2>&1 | grep  "200\ OK" |wc -l)
if [ $return_num -eq 1 ];then
  exit 0
else
  exit 1
fi

keepalived状态切换时执行的脚本

cat /etc/keepalived/change_drbd.sh

#!/bin/bash
status=$1
if [ "$status" = "master" ];then
  current_status=$(/usr/sbin/drbdadm role gitlab)
  [[ "$current_status" = "Primary" ]] && exit 0 

  while [ "$current_status" = "Secondary" ];do
    /usr/sbin/drbdadm  primary gitlab
    current_status=$(/usr/sbin/drbdadm role gitlab)
    sleep 1
  done

  mount /dev/drbd0 /data
  /usr/bin/gitlab-ctl start
fi

if [ "$status" = "backup" ];then
  current_status=$(/usr/sbin/drbdadm role gitlab)
  [[ "$current_status" = "Secondary" ]] && exit 0
  /usr/bin/gitlab-ctl stop
  umount /data
  /usr/sbin/drbdadm secondary gitlab
fi

给以上两个脚本加上执行权限

chmod +x /etc/keepalived/change_drbd.sh
chmod +x /etc/keepalived/check_gitlab.sh

启动keepalived

systemctl start keepalived

查看状态

systemctl status keepalived

查看日志

tailf /var/log/messages

启动keepalived后,浮动IP应该是在备节点上面,因为主节点没有启动gitlab服务,keepalived在检查服务状态是返回1,会将自身权重减20,这样备节点就会因为权重是90而成为新的master。

准备好keepalivd后先不要启动,使用以下命令停止keepalived

停止keepalived

systemctl stop keepalived

注意将gitlab-service-02节点的drbd状态改为secondary

gitlab-ctl stop
umount /data
drbdadm  secondary gitlab

配置/etc/hosts  支持postfix邮件发送

cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 ZHG-GITLAB-01  #主要就是在最后加大写的主机名称

vim /etc/postfix/main.cf
inet_interfaces = 192.168.137.251   #将localhost   改成VIP

# 怎么安装postfix,后面章节会有

 

启动gitlab+drbd+keepalived

gitlab-service-01节点

drbdadm  primary gitlab
mount /dev/drbd0 /data
gitlab-ctl start

gitctl启动完成,服务正常后再启动keepalived,因为keepalived做了服务检查,服务没有启动完全,检查失败的话,会自动切换主备节点。

systemctl start keepalived

浮动IP在主节点上表示keepalived启动成功

测试

测试整套系统工作是否正常。

测试一:关闭主节点,看备用节点是否接管;启动主节点后会自动切换回主节点

测试二:修改检查脚本,让检查失败,看备用节点是否接管。

测试二切回主节点的方法:

gitlab-service-02节点

gitlab-ctl stop
umount /data
drbdadm  secondary gitlab

gitlab-service-01节点

先把检查脚本还原

drbdadm  primary gitlab
mount /dev/drbd0 /data
gitlab-ctl start

测试内容

第一步,使用浮动IP登陆gitlab,创建群组1,项目1,用户1;

第二步,切换到备节点后,查看第一步创建的群组,项目,用户是否存在;

第三步,修改项目1中的代码,创建群组2,项目2,用户2

第四步,切换回主节点后,查看第三步的操作是否同步。

安装postfix发送邮件

#安装cyrus依赖,不然会报错:
Error in sasl_client_start (-4) SASL(-4): no mechanism available: No worthy mechs found

#使用如下命令安装
yum install cyrus-sasl-plain  cyrus-sasl-devel  cyrus-sasl-gssapi -y


#安装postfix
yum install postfix -y

修改/etc/postfix/master.cf

添加 smtps inet n - - - - smtpd

解除注释: -o smtpd_tls_wrappermode=yes

PS:注意格式

修改 /etc/services

添加 smtps    465/tcp    mail2

smtps    465/udp    mail2

创建相关授权文件及虚拟映射文件,以QQ邮件为例

vim  /etc/postfix/sasl_passwd

添加  
[smtp.exmail.qq.com]:587 发件人邮箱地址:授权码或密码

postmap /etc/postfix/sasl_passwd   # 生成sasl_passwd.db 文件


vim /etc/postfix/generic

添加   
root@邮箱后缀 发件人邮箱地址

postmap /etc/postfix/generic    生成generic.db 文件

编辑主配置文件

vim /etc/postfix/main.cf

修改:
inet_protocols = ipv4

新增:

# userconfig
relayhost = [smtp.exmail.qq.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_security_options=noanonymous
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_tls_security_level = encrypt
smtp_tls_wrappermode = yes
smtp_generic_maps = hash:/etc/postfix/generic

重启服务

systemctl restart postfix

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tryrus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值