Mycat實現讀寫分離

来源:https://www.cnblogs.com/fantjesse/archive/2019/05/02/10802907.html
-Advertisement-
Play Games

隨著應用的訪問量併發量的增加,應用讀寫分離是很有必要的。當然應用要實現讀寫分離,首先資料庫層要先做到主從配置。 應用實現讀寫分離至少有兩種方法: 應用本身通過代碼實現,例如基於動態數據源、AOP的原理來實現寫操作時用主資料庫,讀操作時用從資料庫。 通過中間件的方式實現,例如通過Mycat,即中間件會 ...


隨著應用的訪問量併發量的增加,應用讀寫分離是很有必要的。當然應用要實現讀寫分離,首先資料庫層要先做到主從配置。

應用實現讀寫分離至少有兩種方法:

  • 應用本身通過代碼實現,例如基於動態數據源、AOP的原理來實現寫操作時用主資料庫,讀操作時用從資料庫。
  • 通過中間件的方式實現,例如通過Mycat,即中間件會分析對應的SQL,寫操作時會連接主資料庫,讀操作時連接從資料庫。

本篇文章是介紹通過Mycat中間件的方式實現讀寫分離。

1、Mycat

Mycat是一款開源的資料庫中間件,其官網為http://www.mycat.io/,其中官方對它介紹為:

Mycat 是一個強大的資料庫中間件,不僅僅可以用作讀寫分離、以及分表分庫、容災備份,而且可以用於多租戶應用開發、雲平臺基礎設施、讓你的架構具備很強的適應性和靈活性,藉助於即將發佈的Mycat 智能優化模塊,系統的數據訪問瓶頸和熱點一目瞭然,根據這些統計分析數據,你可以自動或手工調整後端存儲,將不同的表映射到不同存儲引擎上,而整個應用的代碼一行也不用改變。

Mycat的實現原理為:

Mycat 的原理中最重要的一個動詞是“攔截”,它攔截了用戶發送過來的SQL 語句,首先對SQL 語句做了一些特定的分析:如分片分析、路由分析、讀寫分離分析、緩存分析等,然後將此SQL 發往後端的真實資料庫,並將返回的結果做適當的處理,最終再返回給用戶。

關於Mycat更多的介紹大家可以查看官網。

2、部署Mycat

應用是直接連接Mycat,然後Mycat管理了1個主資料庫和1個從資料庫,架構如下:

其中每個組件對應伺服器地址為:

  • Mycat:192.168.197.131
  • 主庫:192.168.197.135
  • 從庫:192.168.197.136

部署Mycat步驟為:

(1)、安裝JDK,由於Mycat是基於Java語言來編寫的,所以需要安裝JDK,版本為1.8即可。

JDK安裝包可以到官網下載,下載後解壓,然後配置環境變數,即:

在/etc/profile文件中加入

export JAVA_HOME=/opt/jdk1.8.0_112
export PATH=$JAVA_HOME/bin:$PATH

(2)、下載Mycat安裝包,版本為1.6-RELEASE,下載地址為http://dl.mycat.io/1.6-RELEASE/,選擇linux環境的版本即可。

(3)、將Mycat安裝包上傳伺服器後解壓,即:

tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

以上3步就相當於將Mycat部署好了,現在就需要配置Mycat了。

配置Mycat步驟為:

(1)、在主庫和從庫中分別創建用於Mycat連接的賬號,即:

GRANT CREATE,DELETE,INSERT,SELECT,UPDATE ON jgyw.* TO 'jgywuser'@'192.168.197.131' IDENTIFIED BY 'jgyw@123';

以上語句的意思是創建一個jgywuser用戶,該用戶只有對jgyw模式下的表有增刪改查的許可權。

(2)、配置Mycat的schema.xml文件,該文件位於Mycat中conf文件夾下,配置如下:

<mycat:schema xmlns:mycat="http://io.mycat/">
    <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="jgywnode">
    </schema>

    <dataNode name="jgywnode" dataHost="jgywhost" database="jgyw" />

    <dataHost name="jgywhost" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native">

        <heartbeat>select user()</heartbeat>
        
        <writeHost host="master" url="192.168.197.135:3306" user="jgywuser" password="jgyw@123">
            <readHost host="slave" url="192.168.197.136:3306" user="jgywuser" password="jgyw@123"/>
        </writeHost>
   </dataHost>
</mycat:schema>

其中:

  • schema 標簽用於定義MyCat 實例中的邏輯庫,MyCat 可以有多個邏輯庫,每個邏輯庫都有自己的相關配置。可以使用schema 標簽來劃分這些不同的邏輯庫。

  • dataNode 標簽定義了MyCat 中的數據節點,也就是我們通常說所的數據分片。一個dataNode 標簽就是一個獨立的數據分片。

  • dataHost標簽直接定義了具體的資料庫實例、讀寫分離配置和心跳語句。其中有幾個重要的屬性:

    balance屬性
    負載均衡類型,目前的取值有3 種:
    balance="0", 不開啟讀寫分離機制,所有讀操作都發送到當前可用的writeHost 上。
    balance="1",全部的readHost 與stand by writeHost 參與select 語句的負載均衡,簡單的說,當雙主雙從模式(M1->S1,M2->S2,並且M1 與M2 互為主備),正常情況下,M2,S1,S2 都參與select 語句的負載均衡。
    balance="2",所有讀操作都隨機的在writeHost、readhost 上分發。
    balance="3",所有讀請求隨機的分發到wiriterHost 對應的readhost 執行,writerHost 不負擔讀壓
    力,註意balance=3 只在1.4 及其以後版本有,1.3 沒有。
    
    writeType 屬性
    負載均衡類型,目前的取值有3 種:
    writeType="0", 所有寫操作發送到配置的第一個writeHost,第一個掛了切到還生存的第二個
    writeHost,重新啟動後已切換後的為準,切換記錄在配置文件中:dnindex.properties .
    writeType="1",所有寫操作都隨機的發送到配置的writeHost,1.5 以後廢棄不推薦。

(3)、配置server.xml,即主要配置連接Mycat的用戶賬號信息,即:

<user name="jgyw">
    <property name="password">jgyw</property>
    <property name="schemas">TESTDB</property>
    <property name="readOnly">false</property>
</user>

即配置一個用戶名為jgyw,密碼為jgyw的用戶,同時具有TESTDB模式下的讀寫許可權,註意該模式即是在schema.xml配置文件定義的模式名一樣。

(4)、啟動Mycat,即:

./mycat start

Mycat啟動成功後,會開放兩個埠,即數據埠8066,管理埠9066

3、測試

首先在主庫的jgyw模式下創建一個comm_config表,即:

CREATE TABLE comm_config (configId varchar(200) NOT NULL ,configValue varchar(1024) DEFAULT NULL ,description varchar(2000) DEFAULT NULL ,PRIMARY KEY (configId)) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;

應用的資料庫連接配置信息為:

spring:
  datasource: 
    url: jdbc:mysql://192.168.197.131:8066/TESTDB
    username: jgyw
    password: jgyw
    driver-class-name: com.mysql.jdbc.Driver

用的是8066埠,同時用戶也是server.xml配置文件中配置的用戶。

測試的數據介面,即:

package com.swnote.common.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.swnote.common.domain.Config;
import com.swnote.common.service.IConfigService;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@RestController
public class ConfigController {

    @Autowired
    private IConfigService configService;

    @RequestMapping(value = "/config/save", method = RequestMethod.POST)
    public Config save(@RequestBody Config config) throws Exception {
        try {
            configService.save(config);
            return config;
        } catch (Exception e) {
            log.error("新增配置信息錯誤", e);
            throw e;
        }
    }

    @RequestMapping(value = "/config/list", method = RequestMethod.GET)
    public List<Config> list() throws Exception {
        try {
            return configService.list();
        } catch (Exception e) {
            log.error("查詢配置信息錯誤", e);
            throw e;
        }
    }
}

進入Mycat的管理端,即:

mysql -h127.0.0.1 -ujgyw -pjgyw -P9066

然後執行命令:

show @@datasource;

可以查到:

+----------+--------+-------+-----------------+------+------+--------+------+------+---------+-----------+------------+
| DATANODE | NAME   | TYPE  | HOST            | PORT | W/R  | ACTIVE | IDLE | SIZE | EXECUTE | READ_LOAD | WRITE_LOAD |
+----------+--------+-------+-----------------+------+------+--------+------+------+---------+-----------+------------+
| jgywnode | master | mysql | 192.168.197.135 | 3306 | W    |      0 |   10 | 1000 |    8959 |         0 |         42 |
| jgywnode | slave  | mysql | 192.168.197.136 | 3306 | R    |      0 |   10 | 1000 |    8937 |        22 |          0 |
+----------+--------+-------+-----------------+------+------+--------+------+------+---------+-----------+------------+
2 rows in set (0.00 sec)

當調用讀介面時READ_LOAD的值對應在slave上會加1說明是走從庫;

當調用寫介面時WRITE_LOAD的值對就在master上會加1說明是走主庫。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. 實時刷新tail -f /var/log/messages 2. 實時刷新最新500條log tail -500f /var/log/messages linux日誌文件說明 /var/log/message 系統啟動後的信息和錯誤日誌 /var/log/secure 與安全相關的日誌信息 / ...
  • GPT分區表磁碟下使用U盤安裝linux必須使用UEFI啟動方式 安裝系統前需要斷網,不勾選安裝第三方軟體(否則會預設安裝系統更新卡在安裝界面) 安裝啟動引導器設備:Windows Boot Manager(既ufi引導分區) • 設置國內源• 更新源• 安裝系統更新• 安裝Nvdia專有顯卡驅動 ...
  • 修改註冊表 方法1 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\SharedAccess\Parameters 中的: ScopeAddressScopeAddressBackup 方法2 管理員運行bat文件(我這裡改為了192.168 ...
  • cd命令是改變子目錄的命令, 下麵是cd命令的常見用法 cd/?可顯示幫助信息 cd\ 返回到當前所在的根目錄中 cd.. 返回上一層目錄 cd +目錄名,進入下一層目錄 驅動器:,進入到另一個驅動器 cd 驅動器:\目錄名,改變其他驅動器下的預設目錄 cd+驅動器:,顯示某驅動器下的預設目錄 cd ...
  • You have to work very hard to believe that you are really powerless. Mac-搭建Hadoop集群 我用到了:VMware Fusion、CentOS7、FileZilla、jdk-8u181-linux-x64.tar.gz和ha ...
  • 1.安裝資料庫:執行命令 yum -y install mysql-server 2.啟動資料庫:安裝完畢,執行命令service mysqld start 3.登錄資料庫:mysql -u root -p回車後輸入密碼(mysql的預設用戶名是root,密碼為空) 4.使用資料庫:登錄成功切換到m ...
  • 文/開源智造聯合創始人老楊 本文來自《OdooERP應用與開發案例教程》的試讀章節。書籍尚未出版,請勿轉載。歡迎您反饋閱讀意見。 PostgreSQL是Odoo支持的資料庫。PostgreSQL是起源於大學的一個歷史很長的開源資料庫系統。包括美國航天局NASA、德國證券交易中心、中國的平安、騰訊的微 ...
  • MySQL在command line Client下的一些命令 通過CMD進入到本地資料庫: mysql -h localhost -u -root -p 參數說明: -h 要連接的伺服器的主機名或IP地址,也可以是遠程的伺服器主機,-h localhos 也可以表示成 -hlocalhost 即: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...