文章目录
gitlab+DRBD实现高可用
需求说明
虽然gitlab有每小时备份,还原依然需要消耗一小时左右的时间,因此需要搭建一个高可用环境。现采用Gitlab+DRBD实现高可用
原理解析
在两台gitlab服务器上(也可以是docker节点),通过DRBD来实现数据一致。更改gitlab的仓库和pg数据库的目录位置在DRBD盘上(DRBD服务创建的盘),手动切换DRBD主备。
图片来源微信公众号 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:一致的最新的数据状态,这个状态为正常状态