MySQL集群:高可用性DBMS

如果你在寻找一个不会发生单点故障的数据库管理系统,那么水平拓展的MySQL集群分布式多主架构将是您的最佳选择。MySQL集群可以通过MySQL和NoSQL接口访问,并且可以用来服务密集的读/写工作。

在我建立了一个DHCP服务器后,我计划在我的网络中部署一个DNS服务器。在同一台服务器上配置DNS和DHCP是一个很好的选择,因为这样DHCP服务器分配给特定主机的IP地址就可以立即在DNS数据库中更新。如果出于某种原因,此DNS-DHCP服务器出现故障,则会对整个生产环境造成不利影响。作为预防措施,我们必须引入辅助DNS-DHCP服务器,该服务器必须配置为高可用性模式(HA),以便在主服务器关闭时辅助服务器接管并处理传入的请求。

PowerDNS是我们配置授权DNS服务器的首选,用MySQL数据库作为后端,因为这种组合具有其独特的优点。这样它可以处理传入的查询,查看MySQL数据库中的DNS记录并提供适当的响应。高可用性的DNS服务器必须始终保持两台服务器中的数据库同步。而且,两个DHCP服务器都工作在主动 - 主动模式下,这样它们就可以将IP地址池分隔开,并且可以先后处理传入的DHCP请求。因此,两台服务器中的MySQL数据库都会发生多次读取/写入操作。为了使两个数据库保持同步,必须有这样一种机制,不论何时任何服务器对数据库进行了更改,都会映射在其他服务器的数据库中,这样它们就可以都持有相同的DNS记录。

为了创建高可用性环境,如上所述,MySQL提供了两种解决方案。MySQL同步(replication)和MySQL集群。主从同步,其中我们有一个读/写和一个或多个只读从站,但在这种情况下是没有用的,因为复制是单向(从主站到从站)。尽管MySQL 主主复制是也是其中一种选择,但这不是一个好办法,尤其是当有多个主设备同时接收写请求时。循环复制(A到B,B到C,C到D和D到A)的一大缺点是,如果任何节点发生故障,改节点和后续节点的复制将暂停。

  • 依靠主内存进行数据存储的数据库系统,管理和操作,以在查询数据时实现更好的性能。
  • 无共享体系结构数据库,用于将数据存储在群集中的多个独立数据节点上,而不是共享数据存储,无单点故障(SPOF)。
  • 分布式数据库系统,它将部分数据库存储在集群中的多个节点上,由中央分布式数据库管理系统管理。所以即使一个节点出现故障,数据的完整性也会保持。而且,拓展(Scaling)成为一个方便的任务,可用性几乎达到99.99%。
  • 数据库更新将在集群中的所有数据节点之间同步复制,保证节点故障时的数据可用性。

MySQL集群组件

管理节点/服务器 这将维护集群的全局配置文件并在需要时提供集群信息。它还维护集群中发生事件的日志。管理节点中的管理客户端执行所有管理工作,如启动/停止节点,启动/停止备份以及检查群集的状态。

MySQL节点/服务器 这些服务器包含本地配置文件。他们运行mysqld守护进程并将其组合在一起形成一个集群,从而实现高性能(由于并行性)和高可用性。这些节点处理所有传入的查询,与数据节点通信并提供对集群的应用程序访问。

数据节点 这些节点运行ndbd守护进程并负责数据存储和检索。多个数据节点聚集在一起为整个集群提供存储,以便客户端将它们视为单个数据库。除数据存储外,他们还会持续监视群集中的其他数据节点,并在发生故障时通知管理服务器。

运行原理 在MySQL集群的核心,有一个NDB(网络数据库)存储引擎,它实际上负责高可用性环境和数据冗余。在基本场景中,我们有一个应用程序请求查询,通常以INSERT / UPDATE / DELETE 之类的SQL语句的形式发送到MySQL服务器。在MySQL集群中,其中一个MySQL服务器运行NDB存储引擎(或NDBCluster),它接收传入的SQL查询并与数据节点通信以存储数据。在确认数据成功写入数据节点之后,MySQL服务器给应用程序以OK状态确认。为了即使在节点发生故障后也能保持数据可用,它被分成许多称为分区的区块,这些区块等于集群中存在的节点数量。所以,每个节点必须存储一个分区以及一个分区的副本。管理节点上的配置文件中配置了副本的编号。MySQL集群可以达到99.999%的可用性,副本是关键要素。

处理故障 当MySQL节点发生故障时,作为无共享体系结构,集群中的其他节点(MySQL /数据节点或管理节点)不会受到影响,而是继续完成任务。它由应用程序连接到集群中的另一个MySQL节点。另一方面,如果数据节点发生故障,集群中的另一个数据节点接管责任,并且由于数据冗余(副本),数据也将可用。尽管MySQL集群负责处理节点故障,但您需要注意尽早处理发生故障的数据节点,因为您永远不知道其他节点何时会停止工作。管理节点发生故障不会造成太大影响,因为此节点仅处理监视和备份任务,但可能无法启动/停止其他群集节点。拥有两个管理节点绝对是一个解决方案。

实施 考虑到我有三个子网,并且没有任何预算问题,我选择部署四个DNS-DHCP服务器,其中三个将作为其各自网络的主要服务器,第四个将是次要服务器。我将在所有这四个节点(MySQL +数据节点)上都有MySQL数据库,并且这些节点将被配置成群集。为了建立MySQL集群,我需要将两个节点配置为管理节点。该情景在下表中展示。

管理节点 mgmtsrv01 172.22.100.10 mgmtsrv02 172.22.96.10

MySQL和数据节点 dhcpsrv01 172.22.11.100(区域1的主DHCP为 dhcpsrv02 172.22.22.100(区域2的主DHCP) dhcpsrv03 172.22.33.100(区域3的主DHCP)dhcpsrv04 172.22.44.100(所有的辅助DHCP)

系统: 基于Linux的虚拟机 操作系统: CentOS版本6.7 RAM: 8GB CPU核心4

软件包依赖 1. libaio.x86_64 0:0.3.107-10.el6.rpm 2. libaio-devel.x86_64 0:0.3.107-10.el6.rpm 3. numactl-2.0.9-2.el6.x86_64。 rpm 4. cryptopp-5.6.1-8.1.x86_64.rpm(PDNS需要) 5. php-pear-MDB2-Driver-mysql-1.5.0-0.8.b4.el6.noarch.rpm (PDNS需要) 6 。php-pear-MDB2-2.5.0-0.7.b4.el6.remi.noarch.rpm(PDNS需要) 7. php-mysql-5.3.3-46.el6_6.x86_64(PDNS需要) 8. php -pear-1.9.4-4.el6.noarch(PDNS需要) 9. php-pdo-5.3.3-46.el6_6.x86_64(PDNS需要) 10. perl-DBD-MySQL-4.013-3.el6 .x86_64(PDNS需要)

安装软件包 1. MySQL-Cluster-client-gpl-7.3.11-1.el6.x86_64.rpm 2. MySQL-Cluster-server-gpl-7.3.11-1.el6.x86_64.rpm 3. MySQL-Cluster- shared-compat-gpl-7.3.11-1.el6.x86_64.rpm (PDNS必需)

需要删除的软件包(如果有的话) 1 mysql-server 2. mysql 3. mysql-libs

数据节点配置 编辑/etc/my.cnf文件,如下所示:

[mysqld]
ndbcluster
# IP address of the cluster management node
ndb-connectstring=172.22.100.10,172.22.96.10
socket=/var/lib/mysql/mysql.sock
user=mysql
innodb_data_file_path = ibdata1:10M:autoextend
pid-file=/var/run/mysqld/mysqld.pid
explicit_defaults_for_timestamp = 1
 
[mysql_cluster]
# IP address of the cluster management node
ndb-connectstring=172.22.100.10,172.22.96.10
 
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

管理节点配置 编辑/var/lib/mysql-cluster/config.ini文件,如下所示:

[ndbd default]
NoOfReplicas=4
DataDir=/opt/mysql-cluster/data
MaxNoOfAttributes=10000
MaxNoOfConcurrentOperations=150000
MaxNoOfOrderedIndexes=512
 
# MANAGEMENT NODES
[ndb_mgmd]
NodeId=1
hostname=172.22.100.10
datadir= /var/lib/mysql-cluster
 
[ndb_mgmd]
NodeId=2
hostname=172.22.96.10
datadir= /var/lib/mysql-cluster
 
# DATA NODES
 
[ndbd]
NodeId=3
hostname=172.22.11.100
datadir=/usr/local/mysql/data
 
[ndbd]
NodeId=4
hostname=172.22.44.100
datadir=/usr/local/mysql/data
 
[ndbd]
NodeId=5
hostname=172.22.33.100
datadir=/usr/local/mysql/data
 
[ndbd]
NodeId=6
hostname=172.22.22.100
datadir=/usr/local/mysql/data
 
#MYSQL NODES
[mysqld]
NodeId=7
hostname=172.22.11.100
 
[mysqld]
NodeId=8
hostname=172.22.44.100
 
[mysqld]
NodeId=9
hostname=172.22.33.100
 
[mysqld]
NodeId=10
hostname=172.22.22.100

注意: 建议在继续之前设置MySQL root密码。

MySQL集群设置 在管理节点上:要启动集群,请使用以下命令:

ndb_mgmd -f /var/lib/mysql-cluster/config.ini

它应该显示以下输出:

MySQL Cluster Management Server mysql-5.6.27 ndb-7.3.11
2016-01-13 11:21:54 [MgmtSrvr] INFO -- The default config directory ‘/usr/mysql-cluster’ does not exist. Trying to create it...
2016-01-13 11:21:54 [MgmtSrvr] INFO -- Sucessfully created config directory

图1:MySQL集群组件

在数据节点上:要启动NDB群集引擎,请使用以下命令:

ndbd

它应该显示下面给出的输出:

2016-01-13 11:22:40 [ndbd] INFO
-- Angel connected to ‘172.22.100.10:1186’
2016-01-13 11:22:40 [ndbd] INFO -- Angel allocated nodeid: 3

在MySQL节点上:要启动MySQL服务,请使用下面的命令:

service mysql start

要从管理节点检查群集状态,请使用以下命令:

ndb_mgm
show

如果配置正常,它必须显示以下输出:

mgmtsrv02 root [mysql-cluster] > ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: 172.22.100.10:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 4 node(s)
id=3 @172.22.11.100 (mysql-5.6.27 ndb-7.3.11,Nodegroup: 0, *)
id=4 @172.22.44.100 (mysql-5.6.27 ndb-7.3.11, Nodegroup: 0)
id=5 @172.22.33.100 (mysql-5.6.27 ndb-7.3.11, Nodegroup: 0)
id=6 @172.22.22.100 (mysql-5.6.27 ndb-7.3.11, Nodegroup: 0)
 
[ndb_mgmd(MGM)] 2 node(s)
id=1 @172.22.100.10 (mysql-5.6.27 ndb-7.3.11)
id=2 @172.22.96.10 (mysql-5.6.27 ndb-7.3.11)
 
[mysqld(API)] 4 node(s)
id=7 @172.22.11.100 (mysql-5.6.27 ndb-7.3.11)
id=8 @172.22.44.100 (mysql-5.6.27 ndb-7.3.11)
id=9 @172.22.33.100 (mysql-5.6.27 ndb-7.3.11)
id=10 @172.22.22.100 (mysql-5.6.27 ndb-7.3.11)

否则,如果任何节点出现故障,则会显示:

[ndbd(NDB)] 4 node(s)
id=3 @172.22.11.100 (mysql-5.6.27 ndb-7.3.11, Nodegroup: 0, *)
id=4 @172.22.44.100 (mysql-5.6.27 ndb-7.3.11, Nodegroup: 0)
id=5 (not connected, accepting connect from 172.22.33.100)
id=6 @172.22.22.100 (mysql-5.6.27 ndb-7.3.11, Nodegroup: 0)

任何DBMS都使用存储引擎或数据库引擎来写入,读取,更新或删除数据库中的数据。InnoDB是MySQL自5.5版以来使用的默认存储引擎,因此无论何时在没有ENGINE子句的情况下创建表,它都会默认创建InnoDB表。借助InnoDB,可以从运行MySQL服务器的硬盘读取和写入数据,因此需要将磁盘配置为RAID,以实现数据冗余。另一方面,MySQL集群使用NDBCluster引擎,该引擎使用网络连接来访问跨不同数据节点(而不是InnoDB等MySQL服务器)传播的数据。因此,在创建表时,必须明确提及NDBCluster存储引擎,以便指示MySQL服务器数据必须存储在数据节点上。

本文的版权归 和风 所有,如需转载请联系作者。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

网游内存数据库的设计(2)

续第一篇,前两天对核心存储做了些修改,以前只打算与关系数据库的行与表做对应,value类型只能使array或list, 现在把7种基本类型也加入到value支持...

41580
来自专栏Golang语言社区

网游内存数据库的设计(2)

续第一篇,前两天对核心存储做了些修改,以前只打算与关系数据库的行与表做对应,value类型只能使array或list, 现在把7种基本类型也加入到value支持...

32640
来自专栏cs

MySQL 问题解决

问题如下: Failed to Connect to MySQL at 127.0.0.1:3306 with user root Access denied...

41880
来自专栏坚毅的PHP

mysql复制学习二 安装及首次复制配置

安装 下载rpm版本 server 安装  rpm -ivh MySQL-server-5.5.24-1.linux2.6.i386.rpm  出错1 ...

44250
来自专栏北京马哥教育

64位CentOS6安装MySQL-5.7.13-linux-glibc2.5-x86_64.tar.gz

作者:云上之山 来源:http://blog.csdn.net/nengyu/article/details/51615836 1.从官网下载 mysql-5....

37180
来自专栏aoho求索

基于可靠消息方案的分布式事务(三):Lottor使用

前面两篇文章介绍了笔者关于可靠消息方案的分布式事务的实现思路以及Java中的事务概念,奈何工作抽不出时间,如今时隔已久,分布式事务系列拖了很久,一直没能好好把项...

9910
来自专栏文渊之博

MySQL常见备份方案

1.1K00
来自专栏蓝天

MySQL-5.7.10主主同步的安装和配置

这里安装的是最新的MySQL 5.7.10(5.7.12、5.7.13(后续更新版本可能类似)有些区别,安装过程中遇到错误可搜索下本文,也许可以找到解决办法...

17240
来自专栏散尽浮华

mysql主从同步(2)-问题梳理

之前部署了Mysql主从复制环境(Mysql主从同步(1)-主从/主主环境部署梳理),在mysql同步过程中会出现很多问题,导致数据同步异常。 以下梳理了几种主...

65360
来自专栏张戈的专栏

zabbix agentd客户端插件Shell一键自动安装脚本

这次生产环境上线了多台 Linux 服务器,需要全部纳入 Zabbix 监控范畴,一台一台的去装 Zabbix Agentd 插件那就太苦逼了,所幸 Zabbi...

36750

扫码关注云+社区

领取腾讯云代金券