lunix gitlab+postgresql搭建gitlab私服实现高可用
搭建内网高可用gitlab私服,lunix下gitlab+postgresql实现高可用。实现方法:两台服务器上部署完全一样的gitlab,其中gitlab有关文件采用 inotify + rsync 进行同步,数据库采用psql主从,且实现开机自启与数据自动备份。
任务目标:搭建内网高可用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
更多推荐
所有评论(0)