gitlab主从搭建
环境
名称 | 规格 | 系统盘 | 数据盘 | 系统 | ip | 服务 | vip |
---|---|---|---|---|---|---|---|
gitlab1 | 8c16G | 100G | 50G | centos7.8 | 192.168.150.69 | drbd90, gitlab-13 | 192.168.150.70 |
gitlab2 | 8c16G | 100G | 50G | centos7.8 | 192.168.150.42 | drbd90, gitlab-13 | 192.168.150.70 |
准备工作(所有节点)
# 修改主机名
192.168.150.69 gitlab1
192.168.150.42 gitlab2
# 关闭防火墙和SELINUX
systemctl stop firewalld.service #关闭防火墙
systemctl disable firewalld.service #禁止开机启动
vi /etc/selinux/config
SELINUX=disabled
# 重启节点
reboot
安装drbd(所有节点)
# 安装elrepo源
rpm -Uvh http://elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm
# 安装drbd
yum -y install drbd90-utils kmod-drbd90
# 加载模块到内核
modprobe drbd
lsmod |grep drbd
# 设置开机启动
systemctl enable drbd
echo "modprobe drbd" >> /etc/rc.local
tail -1 /etc/rc.local
chmod +x /etc/rc.local
# 创建分区,不需要挂载
fdisk /dev/vdb
lsblk
vdb 253:16 0 50G 0 disk
└─vdb1 253:17 0 50G 0 part
# 主配置文件
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 gitlab1 { # 注意:drbd配置文件里。机器名大写和小写敏感。
address 192.168.150.69:7779;
disk /dev/vdb1; # 新建的分区磁盘
}
on gitlab2 {
address 192.168.150.42:7779;
disk /dev/vdb1;
}
}
# 初始化DRBD元数据
drbdadm create-md gitlab
# 启动drbd服务
systemctl status drbd && systemctl status drbd
# 查看资源组状态
drbdadm status gitlab
drbdadm role gitlab
# 注意: 两个节点状态都变成UpToDate才算正常
# 其他命令
drbdadm create-md/wipe-md gitlab # 创建/删除元数据
drbdadm verify gitlab # 基于块文件校验和检测一致性
cat /proc/drbd # 查看过程
drbdadm primary gitlab --force # 强制切换为主
drbd验证
# gitlab1 创建测试
[root@gitlab1 ~]# drbdadm primary gitlab
[root@gitlab1 ~]# drbdadm status
gitlab role:Primary
disk:UpToDate
gitlab2 role:Secondary
peer-disk:UpToDate
[root@gitlab1 ~]# mkfs.xfs /dev/drbd0 -f
[root@gitlab1 ~]# mkdir /data
[root@gitlab1 ~]# mount /dev/drbd0 /data
[root@gitlab1 ~]# echo "test" > /data/test.txt # 添加数据
# 主节点切换,先将01设置为备节点,再将02设置为主节点
[root@gitlab1 ~]# umount /data
[root@gitlab1 ~]# drbdadm secondary gitlab
# gitlab2 创建测试
[root@gitlab2 ~]# drbdadm primary gitlab
[root@gitlab2 ~]# mkdir /data
[root@gitlab2 ~]# mount /dev/drbd0 /data
[root@gitlab2 ~]# cat /data/test.txt # 查看数据成功显示
test
[root@gitlab2 ~]# echo "test2" >> /data/test.txt # 添加新数据
# 再次切换到gitlab1为主节点,gitlab2为备节点
[root@gitlab2 ~]# umount /data
[root@gitlab2 ~]# drbdadm secondary gitlab
[root@gitlab1 ~]# drbdadm status
gitlab role:Primary
disk:UpToDate
gitlab2 role:Secondary
peer-disk:UpToDate
[root@gitlab1 ~]# drbdadm primary gitlab
[root@gitlab1 ~]# mount /dev/drbd0 /data
[root@gitlab1 ~]# cat /data/test.txt
test
test2
gitlab安装
1、gitlab1节点
# 软件包地址: 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://192.168.150.70' # vip地址
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-ctl stop
gitlab-ctl reconfigure # 刷新配置
gitlab-ctl stop
# 卸载drbd盘,切换为secondary状态
umount /data
drbdadm secondary gitlab
2、gitlab2节点
# 软件包地址: https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/
# drbd设置为primary状态
drbdadm primary gitlab
mount /dev/drbd0 /data
# 安装依赖
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://192.168.150.70' # vip地址
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-ctl stop
gitlab-ctl reconfigure # 刷新配置
# 使用主机ip地址登录,修改管理账户root密码
http://192.168.150.42
# 关闭gitlab服务
gitlab-ctl stop
# 卸载drbd盘,切换为secondary状态
umount /data
drbdadm secondary gitlab
gitlab2验证
# 验证gitlab2修改密码是否更改有效
drbdadm primary gitlab
mount /dev/drbd0 /data
# 使用gitlab1IP地址登录
http://192.168.150.69 # 使用更改的密码登录
keepalived安装
# yum安装,所有节点
yum install keepalived.x86_64 -y
# 开机启动,备节点上配置
systemctl start keepalived && systemctl enable keepalived
# 配置文件,所有节点
cat /etc/keepalived/keepalived.conf
# 主节点全局配置,备节点自行修改
global_defs {
# 邮件通知信息
notification_email {
# 定义收件人
[email protected]
}
# 定义发件人
notification_email_from [email protected]
# SMTP服务器地址
smtp_server 127.0.0.1
smtp_connect_timeout 30
# 路由器标识,一般不用改,也可以写成每个主机自己的主机名---备份节点需修改
router_id gitlab1
}
# 定义用于实例执行的脚本内容,比如可以在线降低优先级,用于强制切换,只在主节点配置
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 1111
}
# 设置虚拟VIP地址,一般就设置一个
virtual_ipaddress {
192.168.150.70/32
}
# 工作模式,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.150.69 #主节点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 # 备节点退出状态更换为1
else
exit 1 # 备节点退出状态更换为0
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
# 启动查看状态
systemctl start keepalived
systemctl status keepalived
# 查看日志
tailf /var/log/messages
# 查看IP地址是否生效
ip a
# 因为前面我们将gitlab1的gitlab服务和drbd启动好了,所以这时候gitlab1是主节点,vip也在此节点
测试
测试一:关闭主节点,看备用节点是否接管;启动主节点后会自动切换回主节点
# gitlab1上操作
gitlab-ctl stop
# gitlab2查看vip地址,访问测试
测试二:修改检查脚本,让检查失败,看备用节点是否接管。
测试二切回主节点的方法:
在gitlab1上先把检查脚本还原,再安装以下步骤操作:
drbdadm primary gitlab
mount /dev/drbd0 /data
gitlab-ctl start
测试三:
1、使用vip登录---------->创建项目
2、使用测试机clone项目,并添加文件push
3、关闭gitlab1节点git服务
4、检查gitlab2节点是否接管服务
5、登录网页查看数据是否存在。
升级
主节点升级,所有节点stop keepalived服务
13.9.4--->13.12.9--->14.0.9--->14.10.5--->15.0.0--->15.11.9---->16.0.0--->16.3.4--->16.7.5--->16.11.3
1、根据以上顺序进行升级,同时查看官方文档有无重大更改,
2、每次升级查看服务是否正常,访问502需要等1-5分钟
主节点升级完成后,卸载drbd,修改状态为secondary
从节点修改为premary,挂载drbd,直接yum安装主节点升级的最新版本。
备节点升级时遇到的问题:有历史数据残留
解决方案,先升级到主节点的次版本,再升级到与主节点一致的版本,更新配置
遇到的问题
问题一:
安装完drbd 状态不同步
解决方案: 强制将其中一个节点设置为主,等其他节点数据同步完成
问题二:
vip漂移成功后,ping不通
解决方案: 关掉vrrp_strict模式,/etc/keepalived/keepalived.conf
参考文档:
标签:drbdadm,drbd,gitlab,节点,gitlab1,gitlab13,data,主从 From: https://www.cnblogs.com/kkit/p/18322812