lunix gitlab+postgresql搭建gitlab私服实现高可用
任务目标:搭建内网高可用gitlab私服。
实现方法:两台服务器上部署完全一样的gitlab,其中gitlab有关文件采用 inotify + rsync 进行同步,数据库采用psql主从,且实现开机自启与数据自动备份。
准备两台服务器,环境如下:
操作系统版本: Centos7.9
postgresql数据库版本: 9.6.11
主库: 172.20.26.204
从库: 172.20.26.207
安装有gcc: yum install gcc -y(安装命令)
安装前查了下内存情况,确保内存充足
172.20.26.204
172.20.26.207
一、安装postgresql
1. 安装postgresql
以下操作步骤主从两个节点都执行:
# 下载源码包
[root@node01 ~]# cd /data/software/
wget --no-check-certificate https://ftp.postgresql.org/pub/source/v9.6.11/postgresql-9.6.11.tar.gz
# 安装psql
yum install readline* zlib –y
yum install gcc -y
adduser postgres
mkdir -p /data/postgresql/data
chown postgres /data/postgresql/data
tar -zxf postgresql-9.6.11.tar.gz
cd postgresql-9.6.11
./configure --prefix=/data/postgresql/ --without-zlib
make
make install
2. 主库初始化
以下操作步骤只在主库执行:
# 只在主库初始化
su - postgres
/data/postgresql/bin/initdb -D /data/postgresql/data
#初始化完毕之后启动数据库
/data/postgresql/bin/pg_ctl -D /data/postgresql/data -l logfile start
# 修改监听配置
vim /data/postgresql/data/postgresql.conf
# 修改内容
listen_addresses = '*'
# 添加允许访问数据库的网段
vim /data/postgresql/data/pg_hba.conf
# 添加内容
host all all 0.0.0.0/0 trust
3. 主库配置
# 以下为主数据库配置
# 创建复制用户,专门进行主从同步使用
su - postgres #切换到postgres用户下,若已在此用户下则不需要执行该命令
/data/postgresql/bin/psql #进入数据库
create user rpl superuser password '123456'; #创建复制用户rpl,设置密码为123456
# 主库上配置从库允许的网段
vim /data/postgresql/data/pg_hba.conf
# 添加内容
host replication rpl 172.20.26.0/0 md5
# 修改主库参数文件
vim /data/postgresql/data/postgresql.conf
# 添加内容
wal_level = hot_standby #启用流复制
max_wal_senders=2 #流复制允许连接进程
wal_keep_segments =64 #xlog目录中最多容纳多少个wal日志文件,超过了则删掉最初的几个。
max_connections = 1000 #主库最大连接数
# 重启主库服务
/data/postgresql/bin/pg_ctl -D /data/postgresql/data -l logfile restart
4. 从库配置
以下操作步骤只在从库执行:
# 基础备份
#在从库无需拷贝主库的数据文件到本地,使用pg_basebackup可将主库的数据文件通过网络复制到本地、包括目录结构
#备注:如果主库存在自定义表空间,此操作会失败
/data/postgresql/bin/pg_basebackup -h 172.20.26.204 -p 5432 -U rpl -F p -x -P -R -D /data/postgresql/data/
# 从库配置文件配置
vim /data/postgresql/data/postgresql.conf
# 添加内容
hot_standby = on #从库上执行只读操作
max_standby_streaming_delay = 30s #从库接收主库日志最大超时时间
wal_receiver_status_interval = 10s #从库向主库报告的最大时间间隔
hot_standby_feedback = off #从库与主库发生冲突的反馈信息
max_connections = 1500 #数据库最大连接数
# 创建恢复文件recovery.conf
# recovery.conf 用于主库,从库切换时的参数配置。如果从库没有recovery.conf文件可拷贝模板
vim /data/postgresql/data/recovery.conf
# 添加内容
recovery_target_timeline = 'latest'
standby_mode = 'on'
primary_conninfo = 'host=172.20.26.204 port=5432 user=rpl password=123456'
# 启动从库服务
chmod -R 0700 /data/postgresql/data/
su - postgres
/data/postgresql/bin/pg_ctl -D /data/postgresql/data -l logfile start
# 重启(此操作是为了看下是否正常启动)
/data/postgresql/bin/pg_ctl -D /data/postgresql/data -l logfile restart
重启如果报如下错误,请赋予权限
[postgres@node02 ~]$ exit
登出
您在 /var/spool/mail/root 中有邮件
[root@node02 postgresql-9.6.11]#
回到root用户下执行chown -R postgres:root /data/postgresql/data
通过Win SCP可以看到权限已改
su - postgres #切换到postgres用户下,接着再重启,重启成功显示如下
/data/postgresql/bin/pg_ctl -D /data/postgresql/data -l logfile restart
备注:也有可能是因为配置没配对导致的无法启动,要仔细检查下,postmaster.pid是启动后自动生成的文件
5. 主从状态检查(均在postgres用于下执行)
# 查看主库sender进程信息
ps -ef|grep "wal sender process"
# 查看从库receiver进程信息
ps -ef|grep "wal receiver"
# psql查询主从同步状态
/data/postgresql/bin/psql #进入数据库
select usename,application_name,client_addr,state,sync_state from pg_stat_replication;
主库:
从库:
\q #退出数据库
# 主从集群状态
/data/postgresql/bin/pg_controldata /data/postgresql/data/ |grep "Database cluster state"
主库:
从库:
# 主从数据同步验证,主库建库、从库进行查询测试
/data/postgresql/bin/psql #进入数据库
create database test owner postgres; #创建test数据库
主库:
从库:
/data/postgresql/bin/psql #进入数据库
\l #查询
主从同步正常,需要注意的是从库只有只读功能,无法做写入操作
6. 创建gitlab所需用户与数据库
在主库上创建
/data/postgresql/bin/psql
#创建用户
create role gitlab login encrypted password 'lqc20230928gitlab';
#创建数据库
create database gitlab owner=gitlab ENCODING = 'UTF8';
7. postgresql扩展pg_trgm
以下操作步骤主从两个节点都执行:
切换到root用户下
[root@node01 ~]# cd /data/software/postgresql-9.6.11/contrib/btree_gin
make && make install
[root@node02 ~]# cd /data/software/postgresql-9.6.11/contrib/btree_gin
make && make install
[root@node01 btree_gin]# cd /data/software/postgresql-9.6.11/contrib/pg_trgm
make && make install
[root@node02 btree_gin]# cd /data/software/postgresql-9.6.11/contrib/pg_trgm
make && make install
#重启postregsql
主库:
[root@node01 pg_trgm]# su - postgres
Last login: Thu Sep 28 09:04:55 CST 2023 on pts/0
[postgres@node01 ~]$ /data/postgresql/bin/pg_ctl -D /data/postgresql/data -l logfile restart
waiting for server to shut down.... done
server stopped
server starting
[postgres@node01 ~]$
从库:
[root@node02 pg_trgm]# su - postgres
上一次登录:四 9月 28 10:05:38 CST 2023pts/0 上
[postgres@node02 ~]$ /data/postgresql/bin/pg_ctl -D /data/postgresql/data -l logfile restart
waiting for server to shut down.... done
server stopped
server starting
[postgres@node02 ~]$
创建扩展(这个只需要在主库执行)
# 创建扩展(这个只需要在主库执行)
/data/postgresql/bin/psql gitlab
create extension pg_trgm;
create extension btree_gin;
# 查看是否创建成功
select * from pg_extension;
退出数据库
二、安装gitlab
1. 安装gitlab
以下操作步骤主从两个节点都执行:(切换到root用户下)
# 安装依赖
yum -y install curl policycoreutils policycoreutils-python openssh-server openssh-server openssh-clients postfix
# 下载软件包
[root@node01 pg_trgm]# cd /data/software/ #切换到/data/software/,将软件保存到这里
wget --no-check-certificate https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-11.9.8-ce.0.el7.x86_64.rpm
# 挂载
mkdir /data/gitlab
chmod 755 /data/gitlab
# 安装gitlab-ce
rpm -ivh gitlab-ce-11.9.8-ce.0.el7.x86_64.rpm
2. 修改gitlab配置文件
以下操作步骤主从两个节点都执行:
mkdir -p /data/gitlab/backups
mkdir -p /data/gitlab/git-data
vim /etc/gitlab/gitlab.rb
external_url 'http://gittest.addnewer.com' #在windows客户端绑定对应的host信息
gitlab_rails['backup_path'] = "/data/gitlab/backups"
git_data_dirs({
"default" => {
"path" => "/data/gitlab/git-data"
}
})
postgresql['enable'] = false
gitlab_rails['db_adapter'] = "postgresql"
gitlab_rails['db_encoding'] = "utf8"
gitlab_rails['db_database'] = "gitlab"
gitlab_rails['db_pool'] = 30
gitlab_rails['db_username'] = "gitlab"
gitlab_rails['db_password'] = "lqc20230928gitlab"
gitlab_rails['db_host'] = "172.20.26.204" #注意:主从库同ip,都为主库的ip
gitlab_rails['db_port'] = "5432"
#这条配置很重要,要不然两个gitlab只能启动一个
unicorn['socket'] = '/var/opt/gitlab/sockets/gitlab.socket'
mkdir -p /var/opt/gitlab/sockets
cd /var/opt/gitlab
将主节点的/etc/gitlab/gitlab.rb文件拷贝到从节点对应的路径下
[root@node01 gitlab]# scp /etc/gitlab/gitlab.rb [email protected]:/etc/gitlab/
#ssh目录
mkdir /data/gitlab/.ssh
ln -s /data/gitlab/.ssh .ssh
#用户头像
mkdir /data/gitlab/gitlab-rails
ln -s /data/gitlab/gitlab-rails/ gitlab-rails
3. 启动gitlab
以下操作步骤主从两个节点都执行:
gitlab-ctl reconfigure
gitlab-ctl restart
打开浏览器访问gitlab,端口默认80,访问地址如下:
http://172.20.26.204/ (主)
http://172.20.26.207/ (备)
首次登录,设置root密码,1qaz2wsx
用root密码,1qaz2wsx也可以登录http://172.20.26.207/
备注:刚访问的时候主库报502,等一两分钟刷新就好了(至于为啥要等的问题提还待优化)
如果报错500,可查看日志找出报错原因。
# 使用下面命令动态打印日志
gitlab-ctl tail
或者是访问/var/log/gitlab/gitlab-rails/production_json.log日志文件
4. 测试数据
停掉主库gitlab服务,访问备库,反之
gitlab-ctl stop
开启主库,停掉备库,在主库创建项目,然后开启备库查看数据是否同步,反之
此时只是项目列表同步,在主库创建的test项目如下
但打开备库的test项目会发现提示 No repository
此时还需要进行文件同步
三、gitlab文件同步(inotify + rsync)
1. 环境准备
以下操作步骤主从两个节点都执行:
# 关闭防火墙
[root@node01 gitlab]# systemctl stop firewalld #关闭防火墙
[root@node01 gitlab]# systemctl disable firewalld #设置开机不启动防火墙
# 关闭selinux,重启生效
vim /etc/selinux/config #修改 /etc/selinux/config 文件
将SELINUX=enforcing改为SELINUX=disabled
# 关闭selinux,临时生效
setenforce 0
# 安装rsync xinetd 软件
yum -y install rsync xinetd
2. 主库服务器配置(172.20.26.204)
# 配置xinetd配置文件
vim /etc/xinetd.d/rsync
# 添加内容
# default: off
# description: The rsync server is a good addition to an ftp server, as it \
# allows crc checksumming etc.
service rsync
{
disable = no
flags = IPv6
socket_type = stream
wait = no
user = root
server = /usr/bin/rsync
server_args = --daemon
log_on_failure += USERID
}
# 编辑rsync配置文件
vim /etc/rsyncd.conf
# 添加内容
uid = root
gid = root
[gitlab]
path = /data/gitlab/
auth users = gitlab_user
secrets file = /etc/rsyncd.secrets
read only = false
# 编辑账号认证文件
vim /etc/rsyncd.secrets
# 添加内容
gitlab_user:GitlabFtpUser@gitlab
# 赋予权限
chmod 600 /etc/rsyncd.secrets
# 启动xinetd服务
[root@node01 xinetd.d]# systemctl start xinetd #(重启则为 systemctl restart xinetd)
在从库172.20.26.207上进行测试
# 查看共享出来的标签
rsync -a 172.20.26.204::
3. 从库服务器配置(172.20.26.207)
# 配置xinetd配置文件
vim /etc/xinetd.d/rsync
# 添加内容
# default: off
# description: The rsync server is a good addition to an ftp server, as it \
# allows crc checksumming etc.
service rsync
{
disable = no
flags = IPv6
socket_type = stream
wait = no
user = root
server = /usr/bin/rsync
server_args = --daemon
log_on_failure += USERID
}
# 编辑rsync配置文件
vim /etc/rsyncd.conf
# 添加内容
uid = root
gid = root
[gitlab]
path = /data/gitlab/
auth users = gitlab_user
secrets file = /etc/rsyncd.secrets
read only = false
# 编辑账号认证文件
vim /etc/rsyncd.secrets
# 添加内容
gitlab_user:GitlabFtpUser@gitlab
# 赋予权限
chmod 600 /etc/rsyncd.secrets
# 启动xinetd服务
[root@node02 gitlab]# systemctl start xinetd #(重启则为 systemctl restart xinetd)
在主库进行测试
# 查看共享出来的标签
rsync -a 172.20.26.207::
4. 整体测试
在主库上将 /data/gitlab 目录下的文件同步到从库的 /data/gitlab 目录
rsync -avt /data/gitlab/ [email protected]::gitlab
输入密码GitlabFtpUser@gitlab
在从库上将 /data/gitlab 目录下的文件同步到主库的 /data/gitlab 目录
rsync -avt /data/gitlab/ [email protected]::gitlab
输入密码GitlabFtpUser@gitlab
上面测试成功后,接着配置 inotify 实时同步
5. 实时同步
安装inotify-tools,主从库都需要安装
[root@node01 gitlab-rails]# cd /data/software/ #切换到/data/software/目录下
wget -c https://github.com/inotify-tools/inotify-tools/archive/refs/tags/3.21.9.6.tar.gz
[root@node01 software]# tar -zxf 3.21.9.6.tar.gz
[root@node01 software]# cd inotify-tools-3.21.9.6/
./autogen.sh && \
./configure --prefix=/usr/local/inotify-tools && \
make && \
make install
执行上面命令时报错
解决:
yum install autoconf automake libtool
安装完成后再执行
[root@node01 inotify-tools-3.21.9.6]#./autogen.sh && ./configure --prefix=/usr/local/inotify-tools && make && make install
cp /usr/local/inotify-tools/bin/inotifywa* /usr/sbin/
ls /usr/local/inotify-tools/bin/inotifywait inotifywatch
ls /usr/local/inotify-tools/bin/inotifywait inotifywatch
在从库172.20.26.207上创建密码文件,用于保存主库的密码(此处是需要同步从库的文件到主库的/data/gitlab目录,所以对应是主库gitlab_user 用户的密码)
mkdir -p /home/work/ftppass
# 编辑内容
vim /home/work/ftppass/passwd
# 添加内容(密码)
GitlabFtpUser@gitlab
# 赋予权限
chmod 600 /home/work/ftppass/passwd
# 测试(数据同步)
rsync -avt --password-file=/home/work/ftppass/passwd /data/gitlab/ [email protected]::gitlab
在主库创建密码文件,用于保存从库的密码(此处是需要同步主库的文件到从库的/data/gitlab目录,所以对应是从库gitlab_user 用户的密码)
mkdir -p /home/work/ftppass
# 编辑内容
vim /home/work/ftppass/passwd
# 添加内容(密码)
GitlabFtpUser@gitlab
# 赋予权限
chmod 600 /home/work/ftppass/passwd
# 测试(数据同步)
rsync -avt --password-file=/home/work/ftppass/passwd /data/gitlab/ [email protected]::gitlab
6. 编辑同步脚本并放置后台运行
编辑主库的同步脚本,并放置后台运行
# 创建文件夹
mkdir -p /root/gitlab_sync_sh
# 编辑内容
vim /root/gitlab_sync_sh/gitlab_sync.sh
# 添加内容
#!/bin/sh
#Desc: 用于从主库/data/gitlab目录中的文件同步到从库的/data/gitlab目录
#Date: 2023-10-08
#By: lqc
inotifywait -mrq -e modify,create,move,delete,attrib /data/gitlab |while read events
do
rsync -aruv --delete --password-file=/home/work/ftppass/passwd /data/gitlab/ [email protected]::gitlab
echo "[`date "+%Y-%m-%d %H:%M:%S"`] 出现事件 $events" >> /var/log/sync.log
done
# 执行
cd /root/gitlab_sync_sh #切换到脚本目录,将nohup.out的日志存放在这里
nohup bash /root/gitlab_sync_sh/gitlab_sync.sh & #后台运行脚本
编辑从库的同步脚本,并放置后台运行
# 创建文件夹
mkdir -p /root/gitlab_sync_sh
# 编辑内容
vim /root/gitlab_sync_sh/gitlab_sync.sh
# 添加内容
#!/bin/sh
#Desc: 用于从从库/data/gitlab目录中的文件同步到主库的/data/gitlab目录
#Date: 2023-10-08
#By: lqc
inotifywait -mrq -e modify,create,move,delete,attrib /data/gitlab |while read events
do
rsync -aruv --delete --password-file=/home/work/ftppass/passwd /data/gitlab/ [email protected]::gitlab
echo "[`date "+%Y-%m-%d %H:%M:%S"`] 出现事件 $events" >> /var/log/sync.log
done
# 执行
cd /root/gitlab_sync_sh #切换到脚本目录,将nohup.out的日志存放在这里
nohup bash /root/gitlab_sync_sh/gitlab_sync.sh & #后台运行脚本
7. 测试同步
打开gitlab网页,在主库创建项目,查看从库内容是否同步,反之。
登录从库查看,刚才在主库创建的test_nginx 项目,已同步到了从库上。
我们在从库上创建test_tomcat 项目。
登录主库查看,刚才在从库创建的test_tomcat 项目,已同步到了主库上。
四、设置开机自启
以下操作步骤主从两个节点都执行(在root用户下):
1. postgresql开机自启
将启动命令加入到初始化脚本 /etc/rc.d/rc.local 中
在rc.local脚本中执行程序时是没有环境变量的,如果您执行的程序需要环境变量,可以在脚本中设置环境变量,也可以用su切换用户来执行
# 编辑
vim /etc/rc.d/rc.local
# 添加内容
su - postgres -c '/data/postgresql/bin/pg_ctl -D /data/postgresql/data -l logfile start'
以上命令的含义就是以postgres用户登录再执行psql启动命令。
2. gitlab开机自启
sudo systemctl enable gitlab-runsvdir.service
以上操作后重启服务器可验证是否设置成功
# 查看psql运行状态
su - postgres
/data/postgresql/bin/pg_ctl -D /data/postgresql/data -l logfile status
# 查看gitlab运行状态
gitlab-ctl status
3. gitlab文件同步开机自启
重启的时候报了个错
sent 207 bytes received 128 bytes 44.67 bytes/sec
total size is 194 speedup is 0.58
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1179) [sender=3.1.2]
原因:selinux没有关闭,也就是永久关闭的设置没起效
Rsync常见的报错可参考https://zhuanlan.zhihu.com/p/429068946
不设置开机自启的话,每次开机得执行命令
# 启动xinetd服务
systemctl start xinetd
# 执行
nohup bash /root/gitlab_sync_sh/gitlab_sync.sh &
开机自启设置如下
# 编辑
vim /etc/rc.d/rc.local
# 添加内容
systemctl start xinetd
source /root/gitlab_sync_sh/gitlab_sync.sh &
# 赋予权限
chmod +x /root/gitlab_sync_sh/gitlab_sync.sh
chmod 777 /etc/rc.d/rc.local
# 重启验证
五、数据手动备份与迁移
生成数据备份与导入(root用户下)
# 创建备份(/data/gitlab/backups/目录下会生成个***_gitlab_backup.jar文件)
gitlab-rake gitlab:backup:create
使用(恢复)备份文件
# 以下为使用备份文件的操作,中途需要输入几个“yes”
# 停止相关数据连接
gitlab-ctl stop unicorn
gitlab-ctl stop sidekiq
# 进入目录
cd /data/gitlab/backups/
# 赋予权限
chmod 777 1696816642_2023_10_09_11.9.8_gitlab_backup.tar
# 还原
gitlab-rake gitlab:backup:restore BACKUP=1696816642_2023_10_09_11.9.8
# 重启
gitlab-ctl restart
将备份应用到其他服务器,可以将***_gitlab_backup.tar 复制到新服务器的backups目录下,然后执行使用备份文件的操作即可
六、数据自动备份
1. 自动备份
我们在/data/gitlab/backups目录下创建auto_backup.sh文件,同时赋予执行权限,操作如下
# 进入文件目录
cd /data/gitlab/backups
# 编辑
sudo vim auto_backup.sh
# 添加内容
gitlab-rake gitlab:backup:create
# 赋予权限
sudo chmod +x auto_backup.sh
# 编辑crontab
crontab -e
# 添加内容(每天23点备份gitlab数据)
0 23 * * * root /data/gitlab/backups/auto_backup.sh -D 1
以上操作就是让crontab每天的23:00自动执行auto_backup.sh脚本完成自动备份的功能
注明:
输入 crontab -e 或 crontab -l,提示 no crontab for root
需要在 root 用户下输入 crontab -e,按 Esc 按 :wq 回车
再输入 crontab -l 就没有问题了
主要原因是由于这个liunx服务器 第一次使用crontab,还没有生成对应的文件导致的,执行了 编辑(crontab -e)后就生成了这个文件
2. 删除过期的备份文件
每天备份一次,文件堆积,将来不久我们的硬盘就没有剩余空间了,我们还需要添加删除过期文件的功能,修改auto_backup.sh脚本,内容如下
#!/bin/bash
gitlab-rake gitlab:backup:create;
find /data/gitlab/backups/ -name "*.tar" -ctime +2 -type f -exec rm -rf {} \;
其中
find /data/gitlab/backups/ -name "*.tar" -ctime +2 -type f -exec rm -rf {} \;
为删除命令/ 指令介绍 /,含义为查找备份目录下面后缀名是tar的所有普通文件,判断他们的创建时间,如果是2天前创建的,那么就删除
想要更保险的可以采取双备份,再备份到U盘或者挂载盘,防止服务器或硬盘彻底坏了的情况。