服务架构
通过域名访问代码仓库(域名格式建议: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