gitlab 灾难恢复 geo配置 - 单个从节点主从复制备份容灾

334 阅读7分钟

gitlab geo配置

geo是什么

参考gitlab中文官方文档docs.gitlab.cn/jh/administ…

Geo 是广泛分布的开发团队的解决方案,可作为灾难恢复策略的一部分提供热备份。Geo 提供极狐GitLab 实例的本地只读站点。这可以减少克隆和获取大型仓库所需的时间,从而加快开发速度。

环境准备

  1. 一台安装了gitlab且已经激活导入许可证的EE企业版linux服务器,作为主节点。
  2. 一台安装gitlab EE企业版的linux服务器,作为从节点。
  3. gitlab 需要是通过rpm linux安装包安装的,本文使用的是该方式安装的gitlab
  4. gitlab ee版本要新一些,最好是15往上,本文使用的是15版本配置且测试成功
  5. 配置过程中,我所用到的都是root账户ssh登录

配置

配置文档在docs.gitlab.cn/jh/administ…

本文配置的是单节点Geo站点 image.png

配置数据库复制

参考文档Geo 数据库复制 | 极狐GitLab

主节点配置

  1. 修改 /etc/gitlab/gitlab.rbgitlab_rails['geo_node_name'] = '<site_name_here>'项,给站点取一个唯一名。例如:gitlab_rails['geo_node_name'] = 'master'
  2. 执行gitlab-ctl reconfigure命令激活配置
  3. 执行gitlab-ctl set-geo-primary-node将节点设置为主要站点
  4. 执行gitlab-ctl pg-password-md5 gitlab命令为 gitlab 数据库用户定义密码。过程中会输入一个密码1,记住此刻设置的密码1,同时会输出一个MD5哈希,把密码1和MD5哈希分别配置到/etc/gitlab/gitlab.rbgitlab_rails['db_password']postgresql['sql_user_password']
  5. 执行gitlab-ctl pg-password-md5 gitlab_replicator命令为gitlab_replicator数据库复制用户定义密码。过程中会输入一个密码2,记住此刻设置的密码2,同时会输出一个MD5哈希,把MD5哈希配置到postgresql['sql_replication_password
  6. 打开x/etc/gitlab/gitlab.rb,添加roles(['geo_primary_role'])配置,修改postgresql['listen_address']为主节点的ipv4地址,修改postgresql['md5_auth_cidr_addresses'][['<主节点ipv4地址>/32', '从节点ipv4地址/32']];配置gitlab_rails['auto_migrate'] = false
  7. 执行gitlab-ctl reconfigure命令激活配置
  8. 执行gitlab-ctl restart postgresql重新启动postgresql服务
  9. 再次修改 /etc/gitlab/gitlab.rb配置gitlab_rails['auto_migrate'] = true
  10. 执行gitlab-ctl reconfigure命令激活配置
  11. 执行netstat -nltp | grep 5432命令,能看到有postgres进程监听5432端口说明配置没问题,如果postgresql进程没起来,没监控5432端口,那后续的操作会有问题。
  12. 执行cat ~gitlab-psql/data/server.crt命令,拿到证书内容,记住这个证书1.

至此主节点配置成功!

从节点配置

  1. 执行gitlab-ctl stop puma命令停止应用服务器
  2. 执行gitlab-ctl stop sidekiq命令停止sidekiq
  3. 执行gitlab-rake gitlab:tcp_check[<主节点ipv4地址>,5432]命令,检查是否能连接到主节点的 PostgreSQL 服务器,输出绿色TPC connection from xxx:xx to 主节点ipv4地址:5432 succeeded代表成功
  4. 执行vim server.crt命令创建一个文件,将主节点配置中第12步拿到的证书1内容复制进文件
  5. 执行install -D -o gitlab-psql -g gitlab-psql -m 0400 -T server.crt ~gitlab-psql/.postgresql/root.crt命令安装server.crt文件
  6. 执行sudo -u gitlab-psql /opt/gitlab/embedded/bin/psql --list -U gitlab_replicator -d "dbname=gitlabhq_production sslmode=verify-ca" -W -h <主节点ipv4地址>命令,测试 gitlab-psql 用户是否可以连接到主节点的数据库,正常会提示输入主节点配置中第5步设置的密码2,输入密码,能看到主节点的数据库列表,有列表打印说明配置正常
  7. 编辑 /etc/gitlab/gitlab.rb 并添加或者修改以下配置项:
roles(['geo_secondary_role'])
postgresql['listen_address'] = '<从节点ipv4地址>'
postgresql['md5_auth_cidr_addresses'] = ['<从节点ipv4地址>/32']
# 下面这三项内容的配置和主节点保持一致即可
postgresql['sql_replication_password'] = '<md5_hash_of_your_password>' postgresql['sql_user_password'] = '<md5_hash_of_your_password>'
gitlab_rails['db_password'] = '<your_password_here>'
  1. 执行gitlab-ctl reconfigure命令激活配置
  2. 执行gitlab-ctl restart postgresql命令重新启动postgresql服务

至此从节点配置成功!

启动复制过程

  1. 以root身份在从节点上执行gitlab-ctl replicate-geo-database --slot-name=slave --host=<主节点ipv4地址> --sslmode=verify-ca命令 salve是每个 Geo 次要站点自己唯一的复制槽名称,复制槽名称只能包含小写字母、数字和下划线字符。启动复制过程。过程中在确认是输入replicate, 然后正常会提示输入主节点配置中第5步设置的密码2,输入密码,正常会开始数据库备份,有百分比进度提示。说明该项配置完成。

至此数据库配置完成,如果在启动复制过程时报错,可以从/var/log/gitlab/postgresql/current看日志。我遇到的是postgresql服务没起来导致的错误,重启postgresql即可。另外还遇到一个很奇怪的报错,重启机器得以解决。

配置gitlab,设置主要站点和次要站点

配置快速查找授权 SSH 密钥

参考文档:docs.gitlab.cn/jh/administ…

  1. 使用 gitlab-sshd最方便,直接在主节点和从节点上修改/etc/gitlab/gitlab.rb文件,修改下面两项配置
gitlab_sshd['enable'] = true
gitlab_sshd['listen_address'] = '[::]:2222'
  1. 执行gitlab-ctl reconfigure命令激活配置即可

配置从节点

  1. 在从节点上执行 mv /etc/gitlab/gitlab-secrets.json /etc/gitlab/gitlab-secrets.json.`date +%F` 命令, 会将节点原本的文件备份
  2. 在主节点上执行scp /etc/gitlab/gitlab-secrets.json root@从节点ipv4:/etc/gitlab/命令,将主节点的文件拷贝到从节点
  3. 在从节点上执行chown root:root /etc/gitlab/gitlab-secrets.jsonchmod 0600 /etc/gitlab/gitlab-secrets.json命令修改文件权限
  4. 在从节点上执行gitlab-ctl reconfiguregitlab-ctl restart命令使更改生效

手动复制主节点的 SSH 主机密钥

  1. 在从节点上执行 find /etc/ssh -iname 'ssh_host_*' -exec cp {} {}.backup.`date +%F` \; 命令,备份所有主机密钥
  2. 在从节点上执行scp root@主节点ipv4:/etc/ssh/ssh_host_*_key* /etc/ssh,从主节点复制 OpenSSH 主机密钥
  3. 在从节点上执行chown root:root /etc/ssh/ssh_host_*_key*chmod 0600 /etc/ssh/ssh_host_*_key命令,保证文件权限ok
  4. 在主节点和从节点上执行for file in /etc/ssh/ssh_host_*_key; do ssh-keygen -lf $file; done命令,如果输出一致,说明上述操作没有问题
  5. 在从节点上执行下面的命令,如果输出一致,说明ok
# This will print the fingerprint for private keys:
for file in /etc/ssh/ssh_host_*_key; do ssh-keygen -lf $file; done

# This will print the fingerprint for public keys:
for file in /etc/ssh/ssh_host_*_key.pub; do ssh-keygen -lf $file; done
  1. 执行systemctl restart sshd.service重启sshd服务
  2. 编辑 /etc/gitlab/gitlab.rb文件,修改gitlab_rails['geo_node_name'] = '<site_name_here>'项,取一个唯一的geo节点名
  3. 执行gitlab-ctl reconfigure命令激活配置

添加从节点

导航到主节点上的极狐GitLab 实例:

  1. 在左侧边栏中,选择 搜索或转到
  2. 选择 管理中心
  3. 在左侧边栏中,选择 Geo > 站点
  4. 选择 添加站点image.png
  5. 在 /etc/gitlab/gitlab.rb 中使用 gitlab_rails['geo_node_name'] 填写 Name。它们必须始终每个字符完全匹配。
  6. 用 /etc/gitlab/gitlab.rb 中的 external_url 填写 URL。这些值必须始终匹配,但如果一个以 / 结尾而另一个不以 / 结尾,则无关紧要。
  7. 可选。在 内部 URL(可选)  中,输入主站点的内部 URL。
  8. 可选。选择 次要 站点应复制哪些组或存储分片。留空表示复制所有内容。在选择性同步文档中阅读更多内容。
  9. 选择 保存更改,添加 次要 站点。

重新启动从节点服务

  1. 在从节点执行gitlab-ctl restart重启服务
  2. 可以在主节点和从节点上执行gitlab-rake gitlab:geo:check命令,检查配置项是否有啥问题

至此完成所有配置,登录从节点,可以看到当前处于一个次要的,只读的Geo站点,如需进行变更,必须访问主站点的提示

image.png

验证配置效果以及后续配置

参考官方文档步骤 6. 验证次要站点的正常运行

灾难恢复

当主节点故障时,可以把从节点提为主节点使用,方法参考官方文档docs.gitlab.cn/jh/administ…