MySQL 高可用架構之 PXC 集羣

1、PXC 集羣

Percona XtraDB Cluster (簡稱 PXC) 是 Percona 公司開源的實現 MySQL 高可用的解決方案。它將 Percona Server 和 Percona XtraBackup 與 Galera 庫集成,以實現多主同步複製。和 MySQL 傳統的異步複製相比,它可以保證數據的強一致性,在任什麼時候刻集羣中任意節點上的數據狀態都是徹底一致的,而且整個架構實現了去中心化,全部節點都是對等的,即容許你在任意節點上進行寫入和讀取,集羣會把數據狀態同步至其餘全部節點。但目前 PXC 集羣只支持 InnoDB 存儲引擎,並具備如下限制:html

  • 添加新節點時,必須從現有節點之一複製完整數據集。若是是 100GB,則複製 100GB。爲了減小網絡開銷,建議在搭建集羣前使用備份的方式將全部節點初始的數據狀態調整至一致。
  • 不支持 LOCK TABLES ,在多主設置的狀況下也不支持 UNLOCK TABLES。
  • 不支持鎖定功能,如 GET_LOCK(),RELEASE_LOCK() 等。
  • 因爲可能在提交時回滾,所以也不支持 XA 事務 (分佈式事務) 。
  • 全部表必須具備主鍵。
  • 因爲節點是對等的,因此整個集羣的寫吞吐量受限於性能最差的節點,若是一個節點變慢,則整個羣集都會變慢。所以應該保證全部節點的硬件配置一致,並避免單個節點超負載運行。
  • 容許的最大事務大小由 wsrep_max_ws_rows 和 wsrep_max_ws_size 參數共同定義,所以超大型事務會被拆分爲一系列小型事務,如加載大數據集 LOAD DATA INFILE。
  • 因爲在集羣級別採用樂觀鎖進行併發控制,因此事務在 COMMIT 階段仍然有被停止的可能。如兩個事務在不一樣的集羣節點上提交對相同的行的寫入,此時只有其中一個能夠成功提交,另外一個將被停止。

雖然 PXC 集羣存在以上限制,但就目前而言,它仍然是解決數據一致性和高可用性的最好方案,其搭建步驟以下:node

2、集羣搭建

爲保證集羣高可用,羣集最少要有 3 個節點,這裏以搭建一個 3 節點的集羣爲例,具體以下:mysql

2.1 準備安裝

1. 刪除 MariaDBlinux

1.這裏個人服務器版本爲 Centos 7.x ,須要刪除自帶的 MariaDB 數據庫,避免對後面安裝形成影響:git

yum -y remove mari*
複製代碼

2. 開放訪問牆端口github

開放如下四個防火牆端口,其做用和開放命令分別以下:sql

# MySQL 對外提供服務的端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
# 請求進行全量同步(SST)的端口
firewall-cmd --zone=public --add-port=4444/tcp --permanent
# 集羣中各個節點間的通信端口
firewall-cmd --zone=public --add-port=4567/tcp --permanent
# 請求進行增量同步(IST)的端口
firewall-cmd --zone=public --add-port=4568/tcp --permanent
複製代碼

3. 關閉SELINUXshell

SELinux 安全模塊可能會限制對 Percona XtraDB Cluster 的數據訪問。此時能夠在運行時使用 setenforce 0 命令進行更改,也能夠經過修改 /etc/selinux/config 文件中的 SELINUX 屬性的值爲 disabled ,從而進行永久性的更改:數據庫

vi /etc/selinux/config
# 修改
SELINUX=disabled
複製代碼

修改該文件後須要重啓才能生效:bootstrap

reboot
複製代碼

2.2 在線安裝

配置 yum 源後,直接使用 yum 命令進行在線安裝,命令以下:

sudo yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
sudo yum install Percona-XtraDB-Cluster-57
複製代碼

使用以上命令安裝完成後,會同時安裝好 Percona Server 數據庫,它基於 MySQL 社區版進行了擴展加強,並徹底兼容原有版本,使用方式也徹底一致,啓動命令以下:

sudo systemctl start mysql
複製代碼

2.3 修改密碼

使用如下命令獲取安裝時自動生成的 root 帳戶的密碼:

sudo grep 'temporary password' /var/log/mysqld.log
複製代碼

使用 root 帳戶登陸,並修改其帳戶密碼:

# 登陸服務
mysql -u root -p
# 修改密碼
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
# 退出服務
mysql> exit
複製代碼

以後使用如下命令中止 MySQL 服務:

sudo systemctl stop mysql
複製代碼

2.4 搭建集羣

以上安裝過程在三臺主機上均相同執行,以後就能夠開始集羣的搭建。首先須要修改每一個服務器上的 /etc/my.cnf 文件,第一個節點上須要增長的內容以下:

[mysqld]

# PXC集羣中每一個MySQL實例的惟一標識,不能重複
server-id=1  

wsrep_provider=/usr/lib64/galera3/libgalera_smm.so

# PXC集羣的名稱和全部服務地址
wsrep_cluster_name=pxc-cluster  
wsrep_cluster_address=gcomm://192.168.0.226,192.168.0.227,192.168.0.228

# 當前節點的名稱和服務地址
wsrep_node_name=pxc1 
wsrep_node_address=192.168.0.226

# 指定同步方法和帳戶信息,這個用戶在下文會進行建立
wsrep_sst_method=xtrabackup-v2 
wsrep_sst_auth= sstuser:123456

#開啓嚴厲模式,它會阻止用戶執行 Percona XtraDB Cluster 所不支持的功能。
pxc_strict_mode=ENFORCING  

# 指定二進制日誌的格式
binlog_format=ROW 
# 指定默認的存儲引擎
default_storage_engine=InnoDB 
# Galera 僅支持 InnoDB 的 interleaved(2) 鎖定模式:
# 該模式下全部 INSERT SQL 都不會有表級 AUTO-INC 鎖,多個語句能夠同時執行
innodb_autoinc_lock_mode=2 
複製代碼

第2、三個節點的配置與上面基本相同,可是須要修改 server id 以及當前節點的名稱和地址,具體以下:

server-id=2
wsrep_node_name=pxc2
wsrep_node_address=192.168.0.227
複製代碼
server-id=3
wsrep_node_name=pxc3
wsrep_node_address=192.168.0.228
複製代碼

2.5 啓動集羣

第一個節點須要以引導模式啓動:

sudo systemctl start mysql@bootstrap.service
複製代碼

在將其餘節點添加到羣集以前,須要登陸當前節點,來爲 SST 操做建立用戶並提供權限,命令以下:

# 建立用戶
CREATE USER 'sstuser'@'localhost' IDENTIFIED BY '123456';
# 授予權限
GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO 'sstuser'@'localhost';
# 刷新權限
FLUSH PRIVILEGES;
複製代碼

接着在第二和第三個節點上正常啓動數據庫服務,命令以下:

sudo systemctl start mysql
複製代碼

啓動後,能夠登陸任意節點並使用如下命令查看集羣狀態。輸出中的 wsrep_cluster_size 的值應該爲 3 ,即集羣中節點總數爲 3,此時表明全部節點都已成功加入集羣,至此集羣已經搭建完成。

mysql> show status like 'wsrep%';
+----------------------------------+----------------------------------------------------------+
| Variable_name                    | Value                                                    |
+----------------------------------+----------------------------------------------------------+
| wsrep_local_state_uuid           | 8bcc22cf-bfab-11e9-8a49-6e46c7af709e                     |
.......
| wsrep_incoming_addresses         | 192.168.0.227:3306,192.168.0.228:3306,192.168.0.226:3306 |
| wsrep_gcomm_uuid                 | c8afc276-c623-11e9-a9ea-677d72419479                     |
| wsrep_cluster_conf_id            | 3                                                        |
| wsrep_cluster_size               | 3                                                        |
| wsrep_cluster_state_uuid         | 8bcc22cf-bfab-11e9-8a49-6e46c7af709e                     |
| wsrep_cluster_status             | Primary                                                  |
| wsrep_connected                  | ON                                                       |
| wsrep_local_bf_aborts            | 0                                                        |
| wsrep_local_index                | 2                                                        |
| wsrep_provider_name              | Galera                                                   |
| wsrep_provider_vendor            | Codership Oy <info@codership.com>                        |
| wsrep_provider_version           | 3.37(rff05089)                                           |
| wsrep_ready                      | ON                                                       |
+----------------------------------+----------------------------------------------------------+
複製代碼

2.6 節點下線

PXC 集羣容許動態下線節點,但須要注意的是節點的啓動命令和關閉命令必須一致,如以引導模式啓動的第一個節點必須以引導模式來進行關閉:

systemctl stop mysql@bootstrap.service
複製代碼

其餘節點則能夠按照正常方式關閉:

service stop mysql
複製代碼

因爲全部節點都是對等的,因此下線第一個節點和下線其餘節點在效果上都是相同的,以上就是關於 PXC 集羣搭建的所有內容。

參考資料

Percona XtraDB Cluster 5.7 Documentation

更多文章,歡迎訪問 [全棧工程師手冊] ,GitHub 地址:github.com/heibaiying/…

相關文章
相關標籤/搜索