對于用SQL SERVER2000創(chuàng)建分布式網(wǎng)站系統(tǒng)的認識
發(fā)表時間:2024-06-03 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]最近閑來無事就對“分布式系統(tǒng)”做了一點小小的研究,我覺得這種技術(shù)相當(dāng)不錯,可能很多朋友都聽說過“分布式”這個概念,我對這種技術(shù)的個人理解就是:分布式系統(tǒng)包括很多成員,它們之間資源是相互共享的,從大的方面看是共同擔(dān)負處理任務(wù),但是以個體為單位單獨處理每個小的任務(wù),然后被一個中央處理單元將所有信息合并...
最近閑來無事就對“分布式系統(tǒng)”做了一點小小的研究,我覺得這種技術(shù)相當(dāng)不錯,可能很多朋友都聽說過“分布式”這個概念,我對這種技術(shù)的個人理解就是:分布式系統(tǒng)包括很多成員,它們之間資源是相互共享的,從大的方面看是共同擔(dān)負處理任務(wù),但是以個體為單位單獨處理每個小的任務(wù),然后被一個中央處理單元將所有信息合并的一個系統(tǒng)。這種技術(shù)就是基于服務(wù)器端的一種技術(shù),我就按照我的理解來做了一個簡單的模型(做錯的地方請大家指教J)
下面我就來介紹一下這個模型的構(gòu)造以及數(shù)據(jù)庫設(shè)計問題:
服務(wù)器A:擔(dān)任數(shù)據(jù)庫服務(wù)器同時又擔(dān)任WEB服務(wù)器(平臺WIN SERVER2000 , IIS5.0 , SQL SERVER 2000 , IP地址為192.168.0.1)
服務(wù)器B,C,D:擔(dān)任WEB服務(wù)器(平臺WIN SERVER2000 , IIS5.0 )
首先我們設(shè)計數(shù)據(jù)庫的時候要考慮的問題就是這個系統(tǒng)的特性“分布”,即A,B,C,D四臺服務(wù)器在實際應(yīng)用中他們的地理位置不一定是集中的,比如SOHU的服務(wù)器,遍布各地,但是我們每個人看到的消息都是一樣的,它也是一個較大的分布式網(wǎng)站系統(tǒng),由于地域的差異造成服務(wù)器端時間的差異,我們既要對用戶正確的表示本地的時間,又要方便管理數(shù)據(jù)庫,那么就要對入庫的數(shù)據(jù)有一個統(tǒng)一的時間編號,這個工作當(dāng)然就只有在數(shù)據(jù)庫中實現(xiàn)了,于是我設(shè)計了2個時間的字段,一個WEB_TIME用來存儲從WEB服務(wù)器傳遞過來的日期時間,一個DATA_TIME用來存儲數(shù)據(jù)入庫時當(dāng)前數(shù)據(jù)庫服務(wù)器的系統(tǒng)日期時間
這樣就完成了重要的一部,(本人遇到的在A服務(wù)器添加數(shù)據(jù)時可以寫入DATA_TIME,而無法在B,C,D服務(wù)器上寫入DATA_TIME的原因就在于忘了在該字段設(shè)置該字段不為空,呵呵,只要設(shè)置了不允許為空就ok了)然后將DATA_TIME默認值設(shè)置威getdate()這樣在寫入每條數(shù)據(jù)的時候就由SQL自己自動取得當(dāng)前數(shù)據(jù)庫服務(wù)器的系統(tǒng)時間并寫入,呵呵,這樣就完成了時間的統(tǒng)一問題,然后我比如做一個注冊系統(tǒng)再設(shè)置name和pass兩個字段來存儲用戶的用戶名和密碼,呵呵,完成了數(shù)據(jù)庫的設(shè)計,接下來就是WEB程序了,呼呼
WEB程序部分:
1. 連接數(shù)據(jù)庫(conn.asp)
對于A服務(wù)器來講,它本身既是數(shù)據(jù)庫服務(wù)器又是WEB服務(wù)器,所以它連接數(shù)據(jù)庫的代碼如下:
<%
set conn=server.createobject("ADODB.connection")
conn.open"PROVIDER=SQLOLEDB;DATASOURCE=localhost;UID=sa;PWD=;DATABASE=db"
%>
對于其他WEB服務(wù)器來講他們連接的時遠端的數(shù)據(jù)庫服務(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ù)分配解決思路
這個頁面的代碼在B,C,D服務(wù)器基本上都是一樣的了,比較特殊的就是A服務(wù)器
不過這里還有一個服務(wù)器登陸選擇的問題,(我正在研究中,呵呵,具體程序的實現(xiàn)做出來再告訴大家),不過我的設(shè)想是這樣的,我把服務(wù)器A設(shè)置為第一連接的服務(wù)器,就是所有訪問這個站點的客戶機首先都是訪問A服務(wù)器,然后A服務(wù)器再比較B,C,D三個服務(wù)器的繁忙程度,有選擇的將URL地址指向其中閑置的一臺服務(wù)器,這樣就不會出現(xiàn)服務(wù)器之間負擔(dān)的任務(wù)不均衡,這里就有一個關(guān)于統(tǒng)計服務(wù)器繁忙程度,我的思路是做一個在線統(tǒng)計程序,加在網(wǎng)站代碼中,但是A,B,C,D的程序代碼必須要帶有該服務(wù)器的標(biāo)識,然后將四臺服務(wù)器的統(tǒng)計結(jié)果在服務(wù)器A數(shù)據(jù)庫中匯合,然后服務(wù)器A通過判斷他們存入的統(tǒng)計數(shù)據(jù)來選擇服務(wù)器(有興趣的同志我們可以共同來研究)
我們先在數(shù)據(jù)庫建立一統(tǒng)計三臺服務(wù)器在線人數(shù)的數(shù)據(jù)表命名為count,設(shè)立字段NUM和SERVER_VAL和SERVER_URL分別代表在線人數(shù),和服務(wù)器名和服務(wù)器地址,并且添加進3臺WEB服務(wù)器的基本信息NUM默認為0,和每臺服務(wù)器名,以及網(wǎng)址。
――――――――――――――――――――――――――――――――――――――
然后我們在每個用戶在選擇服務(wù)器后從A服務(wù)器進入B,C,D其中的一臺服務(wù)器時,開始執(zhí)行對該服務(wù)器進行在線人數(shù)統(tǒng)計,并將結(jié)果寫入數(shù)據(jù)庫服務(wù)器A,同樣當(dāng)一個用戶離線時,也將在線人數(shù)結(jié)果寫入數(shù)據(jù)庫服務(wù)器A,這里我采用的是GLOBAL.ASA來進行統(tǒng)計(具體的統(tǒng)計方法各位可以按照您的思路來,我在這里只是拋磚引玉)
這樣基本的原理就完成了,剩下的就是網(wǎng)站建設(shè)了,在這里我把一些基本代碼寫出,請大家指教:
主服務(wù)器(數(shù)據(jù)庫服務(wù)器A SQL SERVER 2000 IIS5.0):
建立數(shù)據(jù)庫db
db下建數(shù)據(jù)表message和count
1. message數(shù)據(jù)表有字段
id(編號,主鍵) int類型 不允許為空
name char類型
pass char類型
tim datetime類型 不允許為空 (設(shè)置默認值為getdate())用于統(tǒng)一管理入庫記錄的時間,該時間以數(shù)據(jù)庫服務(wù)器系統(tǒng)時間為標(biāo)準(zhǔn)
備注:該數(shù)據(jù)表用于調(diào)試各個服務(wù)器間協(xié)作處理用戶和數(shù)據(jù)庫服務(wù)器間會話的任務(wù)
并無特殊意義。
2. count數(shù)據(jù)表有字段
id(編號,主鍵) int類型 不允許為空
num int類型
server_url nchar類型 記錄WEB服務(wù)器的ip地址
server_name nchar類型 記錄WEB服務(wù)器的編號
備注:該數(shù)據(jù)表為各個WEB服務(wù)器在線統(tǒng)計結(jié)果,以及服務(wù)器基本信息,用于主服務(wù)器判斷各個WEB服務(wù)器的繁忙程度來對來訪人數(shù)的協(xié)調(diào)。
主服務(wù)器WEB程序部分:
conn.asp 連接數(shù)據(jù)庫部分
<%
set conn=server.createobject("ADODB.connection")
conn.open"PROVIDER=SQLOLEDB;DATA SOURCE=localhost;UID=sa;PWD=;DATABASE=db"
%>
close.asp關(guān)閉數(shù)據(jù)庫程序
<%
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ù)庫服務(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ù)庫程序
<%
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)計程序)
<%@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ù)庫中沒有發(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>
共計在線<%=num%>人
</body>
</html>
default.asp用戶瀏覽頁面
<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>
<html>
<head>
<title>無標(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%>]頁 共[<%=records%>]記錄
<%if nowpage<>1 then%>
<a href="default.asp?page=<%=nowpage-1%>">[上一頁]</a>
<%else%>
[上一頁]
<%end if%>
<%if nowpage<>pages then%>
<a href="default.asp?page=<%=nowpage+1%>">[下一頁]</a>
<%else%>
[下一頁]
<%end if%>
</td>
</tr>
</table>
<!--#include file=close.asp -->
<%end if%>
</body>
</html>
write.asp寫入數(shù)據(jù)代碼頁
<%@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查詢頁
<%@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
%>
這樣整個站點的代碼就完成了,由于小弟水平有限加上時間倉促(5555,要期末考試了)請各位大俠指教,需要注意的是該程序在運行時需在數(shù)據(jù)庫中count數(shù)據(jù)表中添加進WEB服務(wù)器的基本信息,具體更具情況而言,本程序在IIS5.0 +WIN 2000SERVER+SQL SERVER2000下運行通過
3臺參加調(diào)試WEB服務(wù)器IP分別為: 192.168.0.253 192.168.0.250 192.168.0.251