mysqlproxyjava的簡單介紹

本文目錄一覽:

程序員需要用到netty嗎

作為一個學Java的,如果沒有研究過Netty,那麼你對Java語言的使用和理解僅僅停留在表面水平,會點SSH,寫幾個MVC,訪問資料庫和緩存,這些只是初等Java程序員乾的事。如果你要進階,想了解Java伺服器的深層高階知識,Netty絕對是一個必須要過的門檻。

有了Netty,你可以實現自己的HTTP伺服器,FTP伺服器,UDP伺服器,RPC伺服器,WebSocket伺服器,Redis的Proxy伺服器,MySQL的Proxy伺服器等等。

通過代理在java連接mysql問題,怎麼解決

首先,準備開發工具套件,我們並不會引入過多工具包,僅僅需要: Java8 Vert.x 3 如果你是用Maven做為項目管理工具,請將Vert.x 3引入: io.vertx vertx-core3.3.2 代碼實現: package com.maxleap.mysqlproxy; import io.vertx.core.AbstractVe…

java1.8使用mybaitis連接mysql遞歸查詢所有父節點用到:和@報錯Cause: java.util.NoSuchElementException

Java mysql mybatis批量更新資料庫,採用以下寫法即可執行,但是資料庫連接必須配置:allowMultiQueries=true

例如:jdbc:mysql://192.168.1.236:3306/test?useUnicode=trueamp;characterEncoding=UTF-8allowMultiQueries=true

update id=”batchUpdate”  parameterType=”java.util.List”

     foreach collection=”list” item=”item” index=”index” open=”” close=”” separator=”;”

update test 

set

 test=${item.test}+1

/set

where id = ${item.id}

/foreach

   /update

MyBatis是支持普通SQL查詢,存儲過程和高級映射的優秀持久層框架。MyBatis消除了幾乎所有的JDBC代碼和參數的手工設置以及結果集的檢索。MyBatis使用簡單的XML或註解用於配置和原始映射,將介面和Java的POJOs(Plan Old Java Objects,普通的Java對象)映射成資料庫中的記錄.

java 運行時異常,求大神指教,急!謝謝

sql語句錯了吧。看圈出來的地方,有個clause的資料庫欄位名報了找不到。找到對應的sql語句在資料庫管理工具里調一下吧。

MySQL的sharding的程序是不是要自己開發的

不一定需要自己開發。Shard層可以位於:

1、DAO層:一般需要自行開發,可以靈活定製

2、ORM層:比如guzz、Hibernate Shard

3、JDBC API層:比較難,有一個商業產品dbShards

4、應用伺服器與資料庫之間通過代理實現:MySQL Proxy、amoeba…..

一 背景

當資料庫中的數據量越來越大時,不論是讀還是寫,壓力都會變得越來越大。採用MySQL

Replication多master多slave方案,在上層做負載均衡,雖然能夠一定程度上緩解壓力。但是當一張表中的數據變得非常龐大時,壓力還是

非常大的。試想,如果一張表中的數據量達到了千萬甚至上億級別的時候,不管是建索引,優化緩存等,都會面臨巨大的性能壓力。

二 定義

數據sharding,也稱作數據切分,或分區。是指通過某種條件,把同一個資料庫中的數據分散到多個資料庫或多台機器上,以減小單台機器壓力。

三 分類

數據分區根據切分規則,可以分為兩類:

1、垂直切分

數據的垂直切分,也可以稱之為縱向切分。將資料庫想像成為由很多個一大塊一大塊的「數據塊」(表)組成,我們垂直的將這些「數據塊」切開,然後將他們分散

到多台資料庫主機上面。這樣的切分方法就是一個垂直(縱向)的數據切分。以表為單位,把不同的表分散到不同的資料庫或主機上。規則簡單,實施方便,適合業

務之間耦合度低的系統。

Sharding詳解” title=”MySQL Sharding詳解” height=”373″ width=”553″

垂直切分的優點

(1)資料庫的拆分簡單明了,拆分規則明確;

(2)應用程序模塊清晰明確,整合容易;

(3)數據維護方便易行,容易定位;

垂直切分的缺點

(1)部分表關聯無法在資料庫級別完成,需要在程序中完成;

(2)對於訪問極其頻繁且數據量超大的表仍然存在性能平靜,不一定能滿足要求;

(3)事務處理相對更為複雜;

(4) 切分達到一定程度之後,擴展性會遇到限制;

(5)過讀切分可能會帶來系統過渡複雜而難以維護。

2、水平切分

一般來說,簡單的水平切分主要是將某個訪問極其平凡的表再按照某個欄位的某種規則來分散到多個表之中,每個表中包含一部分數據。以行為單位,將同一個表中的數據按照某種條件拆分到不同的資料庫或主機上。相對複雜,適合單表巨大的系統。

Sharding詳解” title=”MySQL Sharding詳解” height=”372″ width=”553″

水平切分的優點

(1)表關聯基本能夠在資料庫端全部完成;

(2)不會存在某些超大型數據量和高負載的表遇到瓶頸的問題;

(3)應用程序端整體架構改動相對較少;

(4)事務處理相對簡單;

(5)只要切分規則能夠定義好,基本上較難遇到擴展性限制;

水平切分的缺點

(1)切分規則相對更為複雜,很難抽象出一個能夠滿足整個資料庫的切分規則;

(2)後期數據的維護難度有所增加,人為手工定位數據更困難;

(3)應用系統各模塊耦合度較高,可能會對後面數據的遷移拆分造成一定的困難。

3、聯合切分

實際的應用場景中,除了那些負載並不是太大,業務邏輯也相對較簡單的系統可以通過上面兩種切分方法之一來解決擴展性問題之外,恐怕其他大部分業務邏輯稍微

複雜一點,系統負載大一些的系統,都無法通過上面任何一種數據的切分方法來實現較好的擴展性,而需要將上述兩種切分方法結合使用,不同的場景使用不同的切

分方法。

Sharding詳解” title=”MySQL Sharding詳解” height=”480″ width=”342″

聯合切分的優點

(1)可以充分利用垂直切分和水平切分各自的優勢而避免各自的缺陷;

(2)讓系統擴展性得到最大化提升;

聯合切分的缺點

(1)資料庫系統架構比較複雜,維護難度更大;

(2)應用程序架構也相對更複雜;

四 實現方案

現在 Sharding 相關的軟體實現其實不少,基於資料庫層、DAO 層、不同語言下也都不乏案例。限於篇幅,此處只作一下簡要的介紹。

1、 Mysql Proxy + HASCALE

一套比較有潛力的方案。其中MySQL Proxy 是用 Lua 腳本實現的,介於客戶端與伺服器端之間,扮演 Proxy

的角色,提供查詢分析、失敗接管、查詢過濾、調整等功能。目前的 0.6 版本還做不到讀、寫分離。HSCALE 則是針對 MySQL Proxy 插件,也是用

Lua 實現的,對 Sharding 過程簡化了許多。需要指出的是,MySQL Proxy 與 HSCALE

各自會帶來一定的開銷,但這個開銷與集中式數據處理方式單條查詢的開銷還是要小的。

MySQLProxy是MySQL官方提供的一個資料庫代理層產品,和MySQLServer一樣,同樣是一個基於GPL開源協議的開源產品。可用來監視、分析或者傳輸他們之間的通訊信息。他的靈活性允許你最大限度的使用它,目前具備的功能主要有連接路由,Query分析,Query過濾和修改,負載均衡,以及基本的HA機制等。

實際上,MySQLProxy本身並不具有上述所有的這些功能,而是提供了實現上述功能的基礎。要實現這些功能,還需要通過我們自行編寫LUA腳本來實現。

MySQLProxy實際上是在客戶端請求與MySQLServer之間建立了一個連接池。所有客戶端請求都是發向MySQLProxy,然後經由MySQLProxy進行相應的分析,判斷出是讀操作還是寫操作,分發至對應的MySQLServer上。對於多節點Slave集群,也可以起做到負載均衡的效果。以下是MySQLProxy的基本架構圖:

Sharding詳解” title=”MySQL Sharding詳解” height=”480″ width=”420″

通過上面的架構簡圖,我們可以很清晰的看出MySQLProxy在實際應用中所處的位置,以及能做的基本事情。關於MySQLProxy更為詳細的實施細則在MySQL官方文檔中有非常詳細的介紹和示例,感興趣的讀者朋友可以直接從MySQL官方網站免費下載或者在線閱讀,我這裡就不累述浪費紙張了。

2、 Hibernate Shards

這是 Google 技術團隊貢獻的項目(),該項目是在對Google 財務系統數據

Sharding 過程中誕生的。因為是在框架層實現的,所以有其獨特的特性:標準的 Hibernate 編程模型,會用 Hibernate

就能搞定,技術成本較低;相對彈性的 Sharding 策略以及支持虛擬 Shard 等。

3、 Spock Proxy

這也是在實際需求中產生的一個開源項目,基於Mysql Proxy擴展。Spock()是一個人員查找的 Web

2.0 網站。通過對自己的單一 DB 進行有效 Sharding化 而產生了Spock

Proxy( ) 項目,Spock Proxy 算得上 MySQL Proxy

的一個分支,提供基於範圍的 Sharding 機制。Spock 是基於 Rails 的,所以Spock Proxy 也是基於 Rails 構建,關注 ROR

的朋友不應錯過這個項目。

4、 Amoeba for MySQL

Amoeba是一個基於Java開發的,專註於解決分散式資料庫數據源整合Proxy程序的開源框架,基於GPL3開源協議。目前,Amoeba已經具有Query路由,Query過濾,讀寫分離,負載均衡以及HA機制等相關內容。

Amoeba 主要解決的以下幾個問題:

(1)數據切分後複雜數據源整合;

(2)提供數據切分規則並降低數據切分規則給資料庫帶來的影響;

(3)降低資料庫與客戶端的連接數;

(4)讀寫分離路由。

我們可以看出,Amoeba所做的事情,正好就是我們通過數據切分來提升資料庫的擴展性所需要的。

Amoeba並不是一個代理層的Proxy程序,而是一個開發資料庫代理層Proxy程序的開發框架,目前基於Amoeba所開發的Proxy程序有AmoebaForMySQL和AmoebaForAladin兩個。

AmoebaForMySQL主要是專門針對MySQL資料庫的解決方案,前端應用程序請求的協議以及後端連接的數據源資料庫都必須是MySQL。對於客戶端的任何應用程序來說,AmoebaForMySQL和一個MySQL資料庫沒有什麼區別,任何使用MySQL協議的客戶端請求,都可以被AmoebaForMySQL解析並進行相應的處理。下如可以告訴我們AmoebaForMySQL的架構信息(出自Amoeba開發者博客):

Sharding詳解” title=”MySQL Sharding詳解” height=”480″ width=”384″

AmoebaForAladin則是一個適用更為廣泛,功能更為強大的Proxy程序。他可以同時連接不同資料庫的數據源為前端應用程序提供服務,但是僅僅接受符合MySQL協議的客戶端應用程序請求。也就是說,只要前端應用程序通過MySQL協議連接上來之後,AmoebaForAladin會自動分析Query語句,根據Query語句中所請求的數據來自動識別出該所Query的數據源是在什麼類型資料庫的哪一個物理主機上面。下圖展示了AmoebaForAladin的架構細節(出自Amoeba開發者博客):

Sharding詳解” title=”MySQL Sharding詳解” height=”480″ width=”384″

咋一看,兩者好像完全一樣嘛。細看之後,才會發現兩者主要的區別僅在於通過MySQLProtocalAdapter處理之後,根據分析結果判斷出數據源資料庫,然後選擇特定的JDBC驅動和相應協議連接後端資料庫。

其實通過上面兩個架構圖大家可能也已經發現了Amoeba的特點了,他僅僅只是一個開發框架,我們除了選擇他已經提供的ForMySQL和ForAladin這兩款產品之外,還可以基於自身的需求進行相應的二次開發,得到更適應我們自己應用特點的Proxy程序。

當對於使用MySQL資料庫來說,不論是AmoebaForMySQL還是AmoebaForAladin都可以很好的使用。當然,考慮到任何一個系統越是複雜,其性能肯定就會有一定的損失,維護成本自然也會相對更高一些。所以,對於僅僅需要使用MySQL資料庫的時候,我還是建議使用AmoebaForMySQL。

AmoebaForMySQL的使用非常簡單,所有的配置文件都是標準的XML文件,總共有四個配置文件。分別為:

(1)amoeba.xml:主配置文件,配置所有數據源以及Amoeba自身的參數設置;

(2)rule.xml:配置所有Query路由規則的信息;

(3)functionMap.xml:配置用於解析Query中的函數所對應的Java實現類;

(4)rullFunctionMap.xml:配置路由規則中需要使用到的特定函數的實現類;

如果您的規則不是太複雜,基本上僅需要使用到上面四個配置文件中的前面兩個就可完成所有工作。Proxy程序常用的功能如讀寫分離,負載均衡等配置都在amoeba.xml中進行。此外,Amoeba已經支持了實現數據的垂直切分和水平切分的自動路由,路由規則可以在rule.xml進行設置。

目前Amoeba少有欠缺的主要就是其在線管理功能以及對事務的支持了,曾經在與相關開發者的溝通過程中提出過相關的建議,希望能夠提供一個可以進行在線維護管理的命令行管理工具,方便在線維護使用,得到的反饋是管理專門的管理模塊已經納入開發日程了。另外在事務支持方面暫時還是Amoeba無法做到的,即使客戶端應用在提交給Amoeba的請求是包含事務信息的,Amoeba也會忽略事務相關信息。當然,在經過不斷完善之後,我相信事務支持肯定是Amoeba重點考慮增加的feature。

關於Amoeba更為詳細的使用方法讀者朋友可以通過Amoeba開發者博客()上面提供的使用手冊獲取,這裡就不再細述了。

案例()

操作文檔()

5、 HiveDB

和前面的MySQLProxy以及Amoeba一樣,HiveDB同樣是一個基於Java針對MySQL資料庫的提供數據切分及整合的開源框架,只是目前的HiveDB僅僅支持數據的水平切分。主要解決大數據量下資料庫的擴展性及數據的高性能訪問問題,同時支持數據的冗餘及基本的HA機制。

HiveDB的實現機制與MySQLProxy和Amoeba有一定的差異,他並不是藉助MySQL的Replication功能來實現數據的冗餘,而是自行實現了數據冗餘機制,而其底層主要是基於HibernateShards來實現的數據切分工作。

在HiveDB中,通過用戶自定義的各種Partitionkeys(其實就是制定數據切分規則),將數據分散到多個MySQLServer中。在訪問的時候,在運行Query請求的時候,會自動分析過濾條件,並行從多個MySQLServer中讀取數據,併合並結果集返回給客戶端應用程序。

單純從功能方面來講,HiveDB可能並不如MySQLProxy和Amoeba那樣強大,但是其數據切分的思路與前面二者並無本質差異。此外,HiveDB並不僅僅只是一個開源愛好者所共享的內容,而是存在商業公司支持的開源項目。

下面是HiveDB官方網站上面一章圖片,描述了HiveDB如何來組織數據的基本信息,雖然不能詳細的表現出太多架構方面的信息,但是也基本可以展示出其在數據切分方面獨特的一面了。

Sharding詳解” title=”MySQL Sharding詳解” height=”471″ width=”553″

6、 DataFabric

application-level sharding

master/slave replication

7、PL/Proxy

前面幾個都是針對MySQL 的 Sharding 方案,PL/Proxy 則是針對 PostgreSQL 的,設計思想類似 Teradata 的

Hash 機制,數據存儲對客戶端是透明的,客戶請求發送到 PL/Proxy 後,由這裡分散式存儲過程調用,統一分發。 PL/Proxy

的設計初衷就是在這一層充當」數據匯流排」的職責,所以,當數據吞吐量支撐不住的時候,只需要增加更多的 PL/Proxy 伺服器即可。大名鼎鼎的 Skype 用的就是

PL/Proxy 的解決方案。

8、Pyshards

這是個基於Python的解決方案。該工具的設計目標還有個 Re-balancing 在裡面,這倒是個比較激進的想法。目前只支持 MySQL

資料庫。

9、其他實現數據切分及整合的解決方案

除了上面介紹的幾個數據切分及整合的整體解決方案之外,還存在很多其他同樣提供了數據切分與整合的解決方案。如基於MySQLProxy的基礎上做了進一步擴展的HSCALE,通過Rails構建的SpockProxy,以及基於Pathon的Pyshards等等。

不管大家選擇使用哪一種解決方案,總體設計思路基本上都不應該會有任何變化,那就是通過數據的垂直和水平切分,增強資料庫的整體服務能力,讓應用系統的整體擴展能力儘可能的提升,擴展方式儘可能的便捷。

只要我們通過中間層Proxy應用程序較好的解決了數據切分和數據源整合問題,那麼資料庫的線性擴展能力將很容易做到像我們的應用程序一樣方便,只需要通過添加廉價的PCServer伺服器,即可線性增加資料庫集群的整體服務能力,讓資料庫不再輕易成為應用系統的性能瓶頸。

五 注意事項

下面我們所說的分區,主要是指水平分區。

1、在實施分區前,我們可以查看所安裝版本的mysql是否支持分區:

mysql show variables like “%partition%”;

如果支持則會顯示:

+——————-+——-+

| Variable_name | Value |

+——————-+——-+

| have_partitioning | YES |

+——————-+——-+

2、分區適用於一個表的所有數據和索引,不能只對數據分區而不對索引分區,反之亦然,同時也不能只對錶的一部分進行分區。

3、分區類型

(1)RANGE 分區:基於屬於一個給定連續區間的列值,把多行分配給分區。

(2)LIST 分區:類似於按RANGE分區,區別在於LIST分區是基於列值匹配一個離散值集合中的某個值來進行選擇。

(3)HASH分區:基於用戶定義的表達式的返回值來進行選擇的分區,該表達式使用將要插入到表中的這些行的列值進行計算(新浪微博採用的方案)。

(4)KEY 分區:類似於按HASH分區,區別在於KEY分區只支持計算一列或多列,且MySQL

伺服器提供其自身的哈希函數。必須有一列或多列包含整數值。

無論使用何種類型的分區,分區總是在創建時就自動的順序編號,且從0開始記錄。當有一新行插入到一個分區表中時,就是使用這些分區編號來識別正確的分區。

4、MySQL提供了許多修改分區表的方式。添加、刪除、重新定義、合併或拆分已經存在的分區是可能的。所有這些操作都可以通過使用ALTER TABLE

命令的分區擴展來實現。

5、可以對已經存在的表進行分區,直接使用alter table命令即可。

 

如何用java 5分鐘實現一個最簡單的mysql代理伺服器

如何用java 5分鐘實現一個最簡單的mysql代理伺服器

首先,準備開發工具套件,我們並不會引入過多工具包,僅僅需要:

java8

vert.x 3

如果你是用maven做為項目管理工具,請將vert.x 3引入:

1

2

3

4

5

dependency

groupIdio.vertx/groupId

artifactIdvertx-core/artifactId

version3.3.2/version

/dependency

代碼實現:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

package

com.maxleap.mysqlproxy;

import

io.vertx.core.AbstractVerticle;

import

io.vertx.core.Vertx;

import

io.vertx.core.logging.Logger;

import

io.vertx.core.logging.LoggerFactory;

import

io.vertx.core.net.NetClient;

import

io.vertx.core.net.NetServer;

import

io.vertx.core.net.NetSocket;

/**

*

@author sneaky

*

@since 1.0.0

*/

public

class

MysqlProxyServer

{

private

static

final

Logger

logger

=

LoggerFactory.getLogger(MysqlProxyServer.class);

public

static

void

main(String[]

args)

{

Vertx.vertx().deployVerticle(new

MysqlProxyServerVerticle());

}

public

static

class

MysqlProxyServerVerticle

extends

AbstractVerticle

{

private

final

int

port

=

3306;

private

final

String

mysqlHost

=

“10.10.0.6”;

@Override

public

void

start()

throws

Exception

{

NetServer

netServer

=

vertx.createNetServer();//創建代理伺服器

NetClient

netClient

=

vertx.createNetClient();//創建連接mysql客戶端

netServer.connectHandler(socket

netClient.connect(port,

mysqlHost,

result

{

//響應來自客戶端的連接請求,成功之後,在建立一個與目標mysql伺服器的連接

if

(result.succeeded())

{

//與目標mysql伺服器成功連接連接之後,創造一個MysqlProxyConnection對象,並執行代理方法

new

MysqlProxyConnection(socket,

result.result()).proxy();

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/183590.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-25 05:47
下一篇 2024-11-25 05:48

相關推薦

  • Python簡單數學計算

    本文將從多個方面介紹Python的簡單數學計算,包括基礎運算符、函數、庫以及實際應用場景。 一、基礎運算符 Python提供了基礎的算術運算符,包括加(+)、減(-)、乘(*)、除…

    編程 2025-04-29
  • Python滿天星代碼:讓編程變得更加簡單

    本文將從多個方面詳細闡述Python滿天星代碼,為大家介紹它的優點以及如何在編程中使用。無論是剛剛接觸編程還是資深程序員,都能從中獲得一定的收穫。 一、簡介 Python滿天星代碼…

    編程 2025-04-29
  • Python海龜代碼簡單畫圖

    本文將介紹如何使用Python的海龜庫進行簡單畫圖,並提供相關示例代碼。 一、基礎用法 使用Python的海龜庫,我們可以控制一個小海龜在窗口中移動,並利用它的「畫筆」在窗口中繪製…

    編程 2025-04-29
  • Python櫻花樹代碼簡單

    本文將對Python櫻花樹代碼進行詳細的闡述和講解,幫助讀者更好地理解該代碼的實現方法。 一、簡介 櫻花樹是一種圖形效果,它的實現方法比較簡單。Python中可以通過turtle這…

    編程 2025-04-28
  • Python大神作品:讓編程變得更加簡單

    Python作為一種高級的解釋性編程語言,一直被廣泛地運用於各個領域,從Web開發、遊戲開發到人工智慧,Python都扮演著重要的角色。Python的代碼簡潔明了,易於閱讀和維護,…

    編程 2025-04-28
  • 用Python實現簡單爬蟲程序

    在當今時代,互聯網上的信息量是爆炸式增長的,其中很多信息可以被利用。對於數據分析、數據挖掘或者其他一些需要大量數據的任務,我們可以使用爬蟲技術從各個網站獲取需要的信息。而Pytho…

    編程 2025-04-28
  • 如何製作一個簡單的換裝遊戲

    本文將從以下幾個方面,為大家介紹如何製作一個簡單的換裝遊戲: 1. 遊戲需求和界面設計 2. 使用HTML、CSS和JavaScript開發遊戲 3. 實現遊戲的基本功能:拖拽交互…

    編程 2025-04-27
  • Guava Limiter——限流器的簡單易用

    本文將從多個維度對Guava Limiter進行詳細闡述,介紹其定義、使用方法、工作原理和案例應用等方面,並給出完整的代碼示例,希望能夠幫助讀者更好地了解和使用該庫。 一、定義 G…

    編程 2025-04-27
  • 製作一個簡單的管理系統的成本及實現

    想要製作一個簡單的管理系統,需要進行技術選型、開發、測試等過程,那麼這個過程會花費多少錢呢?我們將從多個方面來闡述製作一個簡單的管理系統的成本及實現。 一、技術選型 當我們開始思考…

    編程 2025-04-27
  • 2的32次方-1:一個看似簡單卻又複雜的數字

    對於計算機領域的人來說,2的32次方-1(也就是十進位下的4294967295)這個數字並不陌生。它經常被用來表示IPv4地址或者無符號32位整數的最大值。但實際上,這個數字卻包含…

    編程 2025-04-27

發表回復

登錄後才能評論