私有云Mariadb集群搭建

 

 

     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个节点都在里面了。

下一步大家如果想测试,可以在任意一个节点里创建数据库与表,插入数据后,在另外节点里查看是否有对应信息

 

posted @ 2016-12-13 12:42  叶小宠  阅读(415)  评论(0编辑  收藏  举报