簡要介紹
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)
主機名 | 主機地址 |
---|---|
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號沖突峦甩。