如果你在寻找一个不会发生单点故障的数据库管理系统,那么水平拓展的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)的一大缺点是,如果任何节点发生故障,改节点和后续节点的复制将暂停。
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服务器数据必须存储在数据节点上。