特色
MySQL/Galera 是一种多主同步集群,但只限于使用 MySQL/InnoDB 引擎,并具有下面特点
同步复制
多个主服务器的拓扑结构
可以在任意节点上进行读写
自动控制成员,自动删除故障节点
自动加入节点
真正给予行级别的并发复制
调度客户连接
优势
参考下面基于 DBMS 集群的解决方法
不存在从服务器角色
不存在事务丢失
读写操作可根据需要进行随意扩展
更少的闩操作
知识点
MySQL/Galera 集群使用 Galera 库执行复制,对应 Galera 复制接口,我们需要MySQL 服务器支持 wsrep API 接口
http://www.codership.com/products/mysql-write-set-replication-project
是否可以使用 MySQL 而不使用 mariadb
不可以,因为 mysql 中没有支持 wsrep_ 数据复制的参数,当然代码级别上也具有很大差别
工作原理
mariadb 可以看做是常见的数据库,负责连接应用(web, API 等)
单纯的 mariadb 无法实现多个主服务器数据同步
多台数据库中数据同步由 wsrep 接口实现
最终目标,实现多个 MySQL 同时读写
wsrep API
wsrep API 是一种数据库插件接口,比较类似一种应用程序,主要针对写复制
该程序主要用于定义应用程序如何调用复制库实现回写
wsrep API 由支持改库的应用程序动态装载
全局事务ID(GTID)
wsrep API 描述下面复制模型,一个应用程序,如数据库当前的一个对象,当前被客户端修改,对象改变导致事务产生一系列的原子性改变, 在集群中所有的节点都具备相同的对象,并由同步复制应用都各自节点,按照相同的顺序产生相同变化从而实现数据同步
到最后,wsrep API 将会分配一个全局事务ID 该 ID 具有下面功能
标识对象的改变
标识对象自身 ID 最后状态(正常情况下,ID 是连续不中断的)
GTID 包含
一个 UUID 作为对象标识及经历改变的序号,序号会发生连续的改变
GTID 允许比较应用程序状态,建立对象改变的顺序,决定对象的变化是否需要更新 GTID
通常 GTID 会卑记录成下面格式
45eec521-2f34-11e0-0800-2a36050b826b:94530586304
言归正传,我们需要编译 mariadb-mysql 及 galera 插件
galera/mysql 编译步骤
https://downloads.mariadb.org/interstitial/mariadb-galera-5.5.33a/kvm-tarbake-jaunty-x86/mariadb-galera-5.5.33a.tar.gz/from/http://mirrors.scie.in/mariadb
yum install -y cmake
tar xf mariadb-galera-5.5.33a.tar.gz
cd mariadb-5.5.33a/
cmake -LAH
参考 CMakeCache.txt 文件中的配置信息
cmake -DINSTALL_MYSQLDATADIR:STRING=/mdb -DINSTALL_UNIX_ADDRDIR:STRING=/var/run/mysqld/mysql5.socket make make install
默认情况下, mariadb 安装在 /usr/local/mysql
galera 编译
https://launchpad.net/galera/2.x/23.2.7/+download/galera-23.2.7-src.tar.gz
添加数据源
baseurl=http://mirror.neu.edu.cn/fedora/epel//6Server/x86_64/
添加下面软件包
yum erase -y mysql.x86_64 mysql-devel.x86_64 mysql-libs.x86_64 yum install -y boost-devel.x86_64 libodb-boost-devel.x86_64 bzr scons
解压 galera-23.2.7-src.tar.gz 并进行编译
cd /usr/src tar xf galera-23.2.7-src.tar.gz cd galera-23.2.7-src scons
编译后能生成 libgalera_smm.so
复制编译好的库至下面位置 /usr/local/galera/lib/libgalera_smm.so
mkdir /usr/local/galera/lib -p cp /usr/src/galera-23.2.7-src/libgalera_smm.so /usr/local/galera/lib/libgalera_smm.so
复制 启动脚本 /usr/src/galera-23.2.7-src/scripts/mysql/mysql-galera 到 /usr/local
cp /usr/src/galera-23.2.7-src/scripts/mysql/mysql-galera /usr/local
创建 /usr/local/mysql/etc/my.cnf
[mysqld] basedir=/usr/local/mysql big-tables bind-address=0.0.0.0 character-set-server=utf8 datadir=/mdb log-error=/var/log/mysqld/mysql5-error.log socket=/var/run/mysqld/mysql5.socket pid-file=/var/run/mysqld/mysql5.pid port=3306 user=mysql binlog_format = ROW binlog_cache_size = 1M character_set_server = utf8 collation_server = utf8_general_ci default-storage-engine = InnoDB expire_logs_days = 10 innodb_buffer_pool_size = 300M innodb_thread_concurrency = 16 innodb_log_buffer_size = 8M innodb_doublewrite = 1 innodb_file_per_table = 1 innodb_flush_log_at_trx_commit = 2 server-id = 1 max_connections = 1000 net_buffer_length = 8K open-files-limit = 65535 wsrep_cluster_address = 'gcomm://192.168.200.163,192.168.200.171,172.18.8.49,172.18.8.50' wsrep_provider = /usr/local/galera/lib/libgalera_smm.so wsrep_retry_autocommit = 0 wsrep_sst_method = rs