寫在前面
今天計劃學習MogHA高可用軟件,MonHA類似于Mysql+keepalived的高可用架構,通過提供一個虛擬VIP,實現主備庫之間的故障轉移,對于應用程序透明,應用程序只需要連接VIP即可,不需要修改數據庫連接。
學習環境
NODE1(主庫) | NODE2(從庫) | |
Hostname | pkt_mogdb1 | pkt_mogdb2 |
IP | 10.80.9.249 | 10.80.9.250 |
磁盤 | 20G | 20G |
內存 | 2G | 2G |
軟件安裝
根據官網上支持的模式,分別是Lite模式(推薦)和Full模式。
Lite模式:只在主庫和一臺備庫安裝MogHA軟件,也就是說如果主庫出現故障,只有安裝了MogHA軟件的那臺備庫節點才可以切換成新的主庫,其余的備庫因為沒有安裝MogHA所以只能一直是備庫,不會進行切主,這樣的好處避免了腦裂,以及選主過程中的投票操作,這樣的壞處就是如果主庫和這臺備庫同時故障,就只能手動切主了。
Full模式:在所有的MogDB節點上安裝MogHA軟件,這樣的優點就是可以按照投票結果自由選主,所有的備庫都可能成為新的主庫,更體現了高可用,但是相對處理就比較復雜,因為要考慮腦裂、多主的情況,因此部署的時候備庫數量建議使用2N+1。
個人也建議使用Lite模式,如果主庫損壞,再找另外一臺備機安裝MogHA軟件,保證一主一備可以進行切換即可。
因為我本地只有2個節點,也只能使用Lite輕量模式。
軟件下載
下載地址:https://docs.mogdb.io/zh/mogha/v2.3/release-notes
環境要求
需要配置gsql, gs_ctl 免密執行,因為切主的時候需要執行gs_ctl命令,如果提示需要密碼,需要修改認證文件pg_hba.conf,文件路徑在data_dir下面
# "local" is for Unix domain socket connections only local all all trust host all omm 10.80.9.249/32 trust host all omm 10.80.9.250/32 trust |
找到對應的記錄了,修改trust列的值為trust,然后重啟MogDB使認證生效
gs_om -t stop gs_om -t start |
配置數據庫安裝用戶(omm)的sudo權限
所有節點執行以下語句
[root@pkt_mogdb1 etc]# echo "omm ALL=(ALL) NOPASSWD: /usr/sbin/ifconfig" >> /etc/sudoers |
端口互通
如果有防火墻需要開啟8081的端口訪問,因為MogHA需要通過8081進行訪問,可以修改配置文件中的agent_port參數,因為我的環境防火墻已經關閉了,所以無需操作
配置chronyd時間同步
使用node1為chronyd服務器,node2是chronyd客戶端,正常的生產環境都會有時鐘服務器,因為我的測試環境只有兩臺,因此隨便搭建一下。
#查看是否已經運行chronyd服務 [root@pkt_mogdb1 etc]# systemctl status chronyd |
Node1配置chronyd服務端,vi /etc/chrony.conf
[root@pkt_mogdb1 etc]# cat chrony.conf # Use public servers from the pool.ntp.org project. # Please consider joining the pool (http://www.pool.ntp.org/join.html). server 0.centos.pool.ntp.org iburst server 1.centos.pool.ntp.org iburst server 2.centos.pool.ntp.org iburst server 3.centos.pool.ntp.org iburst server 10.80.9.249 iburst #增加這一行表示自己與自己同步 # Record the rate at which the system clock gains/losses time. driftfile /var/lib/chrony/drift # Allow the system clock to be stepped in the first three updates # if its offset is larger than 1 second. makestep 1.0 3 # Enable kernel synchronization of the real-time clock (RTC). rtcsync # Enable hardware timestamping on all interfaces that support it. #hwtimestamp * # Increase the minimum number of selectable sources required to adjust # the system clock. #minsources 2 # Allow NTP client access from local network. allow 10.80.0.0/16 #修改這一行,允許這個網段的機器可以與自己同步 # Serve time even if not synchronized to a time source. local stratum 10 # 取消注釋: 為no 取消掉后變為 NTP synchronized:yes # Specify file containing keys for NTP authentication. #keyfile /etc/chrony.keys # Specify directory for log files. logdir /var/log/chrony # Select which information is logged. #log measurements statistics tracking |
重啟chronyd服務,并開機啟動
[root@pkt_mogdb1 etc]# systemctl stop chronyd [root@pkt_mogdb1 etc]# systemctl start chronyd [root@pkt_mogdb1 etc]# systemctl status chronyd [root@pkt_mogdb1 etc]# systemctl enable chronyd |
Node2配置chronyd客戶端
vi /etc/chrony.conf #在文件中增加一下內容 server 10.80.9.249 iburst #表示從這臺服務器同步時間 #重啟chronyd服務,并設置開機啟動 [root@pkt_mogdb2 etc]# systemctl stop chronyd [root@pkt_mogdb2 etc]# systemctl start chronyd [root@pkt_mogdb2 etc]# systemctl enable chronyd |
檢查同步狀態
[root@pkt_mogdb2 etc]# timedatectl |
Yes表示已經開啟同步
解壓MogHA
使用root用戶進行解壓(主備節點都需要解壓安裝)
[root@pkt_mogdb1 data]$ cd /opt/mogdb/software/ [root@pkt_mogdb1 software]$ ll total 169736 -rw-r--r--. 1 omm omm 559 Aug 8 17:48 config.yaml -rw-r--r--. 1 omm omm 139152523 Aug 8 17:27 MogDB-3.0.0-CentOS-x86_64.tar.gz -rw-r--r-- 1 root root 16227396 Aug 9 13:38 mogha-2.3.5-CentOS-x86_64.tar.gz -rwxr-xr-x. 1 omm omm 13414400 Aug 2 17:47 ptk -rw-r--r--. 1 omm omm 4974994 Aug 8 17:27 ptk_linux_x86_64.tar.gz -rw-r--r--. 1 omm omm 26502 Aug 2 17:46 README.md -rwxr--r--. 1 omm omm 486 Aug 8 17:36 root_fix_os.2022.0808.173657.sh [root@pkt_mogdb1 software]$ tar -zxf mogha-2.3.5-CentOS-x86_64.tar.gz |
解壓后會在當前目錄下得到一個 mogha 的文件夾。
安裝MogHA
使用root用戶安裝,注意omm為數據庫安裝用戶,路徑是data_dir目錄(主備節點都需要解壓安裝)
[root@pkt_mogdb1 mogha]# sudo ./install.sh omm /opt/mogdb/data/data/ |
提示successfully表示安裝成功
配置MogHA
在mogha目錄下有一個node.conf的配置文件,如果沒有需要手動新建一個即可
以下是我的node.conf配置文件,把修改好文件以后復制到其他節點
[omm@pkt_mogdb1 mogha]$ cat node.conf # docs: https://docs.mogdb.io/zh/mogha/v2.3/overview [config] # 數據庫端口 db_port=26000 # 數據庫的操作系統用戶, 通常為omm db_user=omm # 數據庫的數據目錄 db_datadir=/opt/mogdb/data/data # 本地主庫元數據存儲路徑 primary_info=/opt/mogdb/software/mogha/primary_info # 本地備庫元數據存儲路徑 standby_info=/opt/mogdb/software/mogha/standby_info # 是否使用 lite 模式, 可選值: True / False lite_mode=True # HA節點之間心跳端口, 如果有防火墻, 需要配置互通 agent_port=8081 # 心跳間隔時間 heartbeat_interval=3 # 主庫丟失的探測時間 primary_lost_timeout=10 # 主庫的孤單時間 primary_lonely_timeout=10 # 雙主確認超時時間 double_primary_timeout=10 # 本地元數據文件類型,支持 json/bin meta_file_type=json # 是否為數據庫實例進程限制cpu taskset=False # 設置輸出的日志格式 logger_format=%(asctime)s %(levelname)s [%(filename)s:%(lineno)d]: %(message)s # [2.3.0新增]設置日志存儲目錄 log_dir=/opt/mogdb/software/mogha # [2.3.0新增] 日志文件最大字節數(接近該值時,將發生日志滾動) # 支持的單位: KB, MB, GB (忽略大小寫) log_max_size=512MB # [2.3.0新增] 日志保留的文件個數 log_backup_count=10 # 設置除了主備相關的機器, 允許可以訪問到web接口的IP列表, 多個IP時逗號分隔 allow_ips=10.80.9.249,10.80.9.250 # [2.1新增] 主實例進程未啟動時,是否需要 HA 進行拉起或切換 # 搭配 primary_down_handle_method 使用 handle_down_primary=True # [2.1新增] 備庫進程未啟動時,是否需要 HA 進行拉起 handle_down_standby=True # [2.1新增] 主庫實例進程未啟動時,如何處理 # 支持兩種處理方式: # - restart: 嘗試重啟,嘗試次數在 restart_strategy 參數中設定 # - failover: 直接切換 primary_down_handle_method=restart # [2.1新增] 重啟實例最大嘗試條件: times/minutes # 例如: 10/3 最多嘗試10次或者3分鐘, 任何一個條件先滿足就不再嘗試。 restart_strategy=10/3 # [2.2.1新增] debug_mode=False # [2.3.0新增] # HA節點間HTTP API 心跳請求超時時間(秒) http_req_timeout=3 # (選填) 元數據庫的連接參數 (openGauss類數據庫) # [meta] # ha_name= # HA集群的名稱, 全局唯一, 禁止兩套HA集群共用一個名字 # host= # 機器IP # port= # 端口 # db= # 數據庫名 # user= # 用戶名 # password= # 密碼 # connect_timeout=3 # 連接超時,單位秒 # host1-9, 每個代表一個機器(最多支持1主8備) # (lite模式需僅配置 host1 和 host2 即可) # - ip: 業務IP # - heartbeat_ips: (選填)心跳網絡ip, 允許配置多個心跳網絡, 以逗號隔開 [host1] ip=10.80.9.249 heartbeat_ips= [host2] ip=10.80.9.250 heartbeat_ips= # [host3] # ip= # heartbeat_ips= # [host4] # ip= # heartbeat_ips= # [host5] # ip= # heartbeat_ips= # [host6] # ip= # heartbeat_ips= # [host7] # ip= # heartbeat_ips= # [host8] # ip= # heartbeat_ips= # [host9] # ip= # heartbeat_ips= # zone1~3 用于定義機房, 不同機房配置獨立虛擬IP, # 切換不會切過去,作為異地保留項目 # - vip: 機房虛擬IP (沒有不填) # - hosts: 本機房內機器列表, 填寫機器在配置文件中對應的配置模塊名 host1~9, 示例: host1,host2 # - ping_list: 用于檢查網絡是否通暢的仲裁節點, 例如網關, 支持填寫多個IP (逗號分隔) # - cascades: 機房內的級聯機器列表 (配置方式同 hosts, 沒有不填) # - arping: (選填) 機房的 arping 地址, 切換虛擬IP后通知該地址 [zone1] vip=10.80.9.248 #我的虛擬IP,客戶端直接使用這個ip連接數據庫 hosts=host1,host2 ping_list=10.80.0.1 cascades= arping= # [zone2] # vip= # hosts= # ping_list= # cascades= # arping= # [zone3] # vip= # hosts= # ping_list= # cascades= # arping= |
啟動MogHA
先啟動主節點的MogHA服務,這樣虛擬ip就會綁定到主節點,切換到omm用戶
[root@pkt_mogdb1 mogha]# su - omm [omm@pkt_mogdb1 mogha]$ sudo systemctl start mogha [omm@pkt_mogdb1 mogha]$ sudo systemctl enable mogha [omm@pkt_mogdb1 mogha]$ sudo systemctl status mogha |
查看虛擬IP的綁定情況
[omm@pkt_mogdb1 mogha]$ ip a |
可以看到我的虛擬ip已經綁定到主節點的網卡上
按照此步驟,啟動備節點MogHA。
客戶端連接數據庫只需要連接248即可
gsql -d db_mogdb -h 10.80.9.248 -U zkh -p 26000 -W Zkh12345678 |
MogHA測試
模擬主節點故障,把主節點關掉,查看虛擬ip的漂移情況
可以看到vip248已經成功飄到節點2中,并且節點2中mogha目錄下也有一個日志,記錄了切換過程
再模擬node2節點宕機,把主庫重新切回node1
注意:如果主機修復以后不會自動漂移。
最后
MogHA軟件已經安裝測試成功,總體來說跟keepalived類似,都是通過虛擬ip進行主備機上漂移,然后通過gs_ctl執行主備角色切換。




