1. 程式人生 > >如何在Debian 8上安裝Percona XtraDB Cluster for MySQL

如何在Debian 8上安裝Percona XtraDB Cluster for MySQL

翻譯&轉載來源:https://www.howtoforge.com/tutorial/how-to-install-percona-xtradb-cluster-for-mysql/

 

在本文中,我將向您展示如何在多主複製中配置具有三個節點的MySQL資料庫叢集。多主複製允許在每個節點中寫入記錄,因此如果一個節點失敗,我們可以在另一個節點上工作,好像什麼也沒發生。

Percona的官方文件可以在官方網站https://www.percona.com/上找到。 

首先,為什麼我們選擇三個節點而不僅僅是兩個節點?在任何叢集中,節點數應該是奇數,因此在斷開節點的情況下,我們假設最高伺服器組具有新資料,並且應該複製到下行節點以避免資料丟失。這僅與解決資料複製中的衝突有關,我們不會將只寫入斷開的節點的資料丟失。

這用於避免稱為裂腦的情況,其中我們無法自動選擇哪個節點具有正確的資料。例如,考慮兩個節點彼此斷開連線的2節點叢集,並將相同的記錄寫入兩個節點:當他們重新聯機時誰贏了?我們不知道,所以裂腦發生了,我們必須手動決定哪個記錄是正確的。

確定叢集中哪些部分具有正確資料所需的節點數稱為QUORUM,在我們的示例中,仲裁將為2.因此我們需要2臺伺服器始終相互連線。如果所有三個節點都會關閉,我們就會分裂大腦,我們必須決定伺服器應該手動進入自舉模式,這是確定將從分裂腦中恢復的主要伺服器的過程。

 

在Debian 8上配置Percona XtraDB叢集

本教程描述瞭如何在Debian 8伺服器上安裝和配置三個Percona XtraDB Cluster節點,我們將使用Percona儲存庫中的軟體包。

  • 伺服器1
    • 主機名:mysql1.local.vm
    • IP地址:192.168.152.100
  • 節點2
    • 主機名:  mysql2.local.vm
    • IP地址:192.168.152.110
  • 節點3
    • 主機名:  mysql3.local.vm
    • IP地址:192.168.152.120

在每臺主機上,按如下所示修改檔案/ etc / hosts以確保DNS正常工作。

127.0.0.1 localhost
192.168.152.100 mysql1.local.vm mysql1
192.168.152.110 mysql2.local.vm mysql2
192.168.152.120 mysql3.local.vm mysql3

# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

先決條件

本教程中描述的過程需要以下最小的伺服器設定:

 

步驟1.安裝Percona Xtradb群集

在所有節點上,以root身份執行以下命令:

wget https://repo.percona.com/apt/percona-release_0.1-4.$(lsb_release -sc)_all.deb
dpkg -i percona-release_0.1-4.$(lsb_release -sc)_all.deb
apt-get update
apt-get -y install percona-xtradb-cluster-57

顯然,輸入您要選擇的mysql密碼。

安裝軟體包後,mysqld將自動啟動。使用/etc/init.d/mysql stop在所有三個節點上停止mysqld。

 

步驟2.配置第一個節點

應將單個節點配置為能夠引導群集。有關引導群集的更多資訊,請參閱引導群集

  1. 確保新增這些行到配置檔案/etc/mysql/my.cnf在的[mysqld]部分的端部的第一個節點(mysql1.local.vm):

[mysqld]

...

# Path to Galera library
wsrep_provider=/usr/lib/libgalera_smm.so

# Cluster connection URL contains the IPs of node#1, node#2 and node#3
wsrep_cluster_address=gcomm://192.168.152.100,192.168.152.110,192.168.152.120

# In order for Galera to work correctly binlog format should be ROW
binlog_format=ROW

# MyISAM storage engine has only experimental support
default_storage_engine=InnoDB

# This InnoDB autoincrement locking mode is a requirement for Galera
innodb_autoinc_lock_mode=2

# Node #1 address
wsrep_node_address=192.168.152.100

# SST method
wsrep_sst_method=xtrabackup-v2

# Cluster name
wsrep_cluster_name=my_ubuntu_cluster

# Authentication for SST method
wsrep_sst_auth="sstuser:PASSW0RD"
  1. 在我的案例“PASSW0RD”中注意您設定的密碼。

  2. 使用以下命令啟動第一個節點:

   [email protected]:~# /etc/init.d/mysql bootstrap-pxc

此命令將啟動第一個節點並引導群集,如果一切正常,您將看到類似的內容:

[email protected]:~# /etc/init.d/mysql bootstrap-pxc
[ ok ] Bootstrapping Percona XtraDB Cluster database server: mysqld ..
[email protected]:~#

在第一個節點啟動後,使用經典的mysql -p命令連線到mysql,然後可以檢查叢集狀態,執行查詢顯示狀態,如'wsrep%';如下例所示:

mysql> show status like 'wsrep%';
+----------------------------+--------------------------------------+
| Variable_name              | Value                                |
+----------------------------+--------------------------------------+
| wsrep_local_state_uuid     | 0251a27c-8a19-11e6-905b-f3f13b0ddc5b |
...
| wsrep_local_state          | 4                                    |
| wsrep_local_state_comment  | Synced                               |
...
| wsrep_cluster_size         | 1                                    |
| wsrep_cluster_status       | Primary                              |
| wsrep_connected            | ON                                   |
...
| wsrep_ready                | ON                                   |
+----------------------------+--------------------------------------+
59 rows in set (0.00 sec)

此輸出顯示群集已成功引導。

要使用XtraBackup執行狀態快照傳輸,請設定具有適當許可權的新使用者:

mysql> CREATE USER 'sstuser'@'localhost' IDENTIFIED BY 'PASSW0RD';
mysql> GRANT PROCESS, RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'sstuser'@'localhost';
mysql> FLUSH PRIVILEGES;

MySQL root帳戶也可用於執行SST,但使用其他(非root)使用者更安全。

 

步驟3.配置第二個節點

  1. 追加以下幾行到配置檔案/etc/mysql/my.cnf第二節點(mysql2.local.vm)上,以便它包含以下資料:

[mysqld]

...

# Path to Galera library
wsrep_provider=/usr/lib/libgalera_smm.so

# Cluster connection URL contains the IPs of node#1, node#2 and node#3
wsrep_cluster_address=gcomm://192.168.152.100,192.168.152.110,192.168.152.120

# In order for Galera to work correctly binlog format should be ROW
binlog_format=ROW

# MyISAM storage engine has only experimental support
default_storage_engine=InnoDB

# This InnoDB autoincrement locking mode is a requirement for Galera
innodb_autoinc_lock_mode=2

# Node #2 address
wsrep_node_address=192.168.152.110

# SST method
wsrep_sst_method=xtrabackup-v2

# Cluster name
wsrep_cluster_name=my_ubuntu_cluster

# Authentication for SST method
wsrep_sst_auth="sstuser:PASSW0RD"

使用以下命令啟動第二個節點(此時請注意,因為您可以看到不處於boostrap模式!!):

[email protected]:~# /etc/init.d/mysql start

伺服器啟動後,它應自動接收SST。現在可以在兩個節點上檢查群集狀態。以下是第二個節點(mysql2.local.vm)的狀態示例:

mysql> show status like 'wsrep%';
+----------------------------+--------------------------------------+
| Variable_name              | Value                                |
+----------------------------+--------------------------------------+
| wsrep_local_state_uuid     | 0251a27c-8a19-11e6-905b-f3f13b0ddc5b |
...
| wsrep_local_state          | 4                                    |
| wsrep_local_state_comment  | Synced                               |
...
| wsrep_cluster_size         | 2                                    |
| wsrep_cluster_status       | Primary                              |
| wsrep_connected            | ON                                   |
...
| wsrep_ready                | ON                                   |
+----------------------------+--------------------------------------+
40 rows in set (0.01 sec)
此輸出顯示新節點已成功新增到群集。注意變數wsrep_cluster_size已經變為2,而不是我們做的第一個查詢之一。

 

步驟4.配置第三個節點

追加以下幾行到配置檔案/etc/mysql/my.cnf第二節點(mysql3.local.vm)上,所以它包含以下配置:

[mysqld]

...

# Path to Galera library
wsrep_provider=/usr/lib/libgalera_smm.so

# Cluster connection URL contains the IPs of node#1, node#2 and node#3
wsrep_cluster_address=gcomm://192.168.152.100,192.168.152.110,192.168.152.120

# In order for Galera to work correctly binlog format should be ROW
binlog_format=ROW

# MyISAM storage engine has only experimental support
default_storage_engine=InnoDB

# This InnoDB autoincrement locking mode is a requirement for Galera
innodb_autoinc_lock_mode=2

# Node #2 address
wsrep_node_address=192.168.152.120

# SST method
wsrep_sst_method=xtrabackup-v2

# Cluster name
wsrep_cluster_name=my_ubuntu_cluster

# Authentication for SST method
wsrep_sst_auth="sstuser:PASSW0RD"

使用以下命令啟動第三個節點:

[email protected]:~# /etc/init.d/mysql start

伺服器啟動後,它應自動接收SST。可以在所有節點上檢查群集狀態。以下是第三個節點(mysql3.local.vm)的狀態示例:

mysql> show status like 'wsrep%';
+----------------------------+--------------------------------------+
| Variable_name              | Value                                |
+----------------------------+--------------------------------------+
| wsrep_local_state_uuid     | 0251a27c-8a19-11e6-905b-f3f13b0ddc5b |
...
| wsrep_local_state          | 4                                    |
| wsrep_local_state_comment  | Synced                               |
...
| wsrep_cluster_size         | 3                                    |
| wsrep_cluster_status       | Primary                              |
| wsrep_connected            | ON                                   |
...
| wsrep_ready                | ON                                   |
+----------------------------+--------------------------------------+
40 rows in set (0.01 sec)

此輸出確認第三個節點已加入群集。再看看wsrep_cluster_size,它現在變成3而不是2。

如果遇到一些問題,請檢視/ var / log / syslog以檢視是否一切正常

Oct 4 12:16:13 mysql3 mysql[2767]: Starting MySQL (Percona XtraDB Cluster) database server: mysqld . . .State transfer in progress, setting sleep higher: mysqld . ..
Oct 4 12:16:13 mysql3 systemd[1]: Started LSB: Start and stop the mysql (Percona XtraDB Cluster) daemon.
Oct 4 12:17:01 mysql3 CRON[3731]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)

在這個問題中,一切順利,你可以看到狀態轉移正在進行中,這意味著資料將被轉移到節點。

 

測試複製

要測試複製,我們在第二個節點上建立一個新資料庫,在第三個節點上為該資料庫建立一個表,並在第一個節點上向表中新增一些記錄。

在第二個節點上建立一個新資料庫:

[email protected]> CREATE DATABASE percona;
Query OK, 1 row affected (0.01 sec)

在第三個節點上建立一個表:

[email protected]> USE percona;
Database changed

[email protected]> CREATE TABLE example (node_id INT PRIMARY KEY, node_name VARCHAR(30));
Query OK, 0 rows affected (0.05 sec)

在第一個節點上插入記錄:

[email protected]> INSERT INTO percona.example VALUES (1, 'percona1');
Query OK, 1 row affected (0.02 sec)

從第二個節點上的該表中檢索所有行:

[email protected]> SELECT * FROM percona.example;
+---------+-----------+
| node_id | node_name |
+---------+-----------+
|       1 | percona1  |
+---------+-----------+
1 row in set (0.00 sec)

要確保應用程式始終可以訪問群集,可以在三個節點前新增負載均衡器。