<code> </code><code>Percona XtraDB Cluster(下文簡稱PXC叢集)提供了MySQL高可用的一種實作方法。PXC叢集以節點組成(推薦至少3節點,後面會讨論兩節點的情況),每個節點都是基于正常的 MySQL/Percona Server,意味着你可以從叢集中分離出某節點單獨使用。叢集中每個節點都包含完整的資料。</code><code></code>
<code> </code><code>PXC叢集主要由兩部分組成:Percona Server with XtraDB和Write Set Replication patches(使用了Galera library,一個通用的用于事務型應用的同步、多主複制插件)。</code>
<code>PXC的特性和優點:</code><code></code>
<code> </code><code>1、同步複制</code>
<code> </code><code>2、支援多主複制</code>
<code> </code><code>3、支援并行複制</code>
<code> </code><code>4、作為高可用方案,相比其他方案其結構和實施相對簡單明了 </code>
<code>PXC的局限和劣勢:</code>
<code> </code><code>1、 目前版本(5.6.20)的複制隻支援InnoDB引擎,其他存儲引擎的更改不複制。然而,DDL(Data Definition Language) 語句在statement級别被複制,并且,對mysql.*表的更改會基于此被複制。例如CREATE USER...語句會被複制,但是 INSERT INTO mysql.user...語句則不會。(也可以通過wsrep_replicate_myisam參數開啟myisam引擎的 複制,但這是一個實驗性的參數)。</code>
<code> </code><code>2、 由于PXC叢集内部一緻性控制的機制,事務有可能被終止,原因如下:叢集允許在兩個節點上通知執行操作同一行的兩個事務,但是隻有一個能執行成功,另一個 會被終止,同時叢集會給被終止的用戶端傳回死鎖錯誤(Error: 1213 SQLSTATE: 40001 (ER_LOCK_DEADLOCK)).</code>
<code> </code><code>3、寫入效率取決于節點中最弱的一台,因為PXC叢集采用的是強一緻性原則,一個更改操作在所有節點都成功才算執行成功。</code>
<code>下面從安裝部署和功能和性能測試三個方面開始PXC之旅。</code>
<code>安裝部署</code>
<code>實驗環境:三台server(硬體配置相同),資訊如下:</code>
<code></code><code>node </code><code>#1</code>
<code> </code><code>hostname: percona1</code>
<code> </code><code>IP: 192.168.1.35</code>
<code></code><code>node </code><code>#2</code>
<code> </code><code>hostname: percona2</code>
<code> </code><code>IP: 192.168.1.36</code>
<code></code><code>node </code><code>#3</code>
<code> hostname: percona3</code>
<code> IP: 192.168.1.37</code>
<code>注意:</code>
<code>Firewall has been set up to allow connecting to ports 3306, 4444,4567 and 4568</code>
<code>SELinux isdisabled如果不關閉SELinux,啟動其他(node1之外)節點時,錯誤日志裡會記錄“</code><code>[ERROR]</code> <code>WSREP:Permission denied”</code>
<code></code>
<code>一.在三台server安裝Percona-XtraDB-Cluster-56</code>
<code> 1.安裝epel源 yum install http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm</code>
<code>(包含比較全比較新的軟體源。最關鍵的是包含PreconaXtraDB Cluster所依賴的socat軟體)</code>
<code>vi /etc/yum.repos.d/epel.repo (修改epel原配置以可用epel源)</code>
<a href="http://s3.51cto.com/wyfs02/M00/4D/FD/wKioL1RfQ0DDQXrqAABaqQF-20c197.jpg" target="_blank"></a>
<code>将其中baseurl行的注釋去掉,同時将mirror行注釋</code>
<code> 2、安裝Precona XtraDB Cluster所需要的擴充包,以防在後期配置時候報錯</code>
<code>shell> yuminstall -y cmake gcc gcc-c++ libaio libaio-devel automake autoconf bzr bisonlibtool ncurses5-devel boost</code>
<code> 3.安裝配置Precona 官方yum源</code>
<code>yum install http://www.percona.com/downloads/percona-release/percona-release-0.0-1.x86_64.rpm</code>
<code> 4.安裝socat</code>
<code>socat is a relay for bidirectional data transfer between two independentdata channels. (Socat是一個在兩個獨立資料的雙向傳輸之間起到中繼作用的軟體)</code>
<code>配置好epel源之後,可直接執行 yum install socat*</code>
<code>若無法yum安裝socat,則按照以下步驟編譯安裝</code>
<code> wget http://www.dest-unreach.org/socat/download/socat-1.7.2.4.tar.gz</code>
<code> tar zxvf socat-1.7.2.4.tar.gz</code>
<code> ./configure</code>
<code> Make && make install</code>
<code> 5.安裝perl元件(xtrabackup需要的元件)</code>
<code> yum install perl-DBD-MySQL perl-DBI perl-Time-HiRes</code>
<code> 6.安裝Percona-XtraDB-Cluster及其相關元件</code>
<code> yum install Percona-XtraDB-Cluster-56 (如下圖)</code>
<code>二.初始化Percona-XtraDB-Cluster叢集</code>
<code>在任意節點(一般為node1)上執行叢集的初始化操作</code>
<code>建立/etc/my.cnf,内容如下</code>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<code>[mysqld]</code>
<code>datadir=</code><code>/var/lib/mysql</code>
<code>user=mysql</code>
<code># Path to Galeralibrary</code>
<code>wsrep_provider=</code><code>/usr/lib64/libgalera_smm</code><code>.so</code>
<code># Cluster connectionURL contains the IPs of node#1, node#2 and node#3----所有節點的ip</code>
<code>#第一次啟動node1節點時,此處不寫各節點IP,需寫成下面一行配置</code>
<code>wsrep_cluster_address=gcomm:</code><code>//</code>
<code>#第一次啟動node1(初始化叢集)完成後,此處需要改成下面一行配置</code>
<code>#wsrep_cluster_address=gcomm://192.168.1.35,192.168.1.36,192.168.1.37</code>
<code># In order for Galerato work correctly binlog format should be ROW</code>
<code>binlog_format=ROW</code>
<code># MyISAM storageengine has only experimental support</code>
<code>default_storage_engine=InnoDB</code>
<code># This changes howInnoDB autoincrement locks are managed and is a requirement for Galera</code>
<code>innodb_autoinc_lock_mode=2</code>
<code># Node #1 address----本機ip</code>
<code>wsrep_node_address=192.168.1.35</code>
<code># SST method----節點間同步的方式</code>
<code>wsrep_sst_method=xtrabackup-v2</code>
<code># Cluster name</code>
<code>wsrep_cluster_name=my_centos_cluster</code>
<code># Authentication forSST method----來做節點間資料同步的賬号密碼</code>
<code>wsrep_sst_auth=</code><code>"sstuser:s3cret"</code>
<code>(其他mysql相關參數絕大多數也可以直接在配置檔案裡添加)</code>
<code>注意:第一次啟動node1(初始化叢集)時,配置檔案裡wsrep_cluster_address=gcomm:// 不需加上各節點IP,否則其他節點會無法啟動;當初始化完成後,需将此處修改為加上各節點IP</code>
<code>在node1執行/etc/init.d/mysql bootstrap-pxc 來初始化叢集,如圖</code>
<code>然後再修改配置檔案my.cnf将wsrep_cluster_address=gcomm:// 行改為 wsrep_cluster_address=gcomm://192.168.1.35,192.168.1.36,192.168.1.37</code>
<code>然後,執行service mysqlrestart 至此,叢集初始化完成,并且node1啟動</code>
<code>設定mysql root密碼</code>
<code>mysql@percona1>UPDATE mysql.user SET password=PASSWORD("Passw0rd") whereuser=’root’;</code>
<code>mysql@percona1>FLUSH PRIVILEGES;</code>
<code>設定用于複制的賬戶密碼</code>
<code>mysql@percona1>GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO ’sstuser’@’localhost’identified by ‘s3cret’;</code>
<code>三.配置node2、node3并啟動</code>
<code> 将node1的/etc/my.cnf内容拷貝至node2和node3,并修改其中wsrep_node_address=192.168.1.35</code>
<code>改為本機ip。</code>
<code> 然後啟動node2、node3 。執行servicemysql start</code>
<code>注意:node2、node3會從node1同步賬号設定的更改</code>
<code> 配置成功以後如果叢集内所有節點執行個體均關閉(crash)後,再啟動時都需要選擇一個存有最新正 确資料的節點作為主節點,執 行 /etc/init.d/mysql bootstrap-pxc 啟動; 然後再啟動他節點。</code>
<code>寫入效率初測</code>
<code>測試方法為</code>
<code>1.将三個節點分别作為單獨的server導入一個sql檔案,執行三次取時間平均值</code>
<code> time mysql -uroot -pxxx system < /system.sql</code>
<code> 平均時間約為6m20s</code>
<code>2.開啟完整叢集,在三個節點分别執行一遍導入操作,取三次執行時間平均值</code>
<code> 平均時間約為7m50s</code>
<code>經過初步測試寫性能PXC叢集相比單server下降約12%。</code>
<code>參考官方文檔一些可以調優的參數:</code><code></code>
1. Variable wsrep_slave_threads :複制線程的數量,galera支援真正的并行複制,适當增大此值可以在複制時獲得更好的吞吐量,如果更改此值後遇到複制的某些問題,嘗試将此值改回1,檢視是否解決。(預設1)
2. wsrep_provider_options="gcache.size=512M",調節galera的緩存大小,或許對減少IO有幫助
3. variable gcache.mem_size
4. variable gcache.size 此參數定義作為‘IST增量同步’的内容源的galera.cache檔案的大小。此檔案設定的大些以便節點重新加入叢集式更有可能采用IST而非SST。(預設128M)
5. variable gcs.fc_master_slave 此變量指定叢集中是否隻有一個master節點
6. variable pc.weight This variable specifies thenode weight that’sgoing to be used for Weighted Quorumcalculations. Default Value 1
7. innodb_flush_log_at_trx_commit
為0時:log buffer 每秒向logfile 重新整理一次,同時log file 每秒執行一次所記錄語句,以使資料持久化。
為1時:預設值。每次事務送出後,log buffer向log file 重新整理一次,同時log file 執行一次資料持久化操作。
為2時:每次事務送出後,log buffer向log file 重新整理一次,但是從log file 向磁盤做資料持久化的操作是每秒執行一次
将此值改為0後,插入全量測試資料的時間有了質的飛越
Hapeoxy代理
上文主要介紹了PXC叢集本身的内容,PXC作為一個叢集,需要前端配以代理伺服器,做負載均衡,才能真正實作其高可用的價值。Percona官方推薦用haproxy作為前端代理,下面介紹一下haproxy的簡要配置:
個人感覺haproxy配置上比lvs相對簡單,但功能并不遜色,我試驗環境的haproxy配置檔案如下
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<code>#---------------------------------------------------------------------</code>
<code># Example configuration for a possibleweb application. See the</code>
<code># full configuration options online.</code>
<code># http://haproxy.1wt.eu/download/1.4/doc/configuration.txt</code>
<code># Global settings</code>
<code>global</code>
<code> </code><code># to have these messages end up in /var/log/haproxy.log you will</code>
<code> </code><code># need to:</code>
<code> </code><code># 1) configure syslog to accept network log events. This is done</code>
<code> </code><code># by adding the '-r' option tothe SYSLOGD_OPTIONS in</code>
<code> </code><code># /etc/sysconfig/syslog</code>
<code> </code><code># 2) configure local2 events to go to the /var/log/haproxy.log</code>
<code> </code><code># file. A line like thefollowing can be added to</code>
<code> </code><code># /etc/sysconfig/syslog</code>
<code> </code><code>#</code>
<code> </code><code># local2.* /var/log/haproxy.log</code>
<code> </code><code>log 127.0.0.1 local0</code>
<code> </code><code>log 127.0.0.1 local1 notice</code>
<code> </code><code>chroot </code><code>/var/lib/haproxy</code>
<code> </code><code>pidfile </code><code>/var/run/haproxy</code><code>.pid</code>
<code> </code><code>maxconn 4000</code>
<code> </code><code>user haproxy</code>
<code> </code><code>group haproxy</code>
<code> </code><code>daemon</code>
<code> </code><code># turn on stats unix socket</code>
<code> </code><code>stats socket </code><code>/var/lib/haproxy/stats</code>
<code># common defaults that all the'listen' and 'backend' sections will</code>
<code># use if not designated in their block</code>
<code>defaults</code>
<code> </code><code>mode http</code>
<code> </code><code>log global</code>
<code> </code><code>option tcplog</code>
<code> </code><code>option dontlognull</code>
<code># option http-server-close</code>
<code># option forwardfor except127.0.0.0/8</code>
<code> </code><code>option redispatch</code>
<code> </code><code>retries 3</code>
<code> </code><code>maxconn 2000</code>
<code> </code><code>timeout connect 5s</code>
<code> </code><code>timeout client 50s</code>
<code> </code><code>timeout server 50s</code>
<code># timeout http-keep-alive 10s</code>
<code> </code><code>timeout check 10s</code>
<code>listen mysql-cluster 0.0.0.0:3306</code>
<code> </code><code>mode tcp</code>
<code> </code><code>balance roundrobin</code>
<code> </code><code>server node1 192.168.1.35:3306 check</code>
<code> </code><code>server node2 192.168.1.36:3306 check</code>
<code> </code><code>server node3 192.168.1.37:3306 check</code>
<code># 建議首先設定haproxy的監控界面,便于直覺的觀察後端節點是否線上</code>
<code>listen status 192.168.1.34:8080</code>
<code> </code><code>stats </code><code>enable</code>
<code> </code><code>stats uri </code><code>/status</code>
<code> </code><code>stats auth admin:xxxx</code>
<code> </code><code>stats realm (haproxy\ statistic)</code>
本文轉自kai404 51CTO部落格,原文連結:http://blog.51cto.com/kaifly/1574640,如需轉載請自行聯系原作者