MySQL 5.7 叢集搭建

楊瀟發表於2018-11-26
  • 安裝MySQL

  • InnoDB叢集搭建

使用Zip壓縮包安裝MySQL

注意

MySQL Community 5.7 Server在Windows平臺執行需要Microsoft Visual C ++ 2013 Redistributable Package支援,使用者安裝前請檢查系統環境是否支援。

  1. 下載MySQL 5.7社群版

  2. 選擇安裝位置

    注意

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

  3. 建立配置檔案my.ini,並將my.ini存放在MySQL安裝目錄下

    [mysqld]
    # 設定MySQL安裝路徑
    basedir=C:/MySQL
    # 設定MySQL資料儲存目錄
    datadir=C:/MySQL/data
    複製程式碼
  4. 使用mysqld手動初始化資料目錄

    • 初始化選項說明

      • --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使用那些技術協同工作

    MySQL 5.7 叢集搭建

使用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伺服器例項作為網路的一部分在多臺主機上執行,而不是在單機上執行。

    下圖說明了您在本節使用的方案:

    MySQL 5.7 叢集搭建

    注意

    與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.
    複製程式碼

相關文章