PXC+ProxySQL高可用環境搭建

一 PXC介紹

Percona XtraDB Cluster是一個針對MySQL的開源的高可用數據庫集羣解決方案。它確保高可用性,防止停機以及數據丟失,併爲不斷增長的環境提供線性可擴展性。集羣包含多個節點,每個節點數據相同。

PXC是基於運行XtraDB存儲引擎的Percona server,使用galera library。推薦的數據傳輸方式是Percona XtraBackup。

PXC集羣推薦至少配置3個節點,避免創建具有兩個或任意偶數個節點的集羣。

可以將現有的MySQL服務器實例轉換爲PXC的節點。還可以將任何節點從集羣中分離出來,並將其用作常規MySQL服務器實例。

 

PXC集羣包含以下特點:

  • 同步複製
    1. 事務要麼在所有節點提交,要麼不提交
  • 多主複製
  • 真正的並行複製
    1. 從庫上的多個線程在行級別上執行並行複製
  • 自動節點配置
    1. 添加一個節點,它就會自動同步
  • 數據一致性
  • 包含ProxySQL的配置腳本
    1. Percona提供了一個ProxySQL包,帶有ProxySQL管理工具,可以自動配置Percona
    2. XtraDB Cluster節點.
  • SSL加密的自動配置
    1. 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

解決辦法:

wget http://ftp.tu-chemnitz.de/pub/linux/dag/redhat/el6/en/x86_64/rpmforge/RPMS/socat-1.7.2.4-1.el6.rf.x86_64.rpm

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官方手冊

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章