MyCat

文章目錄

    • 18.1 MySQL 讀寫分離概述
      • 18.1.1 工作原理
      • 18.1.2 為什么要讀寫分離
      • 18.1.3 實現方式
    • 18.2 什么是 MyCat
    • 18.3 MyCat 安裝與配置
      • 1. 下載與解壓
      • 2. 創建用戶并修改權限
      • 3. 目錄說明
      • 4. Java 環境要求
    • 18.4 MyCat 啟動與配置
      • 1. 配置環境變量
      • 2. 配置 hosts(多節點集群)
      • 3. 配置 Mycat
        • 3.1 配置 server
        • 3.2 schema 配置
          • 3.2.1 首先 備份
          • 3.2.2 更改配置
      • 4. 啟動 MyCat
    • 在這里插入圖片描述
    • 18.5 配置 MySQL 主從
      • 1. 安裝 MySQL 5.7
      • 2. 配置主庫(master)
      • 3. 配置從庫(slave)
      • 4. 測試讀寫分離
  • 總結


18.1 MySQL 讀寫分離概述

18.1.1 工作原理

  • 主庫負責寫操作:INSERTUPDATEDELETE
  • 從庫負責讀操作:SELECT
  • 主從復制保證從庫數據與主庫同步
  • 數據內部交換過程:主庫寫入 → 二進制日志 → 從庫同步

18.1.2 為什么要讀寫分離

  1. 單臺服務器性能瓶頸,需分擔負載
  2. 主從分工,緩解鎖爭用(X鎖和S鎖)
  3. 從庫可使用 MyISAM,提高查詢性能
  4. 增加冗余,提高可用性

18.1.3 實現方式

  1. 應用程序層實現
    • 優點:易部署,對訪問壓力中等的系統性能良好
    • 缺點:代碼耦合、難以支持高級功能、大型系統不適用
  2. 中間件層實現
    • 優點:架構靈活、透明化分庫分表、可做 failover 和監控
    • 常用中間件:
      • Cobar:阿里B2B的分布式系統,已停更
      • MyCat:Cobar二次開發,社區活躍
      • OneProxy:商業收費,高并發穩定
      • Vitess:YouTube使用,架構復雜
      • KingshardAtlasMaxScaleMySQL Router

18.2 什么是 MyCat

  • 開源企業級數據庫中間件
  • 支持事務、ACID
  • 替代 MySQL 集群或 Oracle 集群
  • 融合內存緩存、NoSQL、大數據技術(HDFS)
  • 可視為企業級數據庫中間件,實現分庫分表、讀寫分離

18.3 MyCat 安裝與配置

1. 下載與解壓

#官方網站
http://www.mycat.org.cn/ 
#github
https://github.com/MyCATApache/Mycat-download下載地址
wget https://github.com/MyCATApache/Mycat-download/blob/master/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gztar -xf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/
cd /usr/local/mycat

2. 創建用戶并修改權限

useradd mycat
passwd mycat
chown -R mycat.mycat /usr/local/mycat

3. 目錄說明

  • bin/:可執行文件和 shell 腳本
  • conf/:配置文件
    • server.xml:服務器參數、用戶授權
    • schema.xml:邏輯庫和數據分片配置
    • rule.xml:分片規則
  • lib/:依賴 JAR 文件
  • logs/:日志文件(配置在 log4j.xml

4. Java 環境要求

  • JDK 1.7 及以上(可做可不做)
tar xf jdk-8u191-linux-x64.tar.gz -C /usr/java/
vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/jdk1.8.0_191
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
source /etc/profile.d/java.sh
java -version

18.4 MyCat 啟動與配置

1. 配置環境變量

vim /etc/profile.d/mycat.sh
#!/bin/bash
export MYCAT_HOME=/usr/local/mycat
export PATH=$MYCAT_HOME/bin:$PATH
source /etc/profile.d/mycat.sh

2. 配置 hosts(多節點集群)

這里使用的是上一篇博文的主從mysql

192.168.10.14 slave1
192.168.10.15 slave2
192.168.10.16 master

3. 配置 Mycat

cp /usr/local/mycat/conf/server.xml /usr/local/mycat/conf/server.xml.bakvim   /usr/local/mycat/conf/server.xml
3.1 配置 server

后邊標1的都是需要重點關注需要更改,ha為自己的邏輯庫,可以自擬

<user name="mycat"> 1<property name="password">123456</property> 1<property name="schemas">ha</property> 1<!-- 表級 DML 權限設置 --><!--            <privileges check="false"><schema name="TESTDB" dml="0110" ><table name="tb01" dml="0000"></table><table name="tb02" dml="1111"></table></schema></privileges>           --></user><user name="user"><property name="password">user</property><property name="schemas">ha</property>      1<property name="readOnly">true</property></user>
3.2 schema 配置
3.2.1 首先 備份
cp /usr/local/mycat/conf/schema.xml  /usr/local/mycat/conf/schema.xml.bak
3.2.2 更改配置
#直接復制
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema    xmlns:mycat="http://org.opencloudb/">
<schema name="ha" checkSQLschema="false" sqlMaxLimit="100" dataNode='dn1'>
</schema>
<dataNode name="dn1" dataHost="dthost" database="ha"/>
<dataHost name="dthost" maxCon="500" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType=" -1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="master" url="192.168.10.16:3306" user="mycat" password="123456">
</writeHost>
<writeHost host="slave1" url="192.168.10.14:3306" user="mycat" password="123456" />
</dataHost>
</mycat:schema>==============================================================================
使用這個即可,直接刪除復制粘貼<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/"><!-- 定義邏輯庫 schema --><schema name="ha" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema><!-- 數據節點 --><dataNode name="dn1" dataHost="dthost" database="ha"/><!-- 數據主機組 --><dataHost name="dthost" maxCon="500" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100"><!-- 心跳語句 --><heartbeat>select 1</heartbeat><!-- 主庫 (寫) --><writeHost host="master" url="192.168.10.16:3306" user="mycat" password="123456"><!-- 從庫 (讀) --><readHost host="slave1" url="192.168.10.14:3306" user="mycat" password="123456"/><readHost host="slave2" url="192.168.10.15:3306" user="mycat" password="123456"/></writeHost></dataHost>
</mycat:schema>

① 重要參數說明
上文中的兩個ha不是一個東西,第一個ha是自己擬定的邏輯庫名,后面那個才是mysql數據庫集群中的真實數據庫名。

  • balance:讀負載均衡方式(0-3)

    負載均衡類型,目前的取值有 4 種:
    1.balance="0",    不開啟讀寫分離機制,所有讀操作都發送到當前可用的 writeHost 上;2.balance="1",全部的 readHost 與stand by writeHost 參與 select 語句的負載均衡,簡單的說,當
    雙主雙從模式(M1->S1,M2->S2,并且 M1 與    M2 互為主備),正常情況下,M2、S1、S2 都參與 select 語句的負載均衡;3.balance="2",所有讀操作都隨機的在   writeHost、readhost   上分發;4.balance="3",所有讀請求隨機的分發到 wiriterHost 對應的readhost 執行,writerHost 不負擔讀壓力。注意:writerHost 不負擔讀壓writeType
    
  • switchType:寫節點切換策略(-1表示不自動切換)

    switchType 指的是切換的模式,目前的取值也有 4 種:1.switchType='-1' 表示不自動切換;2.switchType='1' 默認值,表示自動切換;3.switchType='2' 基于MySQL 主從同步的狀態決定是否切換,心跳語句為 show slave status;4.switchType='3'基于 MySQL galary cluster 的切換機制(適合集群)(1.4.1),心跳語句為  show status like 'wsrep%'。
    
  • writeType:寫節點策略(0表示主寫,掛了切換到備)

    1、writeType=”0”, 所有寫操作發送到配置的第一個 writeHost,第一個掛了切到還生存的第二個 writeHost,重新啟動后已切換后的為準,切換記錄在配置文件中:dnindex.properties . 2、writeType=”1”,所有寫操作都隨機的發送到配置的 writeHost,1.5 以后廢棄不推薦。默認 0 就好了!
    

② 參數說明

  • Mycat schema 配置的 XML 根節點

    <mycat:schema xmlns:mycat="http://org.opencloudb/">
    
  • schema 節點

    <schema name="ha" checkSQLschema="false" sqlMaxLimit="100" dataNode='dn1'>
    </schema># name="ha":定義 schema 名稱為 ha,客戶端通過 use ha 來訪問。
    ## checkSQLschema="false":關閉 SQL schema 檢查,加快解析。
    ### sqlMaxLimit="100":單條 SQL 返回最大 100 行。
    #### dataNode='dn1':指定使用的數據節點為 dn1。
    
  • dataNode 節點

    <dataNode name="dn1" dataHost="dthost" database="ha"/>#name="dn1":定義數據節點的名字,這個名字需要是唯一的。##dataHost="dthost":綁定到名為 dthost 的 dataHost。 (該屬性用于定義該分片屬于哪個數據庫實例)###database="ha":訪問的物理數據庫名為 ha。 (該屬性用于定義該分片屬性哪個具體數據庫實例上的具體庫)
    
  • dataHost 節點

    <dataHost name="dthost" maxCon="500" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100">maxCon / minCon:連接池最大/最小連接數。balance="1":負載均衡策略,1 表示輪詢。writeType="0":寫策略,只寫到第一個可用節點。dbType="mysql":數據庫類型 MySQL。dbDriver="native":使用原生驅動。switchType="-1":切換策略,-1 表示自動。slaveThreshold="100":從庫延遲閾值(行數或毫秒,取決于版本)
    
  • 心跳檢測

    <heartbeat>select user()</heartbeat>   #用來檢測數據庫連接是否活躍
    
  • writeHost 節點

    <writeHost host="slave1" url="192.168.10.14:3306" user="mycat" password="123456"/>
    <writeHost host="slave2" url="192.168.10.15:3306" user="mycat" password="123456"/>配置兩個寫節點(主庫)。writeType="0" 表示只寫第一個 writeHost(slave1)。第二個 writeHost 在此配置下不會被寫入使用。
    

數據流向 schema → dataNode → dataHost → writeHost 的結構

4. 啟動 MyCat

cd /usr/local/mycat/bin
./mycat start
cat /usr/local/mycat/logs/wrapper.log

在這里插入圖片描述

18.5 配置 MySQL 主從

1. 安裝 MySQL 5.7

mysql -umycat -p123456 -h127.0.0.1 -P8066

2. 配置主庫(master)

# /etc/my.cnf
validate-password=OFF
server-id=1
log-bin=mysql-bin-master
binlog-do-db=ha
binlog-ignore-db=mysql
配完要重啟數據庫,但是重啟會導致主從數據有問題
mysql> create database ha;
mysql> use ha;
mysql> create table test(id int, name varchar(20));
mysql> insert into test values(1,'man');
mysql> grant all privileges on *.* to 'mycat'@'%' identified by '123456';
mysql> flush privileges;================================================
簡易版 可直接使用這個mysql> grant all privileges on *.* to 'mycat'@'%' identified by '123456';
mysql> flush privileges;
mysql> create database ha;
mysql> use ha;
mysql> create table test(id int, name varchar(20));

3. 配置從庫(slave)

# /etc/my.cnf
server-id=2
validate-password=OFF
mysql> grant all on *.* to mycat@'%' identified by '123456';
mysql> stop slave;
mysql> change master to master_host='192.168.10.14', master_user='slave', master_password='123456';
mysql> start slave;
mysql> show slave status\G# /etc/my.cnf
server-id=3
validate-password=OFF
mysql> grant all on *.* to mycat@'%' identified by '123456';
mysql> stop slave;
mysql> change master to master_host='192.168.10.15', master_user='slave', master_password='123456';
mysql> start slave;
mysql> show slave status\G之前配了主從就不用配主從了!只需要grant加權限就行了!!!只需要
mysql> grant all privileges on *.* to 'mycat'@'%' identified by '123456';
mysql> flush privileges;

4. 測試讀寫分離

#先安裝數據庫
yum install -y mariadb-server mariadb
systemctl start mariadb.service
在客戶端服務器上測試
mysql -u mycat -p123456 -h 192.168.10.80 -P8066		
//通過mycat服務器代理訪問mysql ,在通過客戶端連接mysql后寫入的數據只有主服務會記錄,然后同步給從--從服務器在主服務器上:
create database ha;
use ha;
create table test (id int(10),name varchar(10),address varchar(20));在兩臺從服務器上:
stop slave;											#關閉同步
use ha;
//在slave1上:
insert into test values('1','zhangsan','this_is_slave1');//在slave2上:
insert into test values('2','lisi','this_is_slave2');//在主服務器上:
insert into test values('3','wangwu','this_is_master');//在客戶端服務器上:
use ha;(這里是邏輯庫,然后邏輯庫區調用的真實庫ha)
select * from test;		//客戶端會分別向slave1和slave2讀取數據,顯示的只有在兩個從服務器上添加的數據,沒有在主服務器上添加的數據
重復兩遍查詢可以看到slave1和slave2進行輪詢查詢,沒有master出現,符合讀寫分離
insert into test values('4','qianqi','this_is_client');		//只有主服務器上有此數據//在兩個從服務器上執行 start slave; 即可實現同步在主服務器上添加的數據
start slave;
select * from test;	然后再進行查詢,發現是134,234進行輪詢,實驗成功
如果只能查到134或者234,檢查四個虛擬機的防火墻和selinux

這里按理說應該使用第五臺虛擬機當客戶端進行測試,但是這里用的是mycat服務端兼客戶端,所以ip直接寫的80即本機ip,本質上就是客戶端—》mycat-----》mysql集群,mycat之所以可以使用mysql命令是因為兼容協議,可以吧自己偽裝成mysql,然后查詢進入mycat,由mycat進行調度。

總結

mycat配置的核心就是server.xml和schema.xml,server中是配置的mycat這個服務的全局配置,也就是說客戶端使用登陸的mycat用戶名和密碼(不是數據庫中的用戶名和密碼!),schema中的是對邏輯庫和物理庫的映射等配置,在那里面是真實對應的數據庫用戶和密碼。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/98147.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/98147.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/98147.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用 Spring Boot 搭建和部署 Kafka 消息隊列系統

使用 Spring Boot 搭建和部署 Kafka 消息隊列系統 摘要 本文將引導您在 Kafka 上搭建一個消息隊列系統&#xff0c;并整合到您的 Spring Boot 項目中。我們將逐步實現這一方案&#xff0c;探討其中的關鍵原理&#xff0c;避開可能遇到的坑&#xff0c;并最終將其部署到 Kuberne…

daily notes[45]

文章目錄basic knowledgereferencesbasic knowledge the variable in Rust is not changed. let x5; x6;Rust language promotes the concept that immutable variables are safer than variables in other programming language such as python and and are in favour of th…

技術奇點爆發周:2025 年 9 月科技突破全景掃描

技術奇點爆發周&#xff1a;2025 年 9 月科技突破全景掃描當中國 "祖沖之三號" 量子計算機在特定任務上超越經典超級計算機一千萬億倍的算力新聞&#xff0c;與 OpenAI 宣布 100 億美元定制芯片量產協議的消息在同一周密集爆發時&#xff0c;我們真切感受到了技術革命…

分布式專題——10.3 ShardingSphere實現原理以及內核解析

1 ShardingSphere-JDBC 內核工作原理當往 ShardingSphere 提交一個邏輯SQL后&#xff0c;ShardingSphere 到底做了哪些事情呢&#xff1f;首先要從 ShardingSphere 官方提供的這張整體架構圖說起&#xff1a;1.1 配置管控在 SQL 進入 ShardingSphere 內核處理&#xff08;如解析…

移動語義的里里外外:從 std::move 的幻象到性能的現實

我們都已經聽過這樣的建議&#xff1a;“使用 std::move 來避免昂貴的拷貝&#xff0c;提升性能。” 這沒錯&#xff0c;但如果你對它的理解僅止于此&#xff0c;那么你可能正在黑暗中揮舞著一把利劍&#xff0c;既可能披荊斬棘&#xff0c;也可能傷及自身。 移動語義是 C11 帶…

selenium完整版一覽

selenium 庫驅動瀏覽器selenium庫是一種用于Web應用程序測試的工具,它可以驅動瀏覽器執行特定操作,自動按照腳本代碼做出單擊、輸入、打開、驗證等操作,支持的瀏覽器包括IE、Firefox、Safari、Chrome、Opera等。而在辦公領域中如果經常需要使用瀏覽器操作某些內容,就可以使用se…

[Linux]學習筆記系列 -- lib/kfifo.c 內核FIFO實現(Kernel FIFO Implementation) 高效的無鎖字節流緩沖區

文章目錄lib/kfifo.c 內核FIFO實現(Kernel FIFO Implementation) 高效的無鎖字節流緩沖區歷史與背景這項技術是為了解決什么特定問題而誕生的&#xff1f;它的發展經歷了哪些重要的里程碑或版本迭代&#xff1f;目前該技術的社區活躍度和主流應用情況如何&#xff1f;核心原理與…

MFC_Install_Create

1. 安裝MFC 編寫MFC窗口應用程序需要用到Visual Studiohttps://visualstudio.microsoft.com/zh-hans/&#xff0c;然后安裝&#xff0c;要選擇使用C的桌面開發&#xff0c;再點擊右邊安裝詳細信息中的使用C的桌面開發&#xff0c;往下滑&#xff0c;有一個適用于最新的v143生成…

Langchain4j開發之AI Service

學習基于Langchain4j的大模型開發需要學習其中Ai Service的開發模式。里面對大模型做了一層封裝&#xff0c;提供一些可以方便調用的api。其中有兩種使用Ai Service的方式。一.編程式開發1.首先引入Langchain4的依賴。<dependency><groupId>dev.langchain4j</gr…

認識神經網絡和深度學習

什么是神經網絡&#xff1f;什么又是深度學習&#xff1f;二者有什么關系&#xff1f;……帶著這些疑問&#xff0c;進入本文的學習。什么是神經網絡神經網絡&#xff08;Neural Network&#xff09;是一種模仿生物神經系統&#xff08;如大腦神經元連接方式&#xff09;設計的…

醫療行業安全合規數據管理平臺:構建高效協作與集中化知識沉淀的一體化解決方案

在醫療行業中&#xff0c;數據不僅是日常運營的基礎&#xff0c;更是患者安全、服務質量和合規管理的核心載體。隨著醫療業務的復雜化和服務模式的多元化&#xff0c;各類機構——從大型醫院到科研中心——都面臨著海量文檔、報告、影像資料和政策文件的管理需求。這些資料往往…

Day25_【深度學習(3)—PyTorch使用(5)—張量形狀操作】

reshape() squeeze()unsqueeze()transpose()permute()view() reshape() contiguous() reshape() 一、reshape() 函數保證張量數據不變的前提下改變數據的維度&#xff0c;將其轉換成指定的形狀。def reshape_tensor():data torch.tensor([[1, 2, 3], [4, 5, 6]])print(data…

第十八篇 開發網頁教學:實現畫布、繪畫、簡易 PS 方案

在網頁開發領域&#xff0c;畫布功能是實現交互創作的重要基礎&#xff0c;無論是簡單的繪畫工具&#xff0c;還是具備基礎修圖能力的簡易 PS 方案&#xff0c;都能為用戶帶來豐富的視覺交互體驗。本篇教學將圍繞 “學習 - 實踐 - 實操” 的核心思路&#xff0c;從技術原理講解…

封裝形成用助焊劑:電子制造“隱形橋梁”的技術突圍與全球產業重構

在5G通信、人工智能、新能源汽車等新興技術驅動下&#xff0c;全球電子制造業正以年均6.8%的增速重構產業鏈。作為電子元件焊接的核心輔料&#xff0c;封裝形成用助焊劑&#xff08;又稱電子封裝用助焊劑&#xff09;憑借其“優化焊接質量、提升可靠性、降低制造成本”的核心價…

【完整源碼+數據集+部署教程】零件實例分割系統源碼和數據集:改進yolo11-GhostHGNetV2

背景意義 研究背景與意義 隨著工業自動化和智能制造的迅速發展&#xff0c;零件的高效識別與分割在生產線上的重要性日益凸顯。傳統的圖像處理方法在處理復雜場景時往往面臨著準確性不足和實時性差的問題&#xff0c;而深度學習技術的引入為這一領域帶來了新的機遇。特別是基于…

墨色規則與血色節點:C++紅黑樹設計與實現探秘

前言? 前幾天攻克了AVL樹&#xff0c;我們已然是平衡二叉樹的強者。但旅程還未結束&#xff0c;下一個等待我們的&#xff0c;是更強大、也更傳奇的**終極BOSS**——紅黑樹。它不僅是map和set的強大心臟&#xff0c;更是C STL皇冠上的明珠。準備好了嗎&#xff1f;讓我們一…

大數據時代時序數據庫選型指南:為何 Apache IoTDB 成優選(含實操步驟)

在數字經濟加速滲透的今天&#xff0c;工業物聯網&#xff08;IIoT&#xff09;、智慧能源、金融交易、城市運維等領域每天產生海量 “帶時間戳” 的數據 —— 從工業設備的實時溫度、電壓&#xff0c;到電網的負荷波動&#xff0c;再到金融市場的每秒行情&#xff0c;這類 “時…

MAZANOKE+cpolar讓照片存儲無上限

文章目錄前言1. 關于MAZANOKE2. Docker部署3. 簡單使用MAZANOKE4. 安裝cpolar內網穿透5. 配置公網地址6. 配置固定公網地址總結當工具開始理解用戶的需求痛點時&#xff0c;MAZANOKE與cpolar這對搭檔給出了“輕量化”的解決方案。它不追求浮夸的功能堆砌&#xff0c;卻用扎實的…

正則表達式 - 元字符

正則表達式中的元字符是具有特殊含義的字符&#xff0c;它們不表示字面意義&#xff0c;而是用于控制匹配模式。基本元字符. (點號)匹配除換行符(\n)外的任意單個字符示例&#xff1a;a.b 匹配 "aab", "a1b", "a b" 等^ (脫字符)匹配字符串的開始…

suricata源碼解讀-事務日志

注冊事務日志線程模塊 void TmModuleTxLoggerRegister (void) {tmm_modules[TMM_TXLOGGER].name "__tx_logger__";tmm_modules[TMM_TXLOGGER].ThreadInit OutputTxLogThreadInit;tmm_modules[TMM_TXLOGGER].Func OutputTxLog;tmm_modules[TMM_TXLOGGER].ThreadExi…