對于有主從狀态的叢集,實作讀負載均衡需要将讀請求分發到各Slave上,并且主從發生切換後,要自動調整分發政策。然而,目前主流的LVS監控方案,keepalived或Pacemaker + ldirectord并不能很好的支援這一點,它們需要在發生failover後修改相應的配置檔案,這并不是非常友善。為了把LVS更好內建到Pacemaker叢集裡,将LVS相關的控制操作包裝成資源代理,并提供多種靈活的方式動态配置real server。目前隻支援工作在LVS的DR模式。
Director Server和Real Server上核心參數的自動設定
負載均衡政策等LVS參數的配置
Real Server權重的配置
多種Real Server清單配置方式
a)靜态清單
b)根據資源依賴動态設定
c)根據節點屬性動态設定
d)以上a,b,c 3種的組合
e)根據外部腳本動态擷取
多種Real Server的健康檢查方式
由Real Server對應的RA(如pgsql)檢查
由外部腳本動态檢查
線上動态調整Real Server
Real Server清單發生變更時,已建立的到非故障Real Server的連接配接不受影響。
vip
虛拟服務的VIP.
port
虛拟服務的端口号
virtual_service_options
傳遞給ipvsadm的虛拟服務的選項,比如"-s rr".
default_weight
Real Server的預設權重,預設為1.
weight_of_realservers
Real Server的host和權重組合的清單,設定形式為"node1,weight1 node2,weight2 ..."。 如果省略權重,則使用default_weight。使用了realserver_dependent_resource,realserver_dependent_attribute_name或realserver_dependent_attribute_value參數時, host必須是節點的主機名。
realserver_dependent_resource
Real Server依賴的資源,隻有被配置設定了該資源的節點會被加入到LVS的real server清單中。 如果realserver_get_real_servers_script不為空,該參數将失效。
realserver_dependent_attribute_name
Real Server依賴的節點屬性名。 如果realserver_get_real_servers_script或realserver_check_active_slave_script不為空,該參數将失效。
realserver_dependent_attribute_value
Real Server依賴的節點屬性值的正規表達式,比如對于pgsql RA的從節點,可以設定為"HS:sync|HS:potential|HS:async" 如果realserver_get_real_servers_script或realserver_check_active_slave_script不為空,該參數将失效。
realserver_get_real_servers_script
動态擷取Real Server清單的腳本。該腳本輸出空格分隔得Real Server清單。
realserver_check_active_real_server_script 動态檢查Real Server健康的腳本。該腳本接收節點名作為參數。 如果realserver_get_real_servers_script或realserver_check_active_slave_script不為空,該參數将失效。
Pacemaker
Corosync
ipvsadm
以下是PostgreSQL主從叢集中讀負載均衡的配置示例,讀請求通過LVS的RR負載均衡政策平均分散到2個Slave節點上。
配置lvsdr-realsvr和每個expgsql的Slave資源部署在一起
配值lvsdr的real server清單依賴于lvsdr-realsvr-clone資源和節點的pgsql-status特定屬性值
完整的配置如下:
配值lvsdr的real server清單通過get_active_slaves腳本在Master上動态查詢Slave節點。
采用這種方式可以将Pacemaker叢集以外的Slave作為real server加入到LVS。對這樣的節點需要進行下面的設定
設定作為LVS real server的系統參數
在lo網卡上添加讀VIP
設定Slave節點連接配接資訊中application_name為該節點的主機名或ip位址。
[root@node4 pha4pgsql]# cat /data/postgresql/data/recovery.conf standbymode = 'on' primaryconninfo = 'host=192.168.0.236 port=5432 applicationname=192.168.0.234 user=replication password=replication keepalivesidle=60 keepalivesinterval=5 keepalivescount=5' restorecommand = '' recoverytarget_timeline = 'latest'
通過default_weight和weight_of_realservers指定real server一覽,并通過調用check_active_slave腳本,依次連接配接到real server中的每個節點上檢查其是否可以連接配接并且是Slave。