MariaDB Gelera Cluster (update)

Galera Cluster

  • mysql galera cluster概念
    Galera Cluster是Codership公司开发的免费开源高可用mysql集群方案。原理是在InnoDB存储引擎上安装wsrep(Write Set Replication API)同步组件,另外需要使用库Galera replication library (galera-3)。
    Percona/MariaDB都会提供各自的发现版本。分别是,percona-cluster和MariaDB-Cluste
  • MariaDB-Cluster优缺点
    MariaDB Galera Cluster主要功能:
    同步复制;
    真正的multi-master,即所有节点可以同时读写数据库;
    自动的节点成员控制,失效节点自动被清除;
    新节点加入数据自动复制;
    真正的并行复制,行级;
    用户可以直接连接集群,使用感受上与MySQL完全一致;
    优势:
    因为是多主,所以不存在Slavelag(延迟);
    不存在丢失事务的情况;
    同时具有读和写的扩展能力;
    更小的客户端延迟;
    节点间数据是同步的,而Master/Slave模式是异步的,不同slave上的binlog可能是不同的。
    缺点:
    加入新节点时开销大,需要复制完整的数据;
    不能有效地解决写扩展的问题,所有的写操作都发生在所有的节点,有多少个节点,就有多少份重复的数据;
    由于事务提交需要跨节点通信,即涉及分布式事务操作,因此写入会比主从复制慢很多,节点越多,写入越慢,死锁和回滚也会更加频繁;
    对网络要求比较高,如果网络出现波动不稳定,则可能会造成两个节点失联,Galera Cluster集群会发生脑裂,服务将不可用;
    局限性:
    仅支持InnoDB/XtraDB存储引擎,任何写入其他引擎的表,包括mysql.*表都不会被复制;
    DDL语句可以复制,但是insert into mysql.use(MyISAM存储引擎)之类的插入数据不会被复制;
    delete操作不支持没有主键的表,因为没有主键的表在不同的节点上的顺序不同,如果执行select … limit …将出现不同的结果集;
    LOCK/UNLOCK TABLES/FLUSH TABLES WITH READ LOCKS不支持单表所锁,并且不支持锁函数GET_LOCK()、RELEASE_LOCK(),但FLUSH TABLES WITH READ LOCK支持全局表锁;
    General Query Log日志不能保存在表中,如果开始查询日志,则只能保存到文件中;
    不能有大事务写入,不能操作wsrep_max_ws_rows=131072(行),且写入集不能超过wsrep_max_ws_size=1073741824(1GB),否则客户端直接报错;
    由于集群是乐观锁并发控制,因此,在commit阶段会有事务冲突发生。如果两个事务在集群中的不同节点上对同一行写入并提交,则失败的节点将回滚,客户端返回死锁报错;
    XA分布式事务不支持Codership Galera Cluster,在提交时可能会回滚;
    整个集群的写入吞吐量取决于最弱的节点限制,集群要使用同一的配置。

  • MariaDB Galera Cluster版本
    包括5.5版本,它是基于MariaDB 5.5 + Galera构成;10.0版本是基于 MariaDB + Galera组成。MariaDB从10.1开始整合Galera到数据库包中。

  • 安装步骤(要求联网):
    通过外部yum源安装
    每个节点往/etc/yum.repos.d/base.repo >>>>>>>>>>>>>这是我的repo文件,因人而异找到自己的repo文件加入:

[mariadb]
name=MariaDB
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mariadb/mariadb-5.5.60/yum/centos7-amd64/
gpgcheck=0

每个节点执行yum install MariaDB-Galera-server

安装成功后每个节点修改配置文件:

vim /etc/my.cnf.d/server.cnf
[galera]
# Mandatory settings
wsrep_provider= "/usr/lib64/galera/libgalera_smm.so"    #插件库文件;
wsrep_cluster_address="gcomm://node_ip_address1,node_ip_address2,node_ip_address3"
wsrep_cluster_name=galera_cluster   #修改集群名字,可省略,默认my_wsrep_cluster
wsrep_node_address= #节点地址,可省略;
wsrep_node_name=    #节点名,可省略;
binlog_format=row   #二进制日志格式;
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2  #锁格式;
#bind-address=0.0.0.0   #工作时监听的地址;

首次启动时,需要初始化集群,在其中任意节点上执行如下命令:
/etc/init.d/mysql start --wsrep-new-cluster [--wsrep_cluster_name=galera_cluster]
然后启动其它节点数据库:
/etc/init.d/mysql start
到此MariaDB 集群数据库简单搭建完毕,然后验证:

[root@slave2 10:02:11 ~]#mysql
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 7
Server version: 5.5.60-MariaDB-wsrep MariaDB Server, wsrep_25.23.r9949137
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
4 rows in set (0.00 sec)
MariaDB [(none)]> create database galeradb;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> \u galeradb
Database changed
MariaDB [galeradb]> create table test_tb(id int auto_increment not null primary key,name char(30));
Query OK, 0 rows affected (0.01 sec)
MariaDB [galeradb]> insert test_tb (name) values ('zhang sanfeng');
Query OK, 1 row affected (0.01 sec)
MariaDB [galeradb]> select * from test_tb;
+----+---------------+
| id | name |
+----+---------------+
| 3 | zhang sanfeng |
+----+---------------+
1 row in set (0.00 sec)

然后到其它节点查询 看数据是否同步。同样,在其它节点插入数据再验证OK

  • 工作原理分析
    因为该集群每个节点都有各自的数据库,它们之间是通过wsrep同步数据的,在并发插入或修改数据时需要进行访问控制。
    原理如下:
    当客户端发出一个commit的指令,在事务被提交之前,所有对数据库的更改都会被write-set收集起来,并且将write-set记录的内容发送给其他节点;
    write-set将在每个节点上使用搜索到的主键进行确认性认证测试,测试结果决定着节点是否应用write-set更改数据;
    如果认证测试失败,节点将丢弃 write-set ;
    如果认证测试成功,则事务提交,工作原理如下图:

  • 在一组已运行的集群中,新增节点,那么新节点的数据同步如何解决?
    新加入的节点叫做Joiner,给Joiner提供复制的节点叫Donor;
    在该过程中首先会检查本地grastate.dat文件的seqno事务号是否在远端donor节点galera.cache文件里;
    如果存在,那么进行Incremental State Transfer(IST)增量同步复制,将剩余的事务发送过去;
    如果不存在那么进行State Snapshot Transfer(SST)全量同步复制;
    SST有三种全量拷贝方式:mysqldump、rsync和xtrabackup;
    SST的方法可以通过wsrep_sst_method这个参数来设置。



备注:
SST是指从donor到joiner的数据全量拷贝,它通常使用在一个新的节点加入时,为了与集群同步,新的节点不得不去一个已经在集群中的节点上拷贝数据,在PXC(Percona Xtradb Cluster)中,有三种SST的方法,mysqldump,rsync,Xtrabackup。
建议使用XtraBackup,另外对XtraBackup补充说明:
在XtraBackup 2.1.x版本里,使用innobackupex备份时,备份流程如下:

  1. 备份InnoDB表数据
  2. 执行全局表读锁FLUSH TABLES WITH READ LOCKS
  3. 拷贝.frm和MyISAM表数据
  4. 得到当前的binlog文件名和position点
  5. 完成redo log事务日志的后台复制
  6. 解锁UNLOCK TABLES
    由上面可以看出如果备份好几张MyISAM存储的大表时,将会进行锁表。




猜你喜欢

转载自www.cnblogs.com/allin2018/p/9196565.html