超詳細,多圖文使用galera cluster搭建mysql叢集並介紹wsrep相關引數
阿新 • • 發佈:2020-03-12
# 超詳細,多圖文使用galera cluster搭建mysql叢集並介紹wsrep相關引數
> 介紹galera cluster原理的文章已經有一大堆了,百度幾篇看一看就能有相關了解,這裡就不贅述了。本文主要側重實操,因為跟著百度前幾頁的搭建教程或多或少都有坑,前後配置邏輯矛盾的也有。終於,經過幾個通宵的bug修復,反覆驗證,力求以最簡潔的程式碼,最少的操作量,最直白的邏輯來完成叢集的搭建。因為操作過程中,網上對wsrep相關引數的介紹少之又少,所以最後特別寫了完整版的引數說明,供搭建成功後,各種測試除錯使用,對於這些引數有坑的地方,歡迎在底下留言,供大家參考,謝謝。
對於mysql的叢集方案,我之前總結過,詳情點選檢視,[多圖文,詳細介紹mysql各個叢集方案](https://www.cnblogs.com/lgx211/p/12456859.html)
#### 一,需求瞭解
Galera Cluster需要至少三個節點的伺服器硬體。
如果群集在單個交換機上執行,請使用三個節點。如果您的群集跨越多個交換機,請使用三個交換機。如果您的群集跨越網路,請使用三個網路。如果您的群集跨越資料中心,請使用三個資料中心。這樣可以確保在網路中斷的情況下,群集可以維護主元件。
##### 1,硬體需求
對於伺服器硬體,每個節點至少需要以下元件:
- 1 GHz單核CPU;
- 512 MB RAM;
- 100 Mbps網路連線;
注意:Galera Cluster可能會由於記憶體不足而在有限的硬體上執行時偶爾崩潰。為避免這種情況,請確保分配了足夠的交換空間。
##### 2,軟體需求
對於軟體,群集中的每個節點至少需要以下條件:
- 已安裝Linux或FreeBSD作業系統;
- 帶有wsrep API補丁的MySQL或MariaDB伺服器,已安裝Galera複製外掛。
注意:Galera Cluster的二進位制安裝軟體包包括帶有wsrep API補丁的資料庫伺服器。但是,從源構建時,必須手動應用此修補程式。
#### 二,準備伺服器
在開始安裝過程之前,需要完成一些任務以為Galera Cluster準備伺服器。您必須在叢集中的每個節點上執行以下步驟。
##### 1,配置SELinux
如果在伺服器上啟用了SELinux(增強安全性的Linux),則它可能會阻止mysqld執行所需的操作。您必須對SELinux禁用mysqld或對其進行配置,以允許mysqld執行外部程式並在非特權埠上開啟偵聽套接字,即非特權使用者可以執行的操作。在這裡我看了看它的狀態 `cat /etc/selinux/config `,然後就直接把它給禁用了。
```shell
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0
```
若伺服器必須要啟用SELinux,[請查閱selinux和mysql](https://blogs.oracle.com/jsmyth/selinux-and-mysql)
##### 2,配置防火牆
接下來需要更新每個節點上的防火牆設定,以便它們可以與群集通訊。具體執行方式取決於您的發行版和所使用的特定防火牆軟體。在這裡我看了看防火牆狀態 `firewall-cmd --state` ,就直接把它關閉了。
```shell
systemctl stop firewalld.service
systemctl disable firewalld.service
```
有關為Galera Cluster設定防火牆以及其他用於在Linux和FreeBSD中配置資料包過濾的程式的詳細資訊,[請參閱防火牆設定](https://galeracluster.com/library/documentation/firewall-settings.html)。
##### 3,禁用AppArmor
預設情況下,某些伺服器(例如Ubuntu)包括AppArmor,這可能會阻止mysqld開啟其他埠或執行指令碼。 您必須禁用AppArmor或對其進行配置,以允許mysqld執行外部程式並在非特權埠上開啟偵聽套接字。在這裡我就禁用AppArmor了。
```shell
ln -s /etc/apparmor.d/usr /etc/apparmor.d/disable/.sbin.mysqld
```
輸入效果如下所示,因為我是centos,不是Ubuntu的,所以禁用APPArmor是不需要的操作,這裡只是為了演示。
![lgx_211](https://img-blog.csdnimg.cn/20200312161230340.png)
#### 三,安裝Galera群集
##### 1,依賴包準備
安裝過程十有八九會報錯,會提示依賴檢測失敗,請按照提示,下載相關依賴。這是我依據下面的安裝順序進行安裝而報錯,我為此逐個而安裝的依賴。我的centos是剛安裝的最簡版,所以缺很多東西,你可以先把以下這些依賴安裝完,再安裝mysql cluster相關的。
```shell
yum -y install lsof net-tools perl socat openssl openssl-devel boost-devel
```
有個安裝的檔案和系統現有的有衝突,導致安裝失敗,解除安裝掉這個mariadb。
```shell
rpm -qa| grep mariadb
rpm -e --nodeps mariadb-libs-5.5.64-1.el7.x86_64
```
修改配置檔案的時候,還有幾個依賴包是被需要的,提前下載好
```shell
rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
yum -y install rsync jemalloc
```
##### 2,下載、安裝
Galera Cluster由兩部分組成:Galera複製庫(galera-3)和使用寫集複製(WSREP)API擴充套件的MySQL版本(mysql-wsrep)。
若因軟體版本變化,導致無法下載,或者你不是centos系統,請自行訪問http://releases.galeracluster.com,找到可以下載的對應的版本。
強烈建議安裝順序按照下面所示,逐個來,因為後面的安裝需要依賴前面的安裝。
```shell
wget http://releases.galeracluster.com/galera-3/centos/7/x86_64/galera-3-25.3.29-1.el7.x86_64.rpm
wget http://releases.galeracluster.com/mysql-wsrep-5.7/centos/7/x86_64/mysql-wsrep-5.7-5.7.29-25.21.el7.x86_64.rpm
wget http://releases.galeracluster.com/mysql-wsrep-5.7/centos/7/x86_64/mysql-wsrep-client-5.7-5.7.29-25.21.el7.x86_64.rpm
wget http://releases.galeracluster.com/mysql-wsrep-5.7/centos/7/x86_64/mysql-wsrep-common-5.7-5.7.29-25.21.el7.x86_64.rpm
wget http://releases.galeracluster.com/mysql-wsrep-5.7/centos/7/x86_64/mysql-wsrep-devel-5.7-5.7.29-25.21.el7.x86_64.rpm
wget http://releases.galeracluster.com/mysql-wsrep-5.7/centos/7/x86_64/mysql-wsrep-libs-5.7-5.7.29-25.21.el7.x86_64.rpm
wget http://releases.galeracluster.com/mysql-wsrep-5.7/centos/7/x86_64/mysql-wsrep-libs-compat-5.7-5.7.29-25.21.el7.x86_64.rpm
wget http://releases.galeracluster.com/mysql-wsrep-5.7/centos/7/x86_64/mysql-wsrep-server-5.7-5.7.29-25.21.el7.x86_64.rpm
rpm -ivh mysql-wsrep-common-5.7-5.7.29-25.21.el7.x86_64.rpm
rpm -ivh mysql-wsrep-libs-5.7-5.7.29-25.21.el7.x86_64.rpm
rpm -ivh mysql-wsrep-client-5.7-5.7.29-25.21.el7.x86_64.rpm
rpm -ivh mysql-wsrep-libs-compat-5.7-5.7.29-25.21.el7.x86_64.rpm
rpm -ivh mysql-wsrep-server-5.7-5.7.29-25.21.el7.x86_64.rpm
rpm -ivh mysql-wsrep-5.7-5.7.29-25.21.el7.x86_64.rpm
rpm -ivh mysql-wsrep-devel-5.7-5.7.29-25.21.el7.x86_64.rpm
rpm -ivh galera-3-25.3.29-1.el7.x86_64.rpm
```
最終效果如下所示
![lgx_211](https://img-blog.csdnimg.cn/2020031216131996.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzc1MDIxMg==,size_16,color_FFFFFF,t_70)
##### 3,修改配置
```shell
vi /etc/my.cnf
```
開啟配置檔案,按 `i` 進入編輯模式,增加以下配置資訊。
```
wsrep-provider=/usr/lib64/galera-3/libgalera_smm.so # wsrep提供者,我的是在這個目錄下
wsrep_cluster_name='mysql_cluster' #叢集的名字,必須是統一的
wsrep_cluster_address=gcomm://192.168.119.128,192.168.119.129,192.168.119.130 #叢集中的其他節點地址
wsrep_node_name = node1 #該節點的名稱
wsrep_node_address='192.168.119.128' #該節點的地址
wsrep_sst_method=rsync # 叢集使用rsync同步方式
wsrep_sst_auth=lgx:666666 # 叢集同步的使用者名稱密碼
```
完成以上修改,Esc退出編輯模式,輸入`:wq` 儲存並退出。 類似同樣的操作操作再來兩次。最終效果如下所示
![lgx_211](https://img-blog.csdnimg.cn/20200312161400214.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzc1MDIxMg==,size_16,color_FFFFFF,t_70)
注意:每個節點的 `server-id,wsrep_node_name,wsrep_node_address` 是不一樣的。
##### 4,啟動第一個節點
啟動第一個節點以前,其節點的配置檔案裡面,不能配置其它節點的ip,即 `wsrep_cluster_address=gcomm://` 這樣就行了,否則會導致啟動報錯。待叢集啟動後,再修改它的配置檔案,把其他節點的ip補充上去。
啟動第一個節點,該命令會啟動本機的 mysqld 服務,命令只在叢集第一個節點啟動時使用,因為該指令碼中帶有一個引數:–wsrep-new-cluster,代表新建叢集。
```shell
/usr/bin/mysqld_bootstrap
```
檢視mysqld服務狀態,判斷是否成功啟動,並建立了新叢集。
```shell
systemctl status mysqld
```
效果圖如下所示
![lgx_211](https://img-blog.csdnimg.cn/20200312161429840.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzc1MDIxMg==,size_16,color_FFFFFF,t_70)
##### 5,啟動其它節點
逐個啟動其它節點的服務,並檢視是否啟動成功。
```shell
systemctl start mysqld
systemctl status mysqld
```
可以看到,節點已經啟動。
![lgx_211](https://img-blog.csdnimg.cn/20200312161453470.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzc1MDIxMg==,size_16,color_FFFFFF,t_70)
##### 6,叢集驗證
因為資料庫剛剛初始化,超級使用者root是沒有密碼的,系統會給幾個臨時的root密碼。再修改root密碼時,需要你用其中一個臨時密碼確認一下,即紅框所示。新輸入的密碼若不夠複雜,會被安全原因拒絕生效。
```shell
grep -i 'temporary password' /var/log/mysqld.log
mysqladmin -u root -p 'LGX_211_lgx'
```
![lgx_211](https://img-blog.csdnimg.cn/20200312161600695.png)
現在用剛剛設定的root密碼,來登入某一臺主機上的mysql,看看當前節點的資料庫狀態,再來看看叢集的狀況。
```shell
mysql -u root -p
show status like 'wsrep_local_state_comment';
show status like 'wsrep_cluster_size';
```
由紅框可以看出,當前的節點是正常提供服務的狀態,且與叢集資料狀態是一致的。由籃框可知,當前叢集一共有三個節點。
![lgx_211](https://img-blog.csdnimg.cn/2020031216163192.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzc1MDIxMg==,size_16,color_FFFFFF,t_70)
> Open:節點啟動成功,嘗試連線到叢集
>
> Primary: 節點已處於叢集中,在新節點加入時,選取donor進行資料庫同步時會產生的狀態
> Joiner: 節點處於等待接收或正在接收同步檔案的狀態
> Joined: 節點完成資料同步,但還有部分資料不是最新的,在追趕與叢集資料一致的狀態
> Synced: 節點正常提供服務的狀態,表示當前節點資料狀態與叢集資料狀態是一致的
> Donor: 表示該節點被選為Donor節點,正在為新加進來的節點進行全量資料同步,此時該節點對客戶端不提供服務
##### 7,資料複製驗證
在節點1, `mysql -u root -p` 登入mysql,建立資料庫,並建表,填充資料。
```sql
create database test;
use test;
create table t1(a int);
insert into t1 values(1);
```
如下所示
![lgx_211](https://img-blog.csdnimg.cn/20200312161703699.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzc1MDIxMg==,size_16,color_FFFFFF,t_70)
在節點2,也建一個表,填充資料。
```sql
use test;
create table t2(a int);
insert into t2 values(2);
```
同理,在節點3,也建一個表,填充資料。
```sql
use test;
create table t3(a int);
insert into t3 values(3);
```
然後,隨機選一個節點,來查詢剛剛輸入的資訊。
```sql
select t1.a,t2.a,t3.a from test.t1,test.t2,test.t3;
```
效果如下所示,在任一一個節點上可以查出剛剛在三個節點上輸入的資訊。
![lgx_211](https://img-blog.csdnimg.cn/20200312161732687.png)
8,其它測試
單個節點掛掉不影響其它節點正常對外的讀寫操作。
增加節點,我的電腦已經沒有條件在裝一臺虛擬機器了。
#### 四,wsrep配置一覽
之前的配置檔案是剛開始測試所必須的最簡版。這裡我彙總整理了所有的可配置項,供你上生產運營環境的時候,增加相關配置。
##### wsrep_auto_increment_control
如果設定為1(預設值),將根據叢集的大小以及叢集大小的變化自動調整auto_increment_increment和auto_increment_offset變數。 這樣可以避免由於auto_increment而引起的複製衝突。 在主從環境中,可以設定為OFF。
##### wsrep_causal_reads
如果設定為ON(預設為OFF),則在整個叢集中強制執行讀取提交的特徵。 如果主裝置比從裝置更快地應用事件,則兩者可能會短暫地不同步。 在將此變數設定為ON的情況下,從站將等待事件應用,然後再處理其他查詢。 設定為ON也將導致更大的讀取延遲。
##### wsrep_certification_rules
說明:要在叢集中使用的認證規則。 可能的值為:
strict:可能會導致更多認證失敗的更嚴格的規則。 例如,對於外來鍵,如果不同的節點大約在同一時間收到指向父表中同一行的無衝突插入,則可能導致認證失敗
optimized:寬鬆的規則,允許更多的併發性,並減少更少的認證失敗。
##### wsrep_certify_nonPK
說明:設定為“開”(預設值)時,將自動為沒有一個表的表生成主鍵。 這對於並行應用是必需的,強烈建議對所有表使用。
##### wsrep_cluster_address
說明:啟動時要連線的群集節點的地址,例如gcomm://192.168.0.1:1234?gmcast.listen_addr = 0.0.0.0:2345。 優良作法是以gco