MySQL多主模型Galera Cluster

簡要介紹

Galera Cluster for MySQL是一套基于同步復制的多主MySQL集群解決方案,使用簡單,沒有單點故障,可用性高,能很好保證業務不斷增長時數據的安全和隨時的擴展。

Galera多主模型的主要特點:
  • 基于同步復制
  • 多主服務器的拓撲結構`
  • 可以在任意節點上進行讀寫
  • 自動剔除故障節點
  • 自動加入新節點
  • 真正行級別的并發復制
  • 客戶端連接跟操作單臺MySQL數據庫的體驗一致

安裝Galera的時候的注意事項

  • Galera集群是基于wsrep協議進行的,所以不需要提前配置MySQL異步復制。
  • 不能同時安裝MariaDB-Server和Galera-Server。
  • 使用Galera多主模型至少需要至少三個節點。
    因為安裝Galera-server的時候會替換掉mariadb-server
    三個節點是為了要使用投票功能仲裁出master

實驗拓撲結構

Galera.jpg
主機名 主機地址
node1 192.168.2.201
node2 192.168.2.202
node3 192.168.2.203
node4 192.168.2.204

本文使用的系統版本為CentOS7.1
注意:本文關閉了selinux,以及iptables。

安裝配置Galera

默認的EPEL源是不提供Galera-Server組件的。
而在MariaDB的官網中有提供Galera的二進制包或者yum源。
MariaDB官方地址

Name Release Date Release Status
5.5.53 2016-10-20 Stable

我們可以看到5版本的Galera最近的更新是在2016年的10月。

(1)配置yum源
官方提供寫好的repo文件,因此我們創建一個/etc/yum.repos.d/mariadb.repo文件。
內容如下:

[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/5.5/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

(2)使用yum安裝
雖然會解決依賴關系,一般會安裝如下幾個包。
假如不配置MariaDB的軟件源,EPEL源只會提供galera這一個包

yum install MariaDB-client MariaDB-shared MariaDB-common MariaDB-Galera-server galera rsync socat

(3)查看galera提供的庫文件的所在路徑。(配置文件需要)

[root@bc ~]# rpm -ql galera|grep so
/usr/lib64/galera/libgalera_smm.so

(4)給4個節點中編輯配置文件

vim /etc/my.cnf.d/server.cnf
[galera]
# Mandatory settings
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://192.168.2.201,192.168.2.202,192.168.2.203,192.168.2.204"
wsrep_cluster_name="mycluster"
wsrep_node_name="bc.com"
wsrep_node_address="192.168.2.201"
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0

相比于MariaDB-Server的配置文件,主要配置并不在my.cnf。
配置文件"/etc/my.cnf.d/server.cnf"中有很多注釋信息,打開這幾項
安裝之后MariaDB-Galera-Server就會多了這一個配置文件。并非什么都沒有。不用復制粘貼

(5)首次啟動時,需要初始化集群,在其中一個節點上執行如下命令:

  service mysql start --wsrep-new-cluster --wsrep-cluster-address='gcomm://' &

注意:這里是一個難點(其實是有個坑)。
因為官方的安裝指南演示中的啟動命令是

service mysql start --wsrep-new-cluster

但是在這里很容易出錯,所以一定要注意!!!
由于Galera節點有一個特點就是初始化節點假如初始化失敗,其他節點都會啟動失敗。
也就是說,其他節點無法加入到這個集群中的時候就會顯示啟動失敗。
安裝配置和道理都看了這么久結果服務啟動不起來,是很受挫折的。

(6)而后正常啟動其它節點即可。以node2為例。

[root@node2 ~]# service mysql start
Starting MySQL.161209 01:09:59 mysqld_safe Logging to '/var/lib/mysql/node2.bc.com.err'.
.... SUCCESS! 

(7)登入數據庫查看

[root@bc ~]# mysql -p
Enter password: 

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 5
Server version: 5.5.53-MariaDB-wsrep MariaDB Server, wsrep_25.14.r9949137

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> 

登入node1的MySQL其實在抬頭信息就可以看見
5.5.53-MariaDB-wsrep MariaDB Server, wsrep_25.14.r9949137
這樣表示已經安裝到了MariaDB-Galera-server了。
但是這并沒有什么用,因為更重要的是集群能不能正行運行。

(8)查看集群中關的參數,驗證集群是否正常運行:

MariaDB [(none)]>SHOW STATUS LIKE 'wsrep_%';
+------------------------------+-----------------------------------------------------------------------------+
| Variable_name                | Value                                                                       |
+------------------------------+-----------------------------------------------------------------------------+
| wsrep_local_state_uuid       | 8ae2ecfd-aa14-11e6-9b1e-7f1d6291d077                                        |
| wsrep_protocol_version       | 7                                                                           |
| wsrep_last_committed         | 11                                                                          |
| wsrep_replicated             | 0                                                                           |
| wsrep_replicated_bytes       | 0                                                                           |
| wsrep_repl_keys              | 0                                                                           |
| wsrep_repl_keys_bytes        | 0                                                                           |
| wsrep_repl_data_bytes        | 0                                                                           |
| wsrep_repl_other_bytes       | 0                                                                           |
| wsrep_received               | 5                                                                           |
| wsrep_received_bytes         | 996                                                                         |
| wsrep_local_commits          | 0                                                                           |
| wsrep_local_cert_failures    | 0                                                                           |
| wsrep_local_replays          | 0                                                                           |
| wsrep_local_send_queue       | 0                                                                           |
| wsrep_local_send_queue_max   | 1                                                                           |
| wsrep_local_send_queue_min   | 0                                                                           |
| wsrep_local_send_queue_avg   | 0.000000                                                                    |
| wsrep_local_recv_queue       | 0                                                                           |
| wsrep_local_recv_queue_max   | 2                                                                           |
| wsrep_local_recv_queue_min   | 0                                                                           |
| wsrep_local_recv_queue_avg   | 0.200000                                                                    |
| wsrep_local_cached_downto    | 18446744073709551615                                                        |
| wsrep_flow_control_paused_ns | 0                                                                           |
| wsrep_flow_control_paused    | 0.000000                                                                    |
| wsrep_flow_control_sent      | 0                                                                           |
| wsrep_flow_control_recv      | 0                                                                           |
| wsrep_cert_deps_distance     | 0.000000                                                                    |
| wsrep_apply_oooe             | 0.000000                                                                    |
| wsrep_apply_oool             | 0.000000                                                                    |
| wsrep_apply_window           | 0.000000                                                                    |
| wsrep_commit_oooe            | 0.000000                                                                    |
| wsrep_commit_oool            | 0.000000                                                                    |
| wsrep_commit_window          | 0.000000                                                                    |
| wsrep_local_state            | 4                                                                           |
| wsrep_local_state_comment    | Synced                                                                      |
| wsrep_cert_index_size        | 0                                                                           |
| wsrep_causal_reads           | 0                                                                           |
| wsrep_cert_interval          | 0.000000                                                                    |
| wsrep_incoming_addresses     | 192.168.2.201:3306,192.168.2.202:3306,192.168.2.203:3306,192.168.2.204:3306 |
| wsrep_desync_count           | 0                                                                           |
| wsrep_evs_delayed            |                                                                             |
| wsrep_evs_evict_list         |                                                                             |
| wsrep_evs_repl_latency       | 0/0/0/0/0                                                                   |
| wsrep_evs_state              | OPERATIONAL                                                                 |
| wsrep_gcomm_uuid             | 249832a4-bd6a-11e6-a81b-1bfdbeb7f343                                        |
| wsrep_cluster_conf_id        | 4                                                                           |
| wsrep_cluster_size           | 4                                                                           |
| wsrep_cluster_state_uuid     | 8ae2ecfd-aa14-11e6-9b1e-7f1d6291d077                                        |
| wsrep_cluster_status         | Primary                                                                     |
| wsrep_connected              | ON                                                                          |
| wsrep_local_bf_aborts        | 0                                                                           |
| wsrep_local_index            | 0                                                                           |
| wsrep_provider_name          | Galera                                                                      |
| wsrep_provider_vendor        | Codership Oy <info@codership.com>                                           |
| wsrep_provider_version       | 25.3.18(r3632)                                                              |
| wsrep_ready                  | ON                                                                          |
| wsrep_thread_count           | 2                                                                           |
+------------------------------+-----------------------------------------------------------------------------+

我們可以看到,四個節點都加入到這個多主模型之中了。
假如節點故障,則不會顯示在wsrep_incoming_addresses 之中。
通常初始化節點都是會啟動成功的,但是假如其他節點啟動失敗,wsrep_incoming_addresses 就只會有本機地址。
也就是使用service mysql start --wsrep-new-cluster經常出現的狀況。

(9)測試是否正常工作
a.創建數據庫并在里面建立一個新表。

MariaDB [(none)]> create database wsrep_test;
Query OK, 1 row affected (0.01 sec)

MariaDB [(none)]> use wsrep_test;
Database changed

MariaDB [wsrep_test]> create table wsrep_test (id int auto_increment not null primary key,name varchar(30) not null);

MariaDB [wsrep_test]> desc wsrep_test;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(30) | NO   |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

創建的表格的命令,意思是創建一個叫wsrep_test的表,里面有兩個字段,一個是id,一個是name。
其中id字段設置為自動增長。

b.插入數據

MariaDB [(none)]> insert into wsrep_test.wsrep_test (name) values ('node1');
Query OK, 1 row affected (0.01 sec)

MariaDB [(none)]> insert into wsrep_test.wsrep_test (name) values ('node1');
Query OK, 1 row affected (0.01 sec)

MariaDB [(none)]> insert into wsrep_test.wsrep_test (name) values ('node1');
Query OK, 1 row affected (0.01 sec)

MariaDB [(none)]> insert into wsrep_test.wsrep_test (name) values ('node1');
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> insert into wsrep_test.wsrep_test (name) values ('node1');
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> select * from wsrep_test.wsrep_test;
+----+-------+
| id | name  |
+----+-------+
|  5 | node1 |
|  9 | node1 |
| 13 | node1 |
| 17 | node1 |
| 21 | node1 |
| 26 | node2 |
| 30 | node2 |
| 34 | node2 |
| 38 | node2 |
| 42 | node2 |
| 47 | node3 |
| 51 | node3 |
| 55 | node3 |
| 59 | node3 |
| 63 | node3 |
| 68 | node4 |
| 72 | node4 |
| 76 | node4 |
| 80 | node4 |
| 84 | node4 |
+----+-------+
20 rows in set (0.00 sec)

最終效果是在任何一個節點上面插入的數據,最后在每一個節點中都可以查詢得到。
而且多主模型中,通過設置id自動增長的步長,避免多個節點中自動增長的id號沖突。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容