如何用java 5分鐘實(shí)現(xiàn)一個最簡單的mysql代理服務(wù)器
成都創(chuàng)新互聯(lián)公司堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站制作、網(wǎng)站設(shè)計、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的衛(wèi)東網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
首先,準(zhǔn)備開發(fā)工具套件,我們并不會引入過多工具包,僅僅需要:
java8
vert.x 3
如果你是用maven做為項(xiàng)目管理工具,請將vert.x 3引入:
1
2
3
4
5
dependency
groupIdio.vertx/groupId
artifactIdvertx-core/artifactId
version3.3.2/version
/dependency
代碼實(shí)現(xiàn):
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();//創(chuàng)建代理服務(wù)器
NetClient
netClient
=
vertx.createNetClient();//創(chuàng)建連接mysql客戶端
netServer.connectHandler(socket
-
netClient.connect(port,
mysqlHost,
result
-
{
//響應(yīng)來自客戶端的連接請求,成功之后,在建立一個與目標(biāo)mysql服務(wù)器的連接
if
(result.succeeded())
{
//與目標(biāo)mysql服務(wù)器成功連接連接之后,創(chuàng)造一個MysqlProxyConnection對象,并執(zhí)行代理方法
new
MysqlProxyConnection(socket,
result.result()).proxy();
需要用到集群,負(fù)載均衡及mysql
復(fù)制(replication);
下面提供一個系統(tǒng)模型你可以參考一下:
集群的結(jié)構(gòu)為一個主MySQL服務(wù)器(Master)服務(wù)器與多個從屬M(fèi)ySQL服務(wù)器(Slave)建立復(fù)制(replication)連接,主服務(wù)器與從屬服務(wù)器實(shí)現(xiàn)一定程度上的數(shù)據(jù)同步,多個從屬服務(wù)器存儲相同的數(shù)據(jù)副本,實(shí)現(xiàn)數(shù)據(jù)冗余,提供容錯功能。部署開發(fā)應(yīng)用系統(tǒng)時,對數(shù)據(jù)庫操作代碼進(jìn)行優(yōu)化,將寫操作(如UPDATE、INSERT)定向到主服務(wù)器,把大量的查詢操作(SELECT)定向到從屬服務(wù)器,實(shí)現(xiàn)集群的負(fù)載均衡功能。如果主服務(wù)器發(fā)生故障,從屬服務(wù)器將轉(zhuǎn)換角色成為主服務(wù)器,使應(yīng)用系統(tǒng)為終端用戶提供不間斷的網(wǎng)絡(luò)服務(wù);主服務(wù)器恢復(fù)運(yùn)行后,將其轉(zhuǎn)換為從屬服務(wù)器,存儲數(shù)據(jù)庫副本,繼續(xù)對終端用戶提供數(shù)據(jù)查詢檢索服務(wù)。
這種架構(gòu)一般用在以下三類場景
1. 備份多臺 Server 的數(shù)據(jù)到一臺如果按照數(shù)據(jù)切分方向來講,那就是垂直切分。比如圖 2,業(yè)務(wù) A、B、C、D 是之前拆分好的業(yè)務(wù),現(xiàn)在需要把這些拆分好的業(yè)務(wù)匯總起來備份,那這種需求也很適用于多源復(fù)制架構(gòu)。實(shí)現(xiàn)方法我大概描述下:業(yè)務(wù) A、B、C、D 分別位于 4 臺 Server,每臺 Server 分別有一個數(shù)據(jù)庫來隔離前端的業(yè)務(wù)數(shù)據(jù),那這樣,在從庫就能把四臺業(yè)務(wù)的數(shù)據(jù)全部匯總起來,而不需要做額外的操作。那沒有多源復(fù)制之前,要實(shí)現(xiàn)這類需求,只能在匯總機(jī)器上搭建多個 MySQL 實(shí)例,那這樣勢必會涉及到跨庫關(guān)聯(lián)的問題,不但性能急劇下降,管理多個實(shí)例也沒有單臺來的容易。
2. 用來聚合前端多個 Server 的分片數(shù)據(jù)。
同樣,按照數(shù)據(jù)切分方向來講,屬于水平切分。比如圖 3,按照年份拆分好的數(shù)據(jù),要做一個匯總數(shù)據(jù)展現(xiàn),那這種架構(gòu)也非常合適。實(shí)現(xiàn)方法稍微復(fù)雜些:比如所有 Server 共享同一數(shù)據(jù)庫和表,一般為了開發(fā)極端透明,前端配置有分庫分表的中間件,比如愛可生的 DBLE。
3. 匯總并合并多個 Server 的數(shù)據(jù)
第三類和第一種場景類似。不一樣的是不僅僅是數(shù)據(jù)需要匯總到目標(biāo)端,還得合并這些數(shù)據(jù),這就比第一種來的相對復(fù)雜些。比如圖 4,那這樣的需求,是不是也適合多源復(fù)制呢?答案是 YES。那具體怎么做呢?