文章目录

  • gitlab+DRBD实现高可用
  • 需求说明
  • 原理解析
  • 环境
  • 磁盘准备
  • 安装drbd
  • 配置drbd
  • 配置drbd.conf
  • 配置global_common.conf
  • 配置gitlab.res
  • 启动drbd服务
  • 创建gitlab资源
  • 设置主备
  • 安装gitlab
  • 配置gitlab
  • 设置gitlab高可用环境
  • 验证drbd主备可用性
  • drbd常见命令
  • 参考文档


gitlab+DRBD实现高可用

需求说明

虽然gitlab有每小时备份,还原依然需要消耗一小时左右的时间,因此需要搭建一个高可用环境。现采用Gitlab+DRBD实现高可用

原理解析

在两台gitlab服务器上(也可以是docker节点),通过DRBD来实现数据一致。更改gitlab的仓库和pg数据库的目录位置在DRBD盘上(DRBD服务创建的盘),手动切换DRBD主备。

gitlab集成sonarlint gitlab集成gitpod_高可用


图片来源微信公众号 DevOps持续集成

环境

PVE上的两台centos7虚拟机

192.168.41.253 gitlab-service-01 primary

192.168.41.252 gitlab-service-02 secondary

两台上都需要准备新的一块硬盘或分区,本次采用的是两台虚拟机各加一块1G硬盘

修改主机名

#hostnamectl set-hostname gitlab-service-01  
#hostnamectl set-hostname gitlab-service-02

磁盘准备

drbd需要一块磁盘或分区。这里各增1G磁盘

# fdisk /dev/sdb
命令(输入 m 获取帮助):n
输入n进行新建
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
选择p主分区
之后默认即可,最后设置好后wq退出

查看分区
#partprobe /dev/sdb
#lsblk 
[root@gitlab-service-02 ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   20G  0 disk 
├─sda1            8:1    0    1G  0 part /boot
└─sda2            8:2    0   19G  0 part 
  ├─centos-root 253:0    0   17G  0 lvm  /
  └─centos-swap 253:1    0    2G  0 lvm  [SWAP]
sdb               8:16   0    1G  0 disk 
└─sdb1            8:17   0 1023M  0 part 
sr0              11:0    1  4.2G  0 rom

安装drbd

yum安装

#rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
#yum -y install drbd84
#yum -y install kmod-drbd84
#setenforce 0    最好是永久关闭selinux
#modprobe drbd   这步如果发现异常出错,请更新核心
#yum -y install kernel-devel kernel kernel-headers   更新核心

配置drbd

主从相同

配置drbd.conf

#vim /etc/drbd.conf
#drbd.conf
include "drbd.d/global_common.conf";
include "drbd.d/*.res";

配置global_common.conf

# vim /etc/drbd.d/global_common.conf
#global_common.conf
global {
    usage-count no;
}
common {
    protocol C;
    startup {
        wfc-timeout 15;
        degr-wfc-timeout 15;
        outdated-wfc-timeout 15;
    }
    disk {
        on-io-error detach;
        fencing resource-only;
    }
    net {
        cram-hmac-alg sha1;
        shared-secret "123456";
    }
    syncer {
        rate 100M;
    }
}

配置gitlab.res

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

启动drbd服务

#systemctl start drbd
#systemctl enable drbd
#cat /proc/drbd   查看drbd状态
1: cs:Connected ro:Secondary/Secondary ds:Diskless/UpToDate C r-----
ns:2071 nr:3216 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
在起初没手动设置主备两节点都只会是Secondary 备份。
创建gitlab资源

# drbdadm create-md gitlab

如果中途出现[need to type ‘yes’ to confirm] 一律yes

成功提示

Writing meta data...
New drbd meta data block successfully created.
Success
设置主备
[root@gitlab-service-01 data]# drbdadm  primary gitlab
[root@gitlab-service-02 data]# drbdadm  secondary gitlab
[root@gitlab-service-01 data]# cat /proc/drbd  查看
version: 8.4.11-1 (api:1/proto:86-101)
GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, 2020-04-05 02:58:18

 1: cs:Connected ro:Primary/Secondary ds:Diskless/UpToDate C r-----
    ns:192 nr:6998 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

安装gitlab

依赖安装
#yum -y install policycoreutils openssh-server openssh-clients postfix
下载
#wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-8.0.0-ce.0.el7.x86_64.rpm  #(根据需求自己选择版本)
#rpm -ivh gitlab-ce-8.0.0-ce.0.el7.x86_64.rpm  如果提示缺少依赖请yum安装补上 应该是少了一个什么python相关依赖
设置postfix启动与开机自启动
#systemctl enable postfix && systemctl start postfix
如果你发现你的gitlab经常502 试试看把内存给多点一般内存4g就不会了

配置gitlab

#gitlab-ctl stop  先暂停服务防止数据写入,需要修改存储位置为drbd设备挂载的/data目录
[root@gitlab-service-01 data]#vim  /etc/gitlab/gitlab.rb 
external_url 'http://192.168.41.253'
unicorn['port'] = 8011
git_data_dirs({
   "default" => {
     "path" => "/data/git-data"
    }
})
postgresql['data_dir'] = "/data/postgresql/data"
postgresql['dir'] = "/data/postgresql"
postgresql['home'] = "/data/postgresql"

设置gitlab高可用环境

务必先暂停gitlab服务
#mkdir /data 新建/data gitlab的仓库和pgsql存放目录
在这个时候我们已经开启了drbd服务,且设置好主备。在主节点上格式化新盘,且将盘挂在/data (存放gitlab仓库和pgsql的目录)
[root@gitlab-service-01 ~]#mkfs.ext4 /dev/drbd1   只有主节点才可以对drbd1
格式化、挂载
[root@gitlab-service-01 ~]#mount /dev/drbd1 /data 临时挂载
[root@gitlab-service-01 ~]#gitlab-ctl reconfigure  加载配置
[root@gitlab-service-01 ~]#gitlab-ctl start    启动

验证drbd主备可用性

在主节点上进入/data 目录新建一个目录和一个文件用于测试同步性
新建测试命令略
在主节点上卸载 #umount /dev/drbd1 
设置主节点为备份 #drbdadm secondary gitlab
备份节点上设置为主#drbdadm primary gitlab 并且挂载/data #mount /dev/drbd1 /data
进入目录查看文件是否和之前一致即可。

drbd常见命令

#drbdam create-md 【资源名】创建资源
#drbdadm secondary(primary) 【资源名】  设置xx资源主或备节点
#cat /proc/drbd    查看主备状态
#drbdadm cstate  【资源名】 查看资源连接状态
#drbdadm  role 【资源名】 查看资源角色
#drbdsetup /dev/drbd1 primary --force 强制设置硬盘主备
#drbdadm dstate 【资源名】查看硬盘状态 
UpToDate/UpToDate

本地和对等节点的硬盘有可能为下列状态之一:

Diskless 无盘:本地没有块设备分配给DRBD使用,这表示没有可用的设备,或者使用drbdadm命令手工分离或是底层的I/O错误导致自动分离

Attaching:读取无数据时候的瞬间状态

Failed 失败:本地块设备报告I/O错误的下一个状态,其下一个状态为Diskless无盘

Negotiating:在已经连接的DRBD设置进行Attach读取无数据前的瞬间状态

Inconsistent:数据是不一致的,在两个节点上(初始的完全同步前)这种状态出现后立即创建一个新的资源。此外,在同步期间(同步目标)在一个节点上出现这种状态

Outdated:数据资源是一致的,但是已经过时

DUnknown:当对等节点网络连接不可用时出现这种状态

Consistent:一个没有连接的节点数据一致,当建立连接时,它决定数据是UpToDate或是Outdated

UpToDate:一致的最新的数据状态,这个状态为正常状态