成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MySQL高可用-使用Docker部署MGR

數(shù)據(jù)庫 MySQL
MySQL MGR 集群是多個 MysQL Server 節(jié)點共同組成的分布式集群,每個 Server 都有完整的副本,它是基于 ROW 格式的二進制日志文件和 GTID 特性來實現(xiàn)的。

MySQL 的高可用方案很多,有 MHA、MGR、MySQL InnoDB Cluster 等。起初想學習下 MHA,了解后發(fā)現(xiàn) MHA 在 Github 上的倉庫已經(jīng)沒有更新了。不過 MHA 的兼容性比較好,有老版本的 MySQL 需要做高可用,還是值得一試的。

本文介紹下 MGR 的部署。

MGR (MySQL Group Replication) 是 MySQL 5.7.17 提出的,既可以很好的保證數(shù)據(jù)一致性又可以自動切換,具備故障檢測功能、支持多節(jié)點寫入。是以插件的形式提供,可以靈活部署。

MySQL MGR 集群是多個 MysQL Server 節(jié)點共同組成的分布式集群,每個 Server 都有完整的副本,它是基于 ROW 格式的二進制日志文件和 GTID 特性來實現(xiàn)的。

MGR 的優(yōu)點

  • 強一致性:基于原生復制及 Paxos 協(xié)議的組復制技術(shù)(以插件形式提供),確保數(shù)據(jù)的嚴格一致性。
  • 高容錯性:在少數(shù)節(jié)點故障時仍可正常運行,具備自動故障檢測機制。節(jié)點間資源沖突采用無鎖設(shè)計(如先到者優(yōu)先)處理,避免錯誤。
  • 高擴展性:支持節(jié)點動態(tài)自動加入與移除。新節(jié)點加入后自動同步數(shù)據(jù)至一致狀態(tài);節(jié)點移除后,集群自動更新并維護組配置信息。
  • 高靈活性:支持單主模式與多主模式。單主模式下自動選舉主節(jié)點,所有寫操作路由至主節(jié)點;多主模式下,所有節(jié)點均可并發(fā)處理寫操作。

MGR 的一些限制

  • 僅支持 InnoDB 表,并且每個表一定要有一個主鍵。
  • 必須打開 GTID 特性,二進制日志格式必須設(shè)置為 ROW 。
  • MGR 不支持大事務(wù)。
  • 僅支持 IPv4 網(wǎng)絡(luò),組大小限制為最少3個節(jié)點、最多9個節(jié)點。
  • 不支持外鍵。
  • 二進制日志不支持 Binlog Event Checksum 。
  • 所有節(jié)點 server_id 和 server_uuid 需唯一。

部署前準備

  • 為了方便,mysql 的主節(jié)點和從節(jié)點在一臺虛擬機中進行測試
  • docker 版本:20.10.0
  • docker compose 版本:2.26.2
  • mysql 版本:8.0.39

開始部署

采用 docker-compose 的方式進行部署,部署目錄 mysql-mgr 的文件結(jié)構(gòu)如下圖:

  • docker-compose.yml:容器編排文件,配置一個主和兩個從的 mysql 節(jié)點。
  • mysql-config:此目錄中是主和從的 mysql 配置文件
  • mysql-init-srcipts:此目錄中是 mysql 啟動時需要創(chuàng)建復制賬號以及安裝 mgr 插件
  • start-mgr.sh:三個 mysql 節(jié)點啟動后,執(zhí)行該文件進行 mgr 集群的啟動。

將 mysql-mgr 拷貝到服務(wù)器,進入 mysql-mgr 目錄執(zhí)行 docker-compose up -d 。

等三個 mysql 節(jié)點的狀態(tài)正常,執(zhí)行 ./start-mgr.sh ,成功執(zhí)行如下圖所示。

進入任意一個 mysql 中,執(zhí)行 SELECT * FROM performance_schema.replication_group_members; ,三個節(jié)點的 MEMBER_STATE 為 ONLINE 說明部署成功。

現(xiàn)在可以連上主節(jié)點,進行庫表和數(shù)據(jù)的創(chuàng)建,來驗證是否正常同步到從節(jié)點。

關(guān)鍵點說明

docker-compose 配置

docker-compose.yml 文件定義了三個 MySQL 節(jié)點,分別是一個主節(jié)點和兩個從節(jié)點:

version: '3.8'

services:
  mysql-master:
    image: mysql:8.0.39
    container_name: mysql-master
    hostname: mysql-master
    command: ["mysqld"]
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: mydb
    volumes:
      - mysql-master-data:/var/lib/mysql
      - ./mysql-init-scripts:/docker-entrypoint-initdb.d
      - ./mysql-config/mysql-master.cnf:/etc/mysql/conf.d/mysql-master.cnf
    ports:
      - "3306:3306"
      - "33061:33061"
    networks:
      - mysql-mgr-network
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p$$MYSQL_ROOT_PASSWORD"]
      interval: 10s
      timeout: 5s
      retries: 5

  mysql-slave-1:
    image: mysql:8.0.39
    container_name: mysql-slave-1
    hostname: mysql-slave-1
    command: ["mysqld"]
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: mydb
    volumes:
      - mysql-slave-1-data:/var/lib/mysql
      - ./mysql-init-scripts:/docker-entrypoint-initdb.d
      - ./mysql-config/mysql-slave-1.cnf:/etc/mysql/conf.d/mysql-slave-1.cnf
    ports:
      - "3307:3306"
      - "33062:33061"
    networks:
      - mysql-mgr-network
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p$$MYSQL_ROOT_PASSWORD"]
      interval: 10s
      timeout: 5s
      retries: 5
    depends_on:
      - mysql-master

  mysql-slave-2:
    image: mysql:8.0.39
    container_name: mysql-slave-2
    hostname: mysql-slave-2
    command: ["mysqld"]
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: mydb
    volumes:
      - mysql-slave-2-data:/var/lib/mysql
      - ./mysql-init-scripts:/docker-entrypoint-initdb.d
      - ./mysql-config/mysql-slave-2.cnf:/etc/mysql/conf.d/mysql-slave-2.cnf
    ports:
      - "3308:3306"
      - "33063:33061"
    networks:
      - mysql-mgr-network
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p$$MYSQL_ROOT_PASSWORD"]
      interval: 10s
      timeout: 5s
      retries: 5
    depends_on:
      - mysql-master

networks:
  mysql-mgr-network:
    driver: bridge

volumes:
  mysql-master-data:
  mysql-slave-1-data:
  mysql-slave-2-data:

卷掛載,以主節(jié)點為例:

  • 數(shù)據(jù)持久化:mysql-master-data:/var/lib/mysql
  • 初始化腳本:./mysql-init-scripts:/docker-entrypoint-initdb.d
  • 配置文件:./mysql-config/mysql-master.cnf:/etc/mysql/conf.d/mysql-master.cnf

端口映射:

  • MySQL 節(jié)點端口:3306:3306(主節(jié)點),3307:3306(從節(jié)點1),3308:3306(從節(jié)點2)
  • MGR 通信端口:33061:33061(主節(jié)點),33062:33061(從節(jié)點1),33063:33061(從節(jié)點2)

網(wǎng)絡(luò)配置

  • 所有節(jié)點都連接到同一個網(wǎng)絡(luò) mysql-mgr-network,確保節(jié)點間可以相互通信

MySQL 的配置文件

[mysqld]
server-id=1
log-bin=mysql-bin-1.log
binlog-format=ROW
gtid-mode=ON
enforce-gtid-cnotallow=ON
log-slave-updates=ON
binlog-checksum=NONE
master-info-repository=TABLE
relay-log-info-repository=TABLE
transaction-write-set-extractinotallow=XXHASH64
  • server-id:每個節(jié)點的必須唯一。
  • binglog-format:行級 binlog,MGR 硬性要求 ROW 格式。
  • gtid-mode:啟用 GTID(全局事務(wù)標識),MGR 內(nèi)部完全基于 GTID 做事務(wù)認證和沖突檢測。
  • enforce-gtid-consistency:禁止任何會破壞 GTID 一致性的語句(如 CREATE TEMPORARY TABLE 與 CREATE TABLE ... SELECT),MGR 強制要求打開,否則無法啟動組復制。
  • binlog-checksum:MySQL 8.0.20 之前的 MGR 要求關(guān)閉 binlog 校驗和(因為早期組通信層不支持),8.0.20 及以后可以改為 CRC32,保持默認即可,但舊版本必須顯式設(shè)置為 NONE

這些參數(shù)共同確保節(jié)點開啟 binlog、使用 ROW + GTID、寫入復制元數(shù)據(jù)到 InnoDB 表,并為 MGR 提供事務(wù)寫集合,從而滿足組復制的所有前置條件。

除此之外,還需要進行 MGR 的組復制配置,如下:

loose-group-replication-group-name=aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
loose-group-replication-start-on-boot=OFF
loose-group-replication-local-address=mysql-master:33061
loose-group-replication-group-seeds=mysql-master:33061,mysql-slave-1:33061,mysql-slave-2:33061
loose-group-replication-bootstrap-group=OFF
loose-group-replication-single-primary-mode=ON
loose-group-replication-enforce-update-everywhere-checks=OFF
  • 給整個 MGR 組起一個全局唯一的名字(UUID 格式),三個節(jié)點相同。
  • MySQL 實例啟動時不自動啟動 Group Replication 插件,這個參數(shù)如果設(shè)置為 OFF,當壞掉的節(jié)點修復后,不會自動加入集群。
  • 本節(jié)點在組內(nèi)通信時使用的本地監(jiān)聽地址(IP 或主機名:端口)。
  • 種子列表,告訴當前節(jié)點“初次加入組時可以去找誰”。只要列表中的任意一個節(jié)點在線,新節(jié)點就能拿到完整的成員信息并加入組。通常把所有成員都寫上,方便任何順序啟動。
  • 只在第一個節(jié)點第一次啟動時設(shè)為 ON,用來創(chuàng)建組;之后必須立即改回 OFF 并重啟,否則會出現(xiàn)“腦裂”或成員沖突。
  • 打開單主模式(Single-Primary),組內(nèi)只有一臺節(jié)點可寫(primary),其余為只讀(secondaries),主節(jié)點故障時自動重新選舉。
  • 在多主模式下才生效;單主模式可保持 OFF。

初始化腳本

-- 01-create-replication-user.sql
-- 創(chuàng)建復制用戶
CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'replpass';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
GRANT BACKUP_ADMIN ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;

reset master;

上面的腳本有兩個點需要注意:

  • WITH mysql_native_password 必須要加上
  • 最后的 reset master 不要忘記了
-- 02-install-plugin.sql
INSTALL PLUGIN group_replication SONAME 'group_replication.so';

這些腳本在容器首次啟動時自動執(zhí)行:

  • 創(chuàng)建具有復制權(quán)限的用戶 repl
  • 安裝 Group Replication 插件

啟動 MGR 集群

啟動 MGR 集群的過程由 start-mgr.sh 腳本完成:

#!/bin/bash

# 等待所有MySQL實例啟動完成
sleep 30

# 在主節(jié)點上引導組并啟動組復制
docker exec mysql-master mysql -uroot -prootpassword -e "
  CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='replpass' FOR CHANNEL 'group_replication_recovery';
  SET GLOBAL group_replication_bootstrap_group=ON;
  START GROUP_REPLICATION;
  SET GLOBAL group_replication_bootstrap_group=OFF;
  SELECT * FROM performance_schema.replication_group_members;"

# 等待主節(jié)點組復制啟動完成
sleep 20

# 在從節(jié)點上啟動組復制
docker exec mysql-slave-1 mysql -uroot -prootpassword -e "
  CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='replpass' FOR CHANNEL 'group_replication_recovery';
  START GROUP_REPLICATION;
  SELECT * FROM performance_schema.replication_group_members;"

docker exec mysql-slave-2 mysql -uroot -prootpassword -e "
  CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='replpass' FOR CHANNEL 'group_replication_recovery';
  START GROUP_REPLICATION;
  SELECT * FROM performance_schema.replication_group_members;"

# 檢查MGR狀態(tài)
sleep 5
echo "檢查MGR集群狀態(tài):"
docker exec mysql-master mysql -uroot -prootpassword -e "SELECT * FROM performance_schema.replication_group_members;"

主節(jié)點:

  • 配置復制恢復通道的用戶名和密碼。
  • 設(shè)置 group_replication_bootstrap_group=ON 引導組。
  • 啟動組復制 START GROUP_REPLICATION。
  • 關(guān)閉引導模式 group_replication_bootstrap_group=OFF。
  • 只有第一個節(jié)點需要引導組,其他節(jié)點只需加入。

從節(jié)點:

  • 配置相同的復制恢復通道。
  • 直接啟動組復制,自動加入已存在的組。

常見問題

遇到問題很正常,出現(xiàn)任何錯誤優(yōu)先查看 mysql 節(jié)點的日志,根據(jù)錯誤信息讓 AI 分析并給出解決方案,通常都是可以解決的。

我部署過程中就遇到執(zhí)行 ./start-mgr.sh 后,查詢狀態(tài)如下圖:

只有主節(jié)點是 ONLINE。我對主從節(jié)嘗試手動停止和啟用組復制后解決。

STOP GROUP_REPLICATION; 
START GROUP_REPLICATION;

在學習過程中出現(xiàn)問題其實是好事,可以從解決問題的過程中去提高。之前碰到有同事遇到問題就重置服務(wù)器,其實是在走捷徑,能力得不到提升,而且不是所有的環(huán)境都能重置的。搞懂所有細枝末節(jié)才能以不變應(yīng)萬變。

希望本文對您有所幫助!

責任編輯:姜華 來源: 不止dotNET
相關(guān)推薦

2023-11-07 07:30:18

Hadoop高可用

2023-05-08 08:16:00

高可用MongoDB

2023-11-13 09:03:10

2013-07-11 13:39:23

Hadoop

2022-05-17 11:06:44

數(shù)據(jù)庫MySQL系統(tǒng)

2023-10-17 14:29:35

2015-05-12 10:22:05

MySQL

2019-11-27 16:34:00

配置

2015-10-22 10:28:45

MySQL高可用方案

2019-08-27 15:56:44

MySQL 互聯(lián)網(wǎng)數(shù)據(jù)庫

2017-03-16 13:38:02

MySQLMGR

2018-01-12 14:20:37

數(shù)據(jù)庫MySQL高可用架構(gòu)

2022-02-27 14:37:53

MySQL主備數(shù)據(jù)

2021-01-28 10:15:09

MySQL架構(gòu)數(shù)據(jù)庫

2019-07-19 16:55:07

MySQL管理工具Orchestrato

2021-03-17 10:05:42

KubernetesRedis數(shù)據(jù)庫

2020-10-28 07:10:07

Nginx高可用高并發(fā)

2024-09-13 15:32:18

2024-11-12 10:30:54

Docker部署數(shù)據(jù)庫

2017-11-13 11:07:32

Nginx搭建高可用
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 中文字幕免费视频 | a毛片大片 | 日韩欧美亚洲国产 | 国产成人在线免费观看 | 成年视频在线观看 | 国产成人精品网站 | 成人毛片网站 | 六月激情婷婷 | 中文字幕日韩视频 | 国产成人在线免费观看 | 久久99九九 | 国产激情久久久 | xxxx黄色| 91桃色网站 | 欧洲精品一区 | 久久久成人免费视频 | 九九超碰| 日韩av一级片 | 欧美黄色一级 | 97在线免费视频 | 日本丰满少妇裸体自慰 | 91爱爱爱| 中文字幕在线免费观看视频 | 中文字幕免费视频 | 一级片免费在线观看 | 久艹视频在线观看 | 青青五月天 | 日批视频免费在线观看 | 国产成人精品三级麻豆 | 婷婷中文字幕 | 黄色一节片 | 日韩欧美国产一区二区三区 | 成人玩具h视频 | 成人在线视频免费 | 亚洲永久免费视频 | 亚色视频 | 国产一区久久 | 亚洲黄色三级 | 亚洲va韩国va欧美va精品 | 毛片在线视频 | 黄色a一级 |