MariaDB作为Mysql的一个分支,在开源项目中已经广泛使用,例如大热的openstack,所以,为了保证服务的高可用性,
同时提高系统的负载能力,集群部署是必不可少的。
MariaDB Galera Cluster 介绍
MariaDB集群是MariaDB同步多主机集群。它仅支持XtraDB/ InnoDB存储引擎(虽然有对MyISAM实验支持 - 看wsrep_replicate_myisam系统变量)。
主要功能:
- 同步复制
- 真正的multi-master,即所有节点可以同时读写数据库
- 自动的节点成员控制,失效节点自动被清除
- 新节点加入数据自动复制
- 真正的并行复制,行级
- 用户可以直接连接集群,使用感受上与MySQL完全一致
优势:
- 因为是多主,所以不存在Slavelag(延迟)
- 不存在丢失事务的情况
- 同时具有读和写的扩展能力
- 更小的客户端延迟
- 节点间数据是同步的,而Master/Slave模式是异步的,不同slave上的binlog可能是不同的
技术:
Galera集群的复制功能基于Galeralibrary实现,为了让MySQL与Galera library通讯,特别针对MySQL开发了wsrep API。
Galera插件保证集群同步数据,保持数据的一致性,靠的就是可认证的复制
当客户端发出一个commit的指令,在事务被提交之前,所有对数据库的更改都会被write-set收集起来,并且将 write-set 纪录的内容发送给其他节点。
write-set 将在每个节点进行认证测试,测试结果决定着节点是否应用write-set更改数据。
如果认证测试失败,节点将丢弃 write-set ;如果认证测试成功,则事务提交。
局限性:
(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语句有问题将破坏集群。
openstack中mariadb的集群是比不可少的 ,是组件当中非常重要的组件
我是本次选择mysql的版本是mariadb,集群方法是galera cluster多主集群。
其实也有很多其他方案,如pxc、mha等等,选择galera的原因是安装方便,使用与维护也方便,多主模式任何一个节点挂了都可以在另外节点查看数据,同时openstack各组件也支持配置集群方式的配置
系统环境:
# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) # uname -r 3.10.0-327.el7.x86_64
hosts文件写入
我这边是搭建在rabbitmq上面进行测试的
# cat /etc/hosts 192.168.56.60 rabbitmq01 192.168.56.61 rabbitmq02 192.168.56.62 rabbitmq03
安装基础库(所有节点)
yum -y install make cmake bc gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5-devel libidn libidn-devel openssl openssl-devel nss_ldap openldap openldap-devel openldap-clients openldap-servers libxslt-devel libevent-devel ntp libtool-ltdl bison libtool vim-enhanced tar wget readline-devel libyaml-devel patch telnet lrzsz sysstat screen parted rsync libselinux-python dmidecode ntpdate sar openssh-clients man
安装mariadb源(所有节点)
cat >/etc/yum.repos.d/mariadb.repo <<EOF # MariaDB 10.1 CentOS repository list - created 2016-05-24 07:59 UTC # http://mariadb.org/mariadb/repositories/ [mariadb] name = MariaDB baseurl = http://yum.mariadb.org/10.1/centos7-amd64 gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck=1 EOF
安装软件(所有节点安装)
yum install MariaDB-server MariaDB-client -y
node1节点配置
# cat /etc/my.cnf.d/server.cnf |grep -v '^#'|sed '/^$/d' [server] [mysqld] collation-server = utf8_general_ci init-connect = 'SET NAMES utf8' character-set-server = utf8 skip-name-resolve skip-host-cache open_files_limit = 65535 max_connections = 5000 bind-address=192.168.56.60 binlog_format=row default_storage_engine=InnoDB innodb_autoinc_lock_mode=2 innodb_file_per_table character-set-server = utf8 [galera] wsrep_on=ON wsrep_provider=/usr/lib64/galera/libgalera_smm.so wsrep_provider_options="pc.recovery=TRUE;gcache.size=300M" wsrep_cluster_address='gcomm://' wsrep_cluster_name='ck-galera' wsrep_node_address='192.168.56.60' wsrep_node_name='m-1' wsrep_sst_method=rsync [embedded] [mariadb] [mariadb-10.1]
启动
systemctl enable mariadb
systemctl start mariadb
初始化数据库
mysql_secure_installation
#过程我就不写了
查询集群数量
mysql -uroot -p -e "show status where Variable_name like 'wsrep_cluster_size'" password: +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 1 | +--------------------+-------+
查看当前集群ip
mysql -uroot -p -e "show status where Variable_name like 'wsrep_incoming_addresses'" Enter password: +--------------------------+-------------------+ | Variable_name | Value | +--------------------------+-------------------+ | wsrep_incoming_addresses | 192.168.56.60:3306 | +--------------------------+-------------------+
node2配置
# grep -v '^#' /etc/my.cnf.d/server.cnf |sed '/^$/d' [server] [mysqld] collation-server = utf8_general_ci init-connect = 'SET NAMES utf8' character-set-server = utf8 skip-name-resolve skip-host-cache open_files_limit = 65535 max_connections = 5000 bind-address=192.168.56.61 binlog_format=row default_storage_engine=InnoDB innodb_autoinc_lock_mode=2 innodb_file_per_table character-set-server = utf8 [galera] wsrep_on=ON wsrep_provider=/usr/lib64/galera/libgalera_smm.so wsrep_provider_options="pc.recovery=TRUE;gcache.size=300M" wsrep_cluster_address='gcomm://192.168.56.60' wsrep_cluster_name='ck-galera' wsrep_node_address='192.168.56.61' wsrep_node_name='m-2' wsrep_sst_method=rsync [embedded] [mariadb] [mariadb-10.1]
启动
systemctl enable mariadb
systemctl start mariadb
查看集群数量
# mysql -uroot -p -e "show status where Variable_name like 'wsrep_cluster_size'" Enter password: +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 2 | +--------------------+-------+
查看集群ip
# mysql -uroot -p -e "show status where Variable_name like 'wsrep_incoming_addresses'" Enter password: +--------------------------+---------------------------------------+ | Variable_name | Value | +--------------------------+---------------------------------------+ | wsrep_incoming_addresses | 192.168.56.60:3306,192.168.56.61:3306 | +--------------------------+---------------------------------------+
可以看到node1和node2在里面了
node3配置
修改跟node1与node2一样
# grep -v '^#' /etc/my.cnf.d/server.cnf |sed '/^$/d' [server] [mysqld] collation-server = utf8_general_ci init-connect = 'SET NAMES utf8' character-set-server = utf8 skip-name-resolve skip-host-cache open_files_limit = 65535 max_connections = 5000 bind-address=192.168.56.62 binlog_format=row default_storage_engine=InnoDB innodb_autoinc_lock_mode=2 innodb_file_per_table character-set-server = utf8 [galera] wsrep_on=ON wsrep_provider=/usr/lib64/galera/libgalera_smm.so wsrep_provider_options="pc.recovery=TRUE;gcache.size=300M" wsrep_cluster_address='gcomm://192.168.56.60,192.168.56.61' wsrep_cluster_name='ck-galera' wsrep_node_address='192.168.56.62' wsrep_node_name='m-3' wsrep_sst_method=rsync [embedded] [mariadb] [mariadb-10.1]
启动
systemctl enable mariadb
systemctl start mariadb
查看集群状态
# mysql -uroot -p -e "show status where Variable_name like 'wsrep_cluster_size'" Enter password: +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 3 | +--------------------+-------+
查看集群IP
# mysql -uroot -p -e "show status where Variable_name like 'wsrep_incoming_addresses'" Enter password: +--------------------------+----------------------------------------------------------+ | Variable_name | Value | +--------------------------+----------------------------------------------------------+ | wsrep_incoming_addresses | 192.168.56.60:3306,192.168.56.62:3306,192.168.56.61:3306 | +--------------------------+----------------------------------------------------------+
可以看到3个节点都在里面了。
下一步大家如果想测试,可以在任意一个节点里创建数据库与表,插入数据后,在另外节点里查看是否有对应信息