PCDVD數位科技討論區

PCDVD數位科技討論區 (https://www.pcdvd.com.tw/index.php)
-   七嘴八舌異言堂 (https://www.pcdvd.com.tw/forumdisplay.php?f=12)
-   -   全世界最大的硬碟..... 應該放什麼好呢 ?! (https://www.pcdvd.com.tw/showthread.php?t=842121)

阿飄 2009-03-04 02:34 AM

不要再想些有的沒的
verycd 的做法你可以參考 至少檔案有一個備份
可行的話早就有人做 你的想法我已經聽好幾個人說過了
要做也不是你做 google會去做
光是版權問題就搞死人

chlang 2009-03-04 02:39 AM

引用:
作者TRG-pro
2000% 的資料量=重複率又變成20了?怎麼變來變去?

舉個500%資料量的例子,

資料首先會先打散成 100 份. (假設1% 作一個切割)

然後儲存在 500 台電腦中. (每台儲存 1%, 全部總共有 500% 的資料量)

因此是 500個1%的來源。只要其中有10台不開機,順利完檔的機率有多少?


這個20倍/5倍的假設是可以調整的.
你覺得現在需要針對這個作討論嗎 ?

其次, 根據不同的上線機器數量, 而完檔率的假設,
這邊有個模擬程式, 是針對不同機器數量以及資料內容 作假設, 麻煩你參考.

http://forum.dodopie.com/viewthread.php?tid=2387

程式碼片段: (模擬單一台電腦的容量/上下線狀態)
代碼:

        public class Node
        {
                int nodeNo;
                boolean active=false;
                int nextActiveTime=0; // minute;
                ArrayList <String>pieces=new ArrayList<String>();
                int curActiveTime=0; // how many minute I left;
                Random r = new Random();
                int nodeSpeed=2; // mb/Min
                
                
                StaticsSimulator staticx=null;
                public Node(StaticsSimulator x)
                {
                        staticx=x;
                        this.nodeSpeed = x.nodeSpeed;
                }
                
                /**
                 * initialize my active time/status
                 */
                public void init() {
                        nextActiveTime = r.nextInt(avgSleepTime);
                }

                public ArrayList<String> getPieces()
                {
                        return pieces;
                }
                
                public void tick()
                {
                        nextActiveTime-=1;
                        curActiveTime-=1;
                        updateStatus();
                        if (active && pieces.size()<1)
                                System.out.println("What ?! I am empty:" + pieces.size());
                        
                }
                
                public void updateStatus()
                {
                        double rx = r.nextDouble();
                        if (rx<staticx.nodeCrashRate)
                        {
                                forceDeActiveX();
                                if (active)
                                        forceDeActive();
                                // node crashed.
                                pieces.clear();
                                staticx.failNodeCnt++;
                                active=false;
                                calcNextActive();
                                return;
                        }
                                
                        if (curActiveTime==0){
                                active=false;
                                forceDeActive();
                        }else
                        if (nextActiveTime==0){
                                forceActive();
                        }
                        
                        if (active)
                        {
                                // check my pieces. purge too onLineHealth pieces
                                // get less healthy pieces from other peer.
                                for (int i=0; i< nodeSpeed;i++)
                                {
                                        String myMostHealthPiece = "";
                                        if (pieces.size() >=nodeCapability){
                                                myMostHealthPiece=getMyMostHealthPiece();
                                                
                                                // don't do anything if my piece is too unhealthy.
                                                PieceHealth ph = totalPieces.get(myMostHealthPiece);
                                                if (ph.getGlobalHealth()<=1){
                                                        myMostHealthPiece="";
                                                        continue;
                                                }
                                                
                                        }
                                        String leastHealthPiece=staticx.getLeastHealthPiece(pieces);
                                        
        
                                        if (leastHealthPiece!=null && leastHealthPiece.length()>0){
                                                if (myMostHealthPiece!=""){
                                                        if (pieces.size()>=nodeCapability){
                                                                pieces.remove(myMostHealthPiece);
                                                                staticx.unRegPiece(myMostHealthPiece);
                                                                staticx.delPiece(myMostHealthPiece);
                                                        }
                                                }
                                                pieces.add(leastHealthPiece);
                                                staticx.regPiece(leastHealthPiece);
                                                staticx.addPiece(leastHealthPiece);
                                                
                                        }else
                                        {
                                                System.out.println("XD. no Least Health Piece exists ?");
                                        }
                                }
                                
                        }
                }
                
                /**
                 * 
                 * @return
                 */
                private String getMyMostHealthPiece() {
                        String ret="";
                        int health=-1;
                        for (String x:pieces)
                        {
                                PieceHealth ph=staticx.totalPieces.get(x);
                                if (ph.getOnLineHealth()>health)
                                {
                                        ret = x;
                                        health=ph.getOnLineHealth();
                                }
                        }
                        return ret;
                }

                
                private void forceDeActiveX()
                {
                        for (String i:pieces)
                        {
                                staticx.delPiece(i);
                        }
                }
                
                private void forceDeActive() {
                        for (String i:pieces)
                        {
                                staticx.unRegPiece(i);
                        }
                }
                


                /**
                 * 
                 * @param pieceNo
                 * @return -1 = no removal.
                 */
                public String addPiece(String pieceNo)
                {
                        String removed="";
                        if (pieces.size()>= nodeCapability)
                        {
                                removed=pieces.remove(0);
                        }
                        pieces.add(pieceNo);
                        
                        return removed;
                }
                
                public void forceActive()
                {
                        active=true;
                        calcNextActive();
                        calcCurActive();
                        // register my pieces
                        for (String i:pieces)
                        {
                                staticx.regPiece(i);
                        }
                }
                
                public void calcNextActive()
                {
                        
                        while (nextActiveTime <=0){
                                double d=r.nextGaussian();
                                nextActiveTime = avgSleepTime + (int)(d*avgSleepTime/4);
                        }
                }
                
                public void calcCurActive()
                {
                        double d=r.nextGaussian();
                        curActiveTime = activeDuration + (int)(d*activeDuration/4);
                }
                
                public boolean isActive()
                {
                        return active;
                }
                
                @Override
                public String toString()
                {
                        StringBuffer sb = new StringBuffer();
                        sb.append("Active:" + active);
                        sb.append("\nPieces:");
                        for (String pie:pieces)
                        {
                                sb.append(pie + "\t");
                        }
                        sb.append("\n");
                        return sb.toString();
                }
        }

chlang 2009-03-04 02:42 AM

引用:
作者阿飄
不要再想些有的沒的
verycd 的做法你可以參考 至少檔案有一個備份
可行的話早就有人做 你的想法我已經聽好幾個人說過了
要做也不是你做 google會去做
光是版權問題就搞死人


嗯. 目前這是另外一個隱憂, 版權的問題.
目前的態度是 "個人空間, 除非使用者自己揭露給大眾知道 (釋放連結), 否則不會被觸碰"
但是的確還是可能會有法律爭議.

至於 Google 的作法叫做 "MapReduce", 主要是針對 "不關機的伺服器群" 而設計的.
跟我們 "不確定性散步" 的使用者有差別.


引用:
作者jjhuang.tw
不用的時候我會關掉..


根據我們的模擬模型.

目前主要是以 "平均一台機器 24 小時可能開機一小時" 作為模擬.

並沒有強迫使用者不關機啊 ^^;

u3350829 2009-03-04 02:55 AM

多年前....在下跟三五好友想說弄個網路分享,就使用當時很紅的
SoftEth,一台Server當Router + HUB然後其他人加入這個虛
擬的LAN,之後只要電腦開簡單的檔案分享區所有人都可以存取,
這個互通有無的方式最後甚至變成P2P大家分開抓不同的東西,
在透過這個互相分享,直到今日這個系統依然存在....缺的只是
更大的上傳頻寬而已XD,重點是這個系統幾乎可以穿過所有防火
牆(除非連80port這些都關光光)而且封包全部加密,別人想連到
這個虛擬LAN還需要有我們發的憑證才有辦法,安全性一流....
至於樓主您想做的東西基本上還不如自己架一台eMule Server然
後做好控管來的容易的多,頂多再自己改一些東西....供參考!

lanthanum 2009-03-04 02:59 AM

這個早就有阿...
對岸的納米盤就是這樣阿,只是空間較小
且無法搜尋儲存內容..

只要改進搜尋就跟你說得差不多了

Computer Cowboy 2009-03-04 03:10 AM

引用:
作者chlang
嗯. 目前這是另外一個隱憂, 版權的問題.
目前的態度是 "個人空間, 除非使用者自己揭露給大眾知道 (釋放連結), 否則不會被觸碰"
但是的確還是可能會有法律爭議.

至於 Google 的作法叫做 "MapReduce", 主要是針對 "不關機的伺服器群" 而設計的.
跟我們 "不確定性散步" 的使用者有差別.




根據我們的模擬模型.

目前主要是以 "平均一台機器 24 小時可能開機一小時" 作為模擬.

並沒有強迫使用者不關機啊 ^^;


版權問題一定是大問題, 至於說連結不會給人散發出去, 就更加是很傻很天真了。
無心之失的不說, 如果我是釣魚的, 我只要加入樓主的社群, 再上傳一套有版權的電影, 然後將連結散發出去, 樓主不知道準備了多大的律師團隊? :D

applecore 2009-03-04 03:14 AM

我覺得技術性的問題的確是沒那麼重要,反而應該先討論的是主要的訴求應用在哪、可不可行。

1. 共享好康:這個目前很多系統運作的很好了,樓主的idea似乎也沒有特別的優勢。

2. 網路硬碟:我把這項跟「共享好康」區隔開來,在此項指的就是重複性不大的資料,顯然這會對空間利用率形成很大壓力,所以樓主的idea也不適合。

3. 異地備援:沒哪個企業機關敢用的,因為既然是重要的資料,誰敢放在不知哪個阿貓阿狗的硬碟上,這不是有沒有加密的問題,而是沒有哪個企業願意允許別人任意存取它的機密資料(即使別人"應該""大概""通常""也許"解不開)。

此外,如果是"真正的"分散處理 (免中央伺服器),那就很難實現分級服務收費機制與有效的搜尋了,而如果還是存在某種程度的中央伺服器,那就還是要面對運作成本與法律的問題。



我不是要潑樓主冷水喔,我覺得任何idea在初期一定是很粗糙的,需要很多的琢磨才會比較成熟可行,這很正常。但是如果沒有先思慮週延就貿然投入,邊作邊修正,最後可能就會作白工。

foxtm 2009-03-04 03:30 AM

引用:
作者chlang
這部份前面有提到了.
不是使用者 "把目前的檔案分享出去"
而是 使用者硬碟裡面有 "打散的資料"
因此多的 Peer 數目不是 5-20, 而是 1000

不..打散開來還是5份20份..
舉個例子你可能會比較清楚..

假設某個檔案片段被 A B C D E 五台電腦持有..而有一百個人需要這部份..

在傳統的 p2p 模式中.. F G H I J 等另五台電腦抓完以後..
這段片段可以轉為上傳..所以剩下的95人可以使用 A~J 電腦的上傳頻寬抓這段片段..

但在你的系統中..因為不能讓檔案重複太多份..
所以 F~J 的電腦抓完後不會放到分享區..不會提供上傳..
剩下的 95 人還是只能用 A~E 的上傳頻寬抓檔..

請問是 A~E 的上傳頻寬多呢?還是 A~J 的上傳頻寬多呢?

你被表面上的千份迷惑住了..
實際上在你的系統網路上檔案實際上只有5份20份..
雖然可以分散到各機器..
但實際上會遭受到持有檔案機器的總上傳頻寬限制
所以你的系統註定比 p2p 慢或是同速..

★_★ 2009-03-04 08:09 AM

像樓上所說,人很難管理
到時一定會有幾個自私的傢伙
破解.放毒.放假檔.惡搞通通來 :think:

咕咕鳥 2009-03-04 09:09 AM

看壞的人居多.....

不過...樓上有人提出一個看法...
用在辦公室環境....這就很好用了...
我也建議這個方向
1.頻寬至少是100mb
2.有資料備份的需求
3.上班時間保證都開機
4.空閒磁區都有...
5.公司得花錢買軟體...不買告他...個人會找破解檔...(簡單說...你會有錢賺)
大於5個人的公司都會有資料備份的需求...一般是買NAS...
低價有RAID1的....也要10K左右...兩顆1T做RAID 1..只能用1T
你的軟體只要.不能跨網段...儲存在各磁碟機的資料加密
限制人數分一般版10人(3K)跟PRO版不限人數(5K)....
能設定備份率跟分享容量...(會開一個虛擬磁碟)

假設辦公室有20人
每人出20G就400G
扣掉一半的備份率...也有200G能用
(這樣..就不用買NAS了...)
A電腦掛了...MIS換一台...裝上你的軟體..
30分鐘...文件匣,MAIL又通通跑回來了
期間已經能正常工作了...
平常不用多花時間去備份....

很有機會賺錢...
至少我會跟我主管提要不要買...
之前公司的備份HD掛了....花兩萬去救....
有這軟體就不用買NAS了...


所有的時間均為GMT +8。 現在的時間是02:04 AM.

vBulletin Version 3.0.1
powered_by_vbulletin 2025。