安裝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.
複製代碼