2011-08-09 115 views
1

我正在開發一個Web應用程序,其中,對於每個客戶端(小型大型組織),他們沒有(也不應該)能夠查詢到其他客戶端的記錄。將數據保存在單個數據庫中會很容易,並且使更新和維護變得簡單(直到遇到可伸縮性問題)。但我現在想要面向未來的應用程序。如果每個客戶的數據都包含在孤立的數據庫中,則每個客戶都會獲得更好的性能,並且應該更好地擴展。我不確定它是否相當於數據庫「分片」,因爲我沒有在多個數據庫之間劃分單個模式。我基本上會在每個數據庫中都有一個複製的模式(就像當天在CD上發佈軟件時一樣 - 每個數據庫都有自己的數據庫)。設置數據庫分片 - 沒有跨數據庫查詢

我已經讀了一點,所以我有一個概念的想法。但是,我的頭腦裏有很多問題。我不確定這個過程的透明度如何。或者,如果我想要推出更改,就會遇到更新數百個架構的維護噩夢。

真的,我只是在尋找一個簡單的「完整」例子(希望使用spring/java)。

  1. 我會想象我能有一個單一的應用程序服務器開始單一的數據源,比方說,一個MySQL實例與單個表映射用戶ID到數據庫。

    • 用戶ID
    • 數據庫/碎片-ID

    對於每一個請求(查詢),忽略數據庫高速緩存,那就要查找的碎片ID的用戶?或者,這是否可以在每個會話中最初執行一次並直接與目標數據庫進行交談? (正如你可能能夠告訴我對服務器端的東西不夠強大)。

  2. 有人可以提供一個關於在Spring中如何連接的高層概述嗎?目前,我的架構非常簡單。我有簡單的Spring組件DAO使用jdbctemplate。 DAO的數據源被注入(數據源在applicationContext.xml上配置)。 DAO自動裝入我的服務類。相當標準的東西。

  3. 比方說,我得到了上一步工作,現在我必須改變架構。是否有管理工具可以用於一次應用模式更改並將其傳播到100個其他數據庫?

我正在使用MySQL。我相信「MySQL代理」可能能夠解決問題1和2.有沒有人有這方面的經驗?我想它無法處理管理模式更新,所以我可能不得不推出我自己的解決方案。

謝謝!

回答

0

我不能跟Spring說話,因爲我不使用它。

如果是我,用我的Java EE帽子,我只需使用JNDI數據源,爲每個客戶端創建一個,然後通過客戶端名稱或任何標識符來查看,以區分客戶端。

現在,我相信可以用Spring來完成,我只是不能告訴你如何。

通用數據庫連接池實現如何處理「100個數據庫」,但連接數很多,也是一個不同的問題(想到幾百個開放連接套接口的願景)。我也無法與此交談,沒有做到這一點。

但之後,因爲每個池指向一個單獨的數據庫,那麼你基本上都完成了。每個池可以有它自己的配置,所以你可以將數據庫移動到不同的主機等

這將是我的第一個問題,直到它在測試失敗,但我猜測失敗點將是數據庫池實現或與之相關。其他一切都是通用的數據庫服務器和Java。

-1

這是一種分片/多租戶的情況。你將會有一個維護噩夢,並且它需要編寫代碼分配。您可以使用第三方 - 您可以嘗試ScaleBase(披露:我在那裏工作),他們完全按照您的描述進行操作,並且對您的應用程序透明。

1

我使用的春季和分片在我的公司的想法是,

  1. 你會實現一個ShardDataSourceManager這將是基本連接池的池,你會查找一個數據源的碎片ID。
  2. 您將定義自己的事務性註釋並使用它註釋方法
  3. 您需要在dao層編寫一個攔截器來讀取方法和某些上下文信息的註釋。從上下文信息中查找分片ID並查找數據源並注入到本地線程中。
  4. 查找數據源時的dao層會查看本地線程以構建jdbc模板並對其執行查詢。