
使用者發起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
另一個節點是死的還是活的?
這時兩個節點會進行一個投票
當第三個節點要加入的時間
給貢獻資料者
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
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