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 root@172.20.26.207:/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/  gitlab_user@172.20.26.207::gitlab

输入密码GitlabFtpUser@gitlab

在从库上将 /data/gitlab 目录下的文件同步到主库的 /data/gitlab 目录

rsync -avt  /data/gitlab/  gitlab_user@172.20.26.204::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/ gitlab_user@172.20.26.204::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/ gitlab_user@172.20.26.207::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/ gitlab_user@172.20.26.207::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/ gitlab_user@172.20.26.204::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盘或者挂载盘,防止服务器或硬盘彻底坏了的情况。

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐