如何獲取伺服器唯一標識
❶ 如何產生唯一的server id
我們都知道Mysql用server-id來唯一的標識某個資料庫實例,並在鏈式或雙主復制結構中用它來避免sql語句的無限循環。這篇文章分享下我對server-id的理解,然後比較和權衡生成唯一server-id的幾種方式。
server_id的用途
簡單說來,server_id有兩個用途:
1. 用來標記binlog event的源產地,就是SQL語句最開始源自於哪裡。
2. 用於IO_thread對主庫binlog的過濾。如果沒有設置 replicate-same-server-id=1 ,那麼當從庫的io_thread發現event的源與自己的server-id相同時,就會跳過該event,不把該event寫入到relay log中。從庫的sql_thread自然就不會執行該event。這在鏈式或雙主結構中可以避免sql語句的無限循環。
注意:相同server-id的event在io_thread這一層就過濾了;而對於replicate-(do|ignore)-等規則,則是在sql_thread這一層過濾的。io_thread和sql_thread都有過濾的功能。
server_id為何不能重復
在同一個集群中,server-id一旦重復,可能引發一些詭異問題。
看看下面兩種情況:
圖1:主庫與從庫的server-id不同,但是兩個或多個從庫的server-id相同
這種情況下復制會左右搖擺。當兩個從庫的server-id相同時,如果從庫1已經連接上主庫,此時從庫2也需要連接到主庫,發現之前有server-id相同的連接,就會先注銷該連接,然後重新注冊。
參考下面的代碼片段:
repl_failsafe (register_slave) download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int register_slave(THD* thd, uchar* packet, uint packet_length)
{
int res;
SLAVE_INFO *si;
...
if (!(si->master_id= uint4korr(p)))
si->master_id= server_id;
si->thd= thd;
pthread_mutex_lock(&LOCK_slave_list);
/* 先注銷相同server-id的連接*/
unregister_slave(thd,0,0);
/* 重新注冊*/
res= my_hash_insert(&slave_list, (uchar*) si);
pthread_mutex_unlock(&LOCK_slave_list);
return res;
...
}
兩台從庫不停的注冊,不停的注銷,會產生很多relay log文件,查看從庫狀態會看到relay log文件名不停改變,從庫的復制狀態一會是yes一會是正在連接中。
圖2:鏈式或雙主結構中,主庫與從庫的server-id相同
從庫1同時又是relay資料庫,它能正確同步,然後把relay-log內容重寫到自己的binlog中。當server-id為100的從庫2 io線程獲取binlog時,發現所有內容都是源自於自己,就會丟棄這些event。因此從庫2無法正確同步主庫的數據。只有直接寫relay server的event能正確同步到從庫2。
上面兩種情況可以看到,在同一個replication set中,保持server-id的唯一性非常重要。
server_id的動態修改
無意中發現 server-id 竟然是可以動態修改的,可別高興的太早。好處是,上面圖1的情況下,直接修改其中一個從庫的server-id就可以解決server-id沖突的問題。壞處很隱蔽,如下圖的結構:
現在假設active-master因為某種原因與passive-master的同步斷開後,passive-master上進行了一些ddl變更。然後某dba突發奇想把passive-master的server-id修改為400。當雙master的復制啟動後,那些之前在passive-master上執行的server-id為200的ddl變更,會從此陷入死循環。如果是 alter table t engine=innodb ,它會一直不停,可能你會發現。但是像 update a=a+1; 這樣的sql,你很難發現。當然這種場景只是我的杜撰,這兒有個更真實的例子 主備備的兩個備機轉為雙master時出現的詭異slave lag問題 。
舉這兩個例子只是想說明修改server-id有點危險,最好不要去修改,那麼能一步到位生成它嗎?
如何生成唯一的server_id
常用的方法有如下幾種:
1. 採用隨機數
mysql的server-id是4位元組整數,范圍從0-4294967295,因此採用該范圍內的隨機數來作為server-id產生沖突的可能性是非常小的。
2. 採用時間戳
直接用date +%s來生成server-id。一天86400秒來計算,往後計算50年,最大的server-id也才使用到86400*365*50,完全在server-id范圍內。
3. 採用ip地址+埠
這是我們經常採用的方法。例如ip為192.168.122.23,埠為3309,那麼server-id可以寫為122233309。產生沖突的可能性比較小:遇到*.*.122.23 或者*.*.12.223,而且搭建了同一個replication set的3309才會出現。
4. 採用集中的發號器
在管理伺服器上採用自增的id來統一分配server-id。這可以保證不沖突,但是需要維護中心節點。
5. 分開管理每個replication set
在每個replication set中為mysql庫增加一個管理表,保證每個從庫的server-id不沖突。
哪一種更好
上面的幾種方法都不賴,但是:
1. 方法4加了維護負擔,而且開發環境、測試環境、線上環境都維護一套發號器的話,有點麻煩,混在一起又可能遇到網段隔離的風險,還有發號器資料庫許可權的問題難於控制。所以不推薦。
2. 方法5實現了自治,但是管理成本有點高。從庫要能夠寫主庫的server-id表,復雜。
3. 5種方法都存在的問題是,使用冷備的數據來擴容,server-id需要手動去修改,否則就與冷備源的server-id沖突。而且,當mysql啟動的時候,你無法判斷該mysql是剛通過備份擴容的,還是之前一直正常運行的。所以你不知道這個server-id到底要不要改。而我希望server-id對dba完全透明,又絕不產生沖突,即可徹底屏蔽這個討厭的東西。
建議的方法
其實很簡單。ipv4是4位元組的整數,與server-id的范圍完全一樣。我們認為只有ip地址+埠才能唯一的確定一個mysql實例,所以總是希望把ip信息和埠信息都集成到server-id中。但是別忘了,一個ip上不能同時啟動兩個一樣的埠。所以,server-id只需採用ip地址的整數形式!自定義的mysql啟動腳本強制對server-id進行檢查,發現server-id不對就進行糾正,然後啟動。上面所有的問題,都會迎刃而解。
❷ php 如何獲取唯一身份訪問者,根據每一台電腦來獲得唯一的標識
需要准備的材料分別是:電腦、php編輯器、瀏覽器。
1、首先,打開php編輯器,新建php文件,例如:index.php。
❸ asp.net中獲得客戶機唯一標識的方法
你的web伺服器所能獲取的唯一標識,也就是ip了,其他的確實沒有再能標記web客戶端的地方,雖然說客戶端會改變ip,但是這個伺服器是無能為力的
除此之外就是cookie,如果沒有相應的標識,說明是第一次訪問,你可以給他一個唯一的標識cookie,這樣即使他更改ip,你也能輕易知道他原來的標識,並且做處理
❹ 使用java如何獲取計算機唯一標識(注意,操作系統不一定是windows,還要適應其它操作系統)
計算機唯一標識一般是使用網卡信息,網卡與操作系統無關。
如何用java獲取網卡信息有很多例子和代碼,網路和谷歌一下就可以了。
❺ ios 怎麼在程序里獲取唯一標識
生成iOS設備唯一標示符的方法是使用iOS設備的Media Access Control(MAC)地址。一個MAC地址是一個唯一的號碼,它是物理網路層級方面分配給網路適配器的。這個地址蘋果還有其他的名字,比如說是硬體地址(Hardware Address)或是Wifi地址,都是指同樣的東西。
有很多工程和框架都使用這個方法來生成唯一的設備ID。比如說ODIN。然而,蘋果並不希望有人通過MAC地址來分辨用戶,所以如果在iOS7系統上查詢MAC地址,它現在只會返回02:00:00:00:00:00。
現在蘋果明確的表明應該使用-[UIDevice identifierForVendor]或是-[ASIdentifierManager advertisingIdentifier]來作為你框架和應用的唯一標示符。坦白的來說,應對這些變化也不是那麼的難,見以下代碼片段:
NSString *identifierForVendor = [[UIDevice currentDevice].identifierForVendor UUIDString];
NSString *identifierForAdvertising = [[ASIdentifierManager sharedManager].advertisingIdentifier UUIDString];
每種方法都適配一種特別的用法:
identifierForVendor對供應商來說是唯一的一個值,也就是說,由同一個公司發行的的app在相同的設備上運行的時候都會有這個相同的標識符。然而,如果用戶刪除了這個供應商的app然後再重新安裝的話,這個標識符就會不一致。
advertisingIdentifier會返回給在這個設備上所有軟體供應商相同的 一個值,所以只能在廣告的時候使用。這個值會因為很多情況而有所變化,比如說用戶初始化設備的時候便會改變。
❻ 獲取一台設備唯一標識的方法有哪些,ios
藉助PP助手查看設備標識信息教程:首先在電腦上安裝好PP助手1、將iPhone/iPad/iPod連接電腦端的PP助手,點擊設備名稱→【查看更多信息】。2、在彈出來的設備詳細信息框里,就可以查看到設備標識 ,若要復制該信息,可以點擊下方「在記事本中打開」。3、用記事本打開後即可選擇需要復制的信息進行復制操作了。
❼ 如何獲取Android唯一標識
唯一ID即IMEI,獲取方式如下代碼:
TelephonyManagerTelephonyMgr=(TelephonyManager)getSystemService(TELEPHONY_SERVICE);
StringszImei=TelephonyMgr.getDeviceId();
❽ 怎麼獲取電腦唯一標識碼,網卡MAC地址不好使
1.
右鍵單擊桌面上的「網上鄰居」圖標,選擇「屬性」;
2.
在打開的窗口中,右鍵單擊「本地連接」圖標,選擇「屬性」;
3.
在打開的對話框中,將滑鼠移到「連接時使用」下面的網卡型號標識上,系統會顯示此網卡的mac地址(格式為短橫線
分隔開的6個十六進制數)。
或者:
1.
點擊「開始」,「運行」,在運行命令框中鍵入「cmd」(win98/me鍵入「command」);
2.
在彈出的dos命令窗口中輸入「ipconfig/all」命令回車(不包括引號);
3.
在運行結果中,找到physical
address……後面用短橫線分隔開的十六進制數既是網卡的mac地址xx-xx-xx-xx-xx-xx。
4.
如果用戶使用的操作系統是windows
xp及以上操作系統,可直接在dos命令窗口中輸入「getmac」命令回車(不包括引號),屏幕上顯示的「物理地址」下端即是本機網卡的mac地址。
❾ 急急急!伺服器端如何獲取客戶端的唯一標識信息的PHP代碼,謝謝!!!
如何獲取客戶端的唯一標識信息
首先服務端就排除了,因為可以用多個用戶登錄。
然後看客戶端有什麼辦法,只能是採用客戶端存儲的方式
1、cookie 這個你排除了,可能是因為清除cookie比較容易操作。但這也是一種辦法。
2、客戶端的dom存儲,這個有一定的局限,只有新的瀏覽器支持。而且同樣可以刪除。
3、插件方式,這個需要客戶安裝,一般不可能,但可以利用比較流行的安裝率比較高的插件,例如flash,採用flash的本地存儲記錄。同樣可以刪除。
如果說用mac來唯一標識,但mac也是可以修改的
這個沒有完美的解決方案,只能是盡力。
❿ 怎麼獲取電腦唯一標識碼,網卡MAC地址不好使
1. 右鍵單擊桌面上的「網上鄰居」圖標,選擇「屬性」;
2. 在打開的窗口中,右鍵單擊「本地連接」圖標,選擇「屬性」;
3. 在打開的對話框中,將滑鼠移到「連接時使用」下面的網卡型號標識上,系統會顯示此網卡的MAC地址(格式為短橫線 分隔開的6個十六進制數)。
或者:
1. 點擊「開始」,「運行」,在運行命令框中鍵入「CMD」(win98/Me鍵入「command」);
2. 在彈出的DOS命令窗口中輸入「ipconfig/all」命令回車(不包括引號);
3. 在運行結果中,找到Physical Address……後面用短橫線分隔開的十六進制數既是網卡的MAC地址xx-xx-xx-xx-xx-xx。
4. 如果用戶使用的操作系統是Windows XP及以上操作系統,可直接在DOS命令窗口中輸入「getmac」命令回車(不包括引號),屏幕上顯示的「物理地址」下端即是本機網卡的MAC地址。