天天看點

PXC使用介紹

PXC使用介紹

使用者發起Commit,在收到Ok之前

叢集每次發起一個動作,都會有一個唯一的編号 

PXC獨有的Global Trx Id 

動作發起者: commit_cb

其它節點多了一個動作: apply_cb 

上面的這些動作,是通過那個端号互動的?

4567

4568端口 IST 隻是在節點下線,重新開機加入那一個時間有用

4444 隻會在新節點加入進來時起作用

pxc結構裡面

如果主節點寫入過大

apply_cb 時間會不會跟不上

wsrep_slave_threads參數 解決apply_cb跟不上問題 配置成和CPU的個數相等或是1.5倍

目前節點commit_cb 後就可以傳回了

推過去之後,驗證通過就行了可以傳回用戶端了

cb==commit block 送出資料塊

SST和IST

State Snapshot Transfer(SST) 全量傳輸

Incremental state Transfer(IST)增量傳輸

每個節點都有一份獨立的資料

我們通過SST和IST說一下PXC的啟動關閉流程

當我們啟動第一個節點, bootstrap-pxc 

目前叢集沒有其它成員,你就是老大了。

在第一個節點上可以把帳号初始化, 基本初始化,都搞定了。

初始化的時間,随便那個節點都可以。

其它節點再起來就是要加入進來的。 joining node

wsrep_cluster_address = gcomm://xxxx,,xxxx,xxx

你是新成員,你沒有ID

第一個節點 把自已備份一下(snapshot) 傳給加入的新節點: SST

socat.x86_64

perl-IO_Socket

nc

另一個節點是死的還是活的?

這時兩個節點會進行一個投票

當第三個節點要加入的時間

PXC使用介紹

給貢獻資料者

Donor

新啟動的節點-> open ->primary 

4567 端口溝通

joiner 我是新加入的

joined 

需要有一個人能給他提供一份全量的資料

SST 發生的者的身上就是donor

donor 需要發起innobackupex 

傳輸SST有幾種方法:

1. xtrabackup

2. mysqldump mysql庫也會傳輸

3. rsync 對innodb整個庫進行鎖定來拷貝,保證一緻性

如果node3 需要停一下機

reboot , 加點記憶體,換個硬碟的

node3 希望說能不能把增量傳給我

IST

Galera 2.X之前隻能傳全量

node3能停多長時間,可以傳IST

gcache.size 

wsrep_provider_options 預設128M

wsrep_provider_options="gcache.size=1G"

gid : 1000 

1200 > gcache.size .id 

gralea.cache

gcache.size到底配置設定多大合适呢

1個小時 

可以算一個小時的binlog量大概多大

一般預留2-3小時,gcache.size大小2-4G

假設我們三個節點都關閉了,會發生什麼呢

發現一個可怕的事情

全部傳SST

沒有做到最後關閉的節點,最先啟動

建議滾動關閉

1. node1 先閉 修複完畢

加回來了

2. 再關node2 ,修複完畢

3. 再關node3 ,修複完畢

原則要保持Group裡最少一個成員活着

滾動更新,先更新叢集裡的一個節點,再下一個節點再下一個節點

Gcache 資料沒了。

資料庫關閉之後,會儲存一個last Txid

node1 1000

node2 1001

node3 1002

node1 是整個叢集的老大

其它節點加進來發現資料不一緻,以老大為準

會有丢資料風險

所有節點全關閉了

第一個用bootstrap-pxc啟動的節點,他就為自已是老大了

第二節點加來了,還在老大的關系嗎

兄弟兩個是平起平座的

面臨一個丢資料問題

mysqld —wsrep_recover —bootstrap-pxc 使用mysqld —wsrep_recover參數啟動mysqld

—wsrep_recover

When server is started with this variable, it will parse Global Transaction ID (GTID) from log, and if the GTID is found, assign it as initial position for actual server start. This option is used to recover GTID.

[mysqld_safe]

wsrep_recover=1

wsrep_recover=on

PXC使用介紹

node3 1002 

node3 bootstrap-pxc 

gcache 最小的GTID是多少呢

1002

node2加入 : 1001 

SST

node1加入 一樣的傳輸 SST

怎麼避免gcache丢失這件事情呢

1. 所有的節點中最少有一個線上,進行滾動重新開機

2. 利用主從的概念,把一個從節點轉化成PXC裡的節點

PXC叢集的腦裂問題

輸入任何指令都顯示unkown command

推薦是三個節點

假設變成了兩個節點

突然出現了兩叢集之間連不通了

模拟

iptables Start 4567端口連不通了。

kill -9 mysqld

忽略腦裂的指令

SET GLOBAL wsrep_provider_options="pc.ignore_sb=true";

PXC使用中的特點 和注意事項

PXC裡任何節點都可以讀寫

他的ID增長順序是什麼樣的

show global variables like "%auto%";

offset 是節點數

起始值有啥差別嗎

1,2,3

node1, 1 node2: 2 node3: 3 offset: 3

1,4, 7,10 node1 

5, 8, 11 … node2

6, 9, 12 …. node3 

跟雙主一樣,通過控制步長和起始值來避免自增主鍵沖突

update tb set col3=col3-100 where id=10;

native 處理 node1,node2, node3 理論可以同時處理這個SQL

在PXC裡同時更新到同一行記錄是可能存在這個風險的

樂觀并發控制

隻鎖本地的行記錄,不鎖别人的,不鎖全局,本地處理完再發給别人,那麼就有可能大家同時更新同一行記錄

Error: 1213 SQLSTATE: 40001

考慮單節點寫入

DDL操作

在某成員上做DDL操作,atler table 操作時間可以長一點。

會把整個叢集鎖着

ptcc做一個大表來模拟

metadata lock 搞定

在PXC結裡,不可能不做表結構變更呀

解決:使用pt-online-schema-change

開發建個表告訴你資料不能複制

MyISAM引擎不能被複制,PXC隻支援Innodb 

mysql庫全是MyISAM人家咋複制呢

DCL語句 Create user, drop user, grant ,revoke

pxc結構裡面每個表必須有主鍵

如果沒有主建,有可能會造成叢集中每個節點的Data page裡的資料不一樣

node1 data page 6 rows 

node2 data page : 7rows 

select * from tb limit 100;

不支援表級的鎖 lock /unlock tables

pxc裡隻能把slow log ,query log 放到File裡,不能放到table裡

不支援XA事務

三個節點。假設其中有一個節點 SSD,其它節點是HDD,整個叢集的硬體配置要一樣

木桶理論 :一個木桶打多少水以木桶裡最短的那塊木闆決定,水太多會溢出

整個叢集數最好為3,最多是8個

其中一個節點死掉了,還有2個節點

發現整個叢集還能活

writeSet最大是多呢

wsrep_max_ws_rows

wsrep_max_ws_size 不要超過16KB

pxc的監控

clustercheck

本文轉自 DBAspace 51CTO部落格,原文連結:http://blog.51cto.com/dbaspace/1872627