簡介: Percona Server 由領先的 MySQL 咨詢公司 Percona 發佈。Percona Server 是一款獨立的資料庫產品,其完全與 MySQL 相容,可以在不更改代碼的情況下將存儲引擎更換為 XtraDB 。 Percona 資料庫中使用的存儲引擎為 XtraDB,它是 My ...
簡介:
Percona Server 由領先的 MySQL 咨詢公司 Percona 發佈。Percona Server 是一款獨立的資料庫產品,其完全與 MySQL 相容,可以在不更改代碼的情況下將存儲引擎更換為 XtraDB 。
Percona 資料庫中使用的存儲引擎為 XtraDB,它是 MySQL 資料庫中 InnoDB 存儲引擎的增強版,被設計用來更好的更新電腦硬體系統的新能,同時還包含一些在高性能環境下的新特性。
XtraDB 在 InnoDB 的堅實基礎上構建,使用 XtraDB 具有更多的特性,更好調用,更多的參數指標和更多的擴展。
Percona XtraDB Cluster ( PXC ) 集群是開源、免費的 MySQL 高可用性軟體,可以多主同時對外提供資料庫讀、寫服務,分擔資料庫壓力且不浪費資源。
特性:
1、同步複製,事務在所有節點提交或不提交。
2、多主複製,可以在任意節點上進行讀、寫操作。
3、在從伺服器並行應用事件,真正意義上的並行複製。
4、節點自動配置,數據一致性,不再是非同步複製。
5、當前版本 5.6 僅支持 InnoDB 存儲引擎 ( MyISAM 存儲引擎為實驗階段 )。
6、集群推薦至少三個節點;每個節點都是普通的 Percona 伺服器;可以將現有的資料庫伺服器組成集群,也可以將集群拆分成單獨的伺服器;每個節點都包含完整的數據副本。
更多特性及限制請參考官方地址:https://www.percona.com/doc/percona-xtradb-cluster/LATEST/index.html 介紹一欄。
# 伺服器:192.168.12.128、129、130
一、採用 YUM 安裝 PXC
shell > yum -y install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm # 安裝 YUM 源 shell > yum -y install Percona-XtraDB-Cluster-56 # 安裝 PXC
二、配置 PXC
shell > vim /etc/my.cnf [mysqld] user = mysql socket = /var/lib/mysql/mysql.sock datadir = /var/lib/mysql log-bin = mysql-bin binlog_format = ROW default_storage_engine = InnoDB innodb_autoinc_lock_mode = 2 wsrep_provider = /usr/lib64/libgalera_smm.so wsrep_cluster_address = gcomm://192.168.12.128,192.168.12.129,192.168.12.130 wsrep_cluster_name = PXC wsrep_node_address = 192.168.12.128 wsrep_sst_method = xtrabackup-v2 wsrep_sst_auth = "sstuser:s3cret" [mysqld_safe] log-error = /var/log/mysqld_error.log pid-file = /var/run/mysqld/mysqld.pid
# 參數說明:
1、innodb_autoinc_lock_mode
自增欄位鎖策略,有三個值:0 全部使用表鎖;1 可預判行數時使用新方式( 預留行數的值,分配的 ID 不連續 ),不可預判時使用表鎖;2 不使用表鎖 ( 不適用於 replication )
2、wsrep_slave_threads
複製事務的線程數,預設為 1。可以根據實際吞吐量增加該線程數,實現多線程並行複製 ( show variables like 'wsrep_slave_threads'; )。
3、wsrep_causal_reads
當被查詢結果還沒有同步到 slave 中時,通過該參數可以使查詢動作等待結果同步,最終返回查到的結果 ( 這種短暫延遲可以通過增加併發線程數量、提升伺服器硬體性能、優化網路環境來解決 )。
4、wsrep_sst_method
當集群中有新節點加入時,傳輸快照( 數據 )使用的方法:Xtrabackup 、mysqldump 、rsync 。
推薦使用 Xtrabackup-v2 ( Xtrabackup 的第二版 ),mysqldump 最慢、並且跟 rsync 一樣需要全局鎖,影響效率、導致用戶無法寫入數據。
5、wsrep_sst_auth
使用 Xtrabackup 、mysqldump 傳輸快照時需要的認證用戶( 需要資料庫中建立用戶,my.cnf 也要指明 ),rsync 不需要設置。
三、啟動 PXC
shell > setenforce 0 # 關閉 SELinux ,建議編輯 /etc/selinux/config 永久關閉 shell > iptables -I INPUT -p tcp --dport 4444 -j ACCEPT shell > iptables -I INPUT -p tcp --dport 4567 -j ACCEPT shell > iptables -I INPUT -p tcp --dport 4568 -j ACCEPT
# 需要開放的埠
1、TCP 3306
資料庫對外服務埠,一般只對公司內部或指定 IP 開放。
2、TCP 4444
SST 數據全量傳輸埠,可以只對節點伺服器開放。新節點加入時需要同步數據使用 ( 預設 )。
2016-08-04 01:52:32 13167 [Note] WSREP: SST received: 4f33cb6b-598a-11e6-8738-8b3354956db1:7 # 通過 SST 全量傳輸 ( error.log )
3、TCP 4567
節點與節點通信埠。例如:不開放該埠,其餘節點伺服器無法接入到集群 ( 無法啟動 )。
4、TCP 4568
IST 數據增量傳輸埠。節點下線再上線時傳輸數據使用 ( 當 gcache.size 里完全存放著節點伺服器下線到上線之間的數據時,才會使用增量傳輸 )。
gcache.size 可以在 my.cnf 中通過參數 wsrep_provider_options = "gcache.size=512M" 設置,預設 128M。可以根據生成的 binlog 大小設置。建議大於生成的 binlog 大小。
2016-08-04 02:01:53 13961 [Note] WSREP: Receiving IST: 3 writesets, seqnos 7-10 2016-08-04 02:01:53 13961 [Note] WSREP: IST received: 4f33cb6b-598a-11e6-8738-8b3354956db1:10 # 通過 IST 增量傳輸 ( error.log )
shell > service mysql bootstrap-pxc # 啟動 PXC 集群,申明這是第一個節點不需要數據同步 ( 僅第一次 ) shell > mysql mysql > update mysql.user set password=password('123456') where user='root'; # 設置 root 密碼 ( 安全 ) mysql > flush privileges; mysql > grant reload, lock tables, replication client on *.* to sstuser@localhost identified by 's3cret'; # 建立同步用戶
四、測試 PXC
1、其餘兩台伺服器按照上面的步驟分別配置。
2、其中 my.cnf 中 wsrep_node_address 參數的值改為自身 IP 即可。
3、最後的授權用戶 sstuser 無需創建,會自動同步第一個節點的數據。
4、可以在任意節點創建資料庫,查看是否同步到其餘節點。
5、關閉任意節點,之後其餘節點寫入數據,啟動關閉的節點查看是否數據完整。
6、將節點全部關閉,重新啟動,測試集群是否正常。( 這種情況為一個新的集群,要保證第一個啟動的是數據最新的節點。)
# 一個小報錯:
測試中將所有節點關閉後,又重新啟動。數據最新的節點啟動成功 ( bootstrap-pxc ),並且狀態正常。
但是啟動其餘節點時,報錯如下 ( error.log ):
2016-08-04 01:05:09 12517 [ERROR] WSREP: gcs/src/gcs_group.cpp:group_post_state_exchange():321: Reversing history: 10 -> 7, this member has applied 3 more events than the primary component.Data loss is possible. Aborting.
且第一個節點的狀態也變成了 wsrep_cluster_status 為 Non-Primary ,wsrep_local_state_comment 為 Initialized ,wsrep_ready 為 OFF 。
最終查資料發現需要刪除 /var/lib/mysql/grastate.dat 文件 ( 啟動不了的節點上 ),然後啟動即可。( 原因未知 )
# 實際環境中,至少保證一個節點線上。例如升級硬體時輪流升級,我想大多也會這麼做吧。
# 另外這也是官方為何建議至少三個節點做 PXC ,因為當只有兩個節點時,失敗的節點會導致剩下的節點進入 Non-Primary 狀態,導致集群失敗。
五、監控指標
shell > mysql -uroot -p123456 mysql> show global status like 'wsrep_%'; +------------------------------+--------------------------------------+ | Variable_name | Value | +------------------------------+--------------------------------------+ | wsrep_local_state_uuid | 505b98ce-54e4-11e6-99d7-d64eb985b5d7 | | wsrep_protocol_version | 7 | | wsrep_last_committed | 3 | | wsrep_replicated | 0 | | wsrep_replicated_bytes | 0 | | wsrep_repl_keys | 0 | | wsrep_repl_keys_bytes | 0 | | wsrep_repl_data_bytes | 0 | | wsrep_repl_other_bytes | 0 | | wsrep_received | 2 | | wsrep_received_bytes | 159 | | wsrep_local_commits | 0 | | wsrep_local_cert_failures | 0 | | wsrep_local_replays | 0 | | wsrep_local_send_queue | 0 | | wsrep_local_send_queue_max | 1 | | wsrep_local_send_queue_min | 0 | | wsrep_local_send_queue_avg | 0.000000 | | wsrep_local_recv_queue | 0 | | wsrep_local_recv_queue_max | 2 | | wsrep_local_recv_queue_min | 0 | | wsrep_local_recv_queue_avg | 0.500000 | | wsrep_local_cached_downto | 0 | | wsrep_flow_control_paused_ns | 0 | | wsrep_flow_control_paused | 0.000000 | | wsrep_flow_control_sent | 0 | | wsrep_flow_control_recv | 0 | | wsrep_cert_deps_distance | 0.000000 | | wsrep_apply_oooe | 0.000000 | | wsrep_apply_oool | 0.000000 | | wsrep_apply_window | 0.000000 | | wsrep_commit_oooe | 0.000000 | | wsrep_commit_oool | 0.000000 | | wsrep_commit_window | 0.000000 | | wsrep_local_state | 4 | | wsrep_local_state_comment | Synced | | wsrep_cert_index_size | 0 | | wsrep_cert_bucket_count | 22 | | wsrep_gcache_pool_size | 1320 | | wsrep_causal_reads | 0 | | wsrep_cert_interval | 0.000000 | | wsrep_incoming_addresses | 192.168.12.128:3306 | | wsrep_desync_count | 0 | | wsrep_evs_delayed | | | wsrep_evs_evict_list | | | wsrep_evs_repl_latency | 0/0/0/0/0 | | wsrep_evs_state | OPERATIONAL | | wsrep_gcomm_uuid | 76fe2163-58dd-11e6-9409-e3323d524fdf | | wsrep_cluster_conf_id | 1 | | wsrep_cluster_size | 1 | | wsrep_cluster_state_uuid | 505b98ce-54e4-11e6-99d7-d64eb985b5d7 | | wsrep_cluster_status | Primary | | wsrep_connected | ON | | wsrep_local_bf_aborts | 0 | | wsrep_local_index | 0 | | wsrep_provider_name | Galera | | wsrep_provider_vendor | Codership Oy <info@codership.com> | | wsrep_provider_version | 3.16(r5c765eb) | | wsrep_ready | ON | +------------------------------+--------------------------------------+ 59 rows in set (0.00 sec)
# 集群狀態監控
1、wsrep_cluster_status
監控該值是否為 Primary ,可能的值有 Primary 、Non-Primary 、Disconnected 。非 Primary 為不正常。
2、wsrep_connected 、wsrep_ready
監控參數值是否為 ON ,非 ON 為不正常。
3、wsrep_local_cert_failures 、wsrep_local_bf_aborts
複製衝突導致失敗的次數,為 0 最理想。
4、wsrep_flow_control_sent 、wsrep_flow_control_recv
流量控制信息,發送、接收。
5、wsrep_local_recv_queue
當前接收的隊列長度。
# 需要收集的數據
1、wsrep_local_recv_queue 、wsrep_local_send_queue # 隊列大小
2、wsrep_flow_control_sent 、wsrep_flow_control_recv # 進出流量
3、wsrep_replicated 、wsrep_received # 進出事務數量
4、wsrep_replicated_bytes 、wsrep_received_bytes # 進出事務位元組
5、wsrep_local_cert_failures 、wsrep_local_bf_aborts # 複製衝突
# 有了這些指標,可以通過 Zabbix 監控腳本來收集數據、報警、繪圖等。
五、附加
1、wsrep_cluster_state_uuid
集群 UUID ,所有節點該值必須一致,否則某節點沒有加入到集群中。
2、wsrep_cluster_conf_id
集群變化次數,所有節點都應一致,否則某節點已經被隔離了。
3、wsrep_cluster_size
該值顯示當前集群中有多少節點。
4、wsrep_cluster_status
正常情況所有節點值為 Primary ,表示集群正常。如為 Non-Primary 或 Disconnected 則當前節點不能被操作。
5、wsrep_ready
該值為 ON 表示節點正常,可以接受 SQL Query ;否則幾乎所有的 Query 都會報錯 'ERROR 1047 (08S01) Unknown Command'。
6、wsrep_connected
該值為 ON 表示正常,證明該節點已經連接到集群組。
7、wsrep_local_state_comment
通常情況下返回 Synced 表示節點處於工作狀態,如返回 Initialized 則表明節點已經不在正常工作狀態。