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.confglobal {usage-count no; #是否参加DRBD使用者统计,默认是参加udev-always-use-vnr;
}common {protocol C; #指定复制协议,复制协议共有三种,为协议A,B,C,默认协议为协议Chandlers { #该配置段用来定义一系列处理器,用来回应特定事件。}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.resresource 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.1smtp_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---备份节点需修改为BACKUPstate MASTER# 工作接口,通告选举使用哪个接口进行interface eth0# 虚拟路由ID,如果是一组虚拟路由就定义一个ID,如果是多组就要定义多个,而且这个虚拟# ID还是虚拟MAC最后一段地址的信息,取值范围0-255virtual_router_id 51# 如果你上面定义了MASTER,这里的优先级就需要定义的比其他的高---备份节点需修改为90priority 100# 通告频率,单位为秒advert_int 1# 通信认证机制,这里是明文认证还有一种是加密认证authentication {auth_type PASSauth_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 ];thenexit 0
elseexit 1
fi
keepalived状态切换时执行的脚本
cat /etc/keepalived/change_drbd.sh#!/bin/bash
status=$1
if [ "$status" = "master" ];thencurrent_status=$(/usr/sbin/drbdadm role gitlab)[[ "$current_status" = "Primary" ]] && exit 0 while [ "$current_status" = "Secondary" ];do/usr/sbin/drbdadm primary gitlabcurrent_status=$(/usr/sbin/drbdadm role gitlab)sleep 1donemount /dev/drbd0 /data/usr/bin/gitlab-ctl start
fiif [ "$status" = "backup" ];thencurrent_status=$(/usr/sbin/drbdadm role gitlab)[[ "$current_status" = "Secondary" ]] && exit 0/usr/bin/gitlab-ctl stopumount /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
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
