《Mycat核心技術》第19章:基于MySQL實現讀寫分離

作者:冰河
星球:http://m6z.cn/6aeFbs
博客:https://binghe.gitcode.host
文章匯總:https://binghe.gitcode.host/md/all/all.html
星球項目地址:https://binghe.gitcode.host/md/zsxq/introduce.html

沉淀,成長,突破,幫助他人,成就自我。

  • 本章難度:★★☆☆☆
  • 本章重點:以圖文的形式介紹Myca基于MySQL實現讀寫分離的案例,掌握Mycat在實際案例場景中的應用,能夠結合自身實際項目將Mycat靈活應用到自身實際項目中。

大家好,我是冰河~~

今天給大家介紹《Mycat核心技術》的第19章:以圖文的形式給大家介紹下Myca基于MySQL實現讀寫分離的案例,好了,開始今天的內容。

一、環境

  • 操作系統:CentOS-6.5-x86_64-bin-DVD1.iso
  • JDK版本:jdk1.7.0_80
  • MyCat版本:Mycat-server-1.5.1-RELEASE-20170717215510-linux.tar.gz (下載源碼自行編譯的)
  • MyCat節點IP:192.168.209.133 主機名:liuyazhuang133 主機配置:4核CPU、4G內存
  • MySQL版本:mysql-5.6.32.tar.gz
  • 主節點IP:192.168.209.131 主機名:liuyazhuang131 主機配置:4核CPU、4G內存
  • 從節點IP:192.168.209.132 主機名:liuyazhuang132 主機配置:4核CPU、4G內存

二、MyCat介紹 ( MyCat官網:http://mycat.io/ )

MyCat的讀寫分離是基于后端MySQL集群的主從同步來實現的,而MyCat提供語句的分發功能。MyCat1.4開始支持MySQL主從復制狀態綁定的讀寫分離機制,讓讀更加安全可靠。

編輯

三、MyCat的安裝

1、設置MyCat的主機名和IP與主機名的映射
# vi /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=liuyazhuang133
# vi /etc/hosts
127.0.0.1 liuyazhuang133
192.168.209.131 liuyazhuang131
192.168.209.132 liuyazhuang132
192.168.209.133 liuyazhuang133
2、配置Java環境變量

因為MyCat是用Java開發的,因此MyCat運行需要安裝JDK(準確來說是JRE就夠了),并且需要JDK1.7或以上版本

# vi /etc/profile
## java env
export JAVA_HOME=/usr/local/java/jdk1.7.0_80
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib/rt.jar
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
# source /etc/profile
# java -version
3、上傳安裝包

上傳Mycat-server-1.5.1-RELEASE-20170717215510-linux.tar.gz 到 MyCat服務器中的/home/mycat目錄,并解壓并移動到 /usr/local/mycat目錄

$ tar -zxvf Mycat-server-1.5.1-RELEASE-20170717215510-linux.tar.gz
# mv /home/mycat/mycat  /usr/local/
# cd /usr/local/mycat/
# ll

編輯

4、設置Mycat的環境變量
# vi /etc/profile
## mycat env
export MYCAT_HOME=/usr/local/mycat
export PATH=$PATH:$MYCAT_HOME/bin
# source /etc/profile

四、配置MyCat

1、確認MySQL主從復制正常

在配置MyCat前,請確認MySQL的主從復制安裝配置已完成并正常運行。MySQL主從數據的同步在MySQL中配置,MyCat不負責數據同步的問題。

補充:
(1) MySQL主從復制配置中,如果涉及到函數或存儲過程的同步復制,需要在/etc/my.cnf中的[mysqld]段中增加配置log_bin_trust_function_creators=true 或在客戶端中設置 set global log_bin_trust_function_creators = 1;
(2) 如果要做讀寫分離下的主從切換,那么從節點也有可能會變為寫節點,因此從節點就不能設置為只讀 read_only=1 。
(3) Linux版本的MySQL,需要設置為MySQL大小寫不敏感,否則可能會發生找不到表的問題。可在/etc/my.cnf的[mysqld]段中增加lower_case_table_names=1 。

2、配置MyCat的schema.xml

schema.xml是MyCat最重要的配置文件之一,用于設置MyCat的邏輯庫、表、數據節點、dataHost等內容,

[root@liuyazhuang133 conf]$ cd /usr/local/root/conf/
[root@liuyazhuang133 conf]$ vi schema.xml
<?xml version="1.0"?><!DOCTYPE mycat:schema SYSTEM "schema.dtd"><mycat:schema xmlns:mycat="http://org.opencloudb/"><!-- 定義MyCat的邏輯庫,邏輯庫的概念與MySQL中的 database 概念相同 --><!-- schema name="rc_schema1" checkSQLschema="false" sqlMaxLimit="100" dataNode="rc_dn1"></schema --><!--schema name="pay_schema1" checkSQLschema="false" sqlMaxLimit="100" dataNode="pay_dn1"></schema--><schema name="lyz_schema1" checkSQLschema="false" sqlMaxLimit="100" dataNode="lyz_dn1"></schema><schema name="lyz_schema2" checkSQLschema="false" sqlMaxLimit="100" dataNode="lyz_dn2"></schema><!-- 其中checkSQLschema表明是否檢查并過濾SQL中包含schema的情況,如邏輯庫為 TESTDB,則可能寫為select * from TESTDB.edu_user,此時會自動過濾TESTDB,SQL變為select * from edu_user,若不會出現上述寫法,則可以關閉屬性為false --><!--sqlMaxLimit默認返回的最大記錄數限制,MyCat1.4版本里面,用戶的Limit參數會覆蓋掉MyCat的sqlMaxLimit默認設置--><!-- 定義MyCat的數據節點 --><dataNode name="lyz_dn1" dataHost="dtHost2" database="lyzdb1" /><dataNode name="lyz_dn2" dataHost="dtHost2" database="lyzdb2" /><!-- dataNode 中的 name 數據表示節點名稱, dataHost表示數據主機名稱, database表示該節點要路由的數據庫的名稱 --><!-- dataHost配置的是實際的后端數據庫集群(當然,也可以是非集群) --><!-- 注意:schema中的每一個dataHost中的host屬性值必須唯一,否則會出現主從在所有dataHost中全部切換的現象 --><!-- 定義數據主機dtHost1,只連接到MySQL讀寫分離集群中的Master節點,不使用MyCat托管MySQL主從切換 --><!--<dataHost name="dtHost1" maxCon="500" minCon="20" balance="0"writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"><heartbeat>select user()</heartbeat><writeHost host="hostM1" url="192.168.1.205:3306" user="root" password="lyz" /></dataHost>--><!-- 使用MyCat托管MySQL主從切換 --><!-- 定義數據主機dtHost2,連接到MySQL讀寫分離集群,并配置了讀寫分離和主從切換 --><dataHost name="dtHost2" maxCon="500" minCon="20" balance="1"writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100"><!-- 通過show slave status檢測主從狀態,當主宕機以后,發生切換,從變為主,原來的主變為從,這時候show slave status就會發生錯誤,因為原來的主沒有開啟slave,不建議直接使用switch操作,而是在DB中做主從對調。 --><heartbeat>show slave status</heartbeat><!-- can have multi write hosts --><writeHost host="hostM2" url="192.168.209.131:3306" user="root" password="root" /><writeHost host="hostS2" url="192.168.209.132:3306" user="root" password="root" /></dataHost><!-- 參數balance決定了哪些MySQL服務器參與到讀SQL的負載均衡中 --><!-- balance="0",為不開啟讀寫分離,所有讀操作都發送到當前可用的writeHost上--><!-- balance="1",全部的readHost與stand by writeHost參與select語句的負載均衡--><!-- balance="2",所有讀操作都隨機的在writeHost、readHost上分發--><!-- MyCat1.4版本中,若想支持MySQL一主一從的標準配置,并且在主節點宕機的情況下,從節點還能讀取數據,則需要在MyCat里配置為兩個writeHost并設置balance="1" --><!-- writeType="0",所有寫操作都發送到可用的writeHost上 --><!-- writeType="1",僅僅對于galera for mysql集群這種多主多節點都能寫入的集群起效,此時Mycat會隨機選擇一個writeHost并寫入數據,對于非galera for mysql集群,請不要配置writeType=1,會導致數據庫不一致的嚴重問題 --></mycat:schema>

MyCat1.4開始支持MySQL主從復制狀態綁定的讀寫分離機制,讓讀更加安全可靠,配置如下:
MyCat心跳檢查語句配置為 show slave status ,dataHost 上定義兩個新屬性:switchType=“2” 與 slaveThreshold=“100”,此時意味著開啟MySQL主從復制狀態綁定的讀寫分離與切換機制,MyCat心跳機制通過檢測 show slave status 中的
“Seconds_Behind_Master”, “Slave_IO_Running”, “Slave_SQL_Running” 三個字段來確定當前主從同步的狀態以及Seconds_Behind_Master主從復制時延,當Seconds_Behind_Master 大于slaveThreshold時,讀寫分離篩選器會過濾掉此Slave機器,防止讀到很久之前的舊數據,而當主節點宕機后,切換邏輯會檢查Slave上的Seconds_Behind_Master是否為0,為0時則表示主從同步,可以安全切換,否則不會切換。

3、配置 server.xml

server.xml 主要用于設置系統變量、管理用戶、設置用戶權限等。

[root@liuyazhuang133 conf]$ vi server.xml
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mycat:server SYSTEM "server.dtd"><mycat:server xmlns:mycat="http://org.opencloudb/"><system><property name="defaultSqlParser">druidparser</property><property name="charset">utf8mb4</property><!-- <property name="useCompression">1</property>--><!--1為開啟mysql壓縮協議--><!-- <property name="processorBufferChunk">40960</property> --><!--<property name="processors">1</property><property name="processorExecutor">32</property>--><!--默認是65535 64K 用于sql解析時最大文本長度 --><!--<property name="maxStringLiteralLength">65535</property>--><!--<property name="sequnceHandlerType">0</property>--><!--<property name="backSocketNoDelay">1</property>--><!--<property name="frontSocketNoDelay">1</property>--><!--<property name="processorExecutor">16</property>--><!-- <property name="mutiNodeLimitType">1</property> 0:開啟小數量級(默認) ;1:開啟億級數據排序<property name="mutiNodePatchSize">100</property> 億級數量排序批量<property name="processors">32</property> <property name="processorExecutor">32</property><property name="serverPort">8066</property> <property name="managerPort">9066</property><property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property><property name="frontWriteQueueSize">4096</property><property name="processors">32</property>--></system><!-- 用戶1,對應的MyCat邏輯庫連接到的數據節點對應的主機為MySQL主從復制配置中的Master節點,沒實現讀寫分離,讀寫都在該Master節點中進行  --><!--<user name="user1"><property name="password">roncoo.1</property><property name="schemas">rc_schema1,pay_schema1</property></user>--><!-- 用戶2,對應的MyCat邏輯庫連接到的數據節點對應的主機為主從復制集群,并通過MyCat實現了讀寫分離 --><user name="lyz"><property name="password">lyz.123</property><property name="schemas">lyz_schema1,lyz_schema2</property></user><!-- 用戶3,只讀權限--><user name="userlyz"><property name="password">lyz.123</property><property name="schemas">lyz_schema1,lyz_schema2</property><property name="readOnly">true</property></user></mycat:server>
4、防火墻中打開8066和9066端口

MyCat的默認數據端口為8066,mycat通過這個端口接收數據庫客戶端的訪問請求。
管理端口為9066,用來接收mycat監控命令、查詢mycat運行狀況、重新加載配置文件等。

[root@liuyazhuang133 mycat]# vi /etc/sysconfig/iptables

增加:

## MyCat
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8066 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 9066 -j ACCEPT

重啟防火墻:

[root@liuyazhuang133 mycat]# service iptables restart
5、修改log日志級別為debug

修改log日志級別為debug,以便通過日志確認基于MyCat的MySQL數據庫集群讀寫分離的數據操作狀態(可以在正式上生產前改成info級別)

[root@liuyazhuang133 conf]$ vi /usr/local/mycat/conf/log4j.xml

6、啟動root
[root@liuyazhuang133 bin]$ cd /usr/local/root/bin/

(1) 控制臺啟動,這種啟動方式在控制臺關閉后,root服務也將關閉,適合調試使用:

[root@liuyazhuang133 bin]$ ./root console

(2) 可以采用以下后臺啟動的方式:

[root@liuyazhuang133 bin]$ ./root start
Starting root-server...
(對應的,重啟: root restart , 關閉: root stop )
7、MyCat連接測試

(1) 如果本地Windows安裝有MySQL,可以使用已有的mysql客戶端遠程操作Mycat
?

?

(2) Nativecat連接Mycat

編輯

編輯

編輯

8、讀寫分離測試

(1) 監聽MyCat日志

[root@liuyazhuang133 ~]$ cd /usr/local/mycat/logs/
[root@liuyazhuang133 logs]$ tail -f mycat.log

(2) 讀測試

$ mysql -uuserlyz -plyz.123 -h192.168.209.233 -P8066
mysql> show databases;

mysql> use lyz_schema2;

mysql> show tables;

mysql> select * from lyz_user_02;

執行上面的查詢語句,此時對應的MyCat日志信息如下:

多次執行 select * from lyz_user_02 語句,Mycat打印出來的日志信息顯示讀操作請求都是路由到Slave節點(192.168.209.132)

(2) 寫測試

mysql> insert into lyz_user_02 (userName, pwd) values('liuyazhuang', 'lyz。123');

執行上面的新增插入語句后,此時對應的Mycat日志信息如下:

多次執行以上插入語句,發現新增數據都是從 Master節點(192.168.209.131)插進入的,并且Slave節點通過Binlog同步了Master節點中的數據。

綜上,基于MyCat的讀寫分離集群配置成功。

好了,今天就到這兒吧,我是冰河,我們下期見~~

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

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

相關文章

【安卓逆向】安卓病毒介紹及其簡單案例分析

目錄 引言 一、Android 病毒介紹及分析方法 1.1 Android 病毒預覽 1.2 Android 病毒分析必備知識 1.3 Android 病毒的常見類型及惡意行為 1.3.1 常見病毒類型 1.3.2 常見病毒行為 1.4 病毒激活條件 1.5 Android 病毒的傳播方式 1.6 Android 病毒分析的一般方法 二…

基于LabVIEW的腳本化子VI動態生成

該示例展示了一種利用LabVIEW VI腳本&#xff08;VI Scripting&#xff09;技術&#xff0c;通過程序化方式動態生成并替換子VI的解決方案。核心邏輯為&#xff1a;基于預定義的模板VI&#xff0c;根據用戶選擇的數學操作&#xff08;加法或乘法&#xff09;&#xff0c;自動生…

機器學習之超參數優化(Hyperparameter Optimization)

超參數優化(Hyperparameter Optimization) 1. 簡介 在機器學習和深度學習中,超參數(Hyperparameters) 是在訓練之前需要設定的參數,例如學習率(learning rate)、批量大小(batch size)、神經網絡的層數等。與訓練過程中自動學習的模型參數(如權重和偏置)不同,超參…

Manus 演示案例:谷歌公司運營模擬器游戲體驗

一、項目背景與愿景 在科技行業蓬勃發展的當下&#xff0c;谷歌作為行業巨頭&#xff0c;其成長歷程充滿了無數值得深入探究的決策智慧。這些決策不僅塑造了谷歌的輝煌&#xff0c;也為全球企業的發展提供了寶貴的借鑒。本項目旨在打造一款以谷歌公司發展為藍本的運營模擬器游戲…

es-索引詳解

在 Elasticsearch 中&#xff0c;**索引&#xff08;Index&#xff09;**是核心概念之一&#xff0c;類似于關系型數據庫中的“表”。索引用于存儲、組織和檢索文檔&#xff08;Document&#xff09;。以下是關于 Elasticsearch 索引的詳細解析&#xff1a; 1. 索引的基本概念 …

基于策略模式的智能提示語生成器設計與實現——以Tkinter GUI開發為例

基于策略模式的智能提示語生成器設計與實現——以Tkinter GUI開發為例 一、引言&#xff1a;智能化時代的提示工程工具 在人工智能技術廣泛應用的時代背景下&#xff0c;如何與AI模型進行有效交互已成為關鍵技能。本文介紹的"AI任務需求與提示語策略生成器"正是基于…

01 | Go 項目開發極速入門課介紹

提示&#xff1a; 所有體系課見專欄&#xff1a;Go 項目開發極速入門實戰課。 你好&#xff0c;歡迎學習本課程。本課程是一個 Go 項目開發極速入門課程。旨在幫助剛學習完 Go 基礎語法的 Go 開發者&#xff0c;快速掌握如何開發一個功能相對全面的 Go 項目。 根據課程設計目標…

密閉空間可燃氣體監測終端:守護城市命脈,智馭燃氣安全!

近年來&#xff0c;陜西省高度重視燃氣安全&#xff0c;出臺了一系列政策文件&#xff0c;旨在全面加強城鎮燃氣安全監管&#xff0c;防范化解重大安全風險。2023年&#xff0c;陜西省安委會印發《全省城鎮燃氣安全專項整治工作方案》&#xff0c;明確要求聚焦燃氣經營、輸送配…

大白話react第十八章React 與 WebGL 項目的高級拓展與優化

大白話react第十八章React 與 WebGL 項目的高級拓展與優化 1. 實現 3D 模型的導入與動畫 在之前的基礎上&#xff0c;我們可以導入更復雜的 3D 模型&#xff0c;并且讓這些模型動起來&#xff0c;就像在游戲里看到的角色和場景一樣。這里我們使用 GLTF 格式的模型&#xff0c…

有關Java中的多線程

學習目標 ● 掌握線程相關概念 ● 掌握線程的基本使用 ● 掌握線程池的使用 ● 了解解決線程安全方式 1.為什么要學習線程? ● 從1946年2月14日世界上第一臺計算機在美國賓夕法尼亞大學誕生到今天&#xff0c;計算和處理的模式早已從單用戶單任務的串行模式發展到了多用戶多…

Spring Boot集成EasyExcel

1. 初始化Spring Boot項目 首先&#xff0c;使用Spring Initializr&#xff08;https://start.spring.io/&#xff09;生成一個基本的Spring Boot項目。選擇以下依賴項&#xff1a; Spring WebLombok (用于減少樣板代碼)SLF4J (用于日志記錄) 2. 添加依賴 在你的pom.xml文件…

(2025|ICLR|廈大華為,LoSA,基于表示互信息的動態層級稀疏率,基于重構誤差的秩分配)LLM 的動態低秩稀疏自適應

Dynamic Low-Rank Sparse Adaptation for Large Language Models 目錄 1. 引言 1.1 關鍵詞 2. 方法 2.1 預備知識 2.2 層級稀疏率確定 2.3 稀疏感知的秩分配 2.4 動態稀疏與適配 3. 實驗 3.1 實驗設置 3.2 語言建模 3.3 零樣本任務 3.4 N:M 稀疏性 3.5 消融實驗 …

p5.js:sound(音樂)可視化,動畫顯示音頻高低變化

本文通過4個案例介紹了使用 p5.js 進行音樂可視化的實踐&#xff0c;包括將音頻振幅轉化為圖形、生成波形圖。 承上一篇&#xff1a;vite&#xff1a;初學 p5.js demo 畫圓圈 cd p5-demo copy .\node_modules\p5\lib\p5.min.js . copy .\node_modules\p5\lib\addons\p5.soun…

linux 進程和計劃管理

查看進程 在Linux系統中&#xff0c;有多個命令可以用來查看進程 以下是一些常用的命令&#xff1a; ps命令&#xff1a;用于查看當前系統中的進程狀態。 基本用法&#xff1a;ps -ef&#xff0c;該命令會以完整格式顯示所有進程的詳細信息&#xff0c;包括用戶ID、進程ID、父…

DeepSeek 多模態大模型 Janus-Pro 本地部署教程

下載模型倉庫 git clone https://github.com/deepseek-ai/Janus.git 國內下載倉庫失敗時&#xff0c;可以使用以下代理&#xff1a; git clone https://github.moeyy.xyz/https://github.com/deepseek-ai/Janus.git 準備 Conda 3.12 虛擬環境 conda create --name deepseek7B p…

Qt開源控件庫(qt-material-widgets)的編譯及使用

項目簡介 qt-material-widgets是一個基于 Qt 小部件的 Material Design 規范實現。 項目地址 項目地址&#xff1a;qt-material-widgets 本地構建環境 Win11 家庭中文版 VS2019 Qt5.15.2 (MSVC2019) 本地構建流程 克隆后的目錄結構如圖&#xff1a; 直接使用Qt Crea…

ARM 嵌入式處理器內核與架構深度剖析(2): ARM 處理器架構剖析

目錄 一、ARM處理器架構剖析 1.1. 指令集架構&#xff08;ISA&#xff09; 1.2. 寄存器集 1.3. 存儲模型 1.4. 異常模型 二、架構設計精要 2.1 處理器模式與特權分級 2.2 寄存器銀行化技術 2.3 指令集演化 三、微架構核心技術 3.1 流水線創新 3.2 內存子系統 3.3 …

Flutter 按鈕組件 TextButton 詳解

目錄 1. 引言 2. TextButton 的基本用法 3. 主要屬性 4. 自定義按鈕樣式 4.1 修改文本顏色 4.2 添加背景色 4.3 修改按鈕形狀和邊距 4.4 樣式定制 5. 高級應用技巧 5.1 圖標文本組合 5.2 主題統一配置 5.3 動態交互 6. 性能優化與注意事項 6.1 點擊區域優化 6.…

std::ranges::views::split, lazy_split, std::ranges::split_view, lazy_split_view

std::ranges::views::split, std::ranges::split_view C20 中引入的用于分割范圍&#xff08;range&#xff09;的組件&#xff0c;允許將輸入范圍按特定分隔符或條件分割成多個子范圍。以下是詳細說明和示例&#xff1a; 基本概念 1. 功能 分割范圍&#xff1a;將輸入范圍&…

c++ constraints與concepts使用筆記

c constraints與concepts使用筆記 1. 模板參數缺乏約束的問題2. Concepts 基本概念3. Concept 的定義與使用4. requires 表達式詳解5. requires 從句 vs requires 表達式完整示例&#xff1a;約束矩陣運算 1. 模板參數缺乏約束的問題 問題分析&#xff1a; 傳統模板參數沒有語…