安装MySQLhtml
InnoDB集群搭建mysql
注意sql
MySQL Community 5.7 Server在Windows平台运行须要Microsoft Visual C ++ 2013 Redistributable Package支持,用户安装前请检查系统环境是否支持。shell
下载MySQL 5.7社区版数据库
选择安装位置bash
注意服务器
选择安装位置,尽量保证安装路径当中不要出现空格。本次安装的位置选择在 C:\MySQL网络
建立配置文件my.ini
,并将my.ini
存放在MySQL安装目录下多线程
[mysqld]
# 设置MySQL安装路径
basedir=C:/MySQL
# 设置MySQL数据保存目录
datadir=C:/MySQL/data
复制代码
使用mysqld手动初始化数据目录app
初始化选项说明
--initialize
使用该选项初始化将生成随机密码,建议结合--console
选项使用--initialize-insecure
使用该选项初始化将不会生成任何密码--defaults-file
指定mysql数据目录初始化时读取的配置文件,该选项必须在mysqld
命令以后的第一位初始化数据目录
注意
--initialize
选项初始化生成的随机密码在最后一行
mysqld --defaults-file=C:/MySQL/my.ini ----initialize --console
复制代码
启动MySQL服务器
mysqld --console
复制代码
链接MySQL服务器
使用--initialize
选项初始化数据目录,请使用随机密码登陆服务器
mysql -u root -p
复制代码
使用--initialize-insecure
选项初始化数据目录,请使用--skip-password
选项链接服务器
mysql -u root --skip-password
复制代码
链接后,修改root密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password'
复制代码
注意
一般状况下使用127.0.0.1链接到服务器会被解析为localhost帐户。能够经过如下方式确保链接到MySQL服务器
CREATE USER 'username'@'hostname' IDENTIFIED BY 'new_password' 复制代码
InnoDB集群简介
MySQL InnoDB集群为MySQL提供了一套的高可用性解决方案。MySQL Shell包含的AdminAPI,使您能够轻松配置和管理至少3个MySQL服务器实例集群。每一个MySQL服务器实例都运行MySQL Group Replication模块,它提供了InnoDB集群数据复制机制,而且具备内置的故障转移功能。
注意
InnoDB集群不支持MySQL NDB Cluster。NDB Cluster依赖于NDB存储引擎,以及许多NDB Cluster程序都未随MySQL Server 5.7提供。此外,MySQL Server 5.7提供的mysqld不能与NDB Cluster一块儿使用。
下图显示了MySQL InnoDB Cluster使用那些技术协同工做
MySQL Shell提供了AdminAPI功能,经过AdminAPI提供的dba
全局变量和方法使您可以部署、配置和管理InnoDB集群。如,使用dba.createCluster()方法建立InnoDB集群。
注意
MySQL Shell容许您经过套接字链接到服务器,但AdminAPI须要TCP链接到服务器实例。不要在AdminAPI中使用基于套接字的链接。
MySQL Shell为AdminAPI提供了在线帮助。要列出全部可用的dba命令,请使用dba.help()方法。有关特定的方法的帮助,使用格式为object.help('methodname')。
建立InnoDB Cluster
注意
Sandbox deployment不适合在完整的生产环境部署。
InnoDB Cluster集群环境要求
InnoDB集群使用Group Replication模块,您必须保证您的服务器必须知足相同的要求。AdminAPI提供了dba.checkInstanceConfiguration()
验证明例是否知足组复制要求,dba.configureLocalInstance()
配置实例以知足组复制要求。
注意
使用Sandbox deployment,实例将配置为自动知足这些条件。
--log-bin[=log_file_name]
。--log-slave-updates
。--binlog-format=row
--gtid-mode=on
。--master-info-repository=TABLE
和--relay-log-info-repository=TABLE
。组复制须要将主节点信息和从属节点信息写入系统表mysql.slave_master_info
和mysql.slave_relay_log_info
系统表。该方式可确保组复制插件具备一致的可复制性和复制元数据的事务管理功能。--transaction-write-set-extraction=XXHASH64
为了在收集行并记录到二进制日志时,服务器也会收集写入。写集基于每行的主键,是标记的简化和紧凑视图,惟一标识已更改的行。而后,此标记用于检测冲突。--slave-parallel-workers=N
(N标识并行应用程序的线程数量)、--slave-preserve-commit-order=1
和--slave-parallel-type=LOGICAL_CLOCK
。组复制依赖于围绕全部参与成员以相同的顺序接受和应用已提交事务的一致性机制,所以必须设置--slave-preserve-commit-order=1
确保并行事务的最终提交与原始事务的顺序相同。最后,为了肯定那些事务能够并行执行,从属服务器必须包含生成事务的父信息。MySQL Shell用于配置InnoDB Cluster,配置脚本须要访问Python 2.7版本。
安装方法
用户安装InnoDB Cluster的方法取决于使用的部署方式。对于Sandbox deployment,将集群组件安装在单个计算机上。Sandbox deployment部署是单个计算机的本地部署,所以安装只须要在本地计算机完成一次。对于生产部署,请将组件安装到每台计算机上。
Sandbox deployment
您可使用包含AminAPI的MySQL Shell建立和管理InnoDB集群。在生产部署以前,您可使用Sandbox deployment InnoDB Cluster是探索集群的最好方式。MySQL Shell内置Sandbox deployment,可用于建立正确配置的InnoDB Cluster集群。
注意
Sandbox deployment仅适用于在本地计算机上进行部署和测试。在生产环境中,MySQL Server实例部署到网络上的各类主机。
MySQL Shell提供的AdminAPI中的dba全局变量提供了Sandbox deployment的功能,你可使用dba.deploySandboxInstance()
建立并部署Sandbox实例。
启动MySQL Shell
> mysqlsh
复制代码
MySQL Shell除了包含SQL模式以外,还提供了两种脚本语言模式,Javascript和Python。本次示例中,主要经过Javascript模式来建立Sandbox InnoDB Cluster。在MySQL Shell中能够经过\js
、\py
和\sql
命令来切换模式,默认处于Javascript模式。
msyql-js> dba.deploySandboxInstance(3310)
复制代码
注意
在Javascript和Python模式下,不须要使用分号终止命令。
传递给deploySandboxInstance()的参数是MySQL端口号,MySQL实例将监听来自3310端口的链接。命令执行后,将提示输入实例的root密码。
注意
每一个实例都有本身的密码。在测试环境中建议密码设置的尽量简单和相同,可是生产部署中尽量的为每一个实例使用不一样的密码。
要部署其余Sandbox实例,请重复上述命令:
msyql-js> dba.deploySandboxInstance(3320)
msyql-js> dba.deploySandboxInstance(3330)
复制代码
下一步链接到MySQL Server主服务器(该服务器是包含其余实例要复制数据的实例)建立InnoDB Cluster。在本次示例中,Sandbox实例为空,所以您能够选择任何实例。
使用MySQL Shell链接到主实例,在本例中链接3310端口的实例:
mysql-js> \connect root@localhost:3310
复制代码
\connect
是MySQL Shell中shell.connect()
方法的快捷方法:
mysql-js> shell.connect('root@localhost:3310')
复制代码
链接后,AdminAPI能够写入本实例的配置文件。这与使用生产部署不一样是,在生产部署中,您须要链接到远程实例并在实例上本地运行MySQL Shell应用程序,而后AdminAPI才能写入实例的配置文件。
使用dba.createCluster()
方法建立InnoDB集群,并将当前链接的实例做为主服务器:
mysql-js> var cluster = dba.createCluster('testCluster')
复制代码
createCluster()
将InnoDB Cluster元数据配置到所选择实例,并将当前链接的实例做为主实例。createCluster()
方法返回建立的集群,在上面的示例中,它被分配给cluster变量。createCluster()
的参数是为InnoDB Cluster赋予名称。
由主实例执行的事务都会在从属实例添加时从新执行。
因为示例主服务器数据是空的。在生产环境中,主实例有不少数据,建议经过数据库备份软件备份现有数据,并在其余的实例恢复,从而减小从属数据库复制数据形成的延迟。
添加第二个实例InnoDB Cluster:
mysql-js> cluster.addInstance('root@localhost:3320')
复制代码
提示输入root用户密码。
添加第三个实例
mysql-js> cluster.addInstance('root@localhost:3330')
复制代码
提示
如是实例时Sandbox实例,只能指定localhost实例。
将Sandbox实例添加到集群中,必须将InnoDB集群所需的配置保留到每一个实例的配置文件中。
使用dba.configureLocalInstance('instance')
能够将实例的配置保存到每一个实例的配置文件中。
mysql-js> \connect instance
mysql-js> dba.configureLocalInstance('instance')
复制代码
注意
若dba.configureLocalInstance()没有执行成功,实例在下次重启后将没法从新加入集群。
重复以上操做,保证各个Sandbox实例的配置保存,对于此示例,须要在3310,3320,3330端口进行配置的存储。
mysql-js> \connect root@localhost:port_number)
mysql-js> dba.configureLocalInstance('root@localhost:port_number) 复制代码
要检查是否已建立集群,请使用集群实例的status()功能。
部署集群后,您能够配置MySQL Router以提升高可用性。
生产部署
在生产环境中,组成InnoDB集群的MySQL服务器实例做为网络的一部分在多台主机上运行,而不是在单机上运行。
下图说明了您在本节使用的方案:
注意
与Sandbox deployment不一样的是,对于生产部署,您必须链接每台计算机并使用MySQL Shell提供的AdminAPI的
dba.configureLocalInstance()
保存每一个实例的配置。您还能够经过MySQL Shell控制访问集群权限。
用户管理实例的用户帐号能够不是root帐户,但须要分配MySQL管理员全读权限并写入集群的元数据表当中(SUPER, GRANT OPTION, CREATE, DROP等)。为your_user提供管理InnoDB集群所需权限:
GRANT ALL PRIVILEGES ON mysql_innodb_cluster_metadata.* TO your_user@'%' WITH GRANT OPTION;
GRANT RELOAD, SHUTDOWN, PROCESS, FILE, SUPER, REPLICATION SLAVE, REPLICATION CLIENT, \
CREATE USER ON *.* TO your_user@'%' WITH GRANT OPTION;
GRANT SELECT ON *.* TO your_user@'%' WITH GRANT OPTION;
复制代码
若是仅需读取操做,则可使用具备更多受限特权的帐号。为your_user提供监控InnoDB集群权限:
GRANT SELECT ON mysql_innodb_cluster_metadata.* TO your_user@'%';
GRANT SELECT ON performance_schema.global_status TO your_user@'%';
GRANT SELECT ON performance_schema.replication_applier_configuration TO your_user@'%';
GRANT SELECT ON performance_schema.replication_applier_status TO your_user@'%';
GRANT SELECT ON performance_schema.replication_applier_status_by_coordinator TO your_user@'%';
GRANT SELECT ON performance_schema.replication_applier_status_by_worker TO your_user@'%';
GRANT SELECT ON performance_schema.replication_connection_configuration TO your_user@'%';
GRANT SELECT ON performance_schema.replication_connection_status TO your_user@'%';
GRANT SELECT ON performance_schema.replication_group_member_stats TO your_user@'%';
GRANT SELECT ON performance_schema.replication_group_members TO your_user@'%';
GRANT SELECT ON performance_schema.threads TO your_user@'%' WITH GRANT OPTION;
复制代码
组成集群的生产实例在不一样的计算机上运行,所以每台计算机必须具备惟一的主机名,而且可以解析集群中运行服务器实例的其余计算机主机名。若是不符合这种状况,您能够
report_host
每一个实例的配置为外部可访问的地址要验证是否正确配置了MySQL服务器的主机名,请执行如下查询查看实例如何将本身的地址报告给其余服务器,并尝试使用返回的地址从其余主链接到该MySQL服务器:
SELECT coalesce(@@report_host, @@hostname);
复制代码
使用生产部署时,为MySQL Shell配置详细日志记录能帮助您查找和解决在准备服务器实例做为InnoDB集群一部分发生的任何为题。使用--log-level
选项设置:
ps> mysqlsh --log-level=DEBUG3
复制代码
除了启用MySQL Shell日志,您能够查看每次调用API后的输出内容:
mysql-js> dba.verbose=2
复制代码
这是AdminAPI调用的最完整输出。可用的输出选项:
在生产服务器部署以前,您可使用dba.checkInstanceConfiguration()
功能检查每一个实例上的MySQL是否知足InnoDB集群配置,该操做不会检查实例上任何数据,如下时演示数据:
mysql-js> dba.checkInstanceConfiguration('ic@ic-1:3306')
Please provide the password for 'ic@ic-1:3306':
Validating instance...
The instance 'ic-1:3306' is not valid for Cluster usage.
The following issues were encountered:
- Some configuration options need to be fixed.
+----------------------------------+---------------+----------------+--------------------------------------------------+
| Variable | Current Value | Required Value | Note |
+----------------------------------+---------------+----------------+--------------------------------------------------+
| binlog_checksum | CRC32 | NONE | Update the server variable or restart the server |
| enforce_gtid_consistency | OFF | ON | Restart the server |
| gtid_mode | OFF | ON | Restart the server |
| log_bin | 0 | 1 | Restart the server |
| log_slave_updates | 0 | ON | Restart the server |
| master_info_repository | FILE | TABLE | Restart the server |
| relay_log_info_repository | FILE | TABLE | Restart the server |
| transaction_write_set_extraction | OFF | XXHASH64 | Restart the server |
+----------------------------------+---------------+----------------+--------------------------------------------------+
Please fix these issues , restart the server and try again.
{
"config_errors": [
{
"action": "server_update",
"current": "CRC32",
"option": "binlog_checksum",
"required": "NONE"
},
{
"action": "restart",
"current": "OFF",
"option": "enforce_gtid_consistency",
"required": "ON"
},
{
"action": "restart",
"current": "OFF",
"option": "gtid_mode",
"required": "ON"
},
{
"action": "restart",
"current": "0",
"option": "log_bin",
"required": "1"
},
{
"action": "restart",
"current": "0",
"option": "log_slave_updates",
"required": "ON"
},
{
"action": "restart",
"current": "FILE",
"option": "master_info_repository",
"required": "TABLE"
},
{
"action": "restart",
"current": "FILE",
"option": "relay_log_info_repository",
"required": "TABLE"
},
{
"action": "restart",
"current": "OFF",
"option": "transaction_write_set_extraction",
"required": "XXHASH64"
}
],
"errors": [],
"restart_required": true,
"status": "error"
}
mysql-js>
复制代码
对计划集群中的每个实例重复此过程,以检查实例是否符合集群运行的条件。
您能够根据dba.checkInstanceConfiguration()
检查报告在配置文件配置以上选项从而保证数据库服务符合InnoDB集群要求。您还能够经过dba.configureLocalInstance()
自动配置实例以符合集群要求。如下时示例数据:
mysql-js> dba.configureLocalInstance('root@localhost:3306')
Please provide the password for 'root@localhost:3306':
Please specify the path to the MySQL configuration file: /etc/mysql/mysql.conf.d/mysqld.cnf
Validating instance...
The configuration has been updated but it is required to restart the server.
{
"config_errors": [
{
"action": "restart",
"current": "OFF",
"option": "enforce_gtid_consistency",
"required": "ON"
},
{
"action": "restart",
"current": "OFF",
"option": "gtid_mode",
"required": "ON"
},
{
"action": "restart",
"current": "0",
"option": "log_bin",
"required": "1"
},
{
"action": "restart",
"current": "0",
"option": "log_slave_updates",
"required": "ON"
},
{
"action": "restart",
"current": "FILE",
"option": "master_info_repository",
"required": "TABLE"
},
{
"action": "restart",
"current": "FILE",
"option": "relay_log_info_repository",
"required": "TABLE"
},
{
"action": "restart",
"current": "OFF",
"option": "transaction_write_set_extraction",
"required": "XXHASH64"
}
],
"errors": [],
"restart_required": true,
"status": "error"
}
mysql-js>
复制代码
使用MySQL Shell链接主数据库服务器,并在该服务器上建立集群。
shell> mysqlsh --uri username@hostname:port
mysql-js> var cluster = dba.createCluster('prodCluster')
A new InnoDB cluster will be created on instance 'ic@ic-1:3306'.
Creating InnoDB cluster 'prodCluster' on 'ic@ic-1:3306'...
Adding Seed Instance...
Cluster successfully created. Use Cluster.addInstance() to add MySQL instances.
At least 3 instances are needed for the cluster to be able to withstand up to
one server failure.
复制代码
添加其余实例到InnoDB集群:
mysql-js> cluster.addInstance('username@hostname:port')
复制代码
注意
在次阶段,服务器实例已添加到集群,但InnoDB集群的元数据更改尽在当前链接有效。您必须在没给实例使用dba.configureLocalInstance()保证明例配置保存到服务器上面,以便下次重启后使用。
采用组复制部署
若您的服务器实例已经具有组复制功能,而且但愿使用它来建立集群,请将adoptFromGR
选项传递给dba.createCluster()
。建立的InnoDB集群会匹配复制组是以单主数据库仍是多主数据库运行。
提示
若组复制实例中包含MyISAM引擎建立的表,将全部此类表转换为InnoDB存储引擎,才可建立集群
mysql-js> var cluster = dba.createCluster('prodCluster', {adoptFromGR: true});
A new InnoDB cluster will be created on instance 'root@gr-member-2:3306'.
Creating InnoDB cluster 'prodCluster' on 'root@gr-member-2:3306'...
Adding Seed Instance...
Cluster successfully created. Use cluster.addInstance() to add MySQL instances.
At least 3 instances are needed for the cluster to be able to withstand up to
one server failure.
复制代码