MariaDB Galera Cluster集群优缺点

一、MariaDB Galera Cluster概要

1.简述:

MariaDB Galera Cluster 是一套在mysql innodb存储引擎上面实现multi-master及数据实时同步的系统架构,业务层面无需做读写分离工作,数据库读写压力都能按照既定的规则分发到 各个节点上去。在数据方面完全兼容 MariaDB 和 MySQL。

2.特性:

(1).同步复制 Synchronous replication
(2).Active-active multi-master 拓扑逻辑
(3).可对集群中任一节点进行数据读写
(4).自动成员控制,故障节点自动从集群中移除
(5).自动节点加入
(6).真正并行的复制,基于行级
(7).直接客户端连接,原生的 MySQL 接口
(8).每个节点都包含完整的数据副本
(9).多台数据库中数据同步由 wsrep 接口实现

3.局限性:

(1).目前的复制仅仅支持InnoDB存储引擎,任何写入其他引擎的表,包括mysql.*表将不会复制,但是DDL语句会被复制的,因此创建用户将会被复制,但是insert into mysql.user…将不会被复制的.
(2).DELETE操作不支持没有主键的表,没有主键的表在不同的节点顺序将不同,如果执行SELECT…LIMIT… 将出现不同的结果集.
(3).在多主环境下LOCK/UNLOCK TABLES不支持,以及锁函数GET_LOCK(), RELEASE_LOCK()…
(4).查询日志不能保存在表中。如果开启查询日志,只能保存到文件中。
(5).允许最大的事务大小由wsrep_max_ws_rows和wsrep_max_ws_size定义。任何大型操作将被拒绝。如大型的LOAD DATA操作。
(6).由于集群是乐观的并发控制,事务commit可能在该阶段中止。如果有两个事务向在集群中不同的节点向同一行写入并提交,失败的节点将中止。对 于集群级别的中止,集群返回死锁错误代码(Error: 1213 SQLSTATE: 40001 (ER_LOCK_DEADLOCK)).
(7).XA事务不支持,由于在提交上可能回滚。
(8).整个集群的写入吞吐量是由最弱的节点限制,如果有一个节点变得缓慢,那么整个集群将是缓慢的。为了稳定的高性能要求,所有的节点应使用统一的硬件。
(9).集群节点建议最少3个。
(10).如果DDL语句有问题将破坏集群。

如何在CENTOS/REDHAT/FEDORA中安装MARIADB GALERA CLUSTER 10.0(数据库集群)

MariaDB Galera Cluster 10.0.12稳定已被释放,可供生产使用。MariaDB的是一个关系型数据库管理系统(RDBMS)。一般我们使用的小型应用程序,使用数据库服务器的单个节点服务。但是当有成千上万的用户不断在网上请求访问应用程序时,在这种情况下,我们需要一个架构,这将能够处理这种负载,并提供高可用性。因此,我们需要增加彼此互连的多个数据库服务器,并保持同步,因此在任何情况下,某一服务器出现故障,其他服务器可以继续向用户提供服务。

未分类

本文将帮助你建立MariaDB Galera Cluster10.0.12用CentOS 6.5运行3个节点。集群服务器具体如下。

  • 集群DB1:192.168.1.10(主机名: db1.howtoing.com )
  • 集群DB2:192.168.1.20(主机名: db2.howtoing.com )
  • 集群DB3:192.168.1.30(主机名: db3.howtoing.com )

注意: 第1步/2/3 将完成所有群集节点,操作过程和节点具体配置。

第1步:添加MariaDB存储库

创建一个MariaDB存储库/etc/yum.repos.d/mariadb.repo在你的系统中使用下面的内容。 下面存储库将在CentOS 6.x的系统工作,对于其他系统中使用存储库生产工具,并添加到您的系统。 在CentOS 6 – 64位

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

在CentOS 6 – 32位

[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.0/centos6-x86
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

第2步:安装MariaDB和Galera

安装MariaDB Galera群集程序包之前,删除系统上安装任何现有的MySQL或MariaDB的包。并在所有节点上使用以下命令安装。

# yum install MariaDB-Galera-server MariaDB-client galera

第3步:初始MariaDB配置

在上述步骤成功安装包之后,做一些初步MariaDB的配置。使用下列命令并按照群集的所有节点上的说明。它将提示设置root帐户密码。

# service mysql start
# mysql_secure_installation

之后,创建所有的节点用户,它可以从您的网络集群中的访问数据库中MariaDB的用户。

# mysql -u root -p

MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'cluster'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> exit

启动群集配置之前停止MariaDB服务

# service mysql stop

第4步:DB1设置MariaDB Galera Cluster

让我们安装MariaDB Galera Cluster从DB1服务器开始。编辑MariaDB服务器配置文件,并在[MariaDB]部分添加下面的值。

[root@db1 ~]# vim /etc/my.cnf.d/server.cnf
query_cache_size=0
binlog_format=ROW
default_storage_engine=innodb
innodb_autoinc_lock_mode=2
wsrep_provider=/usr/lib/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://192.168.1.10,192.168.1.20,192.168.1.30"
wsrep_cluster_name='cluster1'
wsrep_node_address='192.168.1.10'
wsrep_node_name='db1'
wsrep_sst_method=rsync
wsrep_sst_auth=cluster:password

使用以下命令启动集群。

[root@db1 ~]# /etc/init.d/mysql bootstrap
Bootstrapping the clusterStarting MySQL.... SUCCESS!

如果你在启动过程中有任何问题,请检查MariaDB的错误日志文件,在 /var/lib/mysql/.err

第5步:添加DB2,在MariaDB的集群中

DB1成功启动集群后。在DB2上开始配置。编辑MariaDB的服务器配置文件,并在[MariaDB]部分添加下面的值。所有设置都差不多,除了wsrep_node_address,wsrep_cluster_address和wsrep_node_name DB1 。

[root@db2 ~]# vim /etc/my.cnf.d/server.cnf
query_cache_size=0
binlog_format=ROW
default_storage_engine=innodb
innodb_autoinc_lock_mode=2
wsrep_provider=/usr/lib/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://192.168.1.10,192.168.1.20,192.168.1.30"
wsrep_cluster_name='cluster1'
wsrep_node_address='192.168.1.20'
wsrep_node_name='db2'
wsrep_sst_method=rsync
wsrep_sst_auth=cluster:password

使用以下命令启动集群。

[root@db2 ~]# /etc/init.d/mysql start
Starting MySQL..... SUCCESS!

第6步:添加DB3,在MariaDB的集群中

此服务器是可选的,如果你想只有两个集群服务器,则可以忽略这一步,如果不配置DB3 你需要从DB1/DB2配置文件中删除第三个服务器IP。要添加此服务器进行修改和DB2一样。

[root@db3 ~]# vim /etc/my.cnf.d/server.cnf
query_cache_size=0
binlog_format=ROW
default_storage_engine=innodb
innodb_autoinc_lock_mode=2
wsrep_provider=/usr/lib/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://192.168.1.10,192.168.1.20,192.168.1.30"
wsrep_cluster_name='cluster1'
wsrep_node_address='192.168.1.30'
wsrep_node_name='db2'
wsrep_sst_method=rsync
wsrep_sst_auth=cluster:password

使用以下命令启动集群。

[root@db3 ~]# /etc/init.d/mysql start
Starting MySQL..... SUCCESS!

第7步:测试MariaDB的Galera群集设置

在这个阶段,您的群集安装已经完成,并正常运行。现在,您可以测试通过在集群的任何服务器创建数据库和表群集安装,它会立即复制到群集中的所有服务器。

Linux下MySQL/MariaDB Galera集群搭建过程

MariaDB介绍

MariaDB是开源社区维护的一个MySQL分支,由MySQL的创始人Michael Widenius主导开发,采用GPL授权许可证。

MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。

详细介绍请参考链接:

http://mariadb.org/(官网)

http://baike.baidu.com/link?url=dFJ-My-I52YFc1mx26K804LPwZrcEWCwB4IqfA4-soYx6295BZLIe7bEFgOtt3CWZ8AYpkp1P342L4S-R4x4CK

Galera Cluster介绍

Galera Cluster是基于MySQL/innodb二次开发而成的一个支持“多主同步”的数据库主从集群,具有高可用,易于扩展等特点。

详细介绍请参考链接:

http://galeracluster.com/(官网)

Galera replication for MySQL

本文使用的Linux发行版:CentOS6.7 下载地址:https://wiki.centos.org/Download

1. 添加yum源

[root@localhost ~]# vi /etc/yum.repos.d/CentOS-MariaDB.repo

添加如下几行:

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

未分类

2. 安装mariadb galera软件包

[root@localhost ~]# yum install MariaDB-Galera-server MariaDB-client galera

未分类

未分类

3. 修改防火墙配置

[root@localhost ~]# vi /etc/sysconfig/iptables

添加如下几行:

-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 4444 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 4567 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 4568 -j ACCEPT

未分类

4. 重启防火墙功能

[root@localhost ~]# service iptables restart

未分类

5. 安装selinux管理工具

[root@localhost ~]# yum provides /usr/sbin/semanage
[root@localhost ~]# yum -y install policycoreutils-python

未分类

6. 修改selinux安全策略

[root@localhost ~]# semanage port -a -t mysqld_port_t -p tcp 4567
[root@localhost ~]# semanage port -a -t mysqld_port_t -p tcp 4568
[root@localhost ~]# semanage permissive -a mysqld_t

未分类

7. 启动mysql服务

[root@localhost ~]# service mysql start

8. 执行mysql安全设置

[root@localhost ~]# mysql_secure_installation

(先设置root账户密码,再一直“y”下去即可)

未分类

未分类

9. 创建用于节点同步的账号

[root@localhost ~]# mysql -uroot -p
MariaDB [(none)]> grant usage on *.* to sst@'%' identified by '123456';
MariaDB [(none)]> flush privileges;

10. 修改mysql默认字符集

MariaDB [(none)]> show variables like 'character%';
MariaDB [(none)]> set character_set_server = utf8;
MariaDB [(none)]> set character_set_database = utf8;

11. 修改集群节点配置

[root@localhost ~]# cp /usr/share/mysql/wsrep.cnf /etc/my.cnf.d/
[root@localhost ~]# vi /etc/my.cnf.d/wsrep.cnf

修改如下几行:

wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://"    #集群节点N的地址(注意把前面的"#"删掉!)
wsrep_sst_auth=sst:123456    #节点N的数据库账户和密码
  • 参数说明

“gcomm://” 是特殊的地址,仅仅是galera cluster初始化启动时候使用。
如果集群启动以后,我们关闭了第一个节点,那么再次启动的时候必须先修改”gcomm://”为其他节点的集群地址,例如wsrep_cluster_address=”gcomm://192.168.0.152″。

检查/etc/my.cnf中有没有!includedir /etc/my.cnf.d/这一行,没有则添加。

[root@localhost ~]# vi /etc/my.cnf

未分类

到这里,第1个节点的配置就完成了,然后在另一台主机上按照步骤1~11配置第2个节点,只需修改节点2的wsrep_cluster_address为节点1的IP即可,以此类推。

12. 启动集群节点

  • 检查mysql进程:[root@localhost ~]# ps aux|grep mysql
  • 停止mysql服务:[root@localhost ~]# service mysql stop
  • 启动第1个节点:[root@localhost ~]# service mysql bootstrap

未分类

启动第2、3、…个节点:[root@localhost ~]# service mysql start

未分类

(注意:启动mysql之前先检查一下服务是否已经启动,不要重复启动,如果无法停止当前mysql服务则手动kill掉mysql的进程)

13. 检查集群运行状态

[root@localhost ~]# mysql -uroot -p
MariaDB [(none)]> show status like 'wsrep%';

如果wsrep_connected=ON且wsrep_ready=ON则说明节点成功接入集群。

未分类

未分类

14. 配置集群的仲裁节点

对于只有2个节点的galera cluster和其他集群软件一样,需要面对极端情况下的“脑裂”状态。为了避免这种问题,galera引入了“arbitrator(仲裁人)”。
“仲裁人”节点上没有数据,它在集群中的作用就是在集群发生分裂时进行仲裁,集群中可以有多个“仲裁人”节点。将“仲裁人”节点加入集群的方法很简单,运行如下命令即可:
[root@localhost ~]# garbd -a gcomm://<节点IP> -g my_wsrep_cluster -d

  • 参数说明

-a 集群地址
-g 集群名称
-d 以daemon模式运行

15. 检查数据库是否符合要求

部署到集群之前,建议先检查数据库是否符合galera的要求,比如存储引擎必须是innodb、数据表必须有主键等,否则记录将不会在多台复制。

选择指定的数据库,执行以下SQL输出不符合要求的表及其原因,根据相应的原因修改即可:

select distinct concat( t.table_schema, '.', t.table_name ) as tbl, t. engine, if ( isnull(c.constraint_name), 'nopk', '' ) as nopk, if ( s.index_type = 'fulltext', 'fulltext', '' ) as ftidx, if ( s.index_type = 'spatial', 'spatial', '' ) as gisidx from information_schema. tables as t left join information_schema.key_column_usage as c on ( t.table_schema = c.constraint_schema and t.table_name = c.table_name and c.constraint_name = 'primary' ) left join information_schema.statistics as s on ( t.table_schema = s.table_schema and t.table_name = s.table_name and s.index_type in ('fulltext', 'spatial')) where t.table_schema not in ( 'information_schema', 'performance_schema', 'mysql' ) and t.table_type = 'base table' and ( t.engine <> 'innodb' or c.constraint_name is null or s.index_type in ('fulltext', 'spatial')) order by t.table_schema, t.table_name;

16. 常见问题

  • 启动mysql时出错:SST in progress, setting sleep higher. ERROR!
    • 确保本机已安装rsync:[root@localhost ~]# yum list|grep rsync
    • 确保已允许galera sst使用的端口4444、4567、4568通过防火墙并重启防火墙功能
    • 确保selinux已对端口4444开放权限:[root@localhost ~]# semanage port -a -t mysqld_port_t -p tcp 4444
  • 查看galera集群状态时wsrep_connected和wsrep_ready的值均为OFF!

打开/etc/my.cnf.d/wsrep.cnf文件,找到wsrep_cluster_address=”gcomm://”这一行,检查前面是否有”#”,如果有则删掉并重启mysql。