1. 程式人生 > 實用技巧 >Gitlab 11.9.1 高可用教程

Gitlab 11.9.1 高可用教程

Gitlab 11.9.1 高可用教程

一、 PostgreSQL資料遷移

由於預設Gitlab的安裝會內建Postgres資料庫,並且沒有對外,所以我們需要通過設定對應的Gitlab的配置將其中的資料庫對外,
以便於我們將其中的資料匯出到外部的資料庫。

1. 公開PostgreSQL連線

這裡將把PostgreSQL公開對外。

vi /etc/gitlab/gitlab.rb

postgresql['listen_address'] = '0.0.0.0'
postgresql['port'] = 5432
postgresql['md5_auth_cidr_addresses'] = %w(192.168.1.1/24)
postgresql['trust_auth_cidr_addresses'] = %w(127.0.0.1/24)
postgresql['sql_user'] = "gitlab"
postgresql['sql_user_password'] = Digest::MD5.hexdigest "securesqlpassword" << postgresql['sql_user']

讀者需要根據實際需要連線到資料庫的IP地址段決定md5_auth_cidr_addresses引數,對於密碼讀者需要調整修改securesqlpassword
為實際連線資料庫的密碼。

為了保證調整資料庫後,Gitlab依然可以正常工作,這裡我們還需要調整gitlab_rails部分的設定即可,具體設定如下所示:

gitlab_rails['db_host'] = '127.0.0.1'
gitlab_rails['db_port'] = 5432
gitlab_rails['db_username'] = "gitlab"
gitlab_rails['db_password'] = "securesqlpassword"

其中對應的連線的使用者名稱和密碼需要跟之前我們配置的資訊一致,完成之後我們重啟對應服務即可:

gitlab-ctl reconfigure

如果發現埠5432沒有被監聽等情況可以通過指令gitlab-ctl restart postgresql手動重啟資料庫。

最後遷移我們通過使用pgadmin備份資料庫然後在其他主機上進行恢復即可。

2. 使用外部PostgreSQL資料庫

完成以上操作後,我們就可以在不影響服務的情況下開始進行服務的遷移工作了,在實際完成具體的遷移後我們
就需要禁用自帶的資料庫,調整對應的連線字串到我們安裝的資料庫上。

vi /etc/gitlab/gitlab.rb

postgresql['enable'] = false

gitlab_rails['db_adapter'] = 'postgresql'
gitlab_rails['db_encoding'] = 'utf8'
gitlab_rails['db_host'] = '0.0.0.0'
gitlab_rails['db_port'] = 5432
gitlab_rails['db_username'] = 'USERNAME'
gitlab_rails['db_password'] = 'PASSWORD'

完成以上設定後我們需要重啟服務gitlab-ctl reconfigure,至此我們就完成了資料庫的切換工作。

二、 Redis資料遷移

1. 公開Redis連線

如果讀者希望Redis資料完全同步,通過公開進行資料的遷移,否則可以直接進行切換。

redis['enable'] = true
redis['port'] = 6379
redis['bind'] = '0.0.0.0'
redis['password'] = 'Redis Password'

由於Redis公開了,那麼Gitlab連線其服務的方式也要進行適當的調整,以保證服務可以正常訪問:

gitlab_rails['redis_host'] = '127.0.0.1'
gitlab_rails['redis_port'] = 6379
gitlab_rails['redis_socket'] = '/tmp/redis.sock'
gitlab_rails['redis_password'] = 'Redis Password'

其中我們需要注意Redis的密碼需要與設定的時候一致。

2. 使用外部儲存

如果使用外部儲存,需要將自帶的關閉然後調整對應地址進行訪問即可:

redis['enable'] = false

gitlab_rails['redis_host'] = 'redis.example.com'
gitlab_rails['redis_port'] = 6379
gitlab_rails['redis_password'] = 'Redis Password'

最後通過重啟服務進行sudo gitlab-ctl reconfigure

三、 PostgreSQL主從複製

由於核心資料均儲存在PostgreSQL,為了保證資料庫的資料不存在丟失的情況,這裡我們需要藉助於其
自身提供的流複製機制實現一主多從架構,從而保證資料在可允許的容錯範圍內實現資料多重備份,避免
因物理損壞從而導致程式碼檔案的丟失。

以下教程均採用基於Docker部署的容器服務。

1. 建立複製賬戶(主節點)

為了能夠讓從節點能夠連線到主節點進行資料的複製,這裡我們需要建立擁有對應許可權的單獨賬戶用於日誌
的複製,首先我們需要進入到容器後通過如下指令進入到具體的資料庫中:

su postgres

psql

# 建立使用者

CREATE ROLE replica login replication encrypted password 'replica';

注意其中的密碼需要修改為實際的密碼,最後通過\q即可退出。

2. 調整配置(主節點)

為了能夠修改配置檔案,這裡我們安裝相關的依賴外掛:

apt-get update
apt-get install vim

完成安裝後我們就可以進行檔案的編輯了:

vi /var/lib/postgresql/data/pg_hba.conf  #允許對應IP連線

host replication replica 192.168.14.34/32 trust

其中的IP地址需要根據實際從節點的IP地址決定,接著我們還需要調整其他對應的引數:

vi /var/lib/postgresql/data/postgresql.conf

listen_addresses = '*'   # 監聽所有IP
archive_mode = on  # 允許歸檔
archive_command = 'cp %p /var/lib/postgresql/data/pg_archive/%f'  # 用該命令來歸檔logfile segment
wal_level = hot_standby #開啟熱備
max_wal_senders = 32 # 這個設定了可以最多有幾個流複製連線,差不多有幾個從,就設定幾個
wal_keep_segments = 64 # 設定流複製保留的最多的xlog數目,一份是 16M,注意機器磁碟 16M*64 = 1G
wal_sender_timeout = 60s # 設定流複製主機發送資料的超時時間
max_connections = 100 # 這個設定要注意下,從庫的max_connections必須要大於主庫的

完成以上配置後主節點的容器就可以重啟了。

3. 拷貝資料(從節點)

由於主節點已經產生的部分的資料,為了保證兩邊的資料的同步性,這裡我們需要
通過對應的複製指令實現基礎資料的複製工作,這裡我們需要指令如下指令進行對應的複製操作:

su postgres

rm -rf /var/lib/postgresql/data/*
pg_basebackup -h 192.168.14.187 -U replica -D /var/lib/postgresql/data -X stream -P
mkdir -p /var/lib/postgresql/data/pg_archive

注意其中的-h後的IP地址需要為主節點的地址

4. recovery.conf配置(從節點)

vi /var/lib/postgresql/data/recovery.conf #增加如下內容

standby_mode = on    # 說明該節點是從伺服器
primary_conninfo = 'host=192.168.14.187 port=5432 user=replica password=replica'  # 主伺服器的資訊以及連線的使用者
recovery_target_timeline = 'latest'

5. postgresql.conf配置(從節點)

vi /var/lib/postgresql/data/postgresql.conf

wal_level = hot_standby
max_connections = 1000 # 一般查多於寫的應用從庫的最大連線數要比較大
hot_standby = on # 說明這臺機器不僅僅是用於資料歸檔,也用於資料查詢
max_standby_streaming_delay = 30s # 資料流備份的最大延遲時間
wal_receiver_status_interval = 10s # 多久向主報告一次從的狀態,當然從每次資料複製都會向主報告狀態,這裡只是設定最長的間隔時間
hot_standby_feedback = on # 如果有錯誤的資料複製,是否向主進行反饋

完成以上操作後,我們將從節點的容器進行重啟即可。

6. 驗證主從部署

這裡我們需要進入到主節點的容器中,通過如下指令進行查詢:

su postgre
psql

select client_addr,sync_state from pg_stat_replication;

如果顯示了我們剛剛新增的從節點則表示主從複製已經啟用了。