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

MySQL讀寫分離神器:MyCat淺析

數據庫 MySQL
如果沒有數據庫中間件(eg:MyCat) ,那么應?將直接?對分?集群,數據源切換、事務處理、數據聚合都需要應?直接處理,原本該是專注于業務的應?,將會花?量的?作來處理分?后的問題。

前言:

在如今的互聯?時代,?數據已成為?業發展的?個重要?向標,?對于海量數據的處理?成為?論是技術還是業務發展中都不可回避的重要問題。數據量越來越?,對性能要求越來越?;對于?量數據的存儲的現在主要分為兩種數據庫:關系型數據庫和 NoSQL 數據庫。

傳統數據庫天然存在著單機單庫瓶頸、難于擴展;? NoSQL 產品的出現雖然彌補了傳統數據庫的性能問題 ,但是不能完全替代傳統數據庫。

隨著業務量的擴張和數據量的激增,系統負載很?的情況下,就必須對數據進?分割。數據被分到多個分?數據庫后,應?如果需要讀取數據,就要需要處理多個數據源的數據。

如果沒有數據庫中間件(eg:MyCat) ,那么應?將直接?對分?集群,數據源切換、事務處理、數據聚合都需要應?直接處理,原本該是專注于業務的應?,將會花?量的?作來處理分?后的問題。

MyCat 是什么?

對于 DBA 來說:

MyCat 就是 MySql Server 增強版的存儲引擎。

對于軟件工程師來說:

MyCat 就是數據庫服務器,可以像操作數據庫那樣操作MyCat。

對于架構師來說:

MyCat 是?個強?的數據庫中間件,不僅可以?作讀寫分離以及分庫分表,甚?可?于多租戶應?開發、云平臺基礎設施,讓架構具備很強的靈活性和適應性。

MyCat的應用場景:

1、?持讀寫分離、主從切換;

2、垂直分庫、?平分表;

3、多租戶應?,如果每個應??個庫,所有的應該只需連接 Mycat,實現多租戶;

4、報表系統,處理?規模報表的統計。數據被切分到不同的分?數據庫上,當應?需要讀取數據時,中間件 mycat 就可以幫助開發?員進?數據聚合、事務、數據源切換等處理,讓開發?員更加專注于業務開發。

MyCat 基本概念介紹:

邏輯庫(schema):

對實際應???,業務開發?員并不需要知道中間件的存在,所以 mycat 中間件?個或多個數據庫集群構成的邏輯庫。

邏輯表(table):

對應?來說,讀寫數據的表就是邏輯表。邏輯表是對應邏輯庫存在的。

分片表:

指原有很?的數據表需要切分到不同數據庫上的表。

非分片表 :

針對分?表來說,原則上是不需要切分的表。

E-R 表:

基于關系型數據庫中實體關系模型,?表和?表記錄存放在同?個分?上,通過表分組保證數據 join 不會出現跨庫操作。

全局表:

類似字典的表;變動不頻繁、數據量總體變化不是很?、規模不超過10w 的表。

分片節點(dataNode):

?個?表被分到不同的分?數據庫上?,每個表分?所在的數據庫就是分?節點

節點主機(dataHost):

?個或多個分?節點(dataNode)所在的機器就是節點主機

分片規則(rule):

?個?表被分成若?個分?表,就需要?定的規則,這樣按照某種業務規則把數據分到某個分?的規則就是分?規則。

MyCat連接池解讀:

MyCat通過共享?個MySQL上的所有物理連接,并結合連接狀態同步的特性,MyCat的連接池做到了最佳的吞吐量,也在?定程度上提升了整個系統的并發?撐能?。

其中ConMap 是存放連接池對象重要的數據結構,ConMap部分源碼如下:

private final ConcurrentHashMap<string,< span=""> ConQueue> items = new ConcurrentHashMap();

public ConQueue getSchemaConQueue(String schema)

{

// 根據schema 獲取當前切?的連接

ConQueue queue = items.get(schema);

if (queue == null) { // 如果沒有可?連接,則新建

ConQueue newQueue = new ConQueue();

queue = items.putIfAbsent(schema,newQueue);

return (queue == null) ? newQueue: queue;

}

return queue;

}

public BackendConnection tryTakeCon(final String schema,

boolean autoCommit)

{

final ConQueue queue = items.get(schema);

// 嘗試獲取?個可?連接

BackendConnection con = tryTakeCon(queue,autoCommit);

if (con != null) {

return con;

}

如果沒有可?連接或者不是?動模式,為了?效且充分利?數據庫連接,當某個?戶會話需要?個?動提交到分? dn1(對應db1)的 SQL 連接的時候,連接池?先找是否有 db1 上的可?連接。

如果有,看是否有?動提交模式的連接,找到就返回,否則返回 db1 上的?動提交模式的連接,若沒有db1 的可?連接,則隨機返回?個其他 db 對應的可?連接,若沒有可?連接,并且連接池還沒達到上限,則創建?個新連接并返回。

MyCat網絡模型NIO/AIO:

  • SocketConnector 發起連接請求類,如 MyCAT 與 MySQL 數據庫的連接,都是由 MyCAT 主動發起連接請求。
  • SocketAcceptor 接收連接請求類,如 MyCAT 啟動 9066 和 8066 分別偵聽管理員和應?程序的連接請求。
  • SocketWR 讀寫操作類,SocketConnector 和 SocketAcceptor 只負責 socket 建?,當 socket 連接建?后進?字節的讀寫操作則由SocketWR 來完成。在 MyCAT 中,NIO 采?多 Reactor 模式,內部維護?個 Selector 選擇器分別處理不同是事件。例如 NIOConnector 類- selector 事件選擇器。
connectQueue 需要建?連接的對象,臨時放在這個隊列?
reactorPool 當連接建?后,從 reactorPool 中分配?個 NIOReactor,處理 Read和 Write 事件

connect 源碼解讀:

private void connect(Selector selector) {

AbstractConnection c = null;

while ((c = connectQueue.poll()) != null) {

try {

SocketChannel channel = (SocketChannel) c.getChannel();

channel.register(selector, SelectionKey.OP_CONNECT, c);

channel.connect(new InetSocketAddress(c.host, c.port));

} catch (Exception e) {

LOGGER.error("error:",e);

c.close(e.toString());

}

}

// 處理connect事件,交給reactor處理

private void finishConnect(SelectionKey key, Object att) {

BackendAIOConnection c = (BackendAIOConnection) att;

try {

if (finishConnect(c, (SocketChannel) c.channel)) {

clearSelectionKey(key);

c.setId(ID_GENERATOR.getId());

NIOProcessor processor =

MycatServer.getInstance().nextProcessor();

c.setProcessor(processor);

NIOReactor reactor = reactorPool.getNextReactor();

reactor.postRegister(c);

c.onConnectfinish();

}

} catch (Exception e) {

clearSelectionKey(key);

LOGGER.error("error:",e);

c.close(e.toString());

c.onConnectFailed(e);

}

}
  • 判斷 connectQueue 中是否新的連接請求。
  • 建??個 SocketChannel。
  • 在 selector 中進行注冊 OP_CONNECT。
  • 發起 SocketChannel.connect()操作。

MyCat讀寫分離實戰:

在?些?型?站業務場景中,單臺數據庫提供的并發量已經?法滿?業務需求;為了提供數據庫的并發能?和負載能?,?般通過讀寫分離來實現。

當我們的數據庫實現讀寫分離的時候,在應?中需要對數據源進?切換, MyCat能夠幫我們更好的實現數據源的動態切換,也就是應?程序只需要連接MyCat中間件,?動幫我們讀取讀寫的數據庫。

未采用MyCat中間件項目架構:

采用MyCat中間件架構:

兩者對比差異:

圖?需要在應?程序中配置多個數據源,通過不同的業務需求動態切換多個數據源。?通過MyCat以后,應?程序只需要連接MyCat作為數據源,?便拓展,對現有的程序不影響。

搭建主從:

  • jdk 準備:jdk1.7 往上版本
  • mysql 準備,兩臺mysql服務,?臺作為主庫負責寫?數據,?臺是從庫負責讀數據
  • MyCat 安裝:MyCAT 有提供編譯好的安裝包,Mycat-server-xxxxx.linux.tar.gz 解壓
  • MyCat 相關?錄說明:

bin 程序目錄,進入到 bin目錄:

Linux 下運?:./mycat console,?先要 chmod +x *conf ?錄下存放配置?件,server.xml 是 Mycat 服務器參數調整和?戶授權的配置?件,schema.xml 是邏輯庫定義和表以及分?定義的配置?件,rule.xml是分?規則的配置?件,分?規則的具體?些參數信息單獨存放為?件,version.txtlib ?錄下主要存放 mycat 依賴的?些 jar ?件.?志存放在 logs/mycat.log 中,每天?個?件,?志的配置是在conf/log4j.xml 中,根據??的需要,可以調整輸出級別為 debug,debug 級別下,會輸出更多的信息,?便排查問題。

配置schemal.xml邏輯庫、邏輯表、分片:

<!-- 配置邏輯庫  -->



<schema name="TESTDB_YONG" checkSQLschema="true" sqlMaxLimit="100" randomDataNode="dn1">

</schema>

<datanode name="dn1" dataHost="localhost1" database="yong_test" />

<!-- 配置讀寫分離 -->
"localhost1" maxCon="1000" minCon="10" balance="0"

writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">

<!-- ?跳配置,檢測所屬的數據庫是否存活 -->

<heartbe< span="">at>select user()

<!-- 寫主庫 -->

<writehost host="hostM1" url="jdbc:mysql://192.168.235.136:3306?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true" user="root" password="12345678">

writeHost>

<!-- 讀從庫 -->

<readhost host="hostS1" url="jdbc:mysql://192.168.235.133:3306?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true" user="root" password="12345678">

readHost>

dataHost>

配置server.xml,主要配置連接MyCat的邏輯庫、邏輯表訪問權限的配置:

<!-- 邏輯庫、邏輯表訪問權限配置  ?戶名  name=root 密碼passwors=123456 -->
<user name="root" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">TESTDB_YONG</property>
<property name="defaultSchema">TESTDB_YONG</property>
<!-- 表級 DML 權限設置 -->
<!--
<privileges check="false">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>

讀寫分離測試:

  • 準備兩臺mysql服務器,?臺配置為主數據庫,負責數據的寫?,?臺配置為從數據庫,負責數據的讀取。
  • 數據庫中間件MyCat通過shcemal.xml和server.xml配置兩臺數據庫的讀寫。
  • 啟動MyaCat服務,連接mycat實現讀寫分離數據源的切換:
  • mysql -h127.0.0.1 -P8066 -uroot -p
  • 連接成功后,然后業務開發?員就可以像操作數據庫那樣使? mycat,mycat 會根據配置的相關路由規則對數據進?分?存儲和匯總。

通過MyCat插?數據:

insert into test(id, name) value (1,'wyw');

Query OK, 1 row affected (0.05 sec)

查看主從數據庫是否有數據,

訪問數據:

select * from test where id = 1;

±-----+

| id |

±-----+

| 1 |

±-----+

1 rows in set (0.00 sec)

根據MyCat的運??志查看讀寫分離的的實質:mycat/logs/mycat.log

查詢指令在從服務器上:

責任編輯:武曉燕 來源: 新鈦云服
相關推薦

2020-04-23 15:08:41

SpringBootMyCatJava

2019-05-13 15:00:14

MySQLMyCat數據庫

2020-12-08 06:17:11

MycatMySQL分離

2025-03-31 10:40:52

2009-05-04 09:13:52

PHPMySQL讀寫分離

2017-09-04 09:53:58

MySQLAtlasNavicat

2021-06-25 10:05:58

SpringBootMySQL數據庫

2010-05-17 11:19:44

MySQL proxy

2017-05-25 10:22:13

NoSQL數據庫主主備份

2011-08-30 09:59:47

Mysql ProxyLUA

2011-08-30 12:49:59

Mysql ProxyLua分離

2021-09-08 10:23:08

讀寫分離Java數據庫

2009-07-15 16:42:03

iBATIS讀寫CLO

2019-09-30 09:19:54

Redis分離云數據庫

2025-01-24 08:38:47

2021-03-08 08:16:42

MySQL分離架構

2020-03-24 14:16:18

ProxySQLMySQL數據庫

2018-04-08 15:20:15

數據庫MySQL主從復制

2018-10-16 16:45:05

數據庫讀寫分離

2018-01-01 05:23:13

服務化讀寫分離架構
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美国产激情二区三区 | 欧美黄视频 | 成人在线视频一区 | 一级黄色绿像片 | 欧洲免费视频 | 久久久久久影院 | 成人自拍视频网站 | 日韩综合网 | 在线中文字幕亚洲 | 亚洲第一福利网 | 第四色播日韩第一页 | 中文字幕99 | 国产亚洲一区二区三区 | 久久久激情视频 | 一级黄在线观看 | 久久久久国产精品 | 久草新在线 | 日韩在线观看视频一区 | 欧美自拍一区 | 亚洲精品乱码久久久久v最新版 | 亚洲性人人天天夜夜摸 | 五月综合激情在线 | 国产欧美日韩精品一区二区三区 | 欧美中文字幕一区二区三区亚洲 | 理论片87福利理论电影 | 久久草视频 | 在线观看国产视频 | 国产一级片91 | 国产精品96久久久久久 | 亚洲视频精品 | 亚洲成人精品 | 国产精品视频一区二区三区四区国 | 久久久精品影院 | 99久久婷婷国产精品综合 | 亚洲国产精品久久久久婷婷老年 | 亚洲视频在线播放 | 欧美久久久久久 | 成人av片在线观看 | 91免费看片 | 精品毛片 | 久久久久久久久久久蜜桃 |