PXC 配置筆記-從MySQL直接轉成PXC叢集
PXC 能提供高可用,高讀,多寫支援
最重要的優點就是高可能,在3個及以上節點時,其中一個掛了,完全不影響業務。 最大的缺點是多寫問題,最短板效能上限問題。 在我們硬體水平是256G記憶體,32核CPU,SSD硬體,單行資料大概1K,單表1千萬,512表。 QPS在2.5k寫+5K讀時,就會有節點同步阻塞問題。當時我們臨時切成只讀(不執行寫SQL)10分鐘後,才緩解過來。寫queue配置引數在下面。 基本第3點,我們的應用場景是:低寫QPS的DB,使用PXC叢集,以防硬體故障,達到高可用。
MySQL的slave 能直接轉換把PXC,不用導資料。
詳細的方法是參考英文原文PXC-install-getting-started
簡單說過程就是: stop mysqld yum remove mysql-server與client,還是shard庫。注意,remove時會把my.cnf備份。
安裝官方的yum源倉庫,直接yum 安裝 PXC。
yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm sudo yum list | grep XtraDB-Cluster|grep 5.7 Percona-XtraDB-Cluster-57.x86_64 Percona-XtraDB-Cluster-57-debuginfo.x86_64 Percona-XtraDB-Cluster-client-57.x86_64 Percona-XtraDB-Cluster-devel-57.x86_64 Percona-XtraDB-Cluster-full-57.x86_64 Percona-XtraDB-Cluster-garbd-57.x86_64 Percona-XtraDB-Cluster-server-57.x86_64 Percona-XtraDB-Cluster-shared-57.x86_64 Percona-XtraDB-Cluster-test-57.x86_64
4.修改原來my.cnf配置檔案,新增PXC配置如下,加到[mysqld]下,原來的不用動。
binlog_format=ROW log_slave_updates=1 ################################# #Percona xtradb cluster config # # galary庫路徑 wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
# wsrep_cluster_address為節點地址(不需要埠),第一個節點啟動時配置為: gcomm:// # 第二個節點啟動時配置為: gcomm://{節點1 IP},{節點2 IP} wsrep_cluster_address=gcomm:// # 並行複製執行緒數 4*cpu, 當24個CPU使用 wsrep_slave_threads=94 # 叢集名字 wsrep_cluster_name=roaming1
# gcache.size 是硬碟快取值大小。 # gcache.page_size 硬碟快取頁大小。 # gcs.fc_limit 允許多少條寫sql未同步執行, 超過這個值 ,就會阻塞寫入請求,直接佇列少於 # gcs.fc_factor*gcs.fc_limit的值。 # gcs.fc_factor 當阻塞發生時,允許寫請求繼續執行的百分比因子:阻塞的寫佇列長度百分比。 # while (get_write_queue() >= fc_limit ){ # block_all_sql() # while( get_write_queue() <= fc_limit*fc_factor){ # allow_all_sql() # } wsrep_provider_options = "gcache.size=32G; gcache.page_size=4G; gcs.fc_limit = 256; gcs.fc_factor = 0.8;" # 節點名: wsrep_node_name = node240 wsrep_sst_method = xtrabackup-v2 # 需要建一個專門的使用者用做sst/ist。要先授權,授權在localhost執行。 wsrep_sst_auth="sst:!admin8888" # 不允許讀延遲資料,會影響讀效能, ON/OFF wsrep_causal_reads = OFF innodb_autoinc_lock_mode = 2 innodb_locks_unsafe_for_binlog = 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
在新增my.cnf配置是,唯一 要注意的是wsrep_cluster_address的值:
第一個節點啟動時配置為: gcomm:// 第二個節點啟動時配置為: gcomm://{節點1 IP},{節點2 IP} 第三個節點啟動時類推,至少配置一個已有資料的節點IP,最後配置一個自己的IP 如:wsrep_cluster_address=gcomm://172.16.8.239,172.16.8.240
1 2 3 4
第一個節點啟動時,無需拖拉資料,直接start slave, 能從原來的master拉binlog繼續執行,本身它還是slave角色。
# 授權一個叫sst使用者,用於節點2加入時同步資料。 # 建議直接授權為all,否則第二個加入時好易許可權問題,反正只是對localhost的授權, # 因此,wsrep_sst_auth直接配置為root使用者也可以。 GRANT ALL ON *.* TO 'sst'@'localhost' IDENTIFIED BY '!admin8888';
1 2 3 4
第二個節點啟動時,注意看error-log,正常的話,會清空datadir,並且從 node1 拉資料,主要通過 sst,所以node1要配置一個sst使用者,這時可能出來一個bug,sst類似xtrabckup通過網路傳輸資料過來到datadir/.sst目錄下,此目錄中的檔案歸屬有可能全是root,此時要全改成mysql使用者,才能正確啟動每二個節點。而方法是取巧:使用watch
使用watch命令,把sst copy過來的檔案全改成mysql使用者的。必需這樣做,mysql正確啟動。 watch -n 1 'chown mysql:mysql datadir/.sst -R'
1 2