一 PXC介紹
Percona XtraDB Cluster是一個針對MySQL的開源的高可用數據庫集羣解決方案。它確保高可用性,防止停機以及數據丟失,併爲不斷增長的環境提供線性可擴展性。集羣包含多個節點,每個節點數據相同。
PXC是基於運行XtraDB存儲引擎的Percona server,使用galera library。推薦的數據傳輸方式是Percona XtraBackup。
PXC集羣推薦至少配置3個節點,避免創建具有兩個或任意偶數個節點的集羣。
可以將現有的MySQL服務器實例轉換爲PXC的節點。還可以將任何節點從集羣中分離出來,並將其用作常規MySQL服務器實例。
PXC集羣包含以下特點:
- 同步複製
- 事務要麼在所有節點提交,要麼不提交
- 多主複製
- 真正的並行複製
- 從庫上的多個線程在行級別上執行並行複製
- 自動節點配置
- 添加一個節點,它就會自動同步
- 數據一致性
- 包含ProxySQL的配置腳本
- Percona提供了一個ProxySQL包,帶有ProxySQL管理工具,可以自動配置Percona
- XtraDB Cluster節點.
- SSL加密的自動配置
- PXC包含pxc-encrypt-cluster-traffic變量,可以啓動自動的SSL加密配置
- PXC集羣性能經過優化,可以隨着生產負載的增加而擴展。
- 完全兼容Mysql, Percona Server和MariaDB
PXC最大的優勢:強一致性、無同步延遲。
缺點:這不能用作有效的寫擴展解決方案;寫入效率取決於節點中最慢的一臺
限制:
1、存儲引擎:
基於PXC的複製僅適用於InnoDB存儲引擎。
對其他存儲引擎的表,包括mysql.*表之類的系統表,任何寫入都不會被複制。
那創建用戶那豈不是無法同步了?關於這個問題。對於基於DDL方式的語句還是被支持的。
DDL語句使用基於語句級別的方式來實現(即不使用row模式)。
對mysql.*表的所有已DDL方式的更改都將以語句級別式進行復制。
如:CREATE USER… DDL被複制(語句級)
INSERT INTO mysql.user… myisam存儲引擎,不會被複制,因爲非DDL語句
當然也可以配置wsrep_replicate_myisam參數實現(不建議使用)
2、不支持的查詢:
LOCK TABLES在多主模式中不支持UNLOCK TABLES以及LOCK TABLES
鎖定功能,如GET_LOCK(),RELEASE_LOCK()等也不被支持
3、查詢日誌不能定向到表:
如果啓用查詢日誌記錄,則必須將日誌轉發到文件
使用general_log和general_log_file選擇查詢日誌記錄和日誌文件名稱
log_output = file # Author : Leshami # Blog : https://blog.csdn.net/leshami
4、最大事務大小:
允許的最大事務大小由wsrep_max_ws_rows和wsrep_max_ws_size變量定義
LOAD DATA INFILE方式處理每10000行提交一次。對於大的事務將被分解衆多小型事務
5、集羣樂觀併發控制:
PXC集羣使用樂觀併發控制,事務發出COMMIT可能仍會在該階段中止
可以有兩個事務寫入相同的行並在單獨的Percona XtraDB集羣節點中提交,並且只有其中一個可以成功提交。
失敗的將被中止。對於集羣級中止,Percona XtraDB集羣返回死鎖錯誤代碼:
(Error: 1213 SQLSTATE: 40001 (ER_LOCK_DEADLOCK)).
6、不支持XA事務:
7、硬件配置短板限制:
整個羣集的寫吞吐量受最弱節點的限制。如果一個節點變慢,整個集羣變慢。
如果您對穩定的高性能有要求,那麼它應該由相應的硬件支持。
8、建議的最小羣集大小是3個節點。第三個節點可以是仲裁者。
9、InnoDB虛假更改功能不受支持。
10、enforce_storage_engine=InnoDB與wsrep_replicate_myisam=OFF(默認)不兼容 。
11、所有表必須有主鍵,不支持不帶主鍵條件的delete。
12、高負載時避免ALTER TABLE … IMPORT / EXPORT
在集羣模式下運行Percona XtraDB集羣時,請避免ALTER TABLE … IMPORT / EXPORT工作負載。
如果未在所有節點上同步執行,則可能導致節點不一致。
二 安裝PXC
2.1 試驗環境
角色 |
主機名 |
IP |
操作系統 |
PXC版本 |
pxc1 |
pc1 |
192.168.1.202 |
CentOS 6 |
5.7.28 |
pxc2 |
pc2 |
192.168.1.203 |
||
pxc3,代理服務器 |
pc3 |
192.168.1.204 |
2.2 安裝步驟
這裏採用yum安裝方式。
2.2.1 開放防火牆端口
需要開放4個端口 3306,4444,4567,4568
3306-mysql實例端口
4567-pxc cluster相互通訊的端口
4444-用於SST傳送的端口
4568-用於IST傳送的端口
#開放這四個端口給192.168.1網段。
iptables --insert INPUT --protocol tcp --match tcp --dport 3306 --source 192.168.1.0/24 --jump ACCEPT
iptables --insert INPUT --protocol tcp --match tcp --dport 4567 --source 192.168.1.0/24 --jump ACCEPT
iptables --insert INPUT --protocol tcp --match tcp --dport 4568 --source 192.168.1.0/24 --jump ACCEPT
iptables --insert INPUT --protocol tcp --match tcp --dport 4444 --source 192.168.1.0/24 --jump ACCEPT
#將配置更新到配置文件
iptables-save > /etc/sysconfig/iptables
2.2.2 確保SELINUX狀態爲permissive
#查看SELINUX狀態
getenforce
#修改selinux模式
臨時修改:
setenforce 0 #設置SELinux 成爲permissive模式,值爲1表示enforcing模式。
永久修改:
vi /etc/sysconfig/selinux
將SELINUX=enforcing改爲SELINUX=disabled
2.2.3 卸載CentOS 自帶的mysql
rpm -qa | grep -i mysql | xargs sudo rpm -e --nodeps
2.2.4 安裝軟件依賴包
yum install perl-IO-Socket-SSL perl-DBD-MySQL perl-Time-HiRes socat nc -y
/*
假如安裝socat報錯:
Requires: socat
解決辦法:
rpm -ivh socat-1.7.2.4-1.el6.rf.x86_64.rpm
*/
2.2.5 配置Percona Repositories
yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
若yum install安裝報錯:
Cannot open: https://repo.percona.com/yum/percona-release-latest.noarch.rpm. Skipping,則可以手動點擊該頁面進行下載,再上傳到服務器上,執行下面命令進行下載:
rpm -ivh percona-release-latest.noarch.rpm
2.2.6 安裝PXC軟件包
yum install Percona-XtraDB-Cluster-57 -y
/*
假如安裝時報錯:libev.so.4()(64bit) is needed。
解決辦法:
wget ftp://rpmfind.net/linux/atrpms/el6-x86_64/atrpms/stable/libev-4.04-2.el6.x86_64.rpm
rpm -ivh libev-4.04-2.el6.x86_64.rpm
*/
2.2.7 啓停PXC server
service mysql start
數據庫自動安裝到了/var/lib/mysql下。
#查看並記錄給臨時生成的密碼
grep 'temporary password' /var/log/mysqld.log
#修改root密碼
mysqladmin -u root -p password #會提示讓輸入新密碼
service mysql stop
2.2.8 爲寫集複製配置節點
vi /etc/my.cnf
添加:
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
wsrep_cluster_name=pxc-cluster
wsrep_cluster_address=gcomm://192.168.1.202,192.168.1.203,192.168.1.204
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth= "sstuser:自定義一個密碼"
pxc_strict_mode=ENFORCING
binlog_format=ROW
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
wsrep_node_name=pxc1
wsrep_node_address=192.168.1.202
--注意:在節點2和節點3上需要相應地修改wsrep_node_name及wsrep_node_address的值。
--我原本是按官方文檔裏修改的/etc/percona-xtradb-cluster.conf.d/wsrep.cnf,但是發現不行,修改/etc/my.cnf可以。
2.2.9 初始化PXC
2.2.9.1 引導第一個節點
/etc/init.d/mysql bootstrap-pxc
注意:在RHEL或CentOS 7上執行systemctl start [email protected]
使用上面的命令啓動節點時,它將使用wsrep_cluster_address=gcomm://來進行引導。這告訴節點使用wsrep_cluster_conf_id設置爲1。將其他節點添加到集羣后,可以重新啓動節點正常,將再次使用標準配置。
#創建SST專用用戶(密碼需要和2.2.8處wsrep_sst_auth裏定義的密碼一樣)
CREATE USER 'sstuser'@'localhost' IDENTIFIED BY 'passw0rd';
GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO
'sstuser'@'localhost';
#創建代理用戶,供ProxySQL使用
CREATE USER 'proxysql_user'@'192.168.1.204' IDENTIFIED BY 'passw0rd';
GRANT insert,delete,update,select ON *.* TO 'proxysql_user '@'192.168.1.204';
#創建遠程root用戶
grant all privileges on *.* to 'root'@'%' identified by '密碼';
#驗證
如果wsep_cluster_status爲Disconnected,wsrep_connected爲OFF,則不正常,說明配置得有問題。
2.2.9.2 添加其他節點到集羣
service mysql start
在第二個,第三個節點上可以看到之前在第一個節點上創建的sstuser用戶也自動同步過來了:
mysql> select host,user from mysql.user;
+-----------+---------------+
| host | user |
+-----------+---------------+
| localhost | mysql.session |
| localhost | mysql.sys |
| localhost | root |
| localhost | sstuser |
+-----------+---------------+
4 rows in set (0.00 sec)
此時,在任意節點上查看集羣狀態,都能看到當前集羣有三個節點,且都是primary:
2.2.10 驗證數據同步
在任意節點上創建一個庫或一個表,都能自動同步到其他節點上:
mysql> create database baidd;
Query OK, 1 row affected (0.00 sec)
mysql> create table t1(id int primary key ,hostname varchar(30));
Query OK, 0 rows affected (0.03 sec)
mysql> insert into t1(id) values(1,’aa’);
Query OK, 1 row affected (0.00 sec)
三 安裝ProxySQL實現讀寫分離及負載均衡
3.1 ProxySQL簡單介紹
ProxySQL是一個高性能的SQL代理。ProxySQL作爲一個守護進程運行,被監控進程監視着,在崩潰時會被重新啓動,以最小化停機時間。
它接受來自MySQL客戶端的查詢,並將其轉發到後端MySQL服務器。
大多數配置可以在運行時完成,不需要重啓。
3.2 安裝ProxySQL
#最好在額外一臺機器上安裝ProxySQL,這裏資源有限,選擇在node3上安裝
yum install proxysql2 -y
datadir默認是/var/lib/proxysql。
也可以點擊https://www.percona.com/downloads/proxysql2/下載安裝包進行安裝。
3.3 修改管理員用戶密碼
修改/etc/proxysql.cnf,改下admin_credentials值。
--默認值是admin:admin,表示用戶和密碼都是admin。
3.4 修改/etc/proxysql-admin.cnf文件
修改以下幾行:
export PROXYSQL_PASSWORD='proxysql admin密碼'
export CLUSTER_USERNAME='PXC集羣的管理員賬號'
export CLUSTER_PASSWORD='PXC集羣的管理員密碼'
export CLUSTER_HOSTNAME='192.168.1.202' #PXC集羣中的其中一個節點
export MAX_CONNECTIONS="1000" #根據自己需要進行配置
export MODE="singlewrite" #這裏配置成了單寫模式
export CLUSTER_APP_USERNAME='proxysql_user'
export CLUSTER_APP_PASSWORD='passw0rd' # proxysql_user的密碼
export MONITOR_PASSWORD='自定義一個monitor用戶密碼'
3.5 啓動ProxySQL
service proxysql start
3.6 開放防火牆6032,6033端口
6032是admin管理端口,用於查看和配置ProxySQL。
6033是接收sql語句的端口,類似於mysql的3306端口。
#開放這倆端口給192.168.1網段。
iptables --insert INPUT --protocol tcp --match tcp --dport 6032 --source 192.168.1.0/24 --jump ACCEPT
iptables --insert INPUT --protocol tcp --match tcp --dport 6033 --source 192.168.1.0/24 --jump ACCEPT
#將配置更新到配置文件
iptables-save > /etc/sysconfig/iptables
3.7 將Percona XtraDB羣集節點自動配置到ProxySQL中
proxysql-admin --config-file=/etc/proxysql-admin.cnf --enable
輸出信息如下:
This script will assist with configuring ProxySQL for use with
Percona XtraDB Cluster (currently only PXC in combination
with ProxySQL is supported)
ProxySQL read/write configuration mode is singlewrite
Configuring the ProxySQL monitoring user.
ProxySQL monitor user name as per command line/config-file is monitor
User 'monitor'@'192.%' has been added with USAGE privileges
Configuring the Percona XtraDB Cluster application user to connect through ProxySQL
Percona XtraDB Cluster application user name as per command line/config-file is sstuser
Percona XtraDB Cluster application user 'proxysql_user'@'192.%' has been added with ALL privileges, this user is created for testing purposes
Adding the Percona XtraDB Cluster server nodes to ProxySQL
Write node info
+---------------+--------------+------+--------+
| hostname | hostgroup_id | port | weight |
+---------------+--------------+------+--------+
| 192.168.1.204 | 10 | 3306 | 1000 |
+---------------+--------------+------+--------+
ProxySQL configuration completed!
ProxySQL has been successfully configured to use with Percona XtraDB Cluster
You can use the following login credentials to connect your application through ProxySQL
mysql --user=proxysql_user -p --host=localhost --port=6033 --protocol=tcp
--可以看到自動在PXC集羣裏創建一個monitor用戶,選取了192.168.1.204作爲了寫節點。
#驗證配置結果
mysql -u admin -p -P 6032 -h 127.0.0.1
--這些PXC節點都是自動配置上的,如果後續需要添加節點,可以再往該表手動插入數據。
#登錄ProxySQL,新插入一條數據,驗證下PXC集羣是否能看到該記錄
mysql --user=proxysql_user -ppassw0rd --host=192.168.1.204 --port=6033 --protocol=tcp -e "insert into baidd.t1(id,hostname) values(10,@@hostname);"
--注意:如果想從ProxySQL中移除PXC節點並停止監視進程,可以使用proxysql-admin --config-file=/etc/proxysql-admin.cnf --disable命令。
--官方文檔上說--enable會自動配置scheduler,但我發現我這裏scheduler表爲空,所以這裏手動插入下:
INSERT INTO scheduler (active,interval_ms,filename,arg1,comment)
VALUES (1,10000,'/usr/bin/proxysql_galera_checker','--config-file=/etc/proxysql-admin.cnf
--write-hg=10 --read-hg=11 --writer-count=1 --mode=singlewrite --priority=192.168.1.202:3306,192.168.1.203:3306,192.168.1.204:3306
--log=/var/lib/proxysql/cluster_one_proxysql_galera_check.log','cluster_one');
LOAD SCHEDULER TO RUNTIME;
3.8 驗證讀寫分離
mysql> select match_digest,destination_hostgroup,active,apply from mysql_query_rules;
+---------------------+-----------------------+--------+-------+
| match_digest | destination_hostgroup | active | apply |
+---------------------+-----------------------+--------+-------+
| ^SELECT.*FOR UPDATE | 10 | 1 | 1 |
| ^SELECT | 11 | 1 | 1 |
+---------------------+-----------------------+--------+-------+
[root@pc3 ~]# mysql --user=proxysql_user -ppassw0rd --host=localhost --port=6033 --protocol=tcp -e "insert into baidd.t1(id,hostname) values(12,@@hostname);"
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@pc3 ~]# mysql --user=proxysql_user -ppassw0rd --host=localhost --port=6033 --protocol=tcp -e "select * from baidd.t1 where id=12;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+----+----------+
| id | hostname |
+----+----------+
| 12 | pc3 |
[root@pc3 ~]# mysql --user=proxysql_user -ppassw0rd --host=localhost --port=6033 --protocol=tcp -e "select @@hostname for update"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| pc3 |
+------------+
[root@pc3 ~]# mysql --user=proxysql_user -ppassw0rd --host=localhost --port=6033 --protocol=tcp -e "select @@hostname"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| pc1 |
+------------+
寫落到了pc3(pc3屬於10寫組)上,讀落到了pc1上,說明實現了讀寫分離
3.9 驗證負載均衡
[root@pc2 ~]#vi a.sh
for i in {1..200}
do
mysql --user=proxysql_user -ppassw0rd --host=192.168.1.204 --port=6033 --protocol=tcp -e "select @@hostname"
done
sh a.sh > a.log
[root@pc2 ~]# cat a.log | grep pc1 | wc -l
98
[root@pc2 ~]# cat a.log | grep pc2 | wc -l
102
--看來還挺均衡的。
如果沒有負載均衡,查看下日誌(/var/lib/proxysql/proxysql.log)看看是否有報錯。
四 驗證集羣高可用
關掉主庫pc3的mysql,遠程連接proxysql插入一條帶有主機名的數據
[root@pc2 ~]# mysql --user=proxysql_user -ppassw0rd --host=192.168.1.204 --port=6033 --protocol=tcp -e "insert into baidd.t1(id,hostname) values(17,@@hostname);"
[root@pc2 ~]# mysql --user=proxysql_user -ppassw0rd --host=192.168.1.204 --port=6033 --protocol=tcp -e "select *from baidd.t1 where id= 17;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+----+----------+
| id | hostname |
+----+----------+
| 17 | pc2 |
+----+----------+
可以看到pc3宕機後,仍然能正常插入,數據插入到了pc2上。
試驗發現,當原主庫啓動後,仍然會往原主庫上插入數據。
#關掉其中一個讀節點,驗證幾百個select,看下是否都正常發送到了另一個讀節點
--擔心ProxySQL單點的話,可以在兩臺機器上裝下ProxySQL,並通過Keepalive配置一個浮動ip。
--本篇文章主要參考自PXC官方手冊