MySQL集群:高可用性DBMS

翻译&转载:https://opensourceforu.com/2016/04/mysql-cluster-a-high-availability-dbms/

MySQL集群:高可用性DBMS

如果您正在寻找没有单点故障的数据库管理系统,那么MySQL Cluster的分布式多主机架构(水平扩展)将是您最好的选择。MySQL Cluster可以访问MySQL Cluster,没有SQL接口,可用于提供密集的读/写工作负载。

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


PowerDNS是配置权威DNS服务器的首选,MySQL数据库作为后端,因为这种组合有其自身的优点。此设置处理传入的查询,查看MySQL数据库中的DNS记录并提供适当的响应。DNS服务器是HA,两台服务器中的数据库必须始终保持同步。此外,两个DHCP服务器都在主动 - 主动模式下工作,这样它们就可以在它们之间划分IP地址池,并且可以满足串联工作的传入DHCP请求。结果,从他们自己的MySQL数据库中的两个服务器发生了多次读/写。为了使两个数据库保持同步,必须有这样一种机制,这样如果任何服务器在数据库中进行了更改,要创建高可用性环境,如上所述,MySQL提供了两种解决方案?? MySQL复制和MySQL集群。主从复制,其中我们有一个读/写和一个或多个只读从属,在这种情况下没有用,因为复制是一种方式(从主服务器到从服务器)。虽然MySQL主 - 主复制是其中一种选择,但它不是一个好的选择,特别是当有多个主设备同时接收写请求时。循环复制(A到B,B到C,C到D和D到A)的最大缺点是,如果任何节点发生故障,复制将暂停链中的后续节点。
另一方面,MySQL集群是:

  • 内存(或主内存)数据库系统,它依赖主内存进行数据存储,管理和操作,以在查询数据时实现更好的性能。
  • 无共享体系结构数据库,它将数据存储在集群中的多个独立数据节点上,而不是共享数据存储,没有单点故障(SPOF)。
  • 一种分布式数据库系统,它将数据库的各部分存储在集群中的多个节点上,该节点由中央分布式数据库管理系统管理。因此,即使节点出现故障,也可以保持数据完整性。此外,扩展成为一项便利的任务,可用性几乎达到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-梨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 Cluster 3月16日

图1:MySQL Cluster组件

在数据节点上:要启动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服务器必须将数据存储在数据节点上。

猜你喜欢

转载自blog.csdn.net/Aria_Miazzy/article/details/84939893