MySQL 5.7 集羣搭建

  • 安裝MySQLhtml

  • InnoDB集羣搭建mysql

使用Zip壓縮包安裝MySQL

注意sql

MySQL Community 5.7 Server在Windows平臺運行須要Microsoft Visual C ++ 2013 Redistributable Package支持,用戶安裝前請檢查系統環境是否支持。shell

  1. 下載MySQL 5.7社區版數據庫

  2. 選擇安裝位置bash

    注意服務器

    選擇安裝位置,儘量保證安裝路徑當中不要出現空格。本次安裝的位置選擇在 C:\MySQL網絡

  3. 建立配置文件my.ini,並將my.ini存放在MySQL安裝目錄下多線程

    [mysqld]
    # 設置MySQL安裝路徑
    basedir=C:/MySQL
    # 設置MySQL數據保存目錄
    datadir=C:/MySQL/data
    複製代碼
  4. 使用mysqld手動初始化數據目錄app

    • 初始化選項說明

      • --initialize使用該選項初始化將生成隨機密碼,建議結合--console選項使用
      • --initialize-insecure使用該選項初始化將不會生成任何密碼
      • --defaults-file指定mysql數據目錄初始化時讀取的配置文件,該選項必須在mysqld命令以後的第一位
    • 初始化數據目錄

      注意

      --initialize選項初始化生成的隨機密碼在最後一行

      mysqld --defaults-file=C:/MySQL/my.ini ----initialize --console
      複製代碼
  5. 啓動MySQL服務器

    mysqld --console
    複製代碼
  6. 鏈接MySQL服務器

    • 使用--initialize選項初始化數據目錄,請使用隨機密碼登陸服務器

      mysql -u root -p
      複製代碼
    • 使用--initialize-insecure選項初始化數據目錄,請使用--skip-password選項鍊接服務器

      mysql -u root --skip-password
      複製代碼
  7. 鏈接後,修改root密碼

    ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password'
    複製代碼

    注意

    一般狀況下使用127.0.0.1鏈接到服務器會被解析爲localhost帳戶。能夠經過如下方式確保鏈接到MySQL服務器

    CREATE USER 'username'@'hostname' IDENTIFIED BY 'new_password'
    複製代碼

InnoDB集羣搭建

  1. 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使用那些技術協同工做

使用AdminAPI

MySQL Shell提供了AdminAPI功能,經過AdminAPI提供的dba全局變量和方法使您可以部署、配置和管理InnoDB集羣。如,使用dba.createCluster()方法建立InnoDB集羣。

注意

MySQL Shell容許您經過套接字鏈接到服務器,但AdminAPI須要TCP鏈接到服務器實例。不要在AdminAPI中使用基於套接字的鏈接。

MySQL Shell爲AdminAPI提供了在線幫助。要列出全部可用的dba命令,請使用dba.help()方法。有關特定的方法的幫助,使用格式爲object.help('methodname')。

  1. 建立InnoDB Cluster

    • Sandbox deployment:若是您在生產部署以前測試InnoDB Cluster,可經過Sandbox功能使您能夠在本地計算機上快速建立集羣。
    • Production deployment:若是要在生產環境使用InnoDB Cluster,則須要配置全部MySQL Server實例,而後將服務器部署到計算機。

    注意

    Sandbox deployment不適合在完整的生產環境部署。

  2. InnoDB Cluster集羣環境要求

    • InnoDB集羣使用Group Replication模塊,您必須保證您的服務器必須知足相同的要求。AdminAPI提供了dba.checkInstanceConfiguration()驗證明例是否知足組複製要求,dba.configureLocalInstance()配置實例以知足組複製要求。

      注意

      使用Sandbox deployment,實例將配置爲自動知足這些條件。

      Group Replication(組複製)基本要求
      • InnoDB Storage Engine,數據必須使用InnoDB事務存儲引擎。
      • Primary Keys,要確保使用組複製的每一個表必須具備已定義的主鍵或等效主鍵。
      • IPv4 Network,MySQL Group Replication模塊僅支持IPv4網絡。
      • Network Performance,組複製須要服務器實例在彼此很是接近的集羣環境中,由於組複製功能極大的受網絡延遲和帶寬的影響。
      服務器配置
      • Binary Log Active, 激活二進制日誌,--log-bin[=log_file_name]
      • Slave Updates Logged,服務器須要經過組複製應用程序更新二進制日誌,--log-slave-updates
      • Binary Log Row Format,組複製格式基於行,以便在組中的服務器之間一致的傳播更改,--binlog-format=row
      • Global Transaction Identifiers On,組複製使用全局事務標識符來準確跟蹤在每一個服務器實例上已提交的事務,從而可以推斷那些服務器執行的事務可能與其餘地方提交的事務衝突,--gtid-mode=on
      • Replication Information Repositories,設置--master-info-repository=TABLE--relay-log-info-repository=TABLE。組複製須要將主節點信息和從屬節點信息寫入系統表mysql.slave_master_infomysql.slave_relay_log_info系統表。該方式可確保組複製插件具備一致的可複製性和複製元數據的事務管理功能。
      • Transaction Write Set Extraction,設置--transaction-write-set-extraction=XXHASH64爲了在收集行並記錄到二進制日誌時,服務器也會收集寫入。寫集基於每行的主鍵,是標記的簡化和緊湊視圖,惟一標識已更改的行。而後,此標記用於檢測衝突。
      • Multithreaded Appliers,組複製成員能夠配置爲多線程應用程序,從而能夠並行應用事務。設置--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版本。

  3. 安裝方法

    用戶安裝InnoDB Cluster的方法取決於使用的部署方式。對於Sandbox deployment,將集羣組件安裝在單個計算機上。Sandbox deployment部署是單個計算機的本地部署,所以安裝只須要在本地計算機完成一次。對於生產部署,請將組件安裝到每臺計算機上。

  4. Sandbox deployment

    您可使用包含AminAPI的MySQL Shell建立和管理InnoDB集羣。在生產部署以前,您可使用Sandbox deployment InnoDB Cluster是探索集羣的最好方式。MySQL Shell內置Sandbox deployment,可用於建立正確配置的InnoDB Cluster集羣。

    注意

    Sandbox deployment僅適用於在本地計算機上進行部署和測試。在生產環境中,MySQL Server實例部署到網絡上的各類主機。

    部署Sandbox實例

    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)
    複製代碼
    建立Sandbox InnoDB Cluster

    下一步鏈接到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

    由主實例執行的事務都會在從屬實例添加時從新執行。

    因爲示例主服務器數據是空的。在生產環境中,主實例有不少數據,建議經過數據庫備份軟件備份現有數據,並在其餘的實例恢復,從而減小從屬數據庫複製數據形成的延遲。

    添加第二個實例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以提升高可用性。

  5. 生產部署

    在生產環境中,組成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;
    複製代碼
    配置主機名

    組成集羣的生產實例在不一樣的計算機上運行,所以每臺計算機必須具備惟一的主機名,而且可以解析集羣中運行服務器實例的其餘計算機主機名。若是不符合這種狀況,您能夠

    • 配置每臺計算機以將每臺其餘計算機的IP映射到主機名。
    • 配置DNS服務
    • 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調用的最完整輸出。可用的輸出選項:

    • 0或OFF表示不進行故障排除時的推薦時,該值也時默認值
    • 1或ON每次調用的都會輸出詳細的內容
    • 2將調試內容完整的數據。
    檢查實例配置

    在生產服務器部署以前,您可使用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()保證明例配置保存到服務器上面,以便下次重啓後使用。

  6. 採用組複製部署

    若您的服務器實例已經具有組複製功能,而且但願使用它來建立集羣,請將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.
    複製代碼
相關文章
相關標籤/搜索