當前位置:首頁 » 城管服務 » 服務一致性

服務一致性

發布時間: 2020-12-29 05:58:18

A. 分布式系統常用的一致性演算法有哪些

在做服務器負載均衡時候可供選擇的負載均衡的演算法有很多,包括: 輪循演算法(Round Robin)、哈希演算法(HASH)、最少連接演算法(Least Connection)、響應速度演算法(Response Time)、加權法(Weighted )等。其中哈希演算法是最為常用的演算法. 典型的應用場景是: 有N台伺服器提供緩存服務,需要對伺服器進行負載均衡,將請求平均分發到每台伺服器上,每台機器負責1/N的服務。 常用的演算法是對hash結果取余數 (hash() mod N):對機器編號從0到N-1,按照自定義的hash()演算法,對每個請求的hash()值按N取模,得到余數i,然後將請求分發到編號為i的機器。但這樣的演算法方法存在致命問題,如果某一台機器宕機,那麼應該落在該機器的請求就無法得到正確的處理,這時需要將當掉的伺服器從演算法從去除,此時候會有(N-1)/N的伺服器的緩存數據需要重新進行計算;如果新增一台機器,會有N /(N+1)的伺服器的緩存數據需要進行重新計算。對於系統而言,這通常是不可接受的顛簸(因為這意味著大量緩存的失效或者數據需要轉移)。那麼,如何設計一個負載均衡策略,使得受到影響的請求盡可能的少呢? 在Memcached、Key-Value Store、Bittorrent DHT、LVS中都採用了Consistent Hashing演算法,可以說Consistent Hashing 是分布式系統負載均衡的首選演算法。 1、Consistent Hashing演算法描述 下面以Memcached中的Consisten Hashing演算法為例說明。 由於hash演算法結果一般為unsigned int型,因此對於hash函數的結果應該均勻分布在[0,232-1]間,如果我們把一個圓環用232 個點來進行均勻切割,首先按照hash(key)函數算出伺服器(節點)的哈希值, 並將其分布到0~232的圓上。 用同樣的hash(key)函數求出需要存儲數據的鍵的哈希值,並映射到圓上。然後從數據映射到的位置開始順時針查找,將數據保存到找到的第一個伺服器(節點)上。 Consistent Hashing原理示意圖 新增一個節點的時候,只有在圓環上新增節點逆時針方向的第一個節點的數據會受到影響。刪除一個節點的時候,只有在圓環上原來刪除節點順時針方向的第一個節點的數據會受到影響,因此通過Consistent Hashing很好地解決了負載均衡中由於新增節點、刪除節點引起的hash值顛簸問題。 Consistent Hashing添加伺服器示意圖 虛擬節點(virtual nodes):之所以要引進虛擬節點是因為在伺服器(節點)數較少的情況下(例如只有3台伺服器),通過hash(key)算出節點的哈希值在圓環上並不是均勻分布的(稀疏的),仍然會出現各節點負載不均衡的問題。虛擬節點可以認為是實際節點的復製品(replicas),本質上與實際節點實際上是一樣的(key並不相同)。引入虛擬節點後,通過將每個實際的伺服器(節點)數按照一定的比例(例如200倍)擴大後並計算其hash(key)值以均勻分布到圓環上。在進行負載均衡時候,落到虛擬節點的哈希值實際就落到了實際的節點上。由於所有的實際節點是按照相同的比例復製成虛擬節點的,因此解決了節點數較少的情況下哈希值在圓環上均勻分布的問題。 虛擬節點對Consistent Hashing結果的影響 從上圖可以看出,在節點數為10個的情況下,每個實際節點的虛擬節點數為實際節點的100-200倍的時候,結果還是很均衡的。 第3段中有這些文字:「但這樣的演算法方法存在致命問題,如果某一台機器宕機,那麼應該落在該機器的請求就無法得到正確的處理,這時需要將當掉的伺服器從演算法從去除,此時候會有(N-1)/N的伺服器的緩存數據需要重新進行計算;」 為何是 (N-1)/N 呢?解釋如下: 比如有 3 台機器,hash值 1-6 在這3台上的分布就是: host 1: 1 4 host 2: 2 5 host 3: 3 6 如果掛掉一台,只剩兩台,模數取 2 ,那麼分布情況就變成: host 1: 1 3 5 host 2: 2 4 6 可以看到,還在數據位置不變的只有2個: 1,2,位置發生改變的有4個,占共6個數據的比率是 4/6 = 2/3這樣的話,受影響的數據太多了,勢必太多的數據需要重新從 DB 載入到 cache 中,嚴重影響性能 【consistent hashing 的辦法】 上面提到的 hash 取模,模數取的比較小,一般是負載的數量,而 consistent hashing 的本質是將模數取的比較大,為 2的32次方減1,即一個最大的 32 位整數。然後,就可以從容的安排數據導向了,那個圖還是挺直觀的。 以下部分為一致性哈希演算法的一種PHP實現。點擊下載

B. 請教個問題基於RPC,RMI等遠程調用服務的事務怎麼保證強一致性要求。JTA能做到嗎

感測器來是一種檢測裝源置,能感受到被測量的信息,並能將感受到的信息,按一定規律變換成為電信號或其他所需形式的信息輸出,以滿足信息的傳輸、處理、存儲、顯示、記錄和控制等要求。
感測器的特點包括:微型化、數字化、智能化、多功能化、系統化、網路化。它是實現自動檢測和自動控制的首要環節。感測器的存在和發展,讓物體有了觸覺、味覺和嗅覺等感官,讓物體慢慢變得活了起來。通常根據其基本感知功能分為熱敏元件、光敏元件、氣敏元件、力敏元件、磁敏元件、濕敏元件、聲敏元件、放射線敏感元件、色敏元件和味敏元件等十大類。

C. 如何保證微服務架構下數據的一致性

1. 性能和時延問題 在服務化之前,業務通常都是本地API調用,本地方法調用性能損耗較回校服務化之後,服答務提供者和消費者之間採用遠程網路通信,增加了額外的性能損耗: 1) 客戶端需要對消息進行序列化,主要佔用CPU計算資源。

D. 如何保證兩端時間一致性

保證兩端時間一致性是指在Android與伺服器通訊中保證兩端時間一致性,方法如內下: 1、在app的setting中有容3個變數org_tablet_tm,org_server_tm和server_timezone,App啟動的時候,即聯線伺服器取回當時的時間和伺服器所在時區分別保存在org_serve...

E. java里客戶端服務端發送接收怎麼保持一致性

1. Server代碼:
package com.javacodegeeks.android.androidsocketserver;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.widget.TextView;

public class Server extends Activity
{
private ServerSocket serverSocket;
private Handler updateConversationHandler;
private Thread serverThread = null;
private TextView text;
public static final int SERVERPORT = 6000;

@Override
public void onCreate(Bundle savedInstanceState)
{

.onCreate(savedInstanceState);
setContentView(R.layout.main);

text = (TextView) findViewById(R.id.text2);

updateConversationHandler = new Handler();

this.serverThread = new Thread(new ServerThread());
this.serverThread.start();

}

@Override
protected void onStop()
{
super.onStop();
try
{
serverSocket.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}

private class ServerThread implements Runnable
{

public void run()
{
Socket socket = null;
try
{
serverSocket = new ServerSocket(SERVERPORT);
}
catch (IOException e)
{
e.printStackTrace();
}
while (!Thread.currentThread().isInterrupted())
{
try
{
socket = serverSocket.accept(); // TODO

CommunicationThread commThread = new CommunicationThread(socket);
new Thread(commThread).start();
}
catch (IOException e)
{
Log.i("liu", "socket.accept()失敗");

e.printStackTrace();
}
}
}
}

private class CommunicationThread implements Runnable
{
private Socket clientSocket;
private BufferedReader input;

public CommunicationThread(Socket clientSocket)
{
this.clientSocket = clientSocket;

Log.i("liu", "獲取到了client的Socket");

try
{
this.input = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream())); // TODO
}
catch (IOException e)
{
Log.i("liu", "input獲取失敗");
e.printStackTrace();
}
}

public void run()
{
while (!Thread.currentThread().isInterrupted())
{
try
{
String read = input.readLine(); // TODO
Log.i("liu", read);
updateConversationHandler.post(new updateUIThread(read));
}
catch (IOException e)
{
Log.i("liu", "input讀取失敗");
e.printStackTrace();
}
}
}
}

private class updateUIThread implements Runnable
{
private String msg;

public updateUIThread(String str)
{
this.msg = str;
}

@Override
public void run()
{
text.setText(text.getText().toString() + "Client Says: " + msg + "\n");
}

}

}
2. Client代碼:

package com.javacodegeeks.android.androidsocketclient;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;

public class Client extends Activity
{
private Socket socket;
private static final int SERVERPORT = 4000;
private static final String SERVER_IP = "10.0.2.2";

@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

new Thread(new ClientThread()).start();
}

public void onClick(View view)
{
try
{
EditText et = (EditText) findViewById(R.id.EditText01);
String str = et.getText().toString();

Log.i("liu", "點擊按鈕");

PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); // TODO
out.println(str);
}
catch (Exception e)
{
Log.i("liu", "write失敗");
e.printStackTrace();
}
}

class ClientThread implements Runnable
{

@Override
public void run()
{
try
{
InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
socket = new Socket(serverAddr, SERVERPORT);
}
catch (UnknownHostException e1)
{
e1.printStackTrace();
}
catch (IOException e1)
{
e1.printStackTrace();
}
}
}
}
3. 附件 是 客戶端和服務端 的源碼。

F. 怎麼保證服務可靠性,數據一致性,以及一旦宕機數據恢復

嚴格的說,Hbase 和它的支持系統源於著名的Google BigTable和Google文件系統設計(GFS的論文發於2003年,BigTable的論文發於2006年)。而 Cassandra 則是最近Facebook的資料庫系統的開源分支,她在實現了BigTable的數據模型的同時,使用了基於Amazon的Dynamo的系統架構來存儲數據(實際上,Cassandra的最初開發工作就是由兩位從Amazon跳槽到Facebook的Dynamo工程師完成的)。
【備注1】Dynamo是亞馬遜的key-value模式的存儲平台,可用性和擴展性都很好,性能也不錯:讀寫訪問中99.9%的響應時間都在300ms內。
在Dynamo的實現中提到一個關鍵的東西,就是數據分區。假設我們的數據的key的范圍是0到2的64次方(不用懷疑你的數據量會超過它,正常甚至變態情況下你都是超不過的,甚至像伏地魔等其他類Dynamo系統是使用的 2的32次方),然後設置一個常數,比如說1000,將我們的key的范圍分成1000份。然後再將這1000份key的范圍均勻分配到所有的節點(s個節點),這樣每個節點負責的分區數就是1000/s份分區。
如圖二,假設我們有A、B、C三台機器,然後將我們的分區定義了12個。

圖二:三個節點分12個區的數據的情況
因為數據是均勻離散到這個環上的(有人開始會認為數據的key是從1、2、3、4……這樣子一直下去的,其實不是的,哈希計算出來的值,

【備注2】DHT(Distributed Hash Table,分布式哈希表),它是一種分布式存儲定址方法的統稱。就像普通的哈希表,裡面保存了key與value的對應關系,一般都能根據一個key去對應到相應的節點,從而得到相對應的value。

【備注3】Consistency(一致性):即數據一致性,簡單的說,就是數據復制到了N台機器,如果有更新,要N機器的數據是一起更新的。
Availability(可用性):好的響應性能,此項意思主要就是速度。
Partition tolerance(分區容錯性):這里是說好的分區方法,體現具體一點,簡單地可理解為是節點的可擴展性。
定理:任何分布式系統只可同時滿足二點,沒法三者兼顧

這個理論說明,分布式(或共享數據)系統的設計中,至多隻能夠提供三個重要特性中的兩個——一致性、可用性和容忍網路分區。簡單的說,一致性指如果一個人向資料庫寫了一個值,那麼其他用戶能夠立刻讀取這個值,可用性意味著如果一些節點失效了,集群中的分布式系統仍然能繼續工作,而容忍分區意味著,如果節點被分割成兩組無法互相通信的節點,系統仍然能夠繼續工作

對比關系型資料庫,NoSQL的優點在哪裡看NoSQL具有高性能、良好的擴展性以及高可靠性等優點。然而,沒有一個產品可以在所有的方面都達到完美。當你仔細審視NoSQL的產品,完全可以找到一些弱點,就像那些傑出的優點一樣逗鮮明出眾地。基於此原因,選擇經過驗證的NoSQL產品就是關鍵。在本文中,作者從運行方面分析Cassandra,HBase以及MongoDB等產品的擴展性和可靠性。
Cassandra故障恢復以及數據一致性

Cassandra在數據的分布式和可靠性方面展示了自身卓越的性能。首先,作者檢測了它的分布能力,Cassandra通過一致性哈希演算法來實現數據的分配處理。
Cassandra的一致性哈希演算法
通過一致性哈希演算法,用戶可以不經過查詢元數據就能搜索並發現key存儲在哪個節點上。用戶通過計算key的哈希值就能發現key,同樣只通過Hash值就可以找到節點所在。你可以想像一致性哈希被作為哈希值順序的放在圓環上,每個節點處理環上的一個部分。如果環上增加了一個節點,那麼某個擁有很大體積數據的特定節點就會被拆分然後分配給新的節點;如果某個節點被移除,分配給該節點的資源就會轉移到鄰節點上。利用這種方式,Cassandra使增加或者移除節點帶來的影響降到了最小。
Cassandra的運行中不需要主伺服器,換句話說:並沒有特定的伺服器來管理數據的分配或者故障恢復。這就意味著,Cassandra並不存在單點故障(Single Point Of Failure,SPoF)。取代主伺服器,每個節點都和其他節點周期性地分享元數據,這個也被稱之為Gossip協議。使用Gossip協議,節點可以對其他節點的運行狀態進行查詢。
Cassandra通過提供一致性級別來實現系統的可靠性。如果使用一個很低的一致性級別,即使一個節點宕掉也可能導致整個服務的停滯。例如,3個節點中的某一個節點在存儲副本數據的過程中宕掉了,一個通用的寫操作,就不能立刻返回成功信息,這是因為故障節點不能完成寫入數據的請求。然而,如果一致性級別被定義成一個約定值或者是1,而存活的節點數大於或者等於設定值,這樣的話就能立刻返回成功。如果是這樣的話,只有在所有的3個節點都同時宕掉,才會發生請求錯誤。
但是,讀/寫操作真的沒有受到節點出錯的影響嗎看
為了證明這點,當有新節點添加時,作者在不斷的伺服器請求下故意讓一個節點發生故障。結果如下所示:
移除一個節點和增加一個新的節點
以下是移除一個節點和增加一個新的節點的結果:
在管理工具中明確移除一個節點,存儲在此節點中的數據就被遷移到剩餘的節點中,然後該節點被移除。
當一個新節點被增加,這個被稱之為引導指令,增加的節點就會向種子節點(seed nodes)報告它已經添加完畢。基於配置信息,新節點會被添加在環上配置信息中指定的范圍,或者環上資源被佔用最高的節的附近—— 當然這是在沒有其它節點被引導在這個范圍上。
數據從那個節點遷移到到新節點上。
一旦數據遷移進程結束,新節點就能進行使用。
節點失敗後增加一個新節點
下面是節點失敗後新增節點的結果:
當一個節點宕掉之後,存儲在節點上的數據並沒有遷移到其他的節點上,服務在於兩個副本(節點)共舞。換句話說,並沒有返回任何錯誤信息,即使在這段時間里又收到服務請求。
當一個新節點被增加的時候,該節點會被分配到環上的一個特定區域。然而,引導指令並沒有執行,因為引導指令只有系統中存在3份副本的時候才會被執行!
新增的節點並沒有數據,但是它能處理請求,這是因為它可以提供服務。如果此時接受到一個讀請求,節點並不會對key返回數據。如果備份因子是3而讀一致性的級別是1,那麼1/3的讀請求可能不會返回數據。如果一致性級別被設置為約定值,1/6的讀請求可能會返回空數據。簡單來講,這沒有讀一致性的保證,除非故障節點已經恢復。實際上在級別1中,協調節點是最有可能第一個接受來自新節點的響應。出現這種情況是因為沒有來自新節點的I/O請求——因為它沒有數據。出於這個原因,新的節點比現有節點有更大的機率返回空數據。
當通過管理工具對新節點做Read Repair時,節點通過讀其他節點的同步數據才能得以建立。此時讀一致性就被破壞了,只到Read Repair完成。
即使節點失敗,Cassandra也能提供無錯的服務。盡管Cassandra在寫數據的時候,展示了自身強大的性能,但是在讀數據的時候並非如此,因為Read Repair的延遲必然導致數據的非一致性的延遲。因此,為了在節點故障中保持讀一致性,需要使用以下的方法:
設置讀一致性水平為逗all地然後執行讀操作。在這種情況下,就能獲得所有來自副本的最新數據。
一旦讀請求失敗,Cassandra會再次進行嘗試。這是因為在第一次讀寫的時候Read Repair可能會作為第二次讀寫時的恢源數據源。然而,這種方法能確保Rread Repair在二次讀之前完成。(當一致性的水平較低,那麼讀修復就會在後台執行,這是一個獨立的線程,區別於讀操作過程的線程)
HBase的失敗因子和恢復方法
HBase包含以下幾個組件:

HRegionServer負責數據的分布處理,由HMaster進行監控。HDFS存儲和復制數據,Zookeeper存儲了HMaster以及備選HMaster的儲存單元信息。如果沒有為每個組件建立冗餘,所有的組件都會成為SPoF。
HRegionServer主要負責響應用戶I/O請求,向HDFS文件系統中讀寫數據,是HBase中最核心的模塊。HRegionServer內部管理了一系列HRegion對象,每個HRegion對應了Table中的一個Region,HRegion中由多個HStore組成。每個HStore對應了Table中的一個Column Family的存儲,可以看出每個Column Family其實就是一個集中的存儲單元,因此最好將具備共同IO特性的column放在一個Column Family中,這樣最高效。(網路)
HRegionServer把數據分布到一些稱之為逗region地的單元中,region就是將一張大表格通過指定欄位對數據進行排序,然後針對排序鍵的范圍拆分出的結果(就像大表中的一小塊)。每個region排序欄位的值范圍存儲在一個單獨的region中,被稱為meta region。而region和meta region的對應關系被存儲在root region中。長話短說,region伺服器存儲著一個層次樹中,包含了root region、meta region以及data region。如果一個region伺服器宕機,這個region伺服器包含的region都不可以被訪問直到被分配給了其它region伺服器。因此產生了伺服器宕機時間,直到那個region被恢復。

G. 麥當勞為什麼可以提供全球一致性的優質服務

加盟的門檻高,品牌的自我保護意識強,國內很多品牌也做加盟連鎖,為了迅速擴張,佔領市場,盲目擴張,慢慢的,品牌就散了,非常不統一

H. 網路存儲伺服器存儲空間數據一致性檢查咋會這么慢

ds1618+ NAS 4塊8T硬碟 組RAID6 文件系統Btrfs 數據一致性檢查11個小時才完成65%

I. 論「外行領導內行」與「領導就是服務」的一致性。

這是一個宏觀的角度。「外行領導內行」,是這么說,外部事物決定內在回的方向,「領導就是答服務」,領導的作用在於發揮這個團體或者說組織起一些事物,使之成為一種可用力量,這個力量對於更大的整體來說就是一種服務,打個比方,把人看作一個整體,胃,服務於整個身體,為之消化食物提供營養,大腦中的這方面的神經系統領導著這一行為,他們是整體服務的。
這兩句話是相對的層面看的,整體決定局部.

J. 身為服務明星,如何帶頭做好保持服務一致性

首先要起好帶頭作用,接下來就是多培訓了,人都有盲從的心理,你帶頭帶好了,自然就有人學. 然後就是培訓了, 要以洗腦為前提,加大培訓力度.

熱點內容
影視轉載限制分鍾 發布:2024-08-19 09:13:14 瀏覽:319
韓國電影傷口上紋身找心裡輔導 發布:2024-08-19 09:07:27 瀏覽:156
韓國電影集合3小時 發布:2024-08-19 08:36:11 瀏覽:783
有母乳場景的電影 發布:2024-08-19 08:32:55 瀏覽:451
我准備再看一場電影英語 發布:2024-08-19 08:14:08 瀏覽:996
奧迪a8電影叫什麼三個女救人 發布:2024-08-19 07:56:14 瀏覽:513
邱淑芬風月片全部 發布:2024-08-19 07:53:22 瀏覽:341
善良媽媽的朋友李采潭 發布:2024-08-19 07:33:09 瀏覽:760
哪裡還可以看查理九世 發布:2024-08-19 07:29:07 瀏覽:143
看電影需要多少幀數 發布:2024-08-19 07:23:14 瀏覽:121