本文参考:https://www.jianshu.com/p/52de6a8d29d6
https://www.cnblogs.com/netonline/archive/2017/10/13/7660767.html
lsyncd复制+pgsql复制
1.安装gitlab (主、从)
* 配置yum源
vi /etc/yum.repos.d/gitlab-ce.repo
复制以下内容:
[gitlab-ce]
name=Gitlab CE Repository
baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/
gpgcheck=0
enabled=1
* 更新本地yum缓存
yum makecache
* 安装GitLab社区版
yum install gitlab-ce #自动安装最新版本
注:若需安装指定版本,则添加版本号即可,即yum install gitlab-ce-x.x.x
* 加载配置文件
gitlab-ctl reconfigure
* 修改配置文件
vim /etc/gitlab/gitlab.rb # 修改默认的配置文件;
* 修改域名
vim /opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml
* 修改GitLab服务端口
vim /var/opt/gitlab/nginx/conf/gitlab-http.conf
* 启动服务
gitlab-ctl start # 启动所有 gitlab 组件;
* GitLab常用命令
gitlab-ctl start # 启动所有 gitlab 组件;
gitlab-ctl stop # 停止所有 gitlab 组件;
gitlab-ctl restart # 重启所有 gitlab 组件;
gitlab-ctl status # 查看服务状态;
gitlab-ctl reconfigure # 启动服务;(重新加载配置文件,在GitLab初次安装后可以使用,但是在业务环境中不可随意使用,reconfigure会把一些过去的config还原,导致修改的端口以及域名等都没有了。)
vim /etc/gitlab/gitlab.rb # 修改默认的配置文件;
gitlab-rake gitlab:check SANITIZE=true --trace # 检查gitlab;
sudo gitlab-ctl tail # 查看日志;
使用lsyncd复制数据
2.安装lsyncd(主)
yum install epel-release
yum install lsyncd
* 修改配置文件
vi /etc/lsyncd.conf
settings {
logfile ="/var/log/lsyncd/lsyncd.log",
statusFile ="/var/log/lsyncd/lsyncd.status",
inotifyMode = "CloseWrite",
maxProcesses = 8,#同时最大起的rsync进程数,一个rsync同步一个文件
}
-- IV. 远程目录同步,rsync模式 + ssh shell
sync {
default.rsync,
source = "/var/opt/gitlab",#源目录,路径使用绝对路径
target = "root@192.168.1.6:/var/opt/gitlab/",#目标目录
-- 上面target,注意如果是普通用户,必须拥有写权限
exclude = { "backups", "gitlab-ci", "sockets", "gitlab.yml", "redis", "postmaster.pid","recovery.conf","postgresql.conf","pg_hba.conf"},
maxDelays = 5,#统计到多少次监控事件即开始一次同步
delay = 30,#若30s内未出发5次监控事件,则每30s同步一次
-- init = true,
rsync = {
binary = "/usr/bin/rsync",#rsync可执行文件
archive = true,#保持文件所有属性
compress = true,#压缩传输,是否开启取决于带宽及cpu
bwlimit = 2000 #限速 kb/s
-- rsh = "/usr/bin/ssh -p 22 -o StrictHostKeyChecking=no"
-- 如果要指定其它端口,请用上面的rsh
}
}
3、配置免密登录
* 生成秘钥
通过命令”ssh-keygen -t rsa“,生成之后会在用户的根目录生成一个 “.ssh”的文件夹
ssh-keygen -t rsa
vi ~/.ssh/known_hosts #删除对应ip的相关rsa信息
* 发送公钥到从机
ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.1.6
4、重启lsyncd服务
systemctl restart lsyncd
5、从机也要安装lsyncd服务
6、需要重起postgresql (从)
gitlab-ctl stop postgresql
gitlab-ctl start postgresql
gitlab的PostgresSQL复制
只使用lsyncd对代码层是好使的,但是如果涉及到用户的操作,会导致失败,从库的PostgresSQL起不起来,所以在上面的基础上,再做一个PostgresSQL的复制。
1、主库配置
* 创建一个有登录和复制权限的账号
由于gitlab上的postgresql已经创建了复制账号,所以不用再创建
有账号可不必进行下面的操作
登录PostgresSQL
su - gitlab-psql
psql -h /var/opt/gitlab/postgresql -d gitlabhq_production
select * from pg_roles;
否则创建账号
postgres=#create role repl login replication encrypted password 'repl@123';
* 认证文件pg_hba.conf
cd /var/opt/gitlab/postgresql/data
vi pg_hba.conf
在最下面添加可访问远程ip,trust代表不需要密码访问
host replication gitlab_replicator 192.168.1.6/32 trust
* 修改配置文件
vi postgresql.conf
修改如下内容
#监听服务器
listen_addresses = '*'
#主从设置为热备模式,流复制必选参数
wal_level = hot_standby
#流复制允许的连接进程,一般同standby数量一致
max_wal_senders = 2
#流复制在没有基于文件的连续归档时,主服务器可能在备机收到WAL日志前回收这些旧的WAL,此时备机需要重新从一个新的基础备份初始化;可设置wal_keep_segments为一个足够高的值来确保旧的WAL段不会被太早重用;1个WAL日志为16MB,所以在设置wal_keep_segments时,在满足空间的前提下可以尽量设置大一些
wal_keep_segments = 64
* 重启服务
gitlab-ctl restart postgresql
2、从库配置
* 备份主库的数据
备份之前先把主库的lsyncd服务停掉,否则会同步主库数据,清空data目录
cd /opt/gitlab/embedded/postgresql/9.6/bin
./pg_basebackup -h 192.168.1.9 -p 5432 -U gitlab_replicator -F p -P -D /var/opt/gitlab/postgresql/data/
* 赋予备份目录权限
chown -R gitlab-psql:root /var/opt/gitlab/postgresql/data/
* 修改从库配置文件postgresql.conf
cd /var/opt/gitlab/postgresql/data/
vi postgresql.conf
#在基础备份时,初始化文件是从主库复制来的,所以配置文件一致,可将wal_level,max_wal_senders与wal_keep_segments等参数注释,以下是新增或修改的参数
#在备份的同时允许查询
hot_standby = on
#可选,流复制最大延迟
max_standby_streaming_delay = 30s
#可选,从向主报告状态的最大间隔时间
wal_receiver_status_interval = 10s
#可选,查询冲突时向主反馈
hot_standby_feedback = on
#默认参数,非主从配置相关参数,表示到数据库的连接数,一般从库做主要的读服务时,设置值需要高于主库
max_connections = 1000
* 修改恢复文件recovery.conf
复制文件
cp /opt/gitlab/embedded/postgresql/9.6/share/recovery.conf.sample ./recovery.conf
更改文件所属
chown gitlab-psql:root recovery.conf
修改文件
vi recovery.conf
#指明从库身份
standby_mode = on
#连接到主库信息
primary_conninfo = 'host=192.168.1.9 port=5432 user=gitlab_replicator'
#同步到最新数据
recovery_target_timeline = 'latest'
* 重启服务
gitlab-ctl restart postgresql
启动主库的lsyncd服务
systemctl restart lsyncd
* 验证
主库sender进程
ps -ef | grep postgres
从库receiver进程
ps -ef | grep postgres