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号冲突。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容