明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

對(duì)于用SQL SERVER2000創(chuàng)建分布式網(wǎng)站系統(tǒng)的認(rèn)識(shí)

[摘要]最近閑來(lái)無(wú)事就對(duì)“分布式系統(tǒng)”做了一點(diǎn)小小的研究,我覺(jué)得這種技術(shù)相當(dāng)不錯(cuò),可能很多朋友都聽說(shuō)過(guò)“分布式”這個(gè)概念,我對(duì)這種技術(shù)的個(gè)人理解就是:分布式系統(tǒng)包括很多成員,它們之間資源是相互共享的,從大的方面看是共同擔(dān)負(fù)處理任務(wù),但是以個(gè)體為單位單獨(dú)處理每個(gè)小的任務(wù),然后被一個(gè)中央處理單元將所有信息合并...

最近閑來(lái)無(wú)事就對(duì)“分布式系統(tǒng)”做了一點(diǎn)小小的研究,我覺(jué)得這種技術(shù)相當(dāng)不錯(cuò),可能很多朋友都聽說(shuō)過(guò)“分布式”這個(gè)概念,我對(duì)這種技術(shù)的個(gè)人理解就是:分布式系統(tǒng)包括很多成員,它們之間資源是相互共享的,從大的方面看是共同擔(dān)負(fù)處理任務(wù),但是以個(gè)體為單位單獨(dú)處理每個(gè)小的任務(wù),然后被一個(gè)中央處理單元將所有信息合并的一個(gè)系統(tǒng)。這種技術(shù)就是基于服務(wù)器端的一種技術(shù),我就按照我的理解來(lái)做了一個(gè)簡(jiǎn)單的模型(做錯(cuò)的地方請(qǐng)大家指教J)

下面我就來(lái)介紹一下這個(gè)模型的構(gòu)造以及數(shù)據(jù)庫(kù)設(shè)計(jì)問(wèn)題:
服務(wù)器A:擔(dān)任數(shù)據(jù)庫(kù)服務(wù)器同時(shí)又擔(dān)任WEB服務(wù)器(平臺(tái)WIN SERVER2000 , IIS5.0 , SQL SERVER 2000 , IP地址為192.168.0.1)
服務(wù)器B,C,D:擔(dān)任WEB服務(wù)器(平臺(tái)WIN SERVER2000 , IIS5.0 )
首先我們?cè)O(shè)計(jì)數(shù)據(jù)庫(kù)的時(shí)候要考慮的問(wèn)題就是這個(gè)系統(tǒng)的特性“分布”,即A,B,C,D四臺(tái)服務(wù)器在實(shí)際應(yīng)用中他們的地理位置不一定是集中的,比如SOHU的服務(wù)器,遍布各地,但是我們每個(gè)人看到的消息都是一樣的,它也是一個(gè)較大的分布式網(wǎng)站系統(tǒng),由于地域的差異造成服務(wù)器端時(shí)間的差異,我們既要對(duì)用戶正確的表示本地的時(shí)間,又要方便管理數(shù)據(jù)庫(kù),那么就要對(duì)入庫(kù)的數(shù)據(jù)有一個(gè)統(tǒng)一的時(shí)間編號(hào),這個(gè)工作當(dāng)然就只有在數(shù)據(jù)庫(kù)中實(shí)現(xiàn)了,于是我設(shè)計(jì)了2個(gè)時(shí)間的字段,一個(gè)WEB_TIME用來(lái)存儲(chǔ)從WEB服務(wù)器傳遞過(guò)來(lái)的日期時(shí)間,一個(gè)DATA_TIME用來(lái)存儲(chǔ)數(shù)據(jù)入庫(kù)時(shí)當(dāng)前數(shù)據(jù)庫(kù)服務(wù)器的系統(tǒng)日期時(shí)間
這樣就完成了重要的一部,(本人遇到的在A服務(wù)器添加數(shù)據(jù)時(shí)可以寫入DATA_TIME,而無(wú)法在B,C,D服務(wù)器上寫入DATA_TIME的原因就在于忘了在該字段設(shè)置該字段不為空,呵呵,只要設(shè)置了不允許為空就ok了)然后將DATA_TIME默認(rèn)值設(shè)置威getdate()這樣在寫入每條數(shù)據(jù)的時(shí)候就由SQL自己自動(dòng)取得當(dāng)前數(shù)據(jù)庫(kù)服務(wù)器的系統(tǒng)時(shí)間并寫入,呵呵,這樣就完成了時(shí)間的統(tǒng)一問(wèn)題,然后我比如做一個(gè)注冊(cè)系統(tǒng)再設(shè)置name和pass兩個(gè)字段來(lái)存儲(chǔ)用戶的用戶名和密碼,呵呵,完成了數(shù)據(jù)庫(kù)的設(shè)計(jì),接下來(lái)就是WEB程序了,呼呼
WEB程序部分:
1. 連接數(shù)據(jù)庫(kù)(conn.asp)
對(duì)于A服務(wù)器來(lái)講,它本身既是數(shù)據(jù)庫(kù)服務(wù)器又是WEB服務(wù)器,所以它連接數(shù)據(jù)庫(kù)的代碼如下:

<%
set conn=server.createobject("ADODB.connection")
conn.open"PROVIDER=SQLOLEDB;DATASOURCE=localhost;UID=sa;PWD=;DATABASE=db"
%>
對(duì)于其他WEB服務(wù)器來(lái)講他們連接的時(shí)遠(yuǎn)端的數(shù)據(jù)庫(kù)服務(wù)器所以代碼改為:
<%
set conn=server.createobject("ADODB.connection")
conn.open"PROVIDER=SQLOLEDB;DATA SOURCE=192.168.0.1;UID=sa;PWD=;DATABASE=db"
%>
2.服務(wù)器任務(wù)分配解決思路
這個(gè)頁(yè)面的代碼在B,C,D服務(wù)器基本上都是一樣的了,比較特殊的就是A服務(wù)器
不過(guò)這里還有一個(gè)服務(wù)器登陸選擇的問(wèn)題,(我正在研究中,呵呵,具體程序的實(shí)現(xiàn)做出來(lái)再告訴大家),不過(guò)我的設(shè)想是這樣的,我把服務(wù)器A設(shè)置為第一連接的服務(wù)器,就是所有訪問(wèn)這個(gè)站點(diǎn)的客戶機(jī)首先都是訪問(wèn)A服務(wù)器,然后A服務(wù)器再比較B,C,D三個(gè)服務(wù)器的繁忙程度,有選擇的將URL地址指向其中閑置的一臺(tái)服務(wù)器,這樣就不會(huì)出現(xiàn)服務(wù)器之間負(fù)擔(dān)的任務(wù)不均衡,這里就有一個(gè)關(guān)于統(tǒng)計(jì)服務(wù)器繁忙程度,我的思路是做一個(gè)在線統(tǒng)計(jì)程序,加在網(wǎng)站代碼中,但是A,B,C,D的程序代碼必須要帶有該服務(wù)器的標(biāo)識(shí),然后將四臺(tái)服務(wù)器的統(tǒng)計(jì)結(jié)果在服務(wù)器A數(shù)據(jù)庫(kù)中匯合,然后服務(wù)器A通過(guò)判斷他們存入的統(tǒng)計(jì)數(shù)據(jù)來(lái)選擇服務(wù)器(有興趣的同志我們可以共同來(lái)研究)
我們先在數(shù)據(jù)庫(kù)建立一統(tǒng)計(jì)三臺(tái)服務(wù)器在線人數(shù)的數(shù)據(jù)表命名為count,設(shè)立字段NUM和SERVER_VAL和SERVER_URL分別代表在線人數(shù),和服務(wù)器名和服務(wù)器地址,并且添加進(jìn)3臺(tái)WEB服務(wù)器的基本信息NUM默認(rèn)為0,和每臺(tái)服務(wù)器名,以及網(wǎng)址。

――――――――――――――――――――――――――――――――――――――

然后我們?cè)诿總(gè)用戶在選擇服務(wù)器后從A服務(wù)器進(jìn)入B,C,D其中的一臺(tái)服務(wù)器時(shí),開始執(zhí)行對(duì)該服務(wù)器進(jìn)行在線人數(shù)統(tǒng)計(jì),并將結(jié)果寫入數(shù)據(jù)庫(kù)服務(wù)器A,同樣當(dāng)一個(gè)用戶離線時(shí),也將在線人數(shù)結(jié)果寫入數(shù)據(jù)庫(kù)服務(wù)器A,這里我采用的是GLOBAL.ASA來(lái)進(jìn)行統(tǒng)計(jì)(具體的統(tǒng)計(jì)方法各位可以按照您的思路來(lái),我在這里只是拋磚引玉)
這樣基本的原理就完成了,剩下的就是網(wǎng)站建設(shè)了,在這里我把一些基本代碼寫出,請(qǐng)大家指教:
主服務(wù)器(數(shù)據(jù)庫(kù)服務(wù)器A SQL SERVER 2000 IIS5.0):
建立數(shù)據(jù)庫(kù)db
db下建數(shù)據(jù)表message和count
1. message數(shù)據(jù)表有字段
id(編號(hào),主鍵) int類型 不允許為空
name char類型
pass char類型
tim datetime類型 不允許為空 (設(shè)置默認(rèn)值為getdate())用于統(tǒng)一管理入庫(kù)記錄的時(shí)間,該時(shí)間以數(shù)據(jù)庫(kù)服務(wù)器系統(tǒng)時(shí)間為標(biāo)準(zhǔn)
備注:該數(shù)據(jù)表用于調(diào)試各個(gè)服務(wù)器間協(xié)作處理用戶和數(shù)據(jù)庫(kù)服務(wù)器間會(huì)話的任務(wù)
并無(wú)特殊意義。
2. count數(shù)據(jù)表有字段
id(編號(hào),主鍵) int類型 不允許為空
num int類型
server_url nchar類型 記錄WEB服務(wù)器的ip地址
server_name nchar類型 記錄WEB服務(wù)器的編號(hào)
備注:該數(shù)據(jù)表為各個(gè)WEB服務(wù)器在線統(tǒng)計(jì)結(jié)果,以及服務(wù)器基本信息,用于主服務(wù)器判斷各個(gè)WEB服務(wù)器的繁忙程度來(lái)對(duì)來(lái)訪人數(shù)的協(xié)調(diào)。
主服務(wù)器WEB程序部分:
conn.asp 連接數(shù)據(jù)庫(kù)部分
<%
set conn=server.createobject("ADODB.connection")
conn.open"PROVIDER=SQLOLEDB;DATA SOURCE=localhost;UID=sa;PWD=;DATABASE=db"
%>
close.asp關(guān)閉數(shù)據(jù)庫(kù)程序
<%
rs.close
conn.close
set rs=nothing
set conn=nothing
%>
index.asp 判斷程序
<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>
<!--#include file=conn.asp -->
<%
dim SERVER_URL
set rs=server.createobject("ADODB.recordset")
sql="select * from count order by num desc"
rs.open sql,conn,1,3
if not rs.eof and not rs.bof then
RS.MOVELAST
SERVER_URL=RS("SERVER_URL") ‘將閑置服務(wù)器IP付給改變量
End if
%>
<!--#include file=close.asp -->
<%
SERVER_URL="http://"&SERVER_URL ‘轉(zhuǎn)換成URL格式
response.Redirect(SERVER_URL) ‘轉(zhuǎn)置閑置服務(wù)器
%>
WEB服務(wù)器程序部分:(主要就是向主服務(wù)器反饋當(dāng)前該服務(wù)器在線人數(shù)情況)
Conn.asp連接數(shù)據(jù)庫(kù)服務(wù)器程序
<%
set conn=server.createobject("ADODB.connection")
conn.open"PROVIDER=SQLOLEDB;DATA SOURCE=192.168.0.1;UID=sa;PWD=;DATABASE=db"
%>
close.asp關(guān)閉數(shù)據(jù)庫(kù)程序
<%
rs.close
conn.close
set rs=nothing
set conn=nothing
%>
GLOBAL.ASA程序
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
sub application_onstart
application.lock
application("count1")=0
application.unlock
end sub
sub session_onstart
application.lock
application("count1")= application("count1")+1
application.unlock
end sub
sub session_onend
application.lock
application("count1")= application("count1")-1
application.unlock
end sub
sub application_onend
application.lock
application("count1")=0
application.unlock
end sub
</script>
Count.asp(統(tǒng)計(jì)程序)
<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%><meta http-equiv="refresh" content="5">
<%session.Timeout=1%>
<%response.buffer=true%>
<!--#include file=conn.asp -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title></title>
當(dāng)前服務(wù)器<%=request.ServerVariables("LOCAL_ADDR")%>在線<%=application("count1")%>人
<br>
<%
server_url=request.ServerVariables("LOCAL_ADDR")
set rs=server.createobject("ADODB.recordset")
sql="select * from count where server_url='"&server_url&"'"
rs.open sql,conn,3,3
if not rs.eof then
rs("num")=application("count1")
rs.update
else
response.Write("該服務(wù)器URL在數(shù)據(jù)庫(kù)中沒(méi)有發(fā)現(xiàn)")
response.End()
end if
%>
<%
num=0
set rs=server.createobject("ADODB.recordset")
sql="select * from count"
rs.open sql,conn,3,3
while not rs.eof
num=num+cint(rs("num"))
rs.movenext
wend
%>
<br>
共計(jì)在線<%=num%>人
</body>
</html>
default.asp用戶瀏覽頁(yè)面
<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>
<html>
<head>
<title>無(wú)標(biāo)題文檔</title>
</head>
<!--#include file=conn.asp -->
<body><iframe src="count.asp" marginheight="5" marginwidth="5" frameborder="0" scrolling="no"></iframe>
<form name="form1" method="post" action="write.asp">
<p>
<input name="user_name" type="text" id="user_name">
</p>
<p>
<input name="user_pass" type="password" id="user_pass">
</p>
<p>
<input type="submit" name="Submit" value="提交">
<input type="reset" name="Submit2" value="重置">
</p>
</form>
<form name="form1" method="post" action="s.asp">
<p>
<input name="condition" type="text" id="condition">
<input type="submit" name="Submit3" value="提交">
</p>
</form>

<%
x=request.Form("aa")
%>
<%set rs=server.createobject("ADODB.recordset")
sql="select * from message order by id desc"
rs.open sql,conn,3,3
%>
<%if not rs.eof and not rs.bof then%>
<%
rs.pagesize=10
pages=rs.pagecount
records=rs.recordcount
nowpage=request("page")
if nowpage="" then
nowpage=1
else
nowpage=cint(nowpage)
end if
rs.absolutepage=nowpage
%>
<%
dim m
m=0
while not rs.eof and m<rs.pagesize
%>
<table width="600" border="1" cellspacing="0" cellpadding="0">
<tr>
<td width="107"><%=rs("id")%></td>
<td width="263"><%=rs("name")%></td>
<td width="222"><%=rs("tim")%></td>
</tr>
</table>
<%
m=m+1
rs.movenext
wend
%>
<table width="600" border="1" cellspacing="0" cellpadding="0">
<tr>
<td>共[<%=pages%>]頁(yè)&nbsp; &nbsp;共[<%=records%>]記錄&nbsp; &nbsp;
<%if nowpage<>1 then%>
<a href="default.asp?page=<%=nowpage-1%>">[上一頁(yè)]</a> &nbsp; &nbsp;
<%else%>
[上一頁(yè)]
<%end if%>
<%if nowpage<>pages then%>
<a href="default.asp?page=<%=nowpage+1%>">[下一頁(yè)]</a>
<%else%>
[下一頁(yè)]
<%end if%>

</td>
</tr>
</table>
<!--#include file=close.asp -->
<%end if%>
</body>
</html>
write.asp寫入數(shù)據(jù)代碼頁(yè)
<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>
<%response.buffer=true%>
<!--#include file=conn.asp -->
<%
dim user_name,user_pass
user_name=request.Form("user_name")
user_pass=request.Form("user_pass")
set rs=server.createobject("ADODB.recordset")
sql="select * from message"
rs.open sql,conn,3,3
if not rs.eof and not rs.bof then
rs.movelast
id=rs("id")+1
rs.movefirst
else
id=1
end if
rs.addnew
rs("id")=id
rs("name")=user_name
rs("pass")=user_pass
rs.update
rs.close
conn.close
set rs=nothing
set conn=nothing
response.Redirect("default.asp")
%>
s.asp查詢頁(yè)
<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>
<%response.buffer=true%>
<!--#include file=conn.asp -->
<%
dim condition
condition=request.Form("condition")
set rs=server.createobject("ADODB.recordset")
sql="select * from message where name like '%"&condition&"%'"
rs.open sql,conn,3,3
if not rs.eof then
m=rs.recordcount
response.Write(m)
response.Write("<br>")
while not rs.eof
response.Write(rs("name"))
response.Write("<hr>")
rs.movenext
wend
end if
rs.close
conn.close
set rs=nothing
set conn=nothing
%>

這樣整個(gè)站點(diǎn)的代碼就完成了,由于小弟水平有限加上時(shí)間倉(cāng)促(5555,要期末考試了)請(qǐng)各位大俠指教,需要注意的是該程序在運(yùn)行時(shí)需在數(shù)據(jù)庫(kù)中count數(shù)據(jù)表中添加進(jìn)WEB服務(wù)器的基本信息,具體更具情況而言,本程序在IIS5.0 +WIN 2000SERVER+SQL SERVER2000下運(yùn)行通過(guò)
3臺(tái)參加調(diào)試WEB服務(wù)器IP分別為: 192.168.0.253 192.168.0.250 192.168.0.251