1. PXC (Percona Xtradb Cluster)
Percona : 基於 MySQL 數據庫已二次開發的數據庫產品
xtradb: 存儲引擎
Cluster: 集羣
1.1 概念:
PXC 是屬於一套比較完美的 MySQL高可用集羣解決方案,相比較傳統的基於主從複製的架構,基本上可以達到實時同步。且節點與節點之間是相互低等的 ,不存在主從關係。
2. PXC 實現的功能
1) 多主複製: 真正的多點讀寫集羣,在任何時候都寫數據都是最新的
2) 同步複製: 集羣不同的節點之間的數據同步,沒有延遲,在數據庫掛掉之後,數據不會消失
3) 併發複製: 從節點在apply 數據時,支持並行執行,有更改的性能表現
4) 故障切換: 因爲支持多點寫入所以在出現數據庫故障時可以很容易進行故障切換
5) 熱插拔: 在服務期間,如果數據庫掛掉了,只要監控程序發現的夠快,不可服務的時間就會少很多,在節點故障時間,節點本身對集羣的影響非常小
6) 自動節點克隆: 在新節點或者停機維護時,增量數據或基礎數據 不需要人工手動備份提供,galera cluster 會自動拉取在線節點的數據,集羣最終會變爲 一致
7) 對應用透明: 集羣的維護,對應用程序是透明的,幾乎感覺不到
3. PXC 優點
1) 實現MySQL數據庫集羣架構的高可用性和數據的強一致性
2) 完成了真正意義上的多節點讀寫的集羣方案
3) 改善了傳統意義上的主從複製延遲問題,基本上達到了實時同步
4) 新加入的節點可以自動部署,無需提供手動備份,維護起來特別方便
5) 由於多節點寫入,所以數據庫故障切換很容易
4. PXC 缺點
1) 新加入的節點開銷大,需要複製完整的數據,採用SST 傳輸開銷太大
2) 任何更新十五都需要全局驗證通過,纔會在每個節點庫上執行,集羣性能受限於性能最差的一臺
3) 因爲需要保證數據的一致性,所以在多節點併發寫時,鎖衝問題比較嚴重
4) 存在寫擴大的問題,所有的節點上都會發生操作
5) 只支持innodb存儲引擎的表
6) 沒有表級別鎖定,執行DDL語句操作會把整個集羣鎖住,而且也kill不了
7) 所有的表必須 含有主鍵,不然操作數據時會報錯
5 PXC 傳輸數據方式
- PXC 有兩種節點的數據傳輸方式
1) SST 全量傳輸
SST傳輸有: xtrabackup、mysqldump、rsync三種方法
2) IST增量傳輸
IST傳輸有:xtrabackup 一種方法
6. PXC 使用端口
Port | 作用 |
---|---|
3306 | 用於提供數據庫服務 |
4567 | 集羣中節點之間的通信端口 |
4568 | 節點之間增量複製的端口 |
4444 | 節點之間全量複製的端口 |
7. 部署 PXC 集羣
實驗環境:
- 要搭建 PXC 集羣,至少. 需要三臺虛擬機來組成一個集羣,且三臺不能存在初從關係,而是各自爲主,所以三臺是對等關係
Host | IP | 環境 |
---|---|---|
Host-A | 192.168.116.101 | 基礎環境,可聯網 |
Host-B | 192.168.116.102 | 基礎環境,可聯網 |
Host-C | 192.168.116.103 | 基礎環境,可聯網 |
1) 在所有節點上部署PXC服務
- 安裝網絡中的程序
yum install -y http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm
- 修改 yum 源
- 關閉祕鑰檢測
[root@localhost ~]# vim /etc/yum.repos.d/percona-release.repo
# 8 gpgcheck = 1 改爲 gpgcheck = 0
# 9 刪除掉
# 14 gpgcheck = 1 改爲 gpgcheck = 0
# 15 刪除掉
# 將以下的內容全部刪除
- yum 安裝 PXC 服務
- 等待時間較長
yum -y install Percona-XtraDB-Cluster-57
2) 部署 Host-A
- PXC 安裝時默認會安裝 MySQL
- 修改 MySQL配置文件
- 配置位於
/etc/percona-xtradb-cluster.conf.d/mysqld.cnf
- 配置位於
[root@localhost ~]# cd /etc/percona-xtradb-cluster.conf.d/
[root@localhost percona-xtradb-cluster.conf.d]# vim mysqld.cnf
[mysqld]
server-id=1 # ID號不能相同
datadir=/usr/local/pxc/data # 指定MySQL數據存放位置
socket=/var/lib/mysql/mysql.sock # 指定socket文件
log-error=/usr/local/pxc/log/mysqld.log # 指定錯誤日誌
pid-file=/usr/local/pxc/data/mysqld.pid # 指定 pid文件
log-bin=mysql-bin # 開啓二進制日誌文件
log_slave_updates # 是否開啓 slave 複製
expire_logs_days=7 # logs 天數
- 創建 MySQL 數據存放目錄、日誌存放目錄、更改屬主屬組
pwd
/etc/percona-xtradb-cluster.conf.d/
mkdir /usr/local/pxc/{data,logs} -p
pwd
/etc/percona-xtradb-cluster.conf.d/
chown -R mysql:mysql /usr/local/pxc/
- 修改PXC配置文件
[root@localhost percona-xtradb-cluster.conf.d]# pwd
/etc/percona-xtradb-cluster.conf.d
[root@localhost percona-xtradb-cluster.conf.d]# vim wsrep.cnf
wsrep_cluster_address=gcomm://192.168.116.101 , 192.168.168.116.102 , 192.168.116.103
# 指定當前集羣內的所有節點
wsrep_node_address=192.168.116.101 # 指定本機節點地址
wsrep_cluster_name=pxc-cluster # 集羣名稱
wsrep_node_name=pxc-cluster-node-1 # 節點名稱
pxc_strict_mode=PERMISSIVE # 同步數據時爲寬容模式
wsrep_sst_auth="sstuser:123.com" # SST 全量備份時使用的 用戶
- 傳輸配置文件
- 由於配置文件無多少差異
- 將 本機的配置文件傳輸給 Host-B、Host-C
3) 部署 Host-B 節點
[root@localhost ~]# cd /etc/percona-xtradb-cluster.conf.d/
[root@localhost percona-xtradb-cluster.conf.d]# vim mysqld.cnf
[mysqld]
server-id=2 # 修改服務 ID
[root@localhost percona-xtradb-cluster.conf.d]# vim wsrep.cnf
wsrep_node_address=192.168.116.102 # 當前節點地址
wsrep_node_name=pxc-cluster-node-2 # 當前節點name
- 創建 數據目錄、日誌目錄、並更改屬主屬組
pwd
/etc/percona-xtradb-cluster.conf.d/
mkdir /usr/local/pxc/{data,logs} -p
pwd
/etc/percona-xtradb-cluster.conf.d/
chown -R mysql:mysql /usr/local/pxc/
4) 部署 Host-C 節點
[root@localhost ~]# cd /etc/percona-xtradb-cluster.conf.d/
[root@localhost percona-xtradb-cluster.conf.d]# vim mysqld.cnf
[mysqld]
server-id=3 # 修改服務 ID
[root@localhost percona-xtradb-cluster.conf.d]# vim wsrep.cnf
wsrep_node_address=192.168.116.103 # 當前節點地址
wsrep_node_name=pxc-cluster-node-3 # 當前節點name
- 創建 數據目錄、日誌目錄、並更改屬主屬組
pwd
/etc/percona-xtradb-cluster.conf.d/
mkdir /usr/local/pxc/{data,logs} -p
pwd
/etc/percona-xtradb-cluster.conf.d/
chown -R mysql:mysql /usr/local/pxc/
5) 部署MySQL
-
在此之前每臺服務器關閉防火牆沙盒
-
開啓數據庫之後沒有權限,需要在配置文件中添加
- 需要修改 root 用戶密碼
- 跳過密碼檢測
[root@localhost ~]# vim /etc/percona-xtradb-cluster.conf.d/mysqld.cnf
skip-grant-tables # 跳過MySQL密碼檢測
- 啓動 MySQL 服務
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl start mysql@bootstrap
- 設置 root 密碼
- 設置 mysql 登錄密碼
- 因跳過了密碼檢測,不需要密碼
[root@localhost ~]# mysql -u root
- 重新啓動服務
- 特殊原因建議,先停止,在啓動
[root@localhost ~]# systemctl stop mysql@bootstrap
[root@localhost ~]# systemctl start mysql@bootstrap
- 更改用戶密碼
[root@localhost ~]# mysql -u root
mysql> update mysql.user set authentication_string=password("123.com") where User="root"; #在用戶表中插入用戶
Query OK, 0 rows affected, 1 warning (0.00 sec)
Rows matched: 1 Changed: 0 Warnings: 1
# 凡是直接修改 user表的都需要刷新用戶
mysql> flush privileges; # 刷新user 用戶表
Query OK, 0 rows affected (0.01 sec)
mysql> grant all on *.* to "sstuser"@"localhost" identified by "123.com";
#授權給全量複製的用戶
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> set password=password("123.com");
#給root設置密碼 會有警告需要設置密碼的時間
mysql> alter user "root"@"localhost" password expire never;
#讓root密碼永久生效
- 設置密碼之後,將跳過密碼配置項刪除
[root@localhost ~]# vim /etc/percona-xtradb-cluster.conf.d/mysqld.cnf
skip-grant-tables # 刪除
- 重新啓動 MySQL服務
[root@localhost ~]# systemctl stop mysql@bootstrap
[root@localhost ~]# systemctl start mysql@bootstrap
- 登錄Msyql
[root@localhost percona-xtradb-cluster.conf.d]# mysql -u root -p123.com
- Host-B、Host-C 配置一樣
8) 驗證
- 創建數據庫,進行驗證
[root@localhost percona-xtradb-cluster.conf.d]# mysql -u root -p123.com
# 在使用命令時,報錯,對數據庫進行任何操作會是如此
mysql> create database aaa;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
# 需要重置 登錄密碼
mysql> alter user 'root'@'localhost' identified by '123.com';
Query OK, 0 rows affected (0.01 sec)
# 再次創建
mysql> create database aaa;
Query OK, 1 row affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| aaa |
| mysql |
| performance_schema |
| sys |
+--------------------+
6 rows in set (0.01 sec)
- 另外服務器
mysql> alter user 'root'@'localhost' identified by '123.com';
Query OK, 0 rows affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| aaa |
| bbb |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)