最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

通過容器技術(shù)(docker)部署MySQL讀寫分離

 更新時間:2026年01月27日 08:49:06   作者:ICT董老師  
Mycat作為開源數(shù)據(jù)庫中間件,在MySQL讀寫分離架構(gòu)中發(fā)揮核心作用,通過智能代理層實現(xiàn)讀寫請求的自動路由、負載均衡與故障轉(zhuǎn)移,從而提高系統(tǒng)性能和可用性

項目的目錄結(jié)構(gòu)

在 MySQL 讀寫分離架構(gòu)中,Mycat 作為開源數(shù)據(jù)庫中間件,核心作用是作為智能代理層,透明化實現(xiàn)讀寫請求的自動路由、負載均衡與故障轉(zhuǎn)移。

以下是其具體作用與技術(shù)實現(xiàn)的分步解析:

智能路由:讀寫請求的精準分發(fā)

讀寫分離機制

Mycat 通過解析 SQL 語句,自動識別寫操作(如 INSERT/UPDATE/DELETE)和讀操作(SELECT),并將寫請求路由至主庫,讀請求分發(fā)至從庫。例如:

  • 寫操作直接發(fā)送至配置的 <writeHost> 節(jié)點(主庫)。
  • 讀操作根據(jù)負載均衡策略(如 balance="3")分發(fā)至 <readHost> 節(jié)點(從庫)。

配置示例(schema.xml)

xml<dataHost name="node1" balance="3">
  <writeHost host="master_ip" url="master_ip:3306" user="root" password="123"/>
  <readHost host="slave1_ip" url="slave1_ip:3306" user="root" password="123"/>
  <readHost host="slave2_ip" url="slave2_ip:3306" user="root" password="123"/>
</dataHost>
  • balance="3" 表示所有讀請求隨機分發(fā)至從庫,主庫不承擔(dān)讀壓力。

?負載均衡:優(yōu)化讀操作分布

策略支持

Mycat 提供多種負載均衡模式,通過 balance 屬性配置:

  • balance="0":所有讀請求發(fā)送至當前可用的主庫(不開啟讀寫分離)。
  • balance="1":讀請求在全部從庫與備用主庫間輪詢。
  • balance="2":讀請求隨機分發(fā)至主庫或從庫。
  • balance="3":讀請求僅分發(fā)至從庫(推薦模式,避免主庫/負載)。

動態(tài)權(quán)重調(diào)整

可通過 weight 屬性為從庫分配權(quán)重,實現(xiàn)非對稱流量分配(如高性能從庫承擔(dān)更多讀請求)。

故障轉(zhuǎn)移:保障高可用性

主庫故障切換

  • 自動切換:配置 switchType="1" 時,Mycat 通過心跳檢測(如 select user())監(jiān)控主庫狀態(tài),若主庫宕機,自動將寫請求路由至備用主庫。
  • 手動切換:通過管理命令(如 switch writeHost)觸發(fā)主從角色切換。

從庫冗余與容錯

  • 配置多個從庫,當某一從庫故障時,Mycat 自動將其從負載均衡池移除,剩余從庫繼續(xù)提供服務(wù)。

數(shù)據(jù)同步:依賴MySQL原生復(fù)制

主從復(fù)制機制

  • Mycat 不參與數(shù)據(jù)同步,而是基于 MySQL 的主從復(fù)制(Binlog + Relay Log)實現(xiàn)數(shù)據(jù)一致性。
  • 主庫通過 Binlog 記錄變更,從庫通過 IO 線程拉取并應(yīng)用日志。

一致性保障

  • 異步復(fù)制:主庫提交后即返回成功,從庫延遲可能影響讀一致性(需業(yè)務(wù)容忍短暫延遲)。
  • 半同步復(fù)制:通過插件(如 rpl_semi_sync_master)確保至少一個從庫收到日志后再返回成功,平衡性能與一致性。

配置與運維簡化

集中化管理

  • 通過 schema.xml 統(tǒng)一配置邏輯庫、數(shù)據(jù)節(jié)點及路由規(guī)則,避免逐臺修改數(shù)據(jù)庫配置。
  • 支持動態(tài)重載配置(reload @@config),無需重啟 Mycat 即可生效。

監(jiān)控與日志

  • 提供實時日志(mycat.log)記錄路由決策、慢查詢及錯誤信息。
  • 集成 Prometheus 等監(jiān)控系統(tǒng),可視化展示集群狀態(tài)(如 QPS、連接數(shù)、主從延遲)。

擴展能力:水平分片與多租戶支持

水平分片

Mycat 支持按范圍、哈希等策略對單表進行分片(如 rule="auto-sharding-long"),突破單機存儲與性能瓶頸。

多租戶隔離

通過邏輯庫(<schema>)隔離不同業(yè)務(wù)的數(shù)據(jù),實現(xiàn)多租戶環(huán)境下的資源獨立與權(quán)限控制。

以下為各配置文件的詳細內(nèi)容

50-server.cnf

[server]
[mysqld]
user=mysql

#skip-networking=0
#bind-address = 0.0.0.0
#require_secure_transport = ON

pid-file=/run/mysqld/mysqld.pid
socket=/run/mysqld/mysqld.sock
basedir=/usr
datadir=/var/lib/mysql
tmpdir=/tmp
lc-messages-dir=/usr/share/mysql
query_cache_size=16M
log_error=/var/log/mysql/error.log
server-id=2
log_bin=mysql-bin
expire_logs_days=10
binlog_ignore_db=mysql
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
[embedded]
[mariadb]
[mariadb-10.3]

docker-compose.yml

version: "3.8"
services:
  db1:
    image: ubuntu:db1
    build:
      context: .
      dockerfile: MDockerfile
    networks:
      - db_network

  db2:
    image: ubuntu:db2
    build:
      context: .
      dockerfile: SDockerfile
    networks:
      - db_network

  mycat:
    image: ubuntu:mycat
    build:
      context: .
      dockerfile: MycatDockerfile

    ports:
      - 8066:8066
      - 9066:9066

    networks:
      - db_network

networks:
  db_network:
    driver: bridge

MDockerfile

FROM ubuntu:latest
LABEL maintainer="dong"
COPY sources.list /etc/apt
RUN apt-get update && apt-get dist-upgrade -y \
    && apt-get install mariadb-server -y
COPY 50-server.cnf /etc/mysql/mariadb.conf.d/50-server.cnf
RUN /etc/init.d/mariadb start \
    && mysql -uroot -e"create user'root'@'%'identified by'123456'" \
    && mysql -uroot -e"grant all on *.* to 'root'@'%'" \
    && mysql -uroot -e"create database student_manager" \
    && mysql -uroot -e"create table student_manager.student(id int primary key auto_increment,name varchar(20))" \
    && mysql -uroot -e"insert into student_manager.student values(null,'zhangsan')"

EXPOSE 3306
CMD /usr/bin/mysqld_safe

/MycatDockerfile

FROM ubuntu:latest
LABEL maintainer="dong"
ADD sources.list /etc/apt
ADD Mycat-server-1.6.7.5-release-20200410174409-linux.tar.gz /root

RUN apt-get update && apt-get dist-upgrade -y && apt-get install openjdk-8-jdk -y

RUN apt-get install supervisor -y
ADD schema.xml /root/mycat/conf
ADD server.xml /root/mycat/conf
ADD schema.dtd /root/mycat/conf
ADD supervisord.conf /etc/supervisord.conf
CMD ["/usr/bin/supervisord"]

schema.dtd

    name            CDATA #REQUIRED
    checkSQLschema  (true|false) "true"
    sqlMaxLimit     CDATA #IMPLIED
    dataNode        CDATA #REQUIRED
>

<!-- 定義 dataNode 元素 -->
<!ELEMENT dataNode EMPTY>
<!ATTLIST dataNode
    name        CDATA #REQUIRED
    dataHost    CDATA #REQUIRED
    database    CDATA #REQUIRED
>

<!-- 定義 dataHost 元素 -->
<!ELEMENT dataHost (heartbeat, writeHost+)>
<!ATTLIST dataHost
    name            CDATA #REQUIRED
    maxCon          CDATA #REQUIRED
    minCon          CDATA #REQUIRED
    balance         (0|1|2|3) #REQUIRED
    dbType          (mysql|oracle|pg) #REQUIRED
    dbDriver        (native|jdbc) #REQUIRED
    writeType       (0|1) #REQUIRED
    switchType      (1|2|3) #REQUIRED
    slaveThreshold  CDATA #REQUIRED
>

<!-- 定義 heartbeat 元素 -->
<!ELEMENT heartbeat (#PCDATA)>

<!-- 定義 writeHost 元素 -->
<!ELEMENT writeHost (readHost*)>
<!ATTLIST writeHost
    host    CDATA #REQUIRED
    url     CDATA #REQUIRED
    user    CDATA #REQUIRED
    password CDATA #REQUIRED
>

<!-- 定義 readHost 元素 -->
<!ELEMENT readHost EMPTY>
<!ATTLIST readHost
    host    CDATA #REQUIRED
    url     CDATA #REQUIRED
    user    CDATA #REQUIRED
    password CDATA #REQUIRED
>

schema.xml

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns="http://io.mycat/">
    <schema name="USERDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1"/>
    <dataNode name="dn1" dataHost="localhost1" database="student_manager"/>
    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
             dbType="mysql" dbDriver="native" writeType="0"
             switchType="1" slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <writeHost host="hostM1" url="db1:3306" user="root" password="123456">
            <readHost host="hostS1" url="db2:3306" user="root" password="123456"/>
        </writeHost>
    </dataHost>
</mycat:schema>

SDockerfile

FROM ubuntu:latest
LABEL maintainer="dong"
COPY sources.list /etc/apt
RUN apt-get update && apt-get dist-upgrade -y \
    && apt-get install mariadb-server -y \
    && sed -i 's/bind-address/#bind-address/g' /etc/mysql/mariadb.conf.d/50-server.cnf \
    && /etc/init.d/mariadb start \
    && mysql -uroot -e"change master to master_host='db1', \
       master_user='root',master_password='123456'" \
    && mysql -uroot -e"start slave"

EXPOSE 3306
CMD /usr/bin/mysqld_safe

server.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
    <property name="nonePasswordLogin">0</property>
    <property name="ignoreUnknownCommand">0</property>
    <property name="useHandshakeV10">1</property>
    <property name="removeGraveAccent">1</property>
    <property name="useSqlStat">0</property>
    <property name="useGlobalTableCheck">0</property>
    <property name="sqlExecuteTimeout">300</property>
    <property name="sequenceHandlerType">1</property>
    <property name="sequenceHandlerPattern">(?:(\s*next\s+value\s+for\s*MYCATSEQ_(\w+))(,|\)|\s)*)+</property>
    <property name="subqueryRelationshipCheck">0</property>
    <property name="sequenceHandlerClass">io.mycat.route.sequence.handler.HttpIncrSequenceHandler</property>
    <property name="processorBufferPoolType">0</property>
    <property name="handleDistributedTransactions">0</property>
    <property name="useOffHeapForMerge">0</property>
    <property name="memoryPageSize">8m</property>
    <property name="spillsFileBufferSize">1m</property>
    <property name="useStreamOutput">0</property>
    <property name="systemReserveMemorySize">384m</property>
    <property name="useZKSwitch">false</property>
    <property name="strictTxIsolation">0</property>
    <property name="parallelExecute">0</property>
</system>
<user name="root">
    <property name="password">123456</property>
    <property name="schemas">USERDB</property>
    <property name="usingDecrypt">0</property>
</user>
</mycat:server>

sources.list

# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.
deb http://mirrors.aliyun.com/ubuntu jammy main restricted
# deb-src http://mirrors.aliyun.com/ubuntu jammy main restricted

## Major bug fix updates produced after the final release of the
## distribution.
deb http://mirrors.aliyun.com/ubuntu jammy-updates main restricted
# deb-src http://mirrors.aliyun.com/ubuntu jammy-updates main restricted

## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team. Also, please note that software in universe WILL NOT receive any
## review or updates from the Ubuntu security team.
deb http://mirrors.aliyun.com/ubuntu jammy universe
# deb-src http://mirrors.aliyun.com/ubuntu jammy universe
deb http://mirrors.aliyun.com/ubuntu jammy-updates universe
# deb-src http://mirrors.aliyun.com/ubuntu jammy-updates universe

## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team, and may not be under a free licence. Please satisfy yourself as to
## your rights to use the software. Also, please note that software in
## multiverse WILL NOT receive any review or updates from the Ubuntu
## security team.
deb http://mirrors.aliyun.com/ubuntu jammy multiverse
# deb-src http://mirrors.aliyun.com/ubuntu jammy multiverse
deb http://mirrors.aliyun.com/ubuntu jammy-updates multiverse
# deb-src http://mirrors.aliyun.com/ubuntu jammy-updates multiverse

## N.B. software from this repository may not have been tested as
## extensively as that contained in the main release, although it includes
## newer versions of some applications which may provide useful features.
## Also, please note that software in backports WILL NOT receive any review
## or updates from the Ubuntu security team.
deb http://mirrors.aliyun.com/ubuntu jammy-backports main restricted universe multiverse
# deb-src http://mirrors.aliyun.com/ubuntu jammy-backports main restricted universe multiverse

deb http://security.ubuntu.com/ubuntu/ jammy-security main restricted
# deb-src http://security.ubuntu.com/ubuntu/ jammy-security main restricted
deb http://security.ubuntu.com/ubuntu/ jammy-security universe
# deb-src http://security.ubuntu.com/ubuntu/ jammy-security universe
deb http://security.ubuntu.com/ubuntu/ jammy-security multiverse
# deb-src http://security.ubuntu.com/ubuntu/ jammy-security multiverse

supervisord.conf

  • 該文件是 supervisor 服務(wù)的配置文件,其中定義了啟動 mycat 的指令。
  • supervisor 是一個進程管理程序,它可以將一個指令變?yōu)榉?wù),并監(jiān)控服務(wù)狀態(tài)。
  • 將啟動 mycat 的指令通過 supervisor 啟動后,指令不退出,可以保持容器不關(guān)閉。
[supervisord]
nodaemon=true

[program:mycat]
command=/bin/bash /root/mycat/bin/mycat start

啟動服務(wù)并運行

使用指令docker compose up -d啟動服務(wù)并在后臺運行

通過訪問主機的8066端口使用數(shù)據(jù)庫服務(wù),查詢數(shù)據(jù),并插入一條數(shù)據(jù)。由于mycat假定在生產(chǎn)環(huán)境中均處于內(nèi)網(wǎng),因此不支持mysql 8客戶端默認加密登錄方式,需要添加參數(shù)–default-auth=mysql_native_password,方可登錄。

mysql --default-auth=mysql_native_password -h 127.0.0.1 -P8066 -uroot -p123456

insert into student values(null,'lisi')

登錄數(shù)據(jù)庫后,通過show databases查看當前所有數(shù)據(jù)庫,在mycat上,可以查詢到schema.xml中所定義的邏輯庫USERDB,該邏輯庫中保存了db1的student_manager庫中的student表,操作USERDB中的student表即可操作db1的student_manager中的student表。

通過訪問主機的9066端口查看讀寫分離集群運行情況。

mysql --default-auth=mysql_native_password -h 127.0.0.1 -P9066 -uroot -p123456 \
-e"show @@datasource"

總結(jié)

Mycat 在 MySQL 讀寫分離中,通過智能路由、負載均衡、故障轉(zhuǎn)移、數(shù)據(jù)同步兼容及集中化配置,構(gòu)建了高性能、高可用的數(shù)據(jù)庫中間層。其價值體現(xiàn)在:

  • 性能提升:分攤讀寫壓力,提升系統(tǒng)吞吐量。
  • 成本優(yōu)化:通過從庫橫向擴展,避免垂直升級主庫的高昂成本。
  • 運維簡化:統(tǒng)一管理數(shù)據(jù)庫集群,降低主從切換、分片擴容等操作的復(fù)雜度。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Docker搭建Skywalking的實現(xiàn)示例

    Docker搭建Skywalking的實現(xiàn)示例

    本文主要介紹了Docker搭建Skywalking的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-02-02
  • win10家庭版安裝docker遇到的問題小結(jié)

    win10家庭版安裝docker遇到的問題小結(jié)

    這篇文章主要介紹了win10家庭版安裝docker遇到的問題小結(jié),本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-10-10
  • Docker容器實現(xiàn)按順序啟動的完整指南

    Docker容器實現(xiàn)按順序啟動的完整指南

    在日常開發(fā)和運維中,我們會遇到這樣的需求,即多個 Docker 容器需要按特定順序啟動,下面小編就和大家詳細介紹一下具體的實現(xiàn)方法吧
    2025-12-12
  • 詳解Docker 配置國內(nèi)免費registry mirror

    詳解Docker 配置國內(nèi)免費registry mirror

    本篇文章主要介紹了 Docker 配置國內(nèi)免費registry mirror,具有一定的參考價值,有興趣的小伙伴們可以參考一下
    2017-07-07
  • 使用Jenkins+docker打包部署后端服務(wù)的實現(xiàn)

    使用Jenkins+docker打包部署后端服務(wù)的實現(xiàn)

    本文主要介紹了使用Jenkins+docker打包部署后端服務(wù)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • 深入解析docker三種網(wǎng)絡(luò)模式

    深入解析docker三種網(wǎng)絡(luò)模式

    這篇文章主要介紹了docker三種網(wǎng)絡(luò)模式,分別是bridge橋接模式,host主機模式,none無網(wǎng)絡(luò)模式,每種模式給大家介紹的非常詳細,需要的朋友可以參考下
    2022-04-04
  • docker創(chuàng)建私有鏡像倉庫搭建教程

    docker創(chuàng)建私有鏡像倉庫搭建教程

    本篇文章主要介紹了docker創(chuàng)建私有鏡像倉庫搭建教程,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • Docker實現(xiàn)自定義jkd鏡像上傳阿里云

    Docker實現(xiàn)自定義jkd鏡像上傳阿里云

    本文詳解基于Ubuntu構(gòu)建JDK8自定義Docker鏡像及上傳至阿里云倉庫的流程,涵蓋Dockerfile編寫、鏡像構(gòu)建、容器運行、環(huán)境變量配置,以及阿里云賬戶準備、鏡像推送與測試等關(guān)鍵步驟
    2025-08-08
  • Docker教程之使用dockerfile生成鏡像

    Docker教程之使用dockerfile生成鏡像

    這篇文章主要介紹了Docker教程之使用dockerfile生成鏡像的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • Docker安裝Flink教程

    Docker安裝Flink教程

    文章描述了如何在Docker中安裝Flink的詳細步驟,包括拉取鏡像、創(chuàng)建文件夾、編輯yml文件、執(zhí)行命令、檢查Docker-compose版本、賦予操作權(quán)限以及通過Web端訪問Flink
    2024-11-11

最新評論

开封市| 伊宁市| 富锦市| 巢湖市| 宣威市| 辉南县| 和静县| 囊谦县| 福海县| 桃园市| 桂东县| 江阴市| 咸阳市| 巫山县| 许昌县| 隆化县| 长垣县| 乐东| 沙坪坝区| 青龙| 桐城市| 景宁| 和林格尔县| 瑞丽市| 新干县| 盈江县| 涿鹿县| 遂川县| 虎林市| 宁德市| 磐安县| 武胜县| 乐昌市| 宜宾县| 绿春县| 新晃| 洛隆县| 阳江市| 宁明县| 昭平县| 贵溪市|