MySQL多主模型Galera Cluster

簡要介紹

Galera Cluster for MySQL是一套基于同步復制的多主MySQL集群解決方案嗓奢,使用簡單新博,沒有單點故障谒获,可用性高容为,能很好保證業(yè)務不斷增長時數(shù)據(jù)的安全和隨時的擴展。

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

安裝Galera的時候的注意事項

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

實驗拓撲結(jié)構(gòu)

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

本文使用的系統(tǒng)版本為CentOS7.1
注意:本文關(guān)閉了selinux滨达,以及iptables。

安裝配置Galera

默認的EPEL源是不提供Galera-Server組件的俯艰。
而在MariaDB的官網(wǎng)中有提供Galera的二進制包或者yum源捡遍。
MariaDB官方地址

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

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

(1)配置yum源
官方提供寫好的repo文件竹握,因此我們創(chuàng)建一個/etc/yum.repos.d/mariadb.repo文件画株。
內(nèi)容如下:

[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安裝
雖然會解決依賴關(guān)系,一般會安裝如下幾個包啦辐。
假如不配置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個節(jié)點中編輯配置文件

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)首次啟動時庸推,需要初始化集群,在其中一個節(jié)點上執(zhí)行如下命令:

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

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

service mysql start --wsrep-new-cluster

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

(6)而后正常啟動其它節(jié)點即可。以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)登入數(shù)據(jù)庫查看

[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
這樣表示已經(jīng)安裝到了MariaDB-Galera-server了关拒。
但是這并沒有什么用,因為更重要的是集群能不能正行運行。

(8)查看集群中關(guān)的參數(shù)着绊,驗證集群是否正常運行:

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                                                                           |
+------------------------------+-----------------------------------------------------------------------------+

我們可以看到谐算,四個節(jié)點都加入到這個多主模型之中了。
假如節(jié)點故障归露,則不會顯示在wsrep_incoming_addresses 之中洲脂。
通常初始化節(jié)點都是會啟動成功的,但是假如其他節(jié)點啟動失敗剧包,wsrep_incoming_addresses 就只會有本機地址恐锦。
也就是使用service mysql start --wsrep-new-cluster經(jīng)常出現(xiàn)的狀況。

(9)測試是否正常工作
a.創(chuàng)建數(shù)據(jù)庫并在里面建立一個新表玄捕。

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)

創(chuàng)建的表格的命令,意思是創(chuàng)建一個叫wsrep_test的表棚放,里面有兩個字段枚粘,一個是id,一個是name飘蚯。
其中id字段設(shè)置為自動增長馍迄。

b.插入數(shù)據(jù)

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)

最終效果是在任何一個節(jié)點上面插入的數(shù)據(jù),最后在每一個節(jié)點中都可以查詢得到局骤。
而且多主模型中攀圈,通過設(shè)置id自動增長的步長,避免多個節(jié)點中自動增長的id號沖突峦甩。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末赘来,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子凯傲,更是在濱河造成了極大的恐慌犬辰,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冰单,死亡現(xiàn)場離奇詭異幌缝,居然都是意外死亡,警方通過查閱死者的電腦和手機诫欠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門涵卵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人荒叼,你說我怎么就攤上這事轿偎。” “怎么了被廓?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵贴硫,是天一觀的道長。 經(jīng)常有香客問我,道長英遭,這世上最難降的妖魔是什么间护? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮挖诸,結(jié)果婚禮上汁尺,老公的妹妹穿的比我還像新娘。我一直安慰自己多律,他們只是感情好痴突,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著狼荞,像睡著了一般辽装。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上相味,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天拾积,我揣著相機與錄音,去河邊找鬼丰涉。 笑死拓巧,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的一死。 我是一名探鬼主播肛度,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼投慈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瘩绒?” 一聲冷哼從身側(cè)響起锁荔,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤阳堕,失蹤者是張志新(化名)和其女友劉穎恬总,沒想到半個月后壹堰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年惠桃,在試婚紗的時候發(fā)現(xiàn)自己被綠了辜王。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片呐馆。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡汹来,死狀恐怖俗慈,靈堂內(nèi)的尸體忽然破棺而出遣耍,到底是詐尸還是另有隱情舵变,我是刑警寧澤纪隙,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站熙兔,受9級特大地震影響住涉,放射性物質(zhì)發(fā)生泄漏舆声。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望忽媒。 院中可真熱鬧晦雨,春花似錦闹瞧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽核无。三九已至藕坯,卻和暖如春炼彪,著一層夾襖步出監(jiān)牢的瞬間辐马,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留赌厅,地道東北人特愿。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓目养,卻偏偏與公主長得像毒嫡,于是被迫代替她去往敵國和親兜畸。 傳聞我的和親對象是個殘疾皇子咬摇,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容