Standing up a MySQL cluster
此配方将指导您完成设置MySQL群集的过程。 通过跨多个系统划分数据并维护副本以避免单点故障,群集数据库可以应对可伸缩性和高可用性的挑战。
集群的成员称为节点。 MySQL集群中有三种节点类型:数据节点,API节点和管理节点。 数据节点负责存储数据。 然后,用户和进程连接到API节点以访问数据库。 管理节点作为整体管理集群。 虽然可以在同一系统上安装多个节点,但是,API节点和数据节点都可以托管在同一系统上。 但是,在同一系统上托管多个数据节点显然不是一个好主意,因为它否定了MySQL分发数据的努力。
准备
此配方演示了如何使用四个系统部署MySQL集群。 第一个系统将托管管理节点,我们假设它具有IP地址192.168.56.100。 第二个系统将托管API节点并具有地址192.168.56.101。 其余系统将配置数据节点,并使用地址192.168.56.102和192.168.56.103。 您需要使用root帐户或sudo在所有四个系统上进行管理访问.
怎么做。。。
请按照以下步骤设置群集MySQL数据库:
- 从MySQL网站下载集群存档,并使用tar解压缩其包:
curl -L dev.mysql.com/get/Downloads/MySQL-Cluster-7.4/ MySQL-Cluster-gpl-7.4.10-1.el7.x86_64.rpm-bundle.tar | tar x
- 在每个系统上,安装perl-Data-Dumper并将已安装的mariadb-libspackage替换为下载的MySQL-Cluster-shared软件包:
yum install perl-Data-Dumper MySQL-Cluster-shared-gpl-*.rpmyum erase mariadb-libs
- 在每个系统上安装MySQL-Cluster-server和MySQL-Cluster-client软件包:
yum install MySQL-Cluster-{server,client}-gpl-*.rpm
- 在托管管理节点的系统上,创建/ var / lib / mysql-cluster目录:
mkdir /var/lib/mysql-cluster
- 在/var/lib/mysql-cluster/config.ini中为管理节点创建集群的配置文件,如下所示:
[ndbd default]NoOfReplicas = 2DataMemory = 100MIndexMemory = 10MServerPort = 2202[ndb_mgmd]hostname = 192.168.56.100[mysqld]hostname = 192.168.56.101[ndbd]hostname = 192.168.56.102[ndbd]hostname = 192.168.56.103
- 启动管理节点:
ndb_mgmd -f /var/lib/mysql-cluster/config.ini
- 在管理节点系统的防火墙中打开端口1186:
firewall-cmd --zone=public --permanent --add-port=1186/tcpfirewall-cmd --reload
- 在每个数据节点的系统上,使用以下命令创建文件/etc/my.cnf:
[mysql_cluster]ndb-connectstring = 192.168.56.100
- 启动每个数据节点:
ndbd
- 在数据节点的系统防火墙中打开端口2202:
firewall-cmd --zone=public --permanent --add-port=2202/tcpfirewall-cmd --reload
- 使用以下命令在托管API节点的系统上创建/etc/my.cnf:
[mysqld]ndbclusterdefault-storage-engine = ndbcluster[mysql_cluster]ndb-connectstring = 192.168.56.100
- 启动MySQL服务器作为API节点:
mysqld_safe &
- 检索安装MySQL服务器时创建的root帐户的临时密码。 它记录在/root/.mysql_secret中:
cat /root/.mysql_secret
- 使用mysqladmin为root帐户设置新密码。 提示输入当前密码时,请输入上一步中标识的密码:
mysqladmin -u root -p password
- 在API节点系统的防火墙中打开端口3306:
firewall-cmd --zone=public --permanent --add-service=mysqlfirewall-cmd --reload
- 使用托管管理节点的系统上的ndb_mgm客户端验证集群的状态:
ndb_mgm -e SHOW
工作原理
本文教您如何使用两个数据节点设置MySQL集群数据库:一个API节点和一个管理节点。 管理节点由ndb_mgmdprocess组成,该处理器向其他节点提供配置信息并对其进行监视。 在数据节点上,ndbd进程处理群集数据的存储,分区和复制。 知道管理节点和数据节点的MySQL服务器充当API节点,用户可以通过该节点使用集群数据库。
Oracle维护的存储库中可用的软件包是在不支持网络数据库(NDB)的情况下构建的,因此我们首先从MySQL网站下载了一个存档,该存档包含将安装支持NDB /集群的MySQL版本的软件包:
curl -L dev.mysql.com/get/Downloads/MySQL-Cluster-7.4/MySQL- Cluster-gpl-7.4.10-1.el7.x86_64.rpm-bundle.tar | tar x
MySQL抽象了数据的物理组织和操作细节,并将其委托给各种存储引擎。 不同的引擎具有不同的能力。 由于NDB引擎是实现集群的引擎,因此我们需要一个支持引擎的构建。 而不是像我们在其他配方中那样将curl的输出写入文件,这次我们使用x参数将输出直接传递给tar,以便动态扩展存档。
之后,我们从CentOS存储库安装了perl-Data-Dumper软件包,并将已安装的mariadb-libs软件包替换为每个系统上刚刚下载的MySQL-Cluster-shared软件包:
yum install perl-Data-Dumper MySQL-Cluster-shared-gpl-*.rpmyum erase mariadb-libs
MySQL-Cluster-shared软件包提供其他程序使用的共享库来使用MySQL。默认情况下,这些库取代了从CentOS存储库安装的MariaDB版本,使我们免于遇到会阻止干净安装的库冲突。由于之后不再需要它,我们卸载了mariadb-libspackage。
Yum在安装MySQL-Cluster-server软件包之后执行的一些安装后步骤是在Perl中编写的,并使用Perl的Data :: Dumper模块。这使得Perl-Data-Dumper包成为MySQL-Cluster-server包的依赖项。但是,一个错误导致Yum错过了这个,所以我们自己安装了这个包,以便MySQL-Cluster-server软件包的安装顺利进行。它不会阻止软件包的安装,但它需要我们手动完成一些额外的配置步骤。
有了这些要求,我们就在每个系统上安装了MySQL-Cluster-server和MySQL-Cluster-client软件包:
yum install MySQL-Cluster-{server,client}-gpl-*.rpm
整个集群的配置几乎集中在/var/lib/mysql-cluster/config.ini中的管理节点。 该文件分为几个部分,第一部分是[ndb default],它提供了应该用于集群的默认配置值。 这里的值适用于集群的每个节点,除非在相应节点的配置部分中被更具体的指令覆盖:
[ndbd default]NoOfReplicas = 2DataMemory = 100MIndexMemory = 10MServerPort = 2202
NoOfReplicas选项设置群集中的副本数。它的值可以设置为1或2,尽管2是推荐值。回想一下,不仅跨数据节点对集群数据库进行了分区,而且还对其进行了复制;每个节点通常承载一个分区,通常是数据库大小的1 / n(其中n是数据节点的数量),也是其他节点的副本。如果系统脱机,群集仍然可以正常运行,因为其数据在副本中仍然可用。 NoOfReplicas的值为1意味着只有一个数据库副本(没有副本),并且数据库的可用性取决于所有数据节点都在运行。
数据节点将其数据库的工作副本保存在RAM中,以减少延迟,同时定期将数据同步到磁盘。 DataMemory选项指定节点应为数据保留多少RAM,IndexMemory指定应为主键和唯一索引保留多少内存。无论您提供什么值,请确保有足够的资源可以避免RAM交换。
ServerPort选项指定节点将用于彼此通信的端口号。默认情况下,MySQL会动态分配端口,以便更容易在同一系统上运行多个节点,但由于此配方在其自己的主机系统上运行每个节点,我们需要知道端口以允许通过防火墙的流量,我们指定了我们自己。
配置中的后续部分使用hostname选项指定管理节点(通过[ndb_mgmtd]部分),API节点([mysqld]部分)和数据节点([ndbd]部分)的地址正在跑步。如多个[ndbd]部分所示,如果在集群中运行该类型的多个节点,则会出现相同类型的多个部分:
[ndb_mgmd]hostname = 192.168.56.100[mysqld]hostname = 192.168.56.101[ndbd]hostname = 192.168.56.102[ndbd]hostname = 192.168.56.103
在其余系统上,/etc/my.cnf被创建为数据节点和API节点使用的配置文件。 每个包含一个[mysql_cluster]部分,它提供了ndb-connectionstring选项:
[mysql_cluster]ndb-connectstring = 192.168.56.100
ndb-connectstring选项指定承载管理节点的系统的地址。 当数据和API节点联机时,它们与管理器通信以接收其配置信息。 如果您的群集有多个管理节点,则可以在用逗号分隔的连接字符串中列出其他节点:
ndb-connectstring = "192.168.56.100,192.168.56.105,192.168.56.106"
此外,API节点的配置包括[mysqld]部分。 它包括用于启用NDB引擎的ndbcluster选项和default-storage-engine选项,指示MySQL使用NDB来管理所有新表,除非在表的CREATE TABLE语句中另有指定:
[mysqld]ndbclusterdefault-storage-engine = ndbcluster
当用户或进程使用CREATE TABLE语句创建新表时,他们可以使用ENGINE指令指定应使用哪些MySQL存储引擎来管理其数据,例如:
CREATE TABLE users ( id INTEGER UNSIGNED NOT NULL PRIMARY KEY, first_name VARCHAR(50) NOT NULL DEFAULT '', last_name VARCHAR(50) NOT NULL DEFAULT '')ENGINE = NDBCluster;
默认引擎是InnoDB引擎。 但是,只有NDB管理的表中的数据才能进入群集。 如果表由另一个引擎管理,则数据驻留在API节点上本地,并且不可用于群集中的其他节点。 为了防止意外问题和这可能导致的任何混淆,我们更改了默认引擎,以便在未提供ENGINE指令时表将使用NDB引擎。
启动MySQL集群时启动节点的顺序很重要,因为一个节点可能依赖于其他节点。 首先启动管理节点,然后启动数据节点,然后启动API节点。
API节点上MySQL的root帐户的密码是在第一次启动服务器时随机生成的,并写入/root/.mysql_secret文件,就像我们在设置MySQL数据库配方时使用mysqladmin更改它一样:
cat /root/.mysql_secretmysqladmin -u root -p password
发送到管理节点系统上的ndb_mgm客户端的SHOW命令允许我们查看集群的状态,并确保一切正常运行。 可以在交互模式下调用客户端,也可以使用-e参数直接将命令传递给它:
ndb_mgm -e SHOW
See also
Refer to the following resources for more information on working with MySQL clusters:
- MySQL Reference Manual: MySQL Cluster Core Concepts (http://dev.mysql.com/doc/refman/5.7/en/mysql-cluster-basics.html)
- MySQL Reference Manual: MySQL Cluster Installation (http://dev.mysql.com/doc/refman/5.7/en/mysql-cluster-installation.html)
- MySQL Reference Manual: MySQL Cluster Nodes, Node Groups, Replicas, and Partitions (http://dev.mysql.com/doc/refman/5.7/en/mysql-cluster-nodes-groups.html)
- MySQL Reference Manual: Online Backup of MySQL Cluster (http://dev.mysql.com/doc/refman/5.7/en/mysql-cluster-backup.html)
- Set Up a MySQL Cluster the Easy Way (http://youtube.com/watch?v=64jtbkuPtvc)
- High Availability MySQL Cookbook by Alex Davies (https://www.packtpub.com/big-data-and-business-intelligence/high-availability-mysql-cookbook)