任务目标:搭建内网高可用gitlab私服。/ 参考博客 /
实现方法:两台服务器上部署完全一样的gitlab,其中gitlab有关文件采用 inotify + rsync 进行同步,数据库采用psql主从,且实现开机自启与数据自动备份。
准备两台服务器,环境如下

系统版本:    Centos7
数据库版本:  9.6.11
主库:       192.168.32.123
从库:       192.168.32.124
安装有gcc:  yum install gcc(安装命令)

安装前查了下内存情况,确保内存充足
192.168.32.123
在这里插入图片描述
192.168.32.124
在这里插入图片描述

一、安装postgresql

1. 安装postgresql
以下操作步骤主从两个节点都执行:

# 下载源码包
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
tar -zxvf postgresql-9.6.11.tar.gz
cd postgresql-9.6.11
./configure --prefix=/data/postgresql/ --without-zlib
make 
make install
adduser postgres
mkdir /data/postgresql/data
chown postgres /data/postgresql/data

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
/data/postgresql/bin/psql
create user rpl superuser password '123456';

在这里插入图片描述

# 主库上配置从库允许的网段
vim /data/postgresql/data/pg_hba.conf
# 添加内容
host    replication     rpl            192.168.32.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 192.168.32.123 -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=192.168.32.123 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 

重启如果报如下错误,请赋予权限
在这里插入图片描述
回到root用户下执行chown -R postgres:root /data/postgresql/data
在这里插入图片描述
通过Win SCP可以看到权限已改
在这里插入图片描述
接着再重启,重启成功显示如下
在这里插入图片描述
备注:也有可能是因为配置没配对导致的无法启动,要仔细检查下,postmaster.pid是启动后自动生成的文件

5. 主从状态检查

# 查看主库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;

主库:
在这里插入图片描述
从库:
在这里插入图片描述

# 主从集群状态
/data/postgresql/bin/pg_controldata /data/postgresql/data/ |grep "Database cluster state"

主库:
在这里插入图片描述
从库:
在这里插入图片描述

# 主从数据同步验证,主库建库、从库进行查询测试
create database test owner postgres;

主库:
在这里插入图片描述
从库:
在这里插入图片描述
主从同步正常,需要注意的是从库只有只读功能,无法做写入操作

6. 创建gitlab所需用户与数据库
在主库上创建

/data/postgresql/bin/psql
#创建用户
create role gitlab login encrypted password 'ghy20200707gitlab';

#创建数据库
create database gitlab owner=gitlab ENCODING = 'UTF8';

在这里插入图片描述
7. postgresql扩展pg_trgm

以下操作步骤主从两个节点都执行:

cd /root/postgresql-9.6.11/contrib/btree_gin
make && make install

cd /root/postgresql-9.6.11/contrib/pg_trgm
make && make install

#重启postregsql
/data/postgresql/bin/pg_ctl -D /data/postgresql/data -l logfile restart

创建扩展(这个只需要在主库执行)

# 创建扩展(这个只需要在主库执行)
/data/postgresql/bin/psql gitlab
create extension pg_trgm;
create extension btree_gin;
# 查看是否创建成功
select * from pg_extension;

在这里插入图片描述

二、安装gitlab

1. 安装gitlab
以下操作步骤主从两个节点都执行:

# 安装依赖
yum -y install curl policycoreutils policycoreutils-python openssh-server openssh-server openssh-clients postfix

# 下载软件包
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配置文件
以下操作步骤主从两个节点都执行:

vim /etc/gitlab/gitlab.rb
external_url 'http://gittest.addnewer.com'
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'] = "ghy20200707gitlab"
gitlab_rails['db_host'] = "192.168.32.123" # 注意:主从库同ip,都为主库的ip
gitlab_rails['db_port'] = "5432"
#这条配置很重要,要不然两个gitlab只能启动一个
unicorn['socket'] = '/var/opt/gitlab/sockets/gitlab.socket'

mkdir /var/opt/gitlab
cd /var/opt/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://192.168.32.123/ (主)
http://192.168.32.124/ (备)
在这里插入图片描述
备注:刚访问的时候主库报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. 环境准备
以下操作步骤主从两个节点都执行:

# 关闭防火墙    
service iptables stop   
   
# 关闭selinux,重启生效
修改 /etc/selinux/config 文件
将SELINUX=enforcing改为SELINUX=disabled
    
# 关闭selinux,临时生效
setenforce 0                
# 安装rsync xinetd 软件
yum -y install rsync xinetd        

2. 主库服务器配置(192.168.32.123)

# 配置xinetd配置文件
vi /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配置文件
vi /etc/rsyncd.conf

# 添加内容
uid = root
gid = root

[gitlab]
    path = /data/gitlab/
    auth users = gitlab_user
    secrets file = /etc/rsyncd.secrets
    read only = false

# 编辑账号认证文件
vi /etc/rsyncd.secrets
# 添加内容
gitlab_user:GitlabFtpUser@gitlab
# 赋予权限
chmod 600 /etc/rsyncd.secrets

# 启动xinetd服务
service xinetd start  #(重启则为 service xinetd restart)

在从库进行测试

# 查看共享出来的标签
rsync -a 192.168.32.123::

3. 从库服务器配置(192.168.32.124)

# 配置xinetd配置文件
vi /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配置文件
vi /etc/rsyncd.conf

# 添加内容
uid = root
gid = root

[gitlab]
    path = /data/gitlab/
    auth users = gitlab_user
    secrets file = /etc/rsyncd.secrets
    read only = false

# 编辑账号认证文件
vi /etc/rsyncd.secrets
# 添加内容
gitlab_user:GitlabFtpUser@gitlab
# 赋予权限
chmod 600 /etc/rsyncd.secrets

# 启动xinetd服务
service xinetd start  #(重启则为 service xinetd restart)

在主库进行测试

# 查看共享出来的标签
rsync -a 192.168.32.124::

4. 整体测试
在主库上将 /data/gitlab 目录下的文件同步到从库的 /data/gitlab 目录

rsync -avt  /data/gitlab/  gitlab_user@192.168.32.124::gitlab

输入密码GitlabFtpUser@gitlab
在这里插入图片描述
在从库上将 /data/gitlab 目录下的文件同步到主库的 /data/gitlab 目录

rsync -avt  /data/gitlab/  gitlab_user@192.168.32.123::gitlab

输入密码GitlabFtpUser@gitlab
在这里插入图片描述
上面测试成功后接着配置 inotify 实时同步

5. 实时同步
安装inotify-tools,主从库都需要安装

wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz --no-check-certificate
tar xf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14
./configure
make
make install
cp /usr/local/bin/inotifywa* /usr/sbin/

在从库创建密码文件,用于保存主库的密码(此处是需要同步从库的文件到主库的/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@192.168.32.123::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@192.168.32.124::gitlab

在这里插入图片描述

6. 编辑同步脚本并放置后台运行
编辑主库的同步脚本,并放置后台运行

# 创建文件夹
mkdir -p /root/gitlab_sync_sh
# 编辑内容
vim /root/gitlab_sync_sh/gitlab_sync.sh 
# 添加内容

#!/bin/sh
#Desc: 用于从主库/data/gitlab目录中的文件同步到从库的/data/gitlab目录
#Date: 2022-03-02
#By: zenngbaihua

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@192.168.32.124::gitlab
        echo "[`date "+%Y-%m-%d %H:%M:%S"`] 出现事件 $events" >> /var/log/sync.log
    done
    
# 执行
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: 2022-03-02
#By: zenngbaihua

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@192.168.32.123::gitlab
        echo "[`date "+%Y-%m-%d %H:%M:%S"`] 出现事件 $events" >> /var/log/sync.log
    done
    
# 执行
nohup bash /root/gitlab_sync_sh/gitlab_sync.sh &

7. 测试同步
打开gitlab网页,在主库创建项目,查看从库内容是否同步,反之

四、设置开机自启

以下操作步骤主从两个节点都执行(在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运行状态
/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服务
service xinetd start 
# 执行
nohup bash /root/gitlab_sync_sh/gitlab_sync.sh &

开机自启设置如下

# 编辑
vim /etc/rc.d/rc.local
# 添加内容
service xinetd start
source /root/gitlab_sync_sh/gitlab_sync.sh &

# 赋予权限
chmod +x /root/gitlab_sync_sh/gitlab_sync.sh
chmod 777 /etc/rc.d/rc.local

# 重启验证

/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 1646115937_2022_03_01_11.9.8_gitlab_backup.tar 
# 还原
gitlab-rake gitlab:backup:restore BACKUP=1646115937_2022_03_01_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盘或者挂载盘,防止服务器或硬盘彻底坏了的情况

over

Logo

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

更多推荐