一、MariaDB Galera Cluster概要:

.简述:

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

.特性:

      ().同步复制 Synchronous replication

      ().Active-active multi-master 拓扑逻辑

      ().可对集群中任一节点进行数据读写

      ().自动成员控制,故障节点自动从集群中移除

      ().自动节点加入

      ().真正并行的复制,基于行级

      ().直接客户端连接,原生的 MySQL 接口

      ().每个节点都包含完整的数据副本

      ().多台数据库中数据同步由 wsrep 接口实现

.局限性

      ().目前的复制仅仅支持InnoDB存储引擎,任何写入其他引擎的表,包括mysql.*表将不会复制,但是DDL语句会被复制的,因此创建用户将会被复制,但是insert into mysql.user…将不会被复制的.

      ().DELETE操作不支持没有主键的表,没有主键的表在不同的节点顺序将不同,如果执行SELECT…LIMIT… 将出现不同的结果集.

      ().在多主环境下LOCK/UNLOCK TABLES不支持,以及锁函数GET_LOCK(), RELEASE_LOCK()…

      ().查询日志不能保存在表中。如果开启查询日志,只能保存到文件中。

      ().允许最大的事务大小由wsrep_max_ws_rows和wsrep_max_ws_size定义。任何大型操作将被拒绝。如大型的LOAD DATA操作。

      ().由于集群是乐观的并发控制,事务commit可能在该阶段中止。如果有两个事务向在集群中不同的节点向同一行写入并提交,失败的节点将中止。对 于集群级别的中止,集群返回死锁错误代码(Error:  SQLSTATE:  (ER_LOCK_DEADLOCK)).

      ().XA事务不支持,由于在提交上可能回滚。

      ().整个集群的写入吞吐量是由最弱的节点限制,如果有一个节点变得缓慢,那么整个集群将是缓慢的。为了稳定的高性能要求,所有的节点应使用统一的硬件。

      ().集群节点建议最少3个。

      ().如果DDL语句有问题将破坏集群。

二、MariaDB Galera Cluster搭建演示

.环境描述

OS: red hat linux 6.0 64bit

MariaDB server1:    192.168.1.137
MariaDB server2: 192.168.1.138
MariaDB server3: 192.168.1.139
Galera SST user: sst
Galera SST password: sstpass123
MySQL root password: kongzhong
. 配置mariadb的yum源 [root@client137 ~]# vim /etc/yum.repos.d/mariadb.repo [root@client138 ~]# vim /etc/yum.repos.d/mariadb.repo [root@client139 ~]# vim /etc/yum.repos.d/mariadb.repo # yum源的内容如下: [mariadb] name = MariaDB baseurl = http://yum.mariadb.org/5.5/rhel6-amd64 enabled = gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck= [root@client137 ~]# yum makecache [root@client138 ~]# yum makecache [root@client139 ~]# yum makecache .安装 MariaDB-Galera-server galera MariaDB-client [root@client137 ~]# yum -y install MariaDB-Galera-server galera MariaDB-client [root@client138 ~]# yum -y install MariaDB-Galera-server galera MariaDB-client [root@client139 ~]# yum -y install MariaDB-Galera-server galera MariaDB-client .编辑每台机器的hosts文件,添加如下内容 [root@client137 ~]# vim /etc/hosts 192.168.1.137 client137.kongzhong.com client137
192.168.1.138 client138.kongzhong.com client138
192.168.1.139 client139.kongzhong.com client139 # 启动测试一下 [root@client137 ~]# /etc/init.d/mysql start
Starting MySQL.... SUCCESS!
[root@client137 ~]# chkconfig mysql on .设置MariaDB的root密码,并做安全加固 [root@client137 ~]# /usr/bin/mysql_secure_installation [root@client137 ~]# /usr/bin/mysql_secure_installation # 登陆数据库,授权用于集群同步的用户和密码 [root@client137 ~]# mysql -uroot -pkongzhong mysql> GRANT USAGE ON *.* to sst@'%' IDENTIFIED BY 'sstpass123'; mysql> GRANT ALL PRIVILEGES on *.* to sst@'%'; mysql> FLUSH PRIVILEGES; mysql> quit # 创建并配置wsrep.cnf文件 [root@client137 ~]# cp /usr/share/mysql/wsrep.cnf /etc/my.cnf.d/
[root@client137 ~]# vim /etc/my.cnf.d/wsrep.cnf # 只需要修改如下4行: wsrep_provider=/usr/lib64/galera/libgalera_smm.so wsrep_cluster_address="gcomm://" wsrep_sst_auth=sst:sstpass123 wsrep_sst_method=rsync # 注意: # "gcomm://" 是特殊的地址,仅仅是Galera cluster初始化启动时候使用。 # 如果集群启动以后,我们关闭了第一个节点,那么再次启动的时候必须先修改,"gcomm://"为其他节点的集群地址,例如wsrep_cluster_address="gcomm://192.168.1.138:4567" .确认本机防火墙上开放了所需TCP 3306和TCP 4567的端口[也可以关闭防火墙] [root@client137 ~]# iptables -A INPUT -i eth0 -p tcp --dport -j ACCEPT
[root@client137 ~]# iptables -A INPUT -i eth0 -p tcp --dport -j ACCEPT # 启动mariadb,查看3306和4567端口是否被监听 [root@client137 ~]# /etc/init.d/mysql restart [root@client137 ~]# netstat -tulpn |grep -e -e
tcp 0.0.0.0: 0.0.0.0:* LISTEN /mysqld
tcp 0.0.0.0: 0.0.0.0:* LISTEN /mysqld # 这样一个节点就已经配置完成,其他节点的配置先给个思路,如下注释部分: # ********************* # 构造新节点的操作步骤如下: .按照上述1-6的步骤安装MariaDB和Galera library .除了第5步wsrep_cluster_address的配置稍有不同: wsrep_cluster_address="gcomm://Node-A-IP:4567" # 这里指向是指上一层的集群地址 .重起MariaDB # ********************* # .新添加节点的配置如下: # 构建192.168.1.138节点 [root@client138 ~]# /etc/init.d/mysql start
Starting MySQL.... SUCCESS!
[root@client138 ~]# /usr/bin/mysql_secure_installation [root@client138 ~]# mysql -uroot -pkongzhong mysql> GRANT USAGE ON *.* to sst@'%' IDENTIFIED BY 'sstpass123'; mysql> GRANT ALL PRIVILEGES on *.* to sst@'%'; mysql> FLUSH PRIVILEGES; mysql> quit [root@client138 ~]# cp /usr/share/mysql/wsrep.cnf /etc/my.cnf.d/
[root@client138 ~]# vim /etc/my.cnf.d/wsrep.cnf # 只需要修改如下4行: wsrep_provider=/usr/lib64/galera/libgalera_smm.so # 这里指定上一个集群节点的IP地址 wsrep_cluster_address="gcomm://192.168.1.137:4567" # 指定用于同步的账号和密码 wsrep_sst_auth=sst:sstpass123 wsrep_sst_method=rsync # 确认本机防火墙上开放了所需TCP 3306和TCP 4567的端口 [root@client138 ~]# iptables -A INPUT -i eth0 -p tcp --dport -j ACCEPT
[root@client138 ~]# iptables -A INPUT -i eth0 -p tcp --dport -j ACCEPT # 启动,监听 [root@client138 ~]# /etc/init.d/mysql restart [root@client138 ~]# netstat -tulpn |grep -e -e
tcp 0.0.0.0: 0.0.0.0:* LISTEN /mysqld
tcp 0.0.0.0: 0.0.0.0:* LISTEN /mysqld # 构建192.168.1.139节点 [root@client139 ~]# /etc/init.d/mysql start
Starting MySQL.... SUCCESS!
[root@client139 ~]# /usr/bin/mysql_secure_installation [root@client139 ~]# mysql -uroot -pkongzhong mysql> GRANT USAGE ON *.* to sst@'%' IDENTIFIED BY 'sstpass123'; mysql> GRANT ALL PRIVILEGES on *.* to sst@'%'; mysql> FLUSH PRIVILEGES; mysql> quit [root@client139 ~]# cp /usr/share/mysql/wsrep.cnf /etc/my.cnf.d/
[root@client139 ~]# vim /etc/my.cnf.d/wsrep.cnf # 只需要修改如下4行: wsrep_provider=/usr/lib64/galera/libgalera_smm.so # 这里指定上一个集群节点的IP地址 wsrep_cluster_address="gcomm://192.168.1.138:4567" # 指定用于同步的账号和密码 wsrep_sst_method=rsync # 确认本机防火墙上开放了所需TCP 3306和TCP 4567的端口 [root@client139 ~]# iptables -A INPUT -i eth0 -p tcp --dport -j ACCEPT
[root@client139 ~]# iptables -A INPUT -i eth0 -p tcp --dport -j ACCEPT # 启动,并查看监听 [root@client139 ~]# /etc/init.d/mysql restart [root@client139 ~]# netstat -tulpn |grep -e -e
tcp 0.0.0.0: 0.0.0.0:* LISTEN /mysqld
tcp 0.0.0.0: 0.0.0.0:* LISTEN /mysqld .以上配置完成后, 对于只有2个节点的Galera Cluster和其他集群软件一样,需要面对极端情况下的"脑裂"状态。 为了避免这种问题,Galera引入了"arbitrator(仲裁人)"。 "仲裁人"节点上没有数据,它在集群中的作用就是在集群发生分裂时进行仲裁,集群中可以有多个"仲裁人"节点。 "仲裁人"节点加入集群的方法如下: [root@client137 ~]# garbd -a gcomm://192.168.1.137:4567 -g my_wsrep_cluster -d # 注释:参数说明 : -d:以daemon模式运行 -a:集群地址 -g: 集群名称 .测试集群是否配置好参数: 登陆数据库: 查看如下几个参数: # 下面这个参数的显示是初始化数据库显示的情况 MariaDB [(none)]> SHOW VARIABLES LIKE 'wsrep_cluster_address';
+-----------------------+----------+
| Variable_name | Value |
+-----------------------+----------+
| wsrep_cluster_address | gcomm:// |
+-----------------------+----------+
row in set (0.00 sec) # 如果配置了指向集群地址,上面那个参数值,应该是你指定集群的IP地址
MariaDB [kz]> SHOW VARIABLES LIKE 'wsrep_cluster_address';
+-----------------------+----------------------------+
| Variable_name | Value |
+-----------------------+----------------------------+
| wsrep_cluster_address | gcomm://192.168.1.139:4567 |
+-----------------------+----------------------------+
row in set (0.00 sec)
# 此参数查看是否开启
MariaDB [kz]> show status like 'wsrep_ready';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wsrep_ready | ON |
+---------------+-------+
row in set (0.00 sec) # 这个查看wsrep的相关参数 MariaDB [terry]> show status like 'wsrep%'; +----------------------------+--------------------------------------+ | Variable_name | Value | +----------------------------+--------------------------------------+ | wsrep_local_state_uuid | bb5b9e17-66c8-11e3-86ba-96854521d205 | uuid 集群唯一标记 | wsrep_protocol_version | | | wsrep_last_committed | | sql 提交记录 | wsrep_replicated | | 随着复制发出的次数 | wsrep_replicated_bytes | | 数据复制发出的字节数 | wsrep_received | | 数据复制接收次数 | wsrep_received_bytes | | 数据复制接收的字节数 | wsrep_local_commits | | 本地执行的 sql | wsrep_local_cert_failures | | 本地失败事务 | wsrep_local_bf_aborts | |从执行事务过程被本地中断 | wsrep_local_replays | | | wsrep_local_send_queue | | 本地发出的队列 | wsrep_local_send_queue_avg | 0.142857 | 队列平均时间间隔 | wsrep_local_recv_queue | | 本地接收队列 | wsrep_local_recv_queue_avg | 0.000000 | 本地接收时间间隔 | wsrep_flow_control_paused | 0.000000 | | wsrep_flow_control_sent | | | wsrep_flow_control_recv | | | wsrep_cert_deps_distance | 0.000000 | 并发数量 | wsrep_apply_oooe | 0.000000 | | wsrep_apply_oool | 0.000000 | | wsrep_apply_window | 1.000000 | | wsrep_commit_oooe | 0.000000 | | wsrep_commit_oool | 0.000000 | | wsrep_commit_window | 1.000000 | | wsrep_local_state | | | wsrep_local_state_comment | Synced | | wsrep_cert_index_size | | | wsrep_causal_reads | | | wsrep_incoming_addresses | 192.168.1.137: | 连接中的数据库 | wsrep_cluster_conf_id | | | wsrep_cluster_size | | 集群成员个数 | wsrep_cluster_state_uuid | bb5b9e17-66c8-11e3-86ba-96854521d205 | 集群 ID | wsrep_cluster_status | Primary | 主服务器 | wsrep_connected | ON | 当前是否连接中 | wsrep_local_index | | | wsrep_provider_name | Galera | | wsrep_provider_vendor | Codership Oy <info@codership.com> | | wsrep_provider_version | 2.7(rXXXX) | | wsrep_ready | ON | 插件是否应用中 +----------------------------+--------------------------------------+ rows in set (0.05 sec) #以上详细参数注释: 监控状态参数说明: ().集群完整性检查: wsrep_cluster_state_uuid:在集群所有节点的值应该是相同的,有不同值的节点,说明其没有连接入集群. wsrep_cluster_conf_id:正常情况下所有节点上该值是一样的.如果值不同,说明该节点被临时"分区"了.当节点之间网络连接恢复的时候应该会恢复一样的值. wsrep_cluster_size:如果这个值跟预期的节点数一致,则所有的集群节点已经连接. wsrep_cluster_status:集群组成的状态.如果不为"Primary",说明出现"分区"或是"split-brain"状况. ().节点状态检查: wsrep_ready: 该值为ON,则说明可以接受SQL负载.如果为Off,则需要检查wsrep_connected. wsrep_connected: 如果该值为Off,且wsrep_ready的值也为Off,则说明该节点没有连接到集群. wsrep_local_state_comment:如果wsrep_connected为On,但wsrep_ready为OFF,则可以从该项查看原因. ().复制健康检查: wsrep_flow_control_paused:表示复制停止了多长时间.即表明集群因为Slave延迟而慢的程度.值为0~,越靠近0越好,值为1表示复制完全停止.可优化wsrep_slave_threads的值来改善. wsrep_cert_deps_distance:有多少事务可以并行应用处理.wsrep_slave_threads设置的值不应该高出该值太多. wsrep_flow_control_sent:表示该节点已经停止复制了多少次. wsrep_local_recv_queue_avg:表示slave事务队列的平均长度.slave瓶颈的预兆. 最慢的节点的wsrep_flow_control_sent和wsrep_local_recv_queue_avg这两个值最高.这两个值较低的话,相对更好. ().检测慢网络问题: wsrep_local_send_queue_avg:网络瓶颈的预兆.如果这个值比较高的话,可能存在网络瓶 ().冲突或死锁的数目: wsrep_last_committed:最后提交的事务数目 wsrep_local_cert_failures和wsrep_local_bf_aborts:回滚,检测到的冲突数目 .测试数据同步,一致等问题,这个测试不演示,概述一下大概思路: ().创建一个数据库,看是否同步 ().数据库里分别创建一个innodb和myisam引擎的表,看是否同步 ().分别往这两张表里插入数据,看是否同步,除innodb引擎数据可以同步,其余引擎是不同步 ().在任意一节点插入,删除数据,看是否同步 .在上面galera集群搭建完成后,我们可以借助于haproxy和lvs来实现mysql数据库集群之间的负载 这里就不演示,可以自己配置试试!

利用MariaDB Galera Cluster实现mariadb的多主复制的更多相关文章

  1. MariaDB Galera Cluster 10.1 只支持 LINUX ?!

    MariaDB Galera Cluster  (MariaDB 10.1) 当前只支持:LINUX ! 参考: https://mariadb.com/kb/en/mariadb/getting-s ...

  2. MariaDB Galera Cluster 部署(如何快速部署 MariaDB 集群)

    MariaDB Galera Cluster 部署(如何快速部署 MariaDB 集群)  OneAPM蓝海讯通7月3日 发布 推荐 4 推荐 收藏 14 收藏,1.1k 浏览 MariaDB 作为 ...

  3. MariaDB Galera Cluster 部署

    原文  http://code.oneapm.com/database/2015/07/02/mariadb-galera-cluster/MariaDB作为Mysql的一个分支,在开源项目中已经广泛 ...

  4. MariaDB Galera Cluster 部署(如何快速部署MariaDB集群)

    MariaDB Galera Cluster 部署(如何快速部署MariaDB集群) [日期:--] 来源:Linux社区 作者:Linux [字体:大 中 小] MariaDB作为Mysql的一个分 ...

  5. 构建 MariaDB Galera Cluster 分布式数据库集群(一)

    MariaDB Galera Cluster 介绍 简介 MariaDB集群是MariaDB同步多主机集群,仅支持XtraDB(详见本文结尾注释)/InnoDB存储引擎(虽然有对MyISAM实验支持 ...

  6. MariaDB Galera Cluster 部署 + keepalived实现高可用

    MariaDB Galera Cluster 部署 MariaDB作为Mysql的一个分支,在开源项目中已经广泛使用,例如大热的openstack,所以,为了保证服务的高可用性,同时提高系统的负载能力 ...

  7. MariaDB Galera Cluster集群搭建

    MariaDB Galera Cluster是什么?   Galera Cluster是由第三方公司Codership所研发的一套免费开源的集群高可用方案,实现了数据零丢失,官网地址为http://g ...

  8. MariaDB Galera Cluster部署手册

    MariaDB Galera Cluster部署手册 galara保证双主数据库的同步及一致性 1.环境准备 基于新部署.最小化安装centos6.5 1>  yum install opens ...

  9. 从 MySQL+MMM 到 MariaDB+Galera Cluster : 一个高可用性系统改造

    很少有事情比推出高可用性(HA)系统之后便经常看到的系统崩溃更糟糕.对于我们这个Rails运行机的团队来说,这个失效的HA系统是MySQL多主复制管理器(MMM). 我们已经找寻MMM的替代品有一段时 ...

随机推荐

  1. 如何解决android studio 运行时中文乱码的问题

    相信很多朋友都会遇到android studio 在MAC OS中运行的时候中文乱码.而在代码编辑的时候正常.经过几天的不断寻找解决办法,终于解决了 比如: Toast.makeText(MainAc ...

  2. [.NET] 打造防“狼”神器 :任务栏篇

    @微微一笑:本文标题纯属自娱自乐. 隐藏任务栏效果图: 对比 说起来惭愧,上面这个隐藏任务栏功能,只是完成了我一半的预想.本想是可以选择性的隐藏任务栏上的某个TaskBarButton,但是Win7+ ...

  3. java的基本数据类型特征

    java的数据类型分为基本数据类型和引用数据类型. 基本数据类型分为数值型.字符型(char).布尔型(boolean) 数值型变量 1.整数型 类型 占用存储空间 表示范围 byte 1字节Byte ...

  4. [转]ORACLE的ProC用法讲解

    pro*c是高级的用法,OCI是oracle的基础用法 如何编译.pc文件: proc code=cpp  parse=none iname=filename.pc oname=filename.cp ...

  5. Nginx Gzip 压缩配置

    Nginx Gzip 压缩配置 随着nginx的发展,越来越多的网站使用nginx,因此nginx的优化变得越来越重要,今天我们来看看nginx的gzip压缩到底是怎么压缩的呢? gzip(GNU-Z ...

  6. Centos 安装 p7zip,即Linux下的7z

    Centos 无法直接通过yum安装7z,我们一般通过repoforge,rpmforge的软件包进行安装,你只需要下载一个对应的包,直接安装就可以 p7zip-9.20.1-1.el4.rf.i38 ...

  7. WCF note1

    Summary of WCF Client to use service use ChannelFactory to create proxy to use service. Client code ...

  8. EF6 在原有数据库中使用 CodeFirst 总复习(一、搭建基础环境)

    本来以为已经会了,可动手时发现许多问题还是模糊不清,正所谓眼高手低.只能重新查资料,再复习一遍. vs.net2013 ef6 mvc5 sqlserver2008   一.建立数据库  Bloggi ...

  9. 30.DDR2问题2_local_init_done为什么没拉高?

    按照初始化时序,在200us时,mem_clk时钟稳定,开始初始化设置,设置完后,会产生一个初始化完成标志,local_init_done会拉高,没有拉高,可能有以下几个原因: 1.确认DDR2 IP ...

  10. 5个SQL核心

    5个核心的SQL语句 1.SELECT -查询语句的逻辑处理顺序 5     SELECT <columnlist> 1     FROM <source objectlist> ...