PXC原理分析


基本環境

節點1 192.168.1.114
節點2 192.168.1.115
節點3 192.168.1.116

Percona-Xtradb-Cluster 5.6 版本下載:

wget http://www.percona.com/downloads/Percona-XtraDB-Cluster-56/Percona-XtraDB-Cluster-5.6.21-25.8/binary/tarball/Percona-XtraDB-Cluster-5.6.21-rel70.1-25.8.938.Linux.x86_64.tar.gz

依賴包安裝:

[root@bogon mysql3306]# yum install  perl-DBD-MySQL.x86_64 perl-IO-Socket-SSL.noarch socat.x86_64 nc -y

[root@bogon opt]# yum install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm -y

[root@bogon opt]#yum install epel-release -y

[root@bogon mysql3306]# yum install -y percona-xtrabackup

初始化報錯:

This probably means that your libc libraries are not 100 % compatible with this binary MySQL version. The MySQL daemon, mysqld, should work normally with the exception that host name resolving will not work. This means that you should use IP addresses instead of hostnames when specifying MySQL privileges !

解決辦法:echo "ip 主機名" >>/etc/hosts

初始化報錯:

./bin/my_print_defaults: error while loading shared libraries: libssl.so.6: cannot open shared object file: No such file or directory
FATAL ERROR: Neither host 'bogon' nor 'localhost' could be looked up with
./bin/resolveip
Please configure the 'hostname' command to return a correct
hostname.
If you want to solve this at a later stage, restart this script
with the --force option

解決辦法:[root@bogon mysql]# yum -y install openssl098e.x86_64

[root@bogon mysql]# ./scripts/mysql_install_db 

[root@bogon mysql]# cp support-files/mysql.server /etc/init.d/mysql

 

my.cnf中添加配置文件:

binlog_format = row

default_storage_engine=InnoDB
innodb_locks_unsafe_for_binlog=1
innodb_autoinc_lock_mode=2
wsrep_cluster_name=zhangshuo #cluster 的名字
wsrep_cluster_address=gcomm://192.168.1.114,192.168.1.115,192.168.1.116 #cluster 中的節點 ip
wsrep_node_address=192.168.1.115 #cluster 當前節點的 ip
wsrep_provider=/usr/local/mysql/lib/libgalera_smm.so
#wsrep_sst_method=rsync
wsrep_sst_method=xtrabackup
wsrep_sst_auth=sst:mysql

 

第一節點啟動:

[root@bogon mysql]# /etc/init.d/mysql bootstrap-pxc

root@localhost:mysql3306.sock  04:11:44 [(none)]>grant all privileges on *.* to 'mysql'@'%' identified by 'mysql';

root@localhost:mysql3306.sock  04:15:31 [(none)]>grant all privileges on *.* to 'sst'@'localhost' identified by 'mysql';

root@localhost:mysql3306.sock  04:16:18 [(none)]>flush privileges;

其他節點啟動:

[root@bogon mysql]# /etc/init.d/mysql  start

檢查集群狀態:

show global status like “wsrep%”;

wsrep_local_state  4      #表示正常監聽

wsrep_local_state_comment  Synced

wsrep_cluster_status  Primary    #表示是主節點可寫入
wsrep_connected  ON

 

注意:
第一個節點啟動的節點( 如果集群全部關閉,第一個起動也需要用這樣的形式)
#/etc/init.d/mysql bootstrap-pxc
其它節點
#/etc/init.d/mysql start
備注:
如集群是不是所有的節點都關閉不用使#/etc/init.d/mysql bootstrap-pxc 啟動。都可以用
#/etc/init.d/mysql start啟動

新加入節點相當於新啟一個節點,在啟動時間把自己寫入 wsrep_cluster_address 中,同時在
wsrep_node_address 中聲明自已的 IP 即可。

 

當一個節點需要加入集群時(稱為joiner)向集群申請全量,也可以指定集群中的機器:/etc/init.d/mysql start --wsrep_sst_donor=xxx.

SST:state snapshop transfer(鏡像全量傳輸),提供SST的節點稱為donor,一般不參與負載,IST:Incremental State Transfer(增量傳輸)。

SST,IST這些數據存放在gcache.size,默認是128M,有參數

 

 

gcache對應磁盤中galera.cache,數據庫重啟gcache會全部釋放。

gcache分配算法:一個小時形成了多少binlog ,10分鍾500M,一個小時3G。如果說離線1個小時,就需要設置大於3G

[root@bogon data]# cat grastate.dat
# GALERA saved state
version: 2.1
uuid: 6dae0dc2-2834-11e6-a45a-66ae03d92d96
seqno: -1  
cert_index:

seqno-1表示已加入到集群,數據庫關閉后seqno會變。

 

PXC不是sql層的合並,而是文件、引擎層的合並。基本沒有延遲,如果設備足夠快如pci-e設備,其他節點可能比主庫還快。

 

a,b,c 三個節點

a: update tb set col1=col1+100 where id = 100;

b: update tb set col1=col1-100 where id=100;

c: update tb set col1=500 where id=100;

如果3個事物同一時間同時更新往其他節點會驗證時會通過嗎?

因為是本地native processing操作是樂觀鎖,所以他們都可以操作成功。往其他節點同步時會更新沖突,三個節點都回滾,報Error: 1213 SQLSTATE: 40001

updatedelete引起的這些問題。可以將updatedelete放到一個節點解決問題。所以嚴格環境建議只有一個節點寫,其他節點做故障接管、或讀。

 

PXC的局限性:

1,僅僅工作在InnoDB引擎表上,因此對mysql庫下的系統表的修改不能被復制,但是DDL操作時可以被復制的,所以可以通過create usergrant 等方式操作系統表

2,不支持在沒有主鍵的表上的DELETE操作,select ... limit 也會在不同節點上返回不同的值

3,不支持的操作: LOCK/UNLOCK TABLES、 lock functions (GET_LOCK(), RELEASE_LOCK

4,query log日志不能存放在表里面,必須存放在文件

5,最大的事務大小由 wsrep_max_ws_rowswsrep_max_ws_size定義,LOAD DATA INFILE10k行提交一次,這種事務將被分割成數

個小的事務.

6,由於集群是基於樂觀的並發控制( optimistic concurrency control ),事務沖突的情況可能會在commit階段發生,當多個節點修改同時同一行數據,只有其中一個節點能夠成功,失敗的節點將終止,並且返回死鎖錯誤代碼 Error: 1213 SQLSTATE: 40001

7,不支持XA事務,因為XA事務有可能在commit的時候出現異常發生rollback

8,整個集群的吞吐量/性能取決於最慢的那個節點,因為需要在所有節點上做Certification,同時還取決於節點間的網絡性能,因此需要所有節點都有相同的硬件配置,並且網絡、磁盤等性能要盡可能的高,例如使用SSD

9,最小建議的集群節點數為3,為解決腦裂, 最多8個節點

10. DDL語句要特別小心,建議使用pt-online-schema-change。 

 

利用從庫使用IST加入PXC集群:

保證從庫沒有延遲的情況下將同步和數據庫關閉,配置PXC參數。記錄從庫同步位置然后解析binlog記錄最后position點。

然后去主庫(PXC節點)看最后同步position執行什么事務,找到對應xid。將主庫grastate.dat拷貝到slave並修改seqno為對應的xid,最后啟動mysql完成IST加入PXC集群。(建議使用mysqld_safe start  --wsrep_sst_donor=xxx。xid從這台機器來,所以要指定這個機器)

 

在PXC集群環境中也有uuid概念:wsrep_gcomm_uuid ,此uuid公共全局可見。(注意與binlog中記錄的serverid+事物編號的GTID是兩種不同的概念)。

官方文檔: http://www.percona.com/doc/percona-xtradb-cluster/5.6/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM