MySQL6

MySQL數據庫6

1. 集羣概述

  • 性能達到瓶頸的解決方案html

    1. Scale Up
      向上擴展能力,如增長更好的硬件固態磁盤,加大內存等,成本高,效果不顯著
    2. Scale Out
      向外擴展,例如創建更多的服務器
  • MySQL擴展采用的方式讀寫分離
    將數據庫的訪問拆分紅兩種訪問,讀(select)和寫(增刪改),經過調度器,將用戶的不一樣請求分別發送給讀服務器或者寫服務器,在寫服務器增長數據時,須要使用主從複製機制來同步數據到讀服務器前端

  • 主從複製特徵node

    1. 每一個節點都有相同的數據集
    2. 向外擴展
    3. 使用二進制日誌功能實現主從複製
    4. 單向
  • 主從複製的功用mysql

    1. 負載均衡讀
      在主從複製的基礎上,配合讀寫分離,能夠由主節點提供寫服務,由從節點提供讀服務,分擔服務器負載;尤爲是在寫少讀多的場景下,經過多個從節點分擔讀負載,能夠大大提升Redis服務器的併發量
    2. 數據冗餘
      能夠防止物理上的損壞,若是主服務器數據刪除,從服務器數據也會丟失,因此還要備份
    3. 高可用和故障切換
      主服務器損壞,更改從服務器設置替換爲主,從服務器損壞,調整調度器策略,跳過損壞的從服務器
    4. MySQL升級測試
      相似灰度發佈,升級集羣中的一部分服務器
  • 讀寫分離應用:git

    1. mysql-proxy:Oracle公司開源產品
      https://downloads.mysql.com/archives/proxy/
    2. Atlas:Qihoo(360公司),基於mysql-proxy的二次修改
      https://github.com/Qihoo360/Atlas/blob/master/README_ZH.md
    3. dbproxy:美團
      https://github.com/Meituan-Dianping/DBProxy
    4. Cetus:網易樂得
      https://github.com/Lede-Inc/cetus
    5. Amoeba:
      https://sourceforge.net/projects/amoeba/
  • 主從複製原理
    在這裏插入圖片描述github

    1. 主服務器
      要求必須啓用二進制日誌服務,執行寫操做(例如update),只要事務提交,就會寫入二進制日誌(Bin Log)裏,而後經過啓用的Slave服務器線程,經過網絡將二進制日誌讀出來,傳送給從服務器的線程io Thread
    2. 從服務器
      1. io Thread線程接收到主服務器傳送的二進制文件,放入relay log中
      2. SQL Thread線程讀出relay log中的二進制文件,寫入數據庫中,完成同步。
    3. 主從複製線程做用
      1. 主節點(dump Thread)
        爲每一個Slave的I/O Thread啓動一個dump線程,用於向其發送binary log events
      2. 從節點:
        1. I/O Thread
          向Master請求二進制日誌事件,並保存於中繼日誌中
        2. SQL Thread
          從中繼日誌中讀取日誌事件,在本地完成重放
    4. 從服務器跟複製功能相關的文件:
      1. master.info
        用於保存slave鏈接至master時的相關信息,例如帳號、密碼、服務器地址等
      2. relay-log.info
        保存在當前slave節點上已經複製的當前二進制日誌和本地replay log日誌的對應關係
    5. 缺點
      主服務器寫操做能夠實現並行操做,由於有事務功能能夠隔離操做,二進制日誌生成後推送給從服務器時,是串行的,由多車道變爲單車道,當用戶訪問量很大時,就會產生延遲很大的問題。
  • MySQL垂直分區
    在這裏插入圖片描述web

    1. 工做原理
      如圖所示,服務器中有三部分數據庫Part一、Part二、Part3,當服務器負載過大時,能夠將其拆分放到三個服務器中來分別管理
    2. 缺點
      在同一個服務器中可使用多表查詢,拆分存放不支持此功能,須要配合開發進行
  • MySQL水平分片(Sharding)
    在這裏插入圖片描述算法

    1. 工做原理
      將數據按照必定的邏輯切成小片,以用戶爲例,有100萬用戶信息,能夠將用戶按奇偶數切分,奇數號的用戶放在Shard1中,偶數號的用戶放在Shard2中。也須要結合業務來分
    2. 缺點
      須要增長分片調度器,來判斷用戶請求,找打相應服務器
  • 主從複製架構:sql

    1. Master/Slave(主從)
    2. Master/Master(主主)
      均可以寫入,容易發生數據衝突,當服務器同步延遲,不能及時發現衝突,用於對數據要求不高狀況
    3. 一主多從
      從服務器還能夠再有從服務器
    4. 一從多主:
      適用於多個不一樣數據庫,版本較高的數據庫支持,將從服務器分爲多個部分,分別存放主服務器數據

2. MySQL主從複製實現

  • 主從配置官網資料
    https://mariadb.com/kb/en/library/setting-up-replication/
    https://dev.mysql.com/doc/refman/5.5/en/replication-configuration.htmlshell

  • 主節點配置

    1. mariadb配置文件,一般爲/etc/my.cnf,在[mysqld]下添加
      1. 必須項
        log_bin:啓用二進制日誌,在mariadb配置文件,[mysqld]內添加項
        server_id=#:爲當前節點設置一個全局唯一的ID號,判斷數據來源的標識,[mysqld]內添加項
      2. 可選項
        log-basename=master:設置datadir中日誌名稱
        sync_binlog=1: 每次寫後當即同步二進制日誌到磁盤,性能差
        innodb_flush_log_at_trx_commit=1: 每次事務提交當即同步日誌寫磁盤
        innodb_support_xa=ON: 默認值,分佈式事務MariaDB10.3.0廢除
        sync_master_info=# :#次事件後master.info同步到磁盤
    2. 建立有複製權限的用戶帳號
      1. 語法
                 
                 
                 
                 
        • 1
        GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'HOST' IDENTIFIED BY 'replpass';
      2. 選項描述
        REPLICATION SLAVE:給予從服務器的權限,只能夠同步複製二進制日誌
        repluser:用戶帳號命名
        HOST:從服務器IP或網段
        IDENTIFIED BY :設置口令關鍵字
  • 從節點配置:

    1. 配置文件

      1. 必須項,[mysqld]內
        server_id=#:爲當前節點設置一個全局唯的ID號
      2. 可選項
        relay_log=relay-log:中繼日誌的文件路徑,默認值文件名爲hostname-relay-bin
        relay_log_index=relay-log.index:中繼日誌索引文件路徑,默認值hostname-relay-bin.index
        skip_slave_start=ON:不自動啓動slave
        sync_relay_log=# :#次寫後同步relay log到磁盤
        sync_relay_log_info=#:#次事務後同步relay-log.info到磁盤
    2. 使用有複製權限的用戶帳號鏈接至主服務器,並啓動複製線程

      1. 從服務器複製同步設置
                 
                 
                 
                 
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        mysql> CHANGE MASTER TO <==同步關鍵字 MASTER_HOST='host', <==主服務器名 MASTER_USER='repluser', <==主服務器受權的帳號 MASTER_PASSWORD='replpass', , <==受權帳號的密碼 MASTER_LOG_FILE='mysql-bin.xxxxx', <==數據同步開始位置來自哪一個二進制日誌 MASTER_LOG_POS=#; <==二進制日誌的開始位置
      2. 啓動從服務器複製線程
                 
                 
                 
                 
        • 1
        mysql> START SLAVE [IO_THREAD|SQL_THREAD];
  • 複製架構中應該注意的問題

    1. 限制從服務器爲只讀
      在從服務器配置文件[mysqld]中設置read_only=ON
      注意:此限制對擁有SUPER權限的用戶均無效,例如root帳號
    2. 阻止全部用戶, 包括主服務器複製
      mysql> FLUSH TABLES WITH READ LOCK;
    3. 重新設置從服務器同步,清除master.inforelay-log.info,relay log 等信息
      1. 先中止從服務器同步線程
        STOP SLAVE
      2. 清空同步數據
        RESET SLAVE ALL
    4. 從服務器忽略幾個主服務器的複製事件,
      1. 忽略用到的global變量
        sql_slave_skip_counter = N
      2. 示例
        在從服務器上創建一條teachers表上id爲13的記錄
                 
                 
                 
                 
        • 1
        MariaDB [hellodb]> INSERT teachers VALUES(13,'k',26,'M');
        主服務器在此以後推送來一條相同Id的記錄,就會在從服務器中出現以下報錯
                 
                 
                 
                 
        • 1
        • 2
        • 3
        • 4
        '查看從服務器同步信息' MariaDB [hellodb]> SHOW SLAVE STATUS\G '出現以下錯誤提示' Last_SQL_Error: Error 'Duplicate entry '13' for key 'PRIMARY'' on query. Default database: 'hellodb'. Query: 'INSERT teachers VALUES(13,'k',30,'M')'
        以後主服務器推送的全部記錄,都將失敗,可使用sql_slave_skip_counter = N來忽略這種錯誤,解決此堵塞現象
                 
                 
                 
                 
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        1. '在堵塞的從服務器上,先中止線程' MariaDB [hellodb]> STOP SLAVE; 2. '執行全局變量sql_slave_skip_counter,經過第2步得知只有1個錯誤,因此值爲1' MariaDB [hellodb]> SET GLOBAL sql_slave_skip_counter=1; Query OK, 0 rows affected (0.01 sec) 3. '啓動線程,恢復主從複製' MariaDB [hellodb]> START SLAVE;
    5. 如何保證主從複製的事務安全
      參看https://mariadb.com/kb/en/library/server-system-variables/

3. 主從複製實現

理論上應該保持主從服務器版本一致,避免出現未知錯誤

  • 主從複製

    1. 安裝mariadb服務,設置主服務器配置文件
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      '修改配置文件' [root@hai7-6 ~]$vim /etc/my.cnf [mysqld] server_id=1 <==設置主服務器server_id innodb_file_per_table <==將表數據文件單獨存放 skip_name_resolve <==不容許反向解析爲主機名 log_bin <==啓動二進制 '啓動服務' [root@hai7-6 ~]$systemctl restart mariadb
    2. 受權從服務器
      記錄二進制日誌文件位置,未來複制數據到從服務器,是將受權帳號信息一塊兒複製過去,仍是複製受權帳號後的信息
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      '受權帳戶爲repluser在網段192.168.50.%,密碼爲centos,能夠複製數據' MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO repluser@'192.168.50.%' IDENTIFIED BY 'centos'; '受權帳號後二進制日誌位置' MariaDB [(none)]> show master status; | mysql_bin.000007 | 401 |
    3. 配置從服務器,從服務器這裏沒有設下級從服務器,暫時不須要加二進制日誌功能
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      [root@hai7-8 ~]$vim /etc/my.cnf [mysqld] server_id=2 <==id號只要惟一就能夠 innodb_file_per_table skip_name_resolve
    4. 在主服務器導入一些數據,便於查看主從複製功能是否啓用
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      [root@hai7-6 ~]$mysql < hellodb_innodb.sql '二進制日誌大小爲' MariaDB [(none)]> show master status; | mysql_bin.000007 | 7811 |
    5. 在從服務器上執行復制命令,這個命令須要記住CHANGE關鍵字,用help補齊剩下部分
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      MariaDB [(none)]> help change <==幫助關鍵字 topics: ALTER TABLE CHANGE MASTER TO <==獲得CHANGE MASTER TO '再次help關鍵字`CHANGE MASTER TO`,獲得修改模板,拿來用,修改成咱們須要的配置,執行' MariaDB [(none)]> CHANGE MASTER TO -> MASTER_HOST='192.168.50.107', -> MASTER_USER='repluser', -> MASTER_PASSWORD='centos', -> MASTER_PORT=3306, -> MASTER_LOG_FILE='mysql_bin.000007', -> MASTER_LOG_POS=245;
    6. 同步命令執行後查看從服務器同步狀態
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      MariaDB [(none)]> SHOW SLAVE STATUS\G Master_Log_File: mysql_bin.000007 <==從這個二進制日誌複製 Read_Master_Log_Pos: 245 <==從以上日誌的什麼位置開始複製 Relay_Master_Log_File: mysql_bin.000007 <==未來生成的文件 Relay_Log_File: mariadb-relay-bin.000001 <==中繼日誌 Relay_Log_Pos: 4 <==中繼位置 Slave_IO_Running: No <==IO線程啓動狀態 Slave_SQL_Running: No <==SQL線程啓動狀態 Seconds_Behind_Master: NULL <==和主服務器複製延遲有多久 Exec_Master_Log_Pos: 245 <==寫入從服務器時,當前寫入的主服務器的位置
    7. 啓動從服務器同步複製線程Slave_IO_Running和Slave_SQL_Running
             
             
             
             
      • 1
      MariaDB [(none)]> START SLAVE;
    8. 測試是否能夠同步數據,修改hellodb數據庫的表teachers
             
             
             
             
      • 1
      • 2
      '增長一條記錄' MariaDB [hellodb]> insert teachers values(5,'a',20,'F');
    9. 在從服務器上查看,是否已經同步
             
             
             
             
      • 1
      • 2
      MariaDB [hellodb]> select * from teachers; | 5 | a | 20 | F | <==同步成功
  • 已經有主從服務器,額外添加一個從服務器

    1. 在準備新增的從服務B上修改配置文件
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      [root@hai7-7 data]$vim /etc/my.cnf [mysqld] server_id=3 innodb_file_per_table skip_name_resolve
    2. 將主服務器數據作徹底備份,並傳送給從服務器B
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      '徹底備份主服務器數據' [root@hai7-6 data]$mysqldump -A -F --single-transaction --master-data=1 > all.sql '傳送給從服務器B' [root@hai7-6 data]$scp all.sql 192.168.50.115:/data
    3. 徹底備份時--master-data=1選項,會自動在備份文件中加入CHANGE MASTER TO關鍵詞,修改徹底備份文件,在導入時備份文件時,使其能夠直接執行從服務器同步複製指令
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      `修改前徹底備份--master-data=1選項,添加的行` [root@hai7-7 data]$vim all.sql CHANGE MASTER TO MASTER_LOG_FILE='mysql_bin.000008', MASTER_LOG_POS=245; `修改成從服務器執行的CHANGE MASTER TO複製指令` [root@hai7-7 data]$vim all.sql CHANGE MASTER TO MASTER_HOST='192.168.50.107',MASTER_USER='repluser', MASTER_PASSWORD='centos',MASTER_PORT=3306, MASTER_LOG_FILE='mysql_bin.000008', MASTER_LOG_POS=245;
    4. 修改完成後,將徹底備份文件導入從服務器B的數據庫中,查看從服務器配置狀況
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      [root@hai7-7 data]$mysql < all.sql MariaDB [(none)]> show slave status\G Slave_IO_State: Master_Host: 192.168.50.107 <==已自動執行CHANGE MASTER TO Master_User: repluser
    5. 啓動從服務器線程,在主服務器添加數據,測試主從複製功能
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      1. '啓動從服務器線程' MariaDB [(none)]> START SLAVE; 2. '在主服務器增長數據' MariaDB [hellodb]> INSERT teachers VALUES(7,'c',30,'F'); 3. '在從服務器查看是否自動同步' MariaDB [hellodb]> SELECT * FROM teachers; | 7 | c | 30 | F | <==同步成功
  • 若是主服務器A宕機,在從服務器(B、C)中,選一個來充當主服務器

    1. 選擇合適的從服務器做爲提高機,參考文件master.info二進制日誌保存位置,判斷那臺從服務器數據較新,就拿那臺當作提高機
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      '查看從服務器文件master.info,能夠獲得二進制日誌信息' [root@hai7-8 ~]$cat /var/lib/mysql/master.info 18 mysql_bin.000008 445
    2. 將準備提高的從服務器C的線程中止
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      '中止線程' MariaDB [(none)]> STOP SLAVE; '查看線程狀態' MariaDB [(none)]> show slave status\G Slave_IO_Running: No <==已中止 Slave_SQL_Running: No
    3. 清理從服務器其餘配置信息,好比家目錄下的master.inforelay-log.info
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      '清理從服務器信息命令' MariaDB [(none)]> RESET SLAVE ALL; '執行清理命令後,從服務器信息將清空' MariaDB [(none)]> show slave status\G Empty set (0.00 sec) <==信息被清空
    4. 修改配置文件,打開二進制日誌功能,清除read_only、中繼日誌等從服務器配置
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      [root@hai7-8 ~]$vim /etc/my.cnf [mysqld] server_id=2 <==id只要惟一就能夠 log-bin <==打開二進制日誌功能
    5. 受權從服務器帳號,若是從服務器已經同步過主服務器受權信息,這裏能夠跳過,若是從服務器B的數據與其餘服務器不一樣,須要備份還原步驟,來同步數據
             
             
             
             
      • 1
      • 2
      '受權帳戶爲repluser在網段192.168.50.%,密碼爲centos,能夠複製數據' MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO repluser@'192.168.50.%' IDENTIFIED BY 'centos';
    6. 中止從服務器B線程,清空從服務信息
             
             
             
             
      • 1
      • 2
      MariaDB [(none)]> STOP SLAVE; MariaDB [(none)]> RESET SLAVE ALL;
    7. 從新配置從服務信息將主服務器地址指向C,啓動線程
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      1. '從新配置從服務器信息' MariaDB [(none)]> CHANGE MASTER TO -> MASTER_HOST='192.168.50.111',MASTER_USER='repluser', -> MASTER_PASSWORD='centos',MASTER_PORT=3306, -> MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=245; 2. '啓動線程' MariaDB [(none)]> START SLAVE;
    8. 在主服務器C上添加數據,查看是否能夠主從複製
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      '主服務器C上添加數據' MariaDB [hellodb]> INSERT teachers VALUES(9,'E',32,'f'); '從服務器B上查看' MariaDB [hellodb]> select * from teachers; | 9 | E | 32 | F |
  • 級聯複製,給從服務器B再下設從服務器C
    主從複製依賴的是二進制日誌文件,而從服務器接收主服務器的二進制文件經過中繼日誌執行寫入磁盤,不會產生新的二進制日誌(二進制日誌產生是對數據庫直接進行增刪改),想要在從服務器生成二進制文件供級聯使用,就須要在配置文件中加入選項log_slave_updates

    1. 主服務器爲A,從服務器爲B,從服務器的下設從服務器爲C;在從服務器B上修改配置文件,開啓二進制日誌功能,重啓服務,查看二進制日誌位置

             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      [root@hai7-8 ~]$vim /etc/my.cnf [mysqld] server_id=3 log_slave_updates <==級聯從服務器關鍵項,產生二進制日誌 log-bin <==爲下設的從服務器複製提供二進制日誌文件 read_only=ON MariaDB [(none)]> show master logs; +--------------------+-----------+ | Log_name | File_size | +--------------------+-----------+ | mariadb-bin.000001 | 245 |
    2. 在C上設置從服務器設置,修改配置文件,設置惟一id,設只讀設置等,而後進入mysql設置從服務器,將主機指向B

             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      '若是以前爲從服務器須要執行清理操做' MariaDB [hellodb]> reset slave all; Query OK, 0 rows affected (0.00 sec) '從新配置從服務器設置' MariaDB [hellodb]> CHANGE MASTER TO -> MASTER_HOST='192.168.50.115',MASTER_USER='repluser', -> MASTER_PASSWORD='centos',MASTER_PORT=3306, -> MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=245; '啓動線程' MariaDB [hellodb]> START SLAVE;

4. 主主複製(互爲主從)

  • 容易產生的問題
    數據同步有延遲,兩主機可能修改的是同一個數據,容易衝突;所以慎用

  • 考慮要點:自動增加id

    1. 配置一個節點使用奇數id
      auto_increment_offset=1 開始點
      auto_increment_increment=2 增加幅度
    2. 另外一個節點使用偶數id
      auto_increment_offset=2
      auto_increment_increment=2
  • 主主複製的配置步驟:

    1. 修改主機配置文件
      A主機
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      [root@hai7-7 data]$vim /etc/my.cnf [mysqld] server_id=3 log-bin auto_increment_offset=2 <==自增ip起始數爲2 auto_increment_increment=2 <==自增ip遞增爲2
      B主機
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      [root@hai7-7 data]$vim /etc/my.cnf [mysqld] server_id=2 log-bin auto_increment_offset=1 <==修改ip起始數爲1 auto_increment_increment=2
    2. 建立用戶
      A主機,B主機上也須要建帳戶,經過同步複製實現便可
             
             
             
             
      • 1
      MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO repluser@'192.168.50.%' IDENTIFIED BY 'centos';
    3. 達成同步複製功能
      B主機,實現複製功能,主服務器地址指向A(192.168.50.111)
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      1. '先實現同步複製功能' MariaDB [(none)]> CHANGE MASTER TO -> MASTER_HOST='192.168.50.111',MASTER_USER='repluser', -> MASTER_PASSWORD='centos',MASTER_PORT=3306, -> MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=245; 2. '啓動同步複製線程' MariaDB [(none)]> START SLAVE; 3. '在A主機受權的帳號信息也一塊兒同步到了B主機' MariaDB [(none)]> SELECT user , host FROM mysql.user; | repluser | 192.168.50.% |
      回到A主機,實現複製功能,主服務器地址指向B(192.168.50.115)
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      MariaDB [(none)]> CHANGE MASTER TO -> MASTER_HOST='192.168.50.115',MASTER_USER='repluser', -> MASTER_PASSWORD='centos',MASTER_PORT=3306, -> MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=245; Query OK, 0 rows affected (0.02 sec) '啓動同步複製線程' MariaDB [(none)]> START SLAVE;
    4. 測試
      創建一個自動遞增id的表,測試主主複製效果
             
             
             
             
      • 1
      MariaDB [hellodb]> CREATE TABLE test (id int auto_increment primary key,name char(20));
      在A主機添加兩條name字段的記錄,讓id自動增加
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      MariaDB [hellodb]> INSERT test (name)VALUES('a'),('b'); MariaDB [hellodb]> select * from test; +----+------+ | id | name | +----+------+ | 1 | a | <==奇數式增加 | 3 | b | +----+------+
      在B主機上添加兩條name字段的記錄,讓id自動增加
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      MariaDB [hellodb]> INSERT test (name)VALUES('e'),('f'); MariaDB [hellodb]> select * from test; +----+------+ | id | name | +----+------+ | 1 | a | | 3 | b | | 4 | e | <==auto_increment只取最大值,不會插入,因此顯示偶數爲4 | 6 | f |

5 半同步複製

默認狀況下,MySQL的複製功能是異步的,異步複製能夠提供最佳的性能,主庫把binlog日誌發送給從庫即結束,並不驗證從庫是否接收完畢。
因爲MySQL的複製內在機制,可能會產生比較大的延遲,這意味着當主服務器或從服務器端發生故障時,有可能從服務器沒有接收到主服務器發送過來的binlog日誌,這就會形成主服務器和從服務器的數據不一致,甚至在恢復時形成數據的丟失;而同步方式效率又不高。
在這裏插入圖片描述

  • 半同步複製工做原理
    1. 用戶發送寫操做請求,調度器將指令轉發給主數據庫,主庫數據發生改變後,不會立刻將數據更改爲功的結果發送給用戶,而是先把binlog日誌發送給從庫,在衆多從庫中只要有一個同步成功,就會返回成功結果給用戶 ;
    2. 若是長時間沒有同步成功任何一個從庫,超過超時時長(timeout)定義的時間後,也會返回成功結果給用戶
  • 半同步複製配置:
    須要在主從服務器上都安裝插件rpl_semi_sync_master,這個插件表現爲庫so文件
    在mariadb-server安裝包中已經包含:
    主服務器插件文件/usr/lib64/mysql/plugin/semisync_master.so
    從服務器插件文件/usr/lib64/mysql/plugin/semisync_slave.so
    1. 主服務器
      1. 安裝插件語法:
                 
                 
                 
                 
        • 1
        mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
      2. 選項描述
        INSTALL PLUGIN:安裝插件命令
        rpl_semi_sync_master:插件類型
        SONAME:關鍵字,後面跟插件文件名
      3. 啓用半同步功能
                 
                 
                 
                 
        • 1
        mysql>SET GLOBAL rpl_semi_sync_master_enabled=1;
      4. 設置超時時長,單位以毫秒爲單位
                 
                 
                 
                 
        • 1
        mysql>SET GLOBAL rpl_semi_sync_master_timeout = 1000;
    2. 從服務器配置:
      1. 安裝插件語法
                 
                 
                 
                 
        • 1
        mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
      2. 啓動半同步功能
                 
                 
                 
                 
        • 1
        mysql> SET GLOBAL rpl_semi_sync_slave_enabled=1;
    3. 查看半同步信息
      1. 顯示變量設定值
        mysql>SHOW GLOBAL VARIABLES LIKE ‘%semi%’;
      2. 顯示服務器當前狀態
        mysql>SHOW GLOBAL STATUS LIKE '%semi%‘;
  • 實現步驟,基於主從複製實現
    1. 配置主服務器配置文件,啓動服務,受權帳號
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      1. '修改主服務器配置文件' [root@hai7-8 ~]$vim /etc/my.cnf [mysqld] server_id=2 log-bin 2. '重啓服務' root@hai7-8 ~]#systemctl start mariadb 3. '受權帳戶' [root@hai7-8 ~]$mysql MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO repluser@'192.168.50.%' IDENTIFIED BY 'centos';
    2. 配置從服務器配置文件
      從服務器B
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      1. '修改配置文件' [root@hai7-7 data]$vim /etc/my.cnf [mysqld] server_id=3 2. '重啓服務' [root@hai7-7 data]$systemctl start mariadb 3. '實現從服務器同步複製' [root@hai7-7 data]$mysql MariaDB [(none)]> CHANGE MASTER TO -> MASTER_HOST='192.168.50.111',MASTER_USER='repluser', -> MASTER_PASSWORD='centos',MASTER_PORT=3306, -> MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=245; 4. '啓動同步線程' MariaDB [(none)]> START SLAVE;
      從服務器C
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      1. '修改配置文件' [root@hai7-6 ~]$vim /etc/my.cnf [mysqld] server_id=1 2. '啓動服務' [root@hai7-6 ~]$systemctl restart mariadb 3. '實現從服務器同步複製功能' [root@hai7-6 ~]$mysql MariaDB [(none)]> CHANGE MASTER TO -> MASTER_HOST='192.168.50.111',MASTER_USER='repluser', -> MASTER_PASSWORD='centos',MASTER_PORT=3306, -> MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=245; 4. '啓動同步線程' MariaDB [(none)]> START SLAVE;
    3. 達成主從複製後開始安裝插件
      主服務器上
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      1. '查看系統自帶插件' MariaDB [(none)]> SHOW PLUGINS; 2. '安裝半同步插件' MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; 3. '啓動半同步插件,重啓失效,生產環境要寫入配置文件my.cnf' MariaDB [(none)]> SHOW GLOBAL STATUS LIKE '%semi%'; +--------------------------------------------+-------+ | Variable_name | Value | +--------------------------------------------+-------+ | Rpl_semi_sync_master_clients | 1 | <==半同步服務器個數
      在客戶端上
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      1. '安裝插件' MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; 2. '啓動插件' MariaDB [(none)]> SET GLOBAL rpl_semi_sync_slave_enabled=1; 3. '啓動後,從服務器線程並無價值此插件,因此須要重啓從服務器線程' MariaDB [(none)]> stop slave; MariaDB [(none)]> start slave; 4. '查看插件運行狀態,值爲ON說明設置半同步成功' MariaDB [(none)]> SHOW GLOBAL STATUS LIKE '%semi%'; +----------------------------+-------+ | Variable_name | Value | +----------------------------+-------+ | Rpl_semi_sync_slave_status | ON | +----------------------------+-------+
    4. 測試半同步是否達成
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      1. '停掉從服務器同步線程,根據半同步原理可知,主服務沒法同步數據,會在超過等待時長後返回成功' MariaDB [(none)]> STOP SLAVE; 2. '在主服務器更改數據' MariaDB [hellodb]> INSERT teachers VALUES(6,'A',30,'M'); Query OK, 1 row affected (10.00 sec) <==等待10秒後返回成功結果

6. 複製過濾器:

讓從節點僅複製指定的數據庫,或指定數據庫的指定表

  • 兩種實現方式:
    1. 服務器選項:主服務器僅向二進制日誌中記錄與特定數據庫相關的事件
      注意:此項和binlog_format相關,基於二進制還原將沒法實現;不建議使用
      參看:https://mariadb.com/kb/en/library/mysqld-options/#-binlog-ignore-db
      binlog-do-db = 數據庫白名單列表,多個數據庫需多行實現
      binlog-ignore-db = 數據庫黑名單列表

    2. 從服務器SQL_THREAD在replay中繼日誌中的事件時,僅讀取與特定數據庫(特定表)相關的事件並應用於本地
      問題:會形成網絡及磁盤IO浪費

      1. replicate_do_db= 指定複製庫的白名單
      2. replicate_ignore_db= 指定複製庫黑名單
      3. replicate_do_table= 指定複製表的白名單
      4. replicate_ignore_table= 指定複製表的黑名單
      5. replicate_wild_do_table= foo%.bar% 支持通配符
      6. replicate_wild_ignore_table=
    3. 示例,在從服務器上在白名單中添加數據庫hellodb,只能對進入庫操做起做用,須要use hellodb進入數據庫,改變數據後從服務器才能同步,hellodb.teacher寫法會被過濾掉

             
             
             
             
      • 1
      MariaDB [hellodb]> SET GLOBAL replicate_do_db=hellodb;

7 MySQL複製加密

在默認的主從複製過程或遠程鏈接到MySQL/MariaDB全部的連接通訊中的數據都是明文的,外網裏訪問數據或則複製,存在安全隱患。經過SSL/TLS加密的方式進行復制的方法,來進一步提升數據的安全性

  • 配置實現:
    參看:https://mariadb.com/kb/en/library/replication-with-secure-connections/

    1. 主服務器開啓SSL:[mysqld] 加一行ssl
    2. 主服務器配置證書和私鑰;而且建立一個要求必須使用SSL鏈接的複製帳號
    3. 從服務器使用CHANGER MASTER TO 命令時指明ssl相關選項
  • 配置示例

    1. 申請證書
      自搭建CA,生產CA祕鑰cakey.pem
             
             
             
             
      • 1
      openssl genrsa 2048 > cakey.pem
      生成自簽名證書
             
             
             
             
      • 1
      openssl req -new -x509 -key cakey.pem -out cacert.pem -days 3650
      爲主服務器A創建證書
      rsa表示算法1024位,有效期爲100天 ,-nodes表示不加密 -keyout表示輸出私鑰文件爲master.key,而後生成證書申請csr
             
             
             
             
      • 1
      openssl req -newkey rsa:1024 -days 100 -nodes -keyout master.key > master.csr
      爲主服務器頒發證書
      -CA表示ca的證書文件,-CAkey表示ca的私鑰文件,-set_serial表示給證書設置一個序列號從01開始編碼
             
             
             
             
      • 1
      openssl x509 -req -in master.csr -days 100 -CA cacert.pem -CAkey cakey.pem -set_serial 01 > master.crt
      從服務器B生成私鑰,並生成證書申請
             
             
             
             
      • 1
      openssl req -newkey rsa:1024 -days 100 -nodes -keyout slave.key > slave.csr
      爲從服務器B頒發證書
             
             
             
             
      • 1
      openssl x509 -req -in slave.csr -days 100 -CA cacert.pem -CAkey cakey.pem -set_serial 02 > slave.crt
      將證書和私鑰複製給主從服務器的對應目錄下
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      '傳送ca證書、主服務器私鑰、主服務器證書給主服務器' scp cacert.pem master.crt master.key 192.168.50.107:/etc/my.cnf.d/ssl/ '傳送ca證書、從服務器私鑰、從服務器證書給從服務器' scp cacert.pem slave.crt slave.key 192.168.50.115:/etc/my.cnf.d/ssl/
    2. 配置主服務器
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      1. '修改配置文件' [root@hai7-8 ssl]$vim /etc/my.cnf [mysqld] server_id=2 log-bin ssl <==主服務器啓用加密功能 ssl-ca=/etc/my.cnf.d/ssl/cacert.pem <==ca證書 ssl-cert=/etc/my.cnf.d/ssl/master.crt <==主服務器證書 ssl-key=/etc/my.cnf.d/ssl/master.key <==主服務器私鑰 2. '重啓服務' [root@hai7-8 ssl]$systemctl restart mariadb
      進入數據庫查看變量,判斷是否配置成功
             
             
             
             
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      [root@hai7-8 ssl]$mysql MariaDB [(none)]> show variables like '%ssl%'; +---------------+------------------------------+ | Variable_name | Value | +---------------+------------------------------+ | have_openssl | YES | <==YES表示配置成功 | have_ssl | YES |
      創建強制加密帳號,強制加密關鍵詞爲require ssl
             
             
             
             
      • 1
      MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO ssluser@'192.168.50.%' IDENTIFIED BY 'centos' require ssl;
    3. 配置從服務器

      8 主從複製的監控和維護

      1. 清理日誌
        1. 刪除指定部分二進制日誌
        2. 刪除二進制日誌信息
        3. 刪除從服務器信息
      2. 主從複製監控
        1. 查看當前二進制日誌位置,白名單和黑名單
        2. 查看二進制日誌記錄詳細內容
        3. 查看全部二進制日誌大小及位置
        4. 查看從服務器同步複製信息
        5. 顯示哪些鏈接線程正在運行
      3. 從服務器是否落後於主服務,在列表中
      4. 如何肯定主從節點數據是否一致
      5. 數據不一致如何修復
        刪除從數據庫,從新複製

      9 MySQL高可用-集羣架構

      9.1 集羣概述

      • 實現高可用性解決方案

        1. MMM: Multi-Master Replication Manager for MySQL,
          Mysql主主複製管理器是一套靈活的腳本程序,基於perl實現,用來對mysql replication進行監控和故障遷移,並能管理mysql Master-Master複製的配置(同一時間只有一個節點是可寫的)
          官網: http://www.mysql-mmm.org
          https://code.google.com/archive/p/mysql-master-master/downloads
        2. MHA: Master High Availability,
          對主節點進行監控,可實現自動故障轉移至其它從節點;經過提高某一從節點爲新的主節點,基於主從複製實現,還須要客戶端配合實現,目前MHA主要支持一主多從的架構,要搭建MHA,要求一個複製集羣中必須最少有三臺數據庫服務器,一主二從,即一臺充當master,一臺充當備用master,另一臺充當從庫,出於機器成本的考慮,淘寶進行了改造,目前淘寶TMHA已經支持一主一從
          官網:https://code.google.com/archive/p/mysql-master-ha/
        3. Galera Cluster:wsrep(MySQL extended with the Write Set Replication)
          經過wsrep協議在全局實現複製;任何一節點均可讀寫,不須要主從複製,實現多主讀寫
      • MHA集羣架構
        在這裏插入圖片描述

        1. 搭建一個Manager的服務器充當管理員,它能夠監聽管理多組主從集羣
        2. 管理的主從集羣,一旦主服務器(M)宕機,Manager就會自動選取一個從服務器(S)提高爲主服務器,使其餘的slave鏈接新的master進行復制
        3. Manager服務器在提高從服務器前,會將從服務器讀取到中繼日誌中的數據(i1),繼續執行完成寫入數據庫
        4. 識別含有最新更新的slave,將數據(i2)分別讀入各從服務器,保證從服務的數據時一致的
        5. 宕機崩潰的master保存二進制日誌事件(binlog events),能夠將主服務器未同步的數據(X)補齊
      • 主服務器宕機緣由

        1. 進程故障
          可是搭載MySQL的服務器正常,這種狀況MHA能夠經過ssh服務將其上的二進制日誌讀出來,應用到Latest Slave上,讓Latest Slave上的數據更新至最新狀態
        2. 物理服務器損壞
          選擇一個數據最新的服務器稱爲主服務器,其餘從服務器自動將新的主服務器識別爲主服務器

      9.2 MHA

      爲了儘量的減小主庫硬件損壞宕機形成的數據丟失,所以在配置MHA的同時建議配置成MySQL 5.5的半同步複製

      • MHA軟件由兩部分組成,Manager工具包和Node工具包

        1. Manager工具包主要包括如下幾個工具:
      1. '清空同步信息,從新以加密方式同步' MariaDB [(none)]> STOP SLAVE; MariaDB [(none)]> RESET SLAVE ALL 2. '從新配置加密同步' MariaDB [(none)]> CHANGE MASTER TO -> MASTER_HOST='192.168.50.111', -> MASTER_USER='ssluser', -> MASTER_PASSWORD='centos', -> MASTER_LOG_FILE='mariadb-bin.000002', -> MASTER_LOG_POS=411, -> MASTER_SSL=1, <=啓用加密 -> MASTER_SSL_CA = '/etc/my.cnf.d/ssl/cacert.pem', <==ca的證書 -> MASTER_SSL_CERT = '/etc/my.cnf.d/ssl/slave.crt', <==從服務器的證書 -> MASTER_SSL_KEY = '/etc/my.cnf.d/ssl/slave.key'; <==從服務器的私鑰 Query OK, 0 rows affected (0.00 sec) 3. '啓動從服務器同步線程' MariaDB [(none)]> start slave;PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr }RESET MASTERRESET SLAVESHOW MASTER STATUSSHOW BINLOG EVENTSSHOW BINARY LOGSSHOW SLAVE STATUSSHOW PROCESSLISTSHOW SLAVE STATUSSeconds_Behind_Master: 0percona-tools
工具 功能描述
masterha_check_ssh 檢查MHA的SSH配置情況
masterha_check_repl 檢查MySQL複製情況
masterha_manger 啓動MHA
masterha_check_status 檢測當前MHA運行狀態
masterha_master_monitor 檢測master是否宕機
masterha_master_switch 故障轉移(自動或手動)
masterha_conf_host 添加或刪除配置的server信息
  1. Node工具包:
    這些工具一般由MHA Manager的腳本觸發,無需人爲操做)主要包括如下幾個工具
工具 功能描述
save_binary_logs 保存和複製master的二進制日誌
apply_diff_relay_logs 識別差別的中繼日誌事件並將其差別的事件應用於其餘的slave
filter_mysqlbinlog 去除沒必要要的ROLLBACK事件(MHA已再也不使用此工具)
purge_relay_logs 清除中繼日誌(不會阻塞SQL線程)
  • 工具包安裝位置

    1. 在管理節點兩個都要安裝
      mha4mysql-manager
      mha4mysql-node
    2. 在被管理節點安裝node包
      mha4mysql-node
  • MHA集羣搭建

    1. 管理節點
      在管理節點創建配置文件,定義集羣服務的設置
      vim /etc/mastermha/app1.cnf
      [server default]
      user=mhauser          <==MHA服務器管理各主從服務器使用的帳號
      password=magedu    	  <==MHA服務器密碼
      manager_workdir=/data/mastermha/app1/            <==工做目錄
      manager_log=/data/mastermha/app1/manager.log     <==日誌
      remote_workdir=/data/mastermha/app1/      <==被管理節點上manager的工做目錄,自動生成
      ssh_user=root              <==主服務器上設置的管理員權限的帳號,用來讀取日誌、提高從服務器等
      repl_user=repluser         <==複製數據的帳號密碼
      repl_password=magedu
      ping_interval=1            <==1秒監控一次服務器是否正常工做
      [server1]   			   <==被管理的服務器
      hostname=192.168.8.17
      candidate_master=1         <==能夠充當master的從服務器,人爲定義充當主服務器
      [server2]
      hostname=192.168.8.27
      candidate_master=1
      [server3]
      hostname=192.168.8.37
  • 自定義擴展選項
    secondary_check_script: ‘經過多條網絡路由檢測master的可用性’
    master_ip_ailover_script: ‘更新Application使用的masterip’
    shutdown_script: ‘強制關閉master節點’
    report_script: ‘發送報告’
    init_conf_load_script: ‘加載初始配置參數’
    master_ip_online_change_script:‘更新master節點ip地址’

  • 實現主服務器(Master)
    1. '修改配置文件'
    vim /etc/my.cnf
    [mysqld]
    log-bin
    server_id=1
    skip_name_resolve=1       <==在MHA中,反向解析爲強制項
    2. '查看二進制文件,備用配置從服務器'
    mysql>show master logs    
    3. '建立從服務器複製權限帳號'
    mysql>grant replication slave on *.* to repluser@'192.168.8.%' identified by 	'magedu';
    4. '建立高權限帳號查看二進制與提高從服務器'
    mysql>grant all on *.* to mhauser@'192.168.8.%’identified by‘magedu';
  • 實現slave
  • 在全部節點實現相互之間ssh key驗證
  • mha驗證和啓動
    1. 驗證配置文件是否配置正確
      masterha_check_ssh --conf=/etc/mastermha/app1.cnf
    2. 驗證同步複製功能是否正確
      masterha_check_repl --conf=/etc/mastermha/app1.cnf
    3. 啓動服務
      masterha_manager --conf=/etc/mastermha/app1.cnf
    4. 排錯日誌
      /data/mastermha/app1/manager.log
    5. 示例

      在全部節點實現相互之間ssh key驗證

       
         
  • 實現主從關係

    1. 主服務器B設置修改配置文件,重啓服務
    2. 創建管理帳號
    3. 從服務器設置
      從服務器C配置,從服務器D的id爲3,其餘相同,重啓服務
    4. 在從服務器上設置同步複製

      配置MHA,須要epel源,須要的工具包和

      1. 在manage管理端兩個都要安裝
                 
                 
                 
                 
        • 1
        • 2
      2. 在被管理節點,也就是主從服務器上只須要安裝
                 
                 
                 
                 
        • 1
      3. 在manage管理端手動創建管理配置文件
      4. 運行檢查腳本,查看配置文件是否設置正確
                   
                   
                   
                   
        • 1
      5. 查看複製是否設置正確
                   
                   
                   
                   
        • 1
      6. 啓動管理服務
                   
                   
                   
                   
        • 1
    5. 測試manage,自動提高從服務器功能,宕掉主服務器

            
            
            
            
      • 1
      • 2
      • 3
  • 9.3 Galera Cluster

    集成了Galera插件的MySQL集羣,是一種新型的,數據不共享的,高度冗餘的高可用方案;
    目前Galera Cluster有兩個版本,分別是Percona Xtradb Cluster及MariaDB Cluster,Galera自己是具備多主特性的,即採用multi-master的集羣架構,是一個既穩健,又在數據一致性、完整性及高性能方面有出色表現的高可用解決方案
    在這裏插入圖片描述
    如圖示:三個節點組成了一個集羣,與普通的主從架構不一樣,它們均可以做爲主節點,三個節點是對等的,稱爲multi-master架構,當有客戶端要寫入或者讀取數據時,鏈接哪一個實例都是同樣的,讀到的數據是相同的,寫入某一個節點以後,集羣本身會將新數據同步到其它節點上面,這種架構不共享任何數據,是一種高冗餘架構想

    • 同步複製與異步複製

      1. 同步複製
        使用急切複製的方法。節點經過更新單個事務中的全部副原本保持全部副本的同步。換句話說,當事務提交時,全部節點都具備相同的值
      2. 異步複製
        使用延遲複製的方法。主數據庫異步地將副本更新傳播到其餘節點。主節點傳播副本後,事務提交。換句話說,當事務提交時,至少在短期內,某些節點持有不一樣的值
    • 同步複製優缺點

      1. 理論上,與異步複製相比,同步複製有幾個優勢。
        1. 高可用性
          同步複製提供高度可用的羣集,並保證24/7服務的可用性,由於:
          1. 節點崩潰時無數據丟失。
          2. 數據副本保持一致。
          3. 沒有複雜的,費時的故障轉移。
        2. 改進性能
          同步複製容許您在集羣中的全部節點上並行執行事務,從而提升性能。
        3. 跨集羣的因果關係
          同步複製保證了整個集羣的因果關係。例如,SELECT在事務以後發出的查詢老是看到事務的效果,即便事務是在另外一個節點上執行的。
      2. 同步複製的缺點
        節點數量的任何增長都會致使事務響應時間以及衝突和死鎖機率的指數增加,所以,這直接致使異步複製仍然是數據庫性能、可伸縮性和可用性的主要複製協議
    • 解決同步複製中的缺點
      Galera集羣使用的基於證書的複製系統就是創建如下方法之上的

      1. Group Communication(羣體通訊)
      2. Write-sets(寫集)
        將要被複制廣播的事務
      3. Database State Machine(數據庫狀態機)
        在本地處理事務,實現新事務首先在本地執行,而後做爲讀取集經過廣播發送給其餘數據庫站點認證
      4. Transaction Reordering(事務重排序)
        在提交事務廣播以前,將事務重排序,實現增長事務認證測試經過數
    • 基於認證的複製須要什麼

      1. 事務型數據庫
        具有回滾功能,具有原子性,一系列數據庫操做必須所有發生,不然什麼都不會發生
      2. 全局排序
        它要求對複製事件進行全局排序。具體而言,它們以相同的順序應用於全部實例
    • Galera Cluster特色

      1. 多主架構
        真正的多點讀寫的集羣,在任什麼時候候讀寫數據,都是最新的
      2. 同步複製
        集羣不一樣節點之間數據同步,沒有延遲,在數據庫掛掉以後,數據不會丟失
      3. 併發複製
        從節點APPLY數據時,支持並行執行,更好的性能
      4. 故障切換
        在出現數據庫故障時,因支持多點寫入,切換容易
      5. 熱插拔
        在服務期間,若是數據庫掛了,只要監控程序發現的夠快,不可服務時間就會很是少。在節點故障期間,節點自己對集羣的影響很是小
      6. 自動節點克隆
        在新增節點,或者停機維護時,增量數據或者基礎數據不須要人工手動備份提供,Galera Cluster會自動拉取在線節點數據,最終集羣會變爲一致
      7. 對應用透明
        集羣的維護,對應用程序是透明的
    • Galera Cluster工做過程
      在這裏插入圖片描述

      1. 當客戶端提交一個commit命令,在事務提交以前,全部對數據庫的操做都會被寫入write-set中,包括主鍵
      2. 而後數據庫會將這個write-set發給全部其餘節點,write-set將在每一個節點上使用主鍵進行認證嘗試
      3. 若是認證失敗,節點會丟棄這個write-set,同時集羣會回滾到以前的事務點;若是認證成功,commit正常提交,事務會應用到其餘節點上
      4. Galera Cluster基於認證的複製主要依賴於the global ordering of transactions,咱們暫且稱其爲全局事務序號,複製期間,Galera Cluster會爲每個事務分配一個全局事務序號,相似序列號。
      5. 當某個事務到達commit階段時,節點會檢查待提交事務的序號與上一次成功提交事務的序號,檢查區間全部事務是否與新事務存在主鍵衝突,若是檢查到衝突,認證就會失敗。
      6. 全部節點以相同的順序接受事務,全部節點對事務是否提交作一致性決定。事務提交成功以後,首先生成此事務的節點會通知應用程序事務已正確提交
    • Galera Cluster官方文檔:
      http://galeracluster.com/documentation-webpages/galera-documentation.pdf
      http://galeracluster.com/documentation-webpages/index.html
      https://mariadb.com/kb/en/mariadb/getting-started-with-mariadb-galera-cluster/

    • Galera Cluster包括兩個組件

      1. Galera replication library (galera-3)
      2. WSREP:MySQL extended with the Write Set Replication
    • WSREP複製實現:
      至少須要三個節點,不能安裝mariadb-server

      1. percona-cluster
      2. MariaDB-Cluster
    • 查看集羣中相關係統變量和狀態變量

      1. SHOW VARIABLES LIKE 'wsrep_%‘;
      2. SHOW STATUS LIKE 'wsrep_%‘;
      3. SHOW STATUS LIKE 'wsrep_cluster_size‘;
    • Galera Cluster實現步驟

      1. 安裝,須要配置yum源,這裏使用清華的yum源

        1. yum源配置
                   
                   
                   
                   
          • 1
          • 2
          • 3
          • 4
        2. 安裝專門的集羣功能版本的mariadb, 包名爲
                   
                   
                   
                   
          • 1
      2. 修改配置文件

    1. '修改配置文件' vim /etc/my.cnf [mysqld] server_id=2 <==不一樣節點此值各不相同 log-bin read_only <==Manage會自動在提高爲主的時候去掉此項 skip_name_resolve=1 2. '實現從服務器同步複製' mysql>CHANGE MASTER TO MASTER_HOST=‘MASTER_IP', MASTER_USER='repluser', MASTER_PASSWORD=‘magedu', MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=245;1. '管理機manager上生成ssh祕鑰' [root@hai7-8 ~]$ssh-keygen 2. '將祕鑰導出至本機' [root@hai7-8 ~/.ssh]$ssh-copy-id 192.168.50.110 3. '將整個目錄拷貝至集羣全部主機上' [root@hai7-8 ~]$scp -pr .ssh 192.168.50.115:/root/ ......其餘主機相似操做[root@hai7-8 ~]$vim /etc/my.cnf [mysqld] server_id=1 innodb_file_per_table log_bin skip_name_resolve 重啓服務 [root@hai7-8 ~]$systemctl start mariadb1. '用來主從複製的帳號' MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO repluser@'192.168.50.%' IDENTIFIED BY 'magedu'; 2. '用於提高從服務器,讀取日誌等帳號' mysql>GRANT all ON *.* TO mhauser@'192.168.50.%' IDENTIFIED BY 'magedu'; 3. '查看二進制日誌文件位置' MariaDB [(none)]> SHOW MASTER LOGS; +--------------------+-----------+ | Log_name | File_size | +--------------------+-----------+ | mariadb-bin.000001 | 541 | +--------------------+-----------+[mysqld] server_id=2 log-bin innodb_file_per_table skip_name_resolve relay_log_purge=0 <==禁止SQL線程執行完中繼日誌就刪除,保留日誌以備宕機補齊數據 read_only [root@hai7-6 ~]$systemctl restart mariadb1. '設置複製命令' MariaDB [(none)]> CHANGE MASTER TO -> MASTER_HOST='192.168.50.108', -> MASTER_USER='repluser', -> MASTER_PASSWORD='magedu', -> MASTER_LOG_FILE='mariadb-bin.000001', -> MASTER_LOG_POS=541; 2. '啓動複製線程命令' MariaDB [(none)]> START SLAVE; 3. '查看從服務器設置,肯定狀態' MariaDB [(none)]> SHOW SLAVE STATUS\Gmha4mysql-node-0.56-0.el6.noarch.rpmmha4mysql-manager-0.56-0.el6.noarch.rpm[root@hai7-8 ~]$yum -y install mha4mysql-node-0.56-0.el6.noarch.rpm [root@hai7-8 ~]$yum -y install mha4mysql-manager-0.56-0.el6.noarch.rpmmha4mysql-node[root@hai7-8 ~]$yum -y install mha4mysql-node-0.56-0.el6.noarch.rpm[root@hai7-8 ~]$mkdir /etc/mha/ <==自建存放配置文件的目錄,路徑沒有要求 [root@hai7-8 ~]$vim /etc/mha/appq.conf <==編輯配置文件,文件名沒有要求 [server default] user=mhauser password=magedu manager_workdir=/data/mastermha/app1/ <==工做目錄,會自動生成 manager_log=/data/mastermha/app1/manager.log remote_workdir=/data/mastermha/app1/ ssh_user=root repl_user=repluser repl_password=magedu ping_interval=1 [server1] hostname=192.168.50.108 candidate_master=1 [server2] hostname=192.168.50.115 candidate_master=1 [server3] hostname=192.168.50.107[root@hai7-8 ~]$masterha_check_ssh --conf=/etc/mha/app1.conf[root@hai7-8 ~]$masterha_check_repl --conf=/etc/mha/appq.conf[root@hai7-8 ~]$masterha_manager --conf=/etc/mha/appq.conf在主服務器端執行,殺掉進程,模擬宕機 [root@hai7-8 ~]$killall mysqld 管理端提高從服務器後,會從前端管理模式退出,爲一次性任務,能夠經過查看管理端日誌,查看被提高從服務器。被提高的從服務器會自動將read_only修改成OFF狀態,可是配置文件中內容還在,須要手工清除,避免重啓修改回去[root@hai7-8 ~]$vim /etc/yum.repos.d/mysql.repo [mysql] baseurl=https://mirrors.tuna.tsinghua.edu.cn/mariadb/mariadb-5.5.59/yum/centos7-amd64/ gpgcheck=0MariaDB-Galera-server[root@hai7-8 ~]$yum install MariaDB-Galera-server -y[root@hai7-8 ~]$vim /etc/my.cnf.d/sevim server.cnf [galera] <==在此語句塊下修改 # Mandatory settings wsrep_provider=/usr/lib64/galera/libgalera_smm.so <==galera提供的驅動模塊 wsrep_cluster_address='gcomm://192.168.50.108,192.168.50.115,192.168.50.107' <==galera組中的IP地址 binlog_format=row <==基於二進制行的複製格式 default_storage_engine=InnoDB <==默認存儲引擎 innodb_autoinc_lock_mode=2 <==innodb鎖級別 bind-address=0.0.0.0 <==綁定的地址,默認就行
  • 下面爲配置可選項
    wsrep_cluster_name = ‘mycluster‘默認my_wsrep_cluster <==集羣名稱
    wsrep_node_name = ‘node1’ <==自定義節點名稱
    wsrep_node_address = ‘192.168.8.7’

    首次啓動時,須要初始化集羣,在其中一個節點上執行腳本mysql
    mysql腳原本自安裝包

     
     
     
     
    • 1
    • 2
    [root@hai7-8 init.d]$rpm -qf mysql MariaDB-Galera-server-5.5.59-1.el7.centos.x86_64

    在其中一個節點上運行此腳本,後面跟start --wsrep-new-cluster表示開啓新的組,後續的節點只要啓動服務便可

     
     
     
     
    • 1
    • 2
    • 3
    [root@hai7-8 ~]$/etc/init.d/mysql start --wsrep-new-cluster 其餘節點啓動服務便可 [root@hai7-6 mysqldata]$service mysql start

    9.4 複製的問題和解決方案

    • 數據損壞或丟失
      1. 主服務器(Master)
        MHA(提高從服務器爲主) + semi repl(半同步複製確保數據完整)
      2. 從服務器(Slave)
        從新複製
    • 不唯一的server id
      從新同步複製
    • 複製延遲
      1. 須要額外的監控工具的輔助
      2. 一從多主:mariadb10版後支持
      3. 多線程複製:對多個數據庫複製

    10. 性能衡量指標

    • 數據庫服務衡量指標:

      1. qps
        query per second(每秒查詢次數)
      2. tps:
        transaction per second(每秒執行的事務次數)
    • 壓力測試工具

      1. mysqlslap
      2. Sysbench:功能強大
        https://github.com/akopytov/sysbench
      3. tpcc-mysql
      4. MySQL Benchmark Suite
      5. MySQL super-smack
      6. MyBench
    • MYSQL壓力測試工具Mysqlslap
      來自於mariadb包,測試的過程默認生成一個mysqlslap的schema,生成測試表t1,查詢和插入測試數據,mysqlslap庫自動生成,若是已經存在則先刪除。用–only-print來打印實際的測試過程,整個測試完成後不會在數據庫中留下痕跡

      1. 使用格式
        mysqlslap [options]
      2. 經常使用參數 [options] 說明
        1. --auto-generate-sql, -a
          自動生成測試表和數據,表示用mysqlslap工具本身生成的SQL腳原本測試併發壓力
        2. --auto-generate-sql-load-type=type
          測試語句的類型。表明要測試的環境是讀操做仍是寫操做仍是二者混合的。取值包括:read,key,write,update和mixed(默認)
        3. --auto-generate-sql-add-auto-increment
          表明對生成的表自動添加auto_increment列,從5.1.18版本開始支持|
        4. --number-char-cols=N, -x
          N 自動生成的測試表中包含多少個字符類型的列,默認1
        5. --number-int-cols=N, -y
          N 自動生成的測試表中包含多少個數字類型的列,默認1
        6. --number-of-queries=N
          總的測試查詢次數(併發客戶數×每客戶查詢次數)
        7. --query=name,-q
          使用自定義腳本執行測試,例如能夠調用自定義的存儲過程或者sql語句來執行測試
        8. --create-schema
          表明自定義的測試庫名稱,測試的schema
        9. --commint=N
          多少條DML後提交一次
        10. --compress, -C
          如服務器和客戶端都支持壓縮,則壓縮信息
        11. --concurrency=N, -c
          N 表示併發量,即模擬多少個客戶端同時執行select。可指定多個值,以逗號或者–delimiter參數指定值作爲分隔符如:--concurrency=100,200,500
        12. --engine=engine_name, -e engine_name
          表明要測試的引擎,能夠有多個,用分隔符隔開。例如:–engines=myisam,innodb
        13. --iterations=N, -i
          N測試執行的迭代次數,表明要在不一樣併發環境下,各自運行測試多少次|
        14. --only-print
          只打印測試語句而不實際執行
        15. --detach=N
          執行N條語句後斷開重連
        16. --debug-info, -T
          打印內存和CPU的相關信息
    • 示例

      1. 單線程測試
        mysqlslap -a -uroot -pmagedu
      2. 多線程測試。使用–concurrency來模擬併發鏈接
        mysqlslap -a -c 100 -uroot -pmagedu
      3. 測試同時不一樣的存儲引擎的性能進行對比
             
             
             
             
        • 1
        mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --iterations=5 --engine=myisam,innodb --debug-info -uroot -pmagedu
        --number-of-queries 1000:查詢一千次
        --concurrency=50,100:併發50和100分別測試
        --iterations=5:迭代5次
        --engine=myisam,innodb:分別對myisam,innodb引擎測試
      4. 執行一次測試,分別50和100個併發,執行1000次總查詢
             
             
             
             
        • 1
        mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --debug-info -uroot -pmagedu
      5. 50和100個併發分別獲得一次測試結果(Benchmark),併發數越多,執行完全部查詢的時間越長。爲了準確起見,能夠多迭代測試幾回
             
             
             
             
        • 1
        mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --iterations=5 --debug-info -uroot -pmagedu

    11 生產環境my.cnf配置示例

    高併發大數據的互聯網業務,架構設計思路是「解放數據庫CPU,將計算轉移到服務層」,併發量大的狀況下,這些功能極可能將數據庫拖死,業務邏輯放到服務層具有更好的擴展性,可以輕易實現「增機器就加性能」

    '硬件:內存32G'
    innodb_file_per_table = 1
    '打開獨立表空間'
    max_connections = 8000
    'MySQL服務所容許的同時會話數的上限,常常出現Too Many Connections的錯誤提示,則須要增大此值,根據服務器性能判斷,防止設置過大超過承載能力崩潰'
    back_log = 300
    'back_log 是操做系統在監聽隊列中所能保持的鏈接數,也就是最大會話數上限後,等待數上限'
    max_connect_errors = 1000
    '每一個客戶端鏈接最大的錯誤容許數量,當超過該次數,MYSQL服務器將禁止此主機的鏈接請求,直到MYSQL服務器重啓或經過flush hosts命令清空此主機的相關信息'
    open_files_limit = 10240
    '全部線程所打開表的數量'
    max_allowed_packet = 32M
    '每一個鏈接傳輸數據大小.最大1G,須是1024的倍數,通常設爲最大的BLOB的值'
    wait_timeout = 10
    '指定一個請求的最大鏈接時間,超時時長'
    sort_buffer_size = 16M
    '排序緩衝被用來處理相似ORDER BY以及GROUP BY隊列所引發的排序'
    join_buffer_size = 16M
    '不帶索引的全表掃描.使用的buffer的最小值'
    query_cache_size = 128M
    '查詢緩衝大小'
    query_cache_limit = 4M
    '指定單個查詢可以使用的緩衝區大小,缺省爲1M'
    transaction_isolation = REPEATABLE-READ
    '設定默認的事務隔離級別'
    thread_stack = 512K
    '線程使用的堆大小. 此值限制內存中能處理的存儲過程的遞歸深度和SQL語句複雜性,此容量的內存在每次鏈接時被預留.'
    log-bin
    '二進制日誌功能'
    binlog_format=row
    '二進制日誌格式'
    innodb_buffer_pool_size = 24G
    'InnoDB使用一個緩衝池來保存索引和原始數據, 可設置這個變量到服務器物理內存大小的80%'
    innodb_file_io_threads = 4
    '用來同步IO操做的IO線程的數量'
    innodb_thread_concurrency = 16
    '在InnoDb核心內的容許線程數量,建議的設置是CPU數量加上磁盤數量的兩倍'
    innodb_log_buffer_size = 16M
    '用來緩衝日誌數據的緩衝區的大小'
    innodb_log_file_size = 512M
    '在日誌組中每一個日誌文件的大小'
    innodb_log_files_in_group = 3
    '在日誌組中的文件總數'
    innodb_lock_wait_timeout = 120
    'SQL語句在被回滾前,InnoDB事務等待InnoDB行鎖的時間'
    long_query_time = 2
    '慢查詢時長'
    log-queries-not-using-indexes
    '將沒有使用索引的查詢也記錄下來'
    相關文章
    相關標籤/搜索