最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL如何生成唯一的server-id

 更新時間:2019年09月07日 11:23:47   作者:Learn and Share  
這篇文章主要給大家介紹了關(guān)于MySQL如何生成唯一的server-id的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

前言

我們都知道MySQL用server-id來唯一的標(biāo)識某個數(shù)據(jù)庫實(shí)例,并在鏈?zhǔn)交螂p主復(fù)制結(jié)構(gòu)中用它來避免sql語句的無限循環(huán)。這篇文章分享下我對server-id的理解,然后比較和權(quán)衡生成唯一server-id的幾種方式。

server_id的用途

簡單說來,server_id有兩個用途:

1. 用來標(biāo)記binlog event的源產(chǎn)地,就是SQL語句最開始源自于哪里。

2. 用于IO_thread對主庫binlog的過濾。如果沒有設(shè)置replicate-same-server-id=1,那么當(dāng)從庫的io_thread發(fā)現(xiàn)event的源與自己的server-id相同時,就會跳過該event,不把該event寫入到relay log中。從庫的sql_thread自然就不會執(zhí)行該event。這在鏈?zhǔn)交螂p主結(jié)構(gòu)中可以避免sql語句的無限循環(huán)。

注意:相同server-id的event在io_thread這一層就過濾了;而對于replicate-(do|ignore)-等規(guī)則,則是在sql_thread這一層過濾的。io_thread和sql_thread都有過濾的功能。

server_id為何不能重復(fù)

在同一個集群中,server-id一旦重復(fù),可能引發(fā)一些詭異問題。

看看下面兩種情況:

圖1:主庫與從庫的server-id不同,但是兩個或多個從庫的server-id相同

這種情況下復(fù)制會左右搖擺。當(dāng)兩個從庫的server-id相同時,如果從庫1已經(jīng)連接上主庫,此時從庫2也需要連接到主庫,發(fā)現(xiàn)之前有server-id相同的連接,就會先注銷該連接,然后重新注冊。

參考下面的代碼片段:

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;
...
}

兩臺從庫不停的注冊,不停的注銷,會產(chǎn)生很多relay log文件,查看從庫狀態(tài)會看到relay log文件名不停改變,從庫的復(fù)制狀態(tài)一會是yes一會是正在連接中。

圖2:鏈?zhǔn)交螂p主結(jié)構(gòu)中,主庫與從庫的server-id相同

從庫1同時又是relay數(shù)據(jù)庫,它能正確同步,然后把relay-log內(nèi)容重寫到自己的binlog中。當(dāng)server-id為100的從庫2 io線程獲取binlog時,發(fā)現(xiàn)所有內(nèi)容都是源自于自己,就會丟棄這些event。因此從庫2無法正確同步主庫的數(shù)據(jù)。只有直接寫relay server的event能正確同步到從庫2。

上面兩種情況可以看到,在同一個replication set中,保持server-id的唯一性非常重要。

server_id的動態(tài)修改

無意中發(fā)現(xiàn)server-id竟然是可以動態(tài)修改的,可別高興的太早。好處是,上面圖1的情況下,直接修改其中一個從庫的server-id就可以解決server-id沖突的問題。壞處很隱蔽,如下圖的結(jié)構(gòu):

現(xiàn)在假設(shè)active-master因?yàn)槟撤N原因與passive-master的同步斷開后,passive-master上進(jìn)行了一些ddl變更。然后某dba突發(fā)奇想把passive-master的server-id修改為400。當(dāng)雙master的復(fù)制啟動后,那些之前在passive-master上執(zhí)行的server-id為200的ddl變更,會從此陷入死循環(huán)。如果是alter table t engine=innodb,它會一直不停,可能你會發(fā)現(xiàn)。但是像update a=a+1;這樣的sql,你很難發(fā)現(xiàn)。當(dāng)然這種場景只是我的杜撰,這兒有個更真實(shí)的例子主備備的兩個備機(jī)轉(zhuǎn)為雙master時出現(xiàn)的詭異slave lag問題:http://hatemysql.com/2010/10/15/主備備的兩個備機(jī)轉(zhuǎn)為雙master時出現(xiàn)的詭異slave-lag問題/。

舉這兩個例子只是想說明修改server-id有點(diǎn)危險,最好不要去修改,那么能一步到位生成它嗎?

生成唯一的server_id

常用的方法有如下幾種:

1. 采用隨機(jī)數(shù)

mysql的server-id是4字節(jié)整數(shù),范圍從0-4294967295,因此采用該范圍內(nèi)的隨機(jī)數(shù)來作為server-id產(chǎn)生沖突的可能性是非常小的。

2. 采用時間戳

直接用date +%s來生成server-id。一天86400秒來計(jì)算,往后計(jì)算50年,最大的server-id也才使用到86400*365*50,完全在server-id范圍內(nèi)。

3. 采用ip地址+端口

這是我們經(jīng)常采用的方法。例如ip為192.168.122.23,端口為3309,那么server-id可以寫為122233309。產(chǎn)生沖突的可能性比較小:遇到*.*.122.23 或者*.*.12.223,而且搭建了同一個replication set的3309才會出現(xiàn)。

4. 采用集中的發(fā)號器

在管理服務(wù)器上采用自增的id來統(tǒng)一分配server-id。這可以保證不沖突,但是需要維護(hù)中心節(jié)點(diǎn)。

5. 分開管理每個replication set

在每個replication set中為mysql庫增加一個管理表,保證每個從庫的server-id不沖突。

上面的幾種方法都不賴,但是:

  • 方法4加了維護(hù)負(fù)擔(dān),而且開發(fā)環(huán)境、測試環(huán)境、線上環(huán)境都維護(hù)一套發(fā)號器的話,有點(diǎn)麻煩,混在一起又可能遇到網(wǎng)段隔離的風(fēng)險,還有發(fā)號器數(shù)據(jù)庫權(quán)限的問題難于控制。所以不推薦。
  • 方法5實(shí)現(xiàn)了自治,但是管理成本有點(diǎn)高。從庫要能夠?qū)懼鲙斓膕erver-id表,復(fù)雜。
  • 5種方法都存在的問題是,使用冷備的數(shù)據(jù)來擴(kuò)容,server-id需要手動去修改,否則就與冷備源的server-id沖突。而且,當(dāng)mysql啟動的時候,你無法判斷該mysql是剛通過備份擴(kuò)容的,還是之前一直正常運(yùn)行的。所以你不知道這個server-id到底要不要改。而我希望server-id對dba完全透明,又絕不產(chǎn)生沖突,即可徹底屏蔽這個討厭的東西。

建議的方法

其實(shí)很簡單。ipv4是4字節(jié)的整數(shù),與server-id的范圍完全一樣。我們認(rèn)為只有ip地址+端口才能唯一的確定一個mysql實(shí)例,所以總是希望把ip信息和端口信息都集成到server-id中。但是別忘了,一個ip上不能同時啟動兩個一樣的端口。所以,server-id只需采用ip地址的整數(shù)形式:select INET_ATON('192.168.12.45'),3232238637!所有新上線的實(shí)例,mysql啟動腳本強(qiáng)制對server-id進(jìn)行檢查,發(fā)現(xiàn)server-id不對就進(jìn)行糾正,然后啟動。這種方法有個前提條件:同一機(jī)器上的多個instance不要有主從關(guān)系,否則server-id一樣就會導(dǎo)致問題。這種情況一般只會在測試環(huán)境出現(xiàn),在線上基本是沒有的。滿足了這個前提,所有問題迎刃而解。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。

您可能感興趣的文章:

相關(guān)文章

  • 使MySQL查詢區(qū)分大小寫的實(shí)現(xiàn)方法

    使MySQL查詢區(qū)分大小寫的實(shí)現(xiàn)方法

    我們在MySQL中使用SELECT語句查詢時,可不可以使查詢區(qū)分大小寫?今天從網(wǎng)絡(luò)上找到了方法,現(xiàn)總結(jié)如下。
    2010-12-12
  • MySQL忘記密碼恢復(fù)密碼的實(shí)現(xiàn)方法

    MySQL忘記密碼恢復(fù)密碼的實(shí)現(xiàn)方法

    流傳較廣的方法,mysql中文參考手冊上的,各位vps主機(jī)租用客戶和服務(wù)器托管用戶忘記mysql5.1管理員密碼時,可以使用這種方法破解下
    2008-07-07
  • MySQL中關(guān)于null值的一個小問題

    MySQL中關(guān)于null值的一個小問題

    這篇文章主要介紹了MySQL中關(guān)于null值的一個小問題,幫助大家更好的理解和學(xué)習(xí)使用MySQL,感興趣的朋友可以了解下
    2021-03-03
  • mysql8.0.11安裝配置方法圖文教程 MySQL8.0新密碼認(rèn)證方式

    mysql8.0.11安裝配置方法圖文教程 MySQL8.0新密碼認(rèn)證方式

    這篇文章主要為大家詳細(xì)介紹了mysql8.0.11安裝配置方法圖文教程,以及MySQL8.0新密碼認(rèn)證方式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • 解決MySQL遇到錯誤:1217 - Cannot delete or update a parent row: a foreign key constraint fails

    解決MySQL遇到錯誤:1217 - Cannot delete or 

    這篇文章主要介紹了解決MySQL遇到錯誤:1217 - Cannot delete or update a parent row: a foreign key constraint fails問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • MYSQL GROUP BY用法詳解

    MYSQL GROUP BY用法詳解

    這篇文章主要為大家詳細(xì)介紹了MYSQL GROUP BY用法,具有一定的實(shí)用性和參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • MySQL中COALESCE函數(shù)示例詳解

    MySQL中COALESCE函數(shù)示例詳解

    COALESCE 是一個功能強(qiáng)大且常用的 SQL 函數(shù),主要用來處理 NULL 值和實(shí)現(xiàn)靈活的值選擇策略,能夠使查詢邏輯更清晰、簡潔,這篇文章主要介紹了MySQL中COALESCE函數(shù),需要的朋友可以參考下
    2025-03-03
  • win10下安裝mysql8.0.23 及 “服務(wù)沒有響應(yīng)控制功能”問題解決辦法

    win10下安裝mysql8.0.23 及 “服務(wù)沒有響應(yīng)控制功能”問題解決辦法

    這篇文章主要介紹了win10下安裝mysql8.0.23 及 “服務(wù)沒有響應(yīng)控制功能”問題解決辦法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • 分析MySQL中索引引引發(fā)的CPU負(fù)載飆升的問題

    分析MySQL中索引引引發(fā)的CPU負(fù)載飆升的問題

    這篇文章主要介紹了分析MySQL中索引引引發(fā)的CPU負(fù)載飆升的問題,文中提到了獨(dú)立索引所帶來的巨大CPU負(fù)擔(dān),以提醒在MySQL中使用索引要注意CPU負(fù)載的問題,需要的朋友可以參考下
    2015-05-05
  • MySQL如何使用union all獲得并集排序

    MySQL如何使用union all獲得并集排序

    這篇文章主要介紹了MySQL如何使用union all獲得并集排序,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03

最新評論

来安县| 大荔县| 靖江市| 沙田区| 尚义县| 琼结县| 慈溪市| 平山县| 棋牌| 阿拉善右旗| 杨浦区| 中阳县| 军事| 轮台县| 晋宁县| 双牌县| 和平区| 镇安县| 溧阳市| 长沙市| 泸西县| 临泉县| 昌乐县| 达日县| 潜山县| 綦江县| 吴忠市| 海安县| 察雅县| 喜德县| 重庆市| 石嘴山市| 名山县| 麦盖提县| 仙居县| 德庆县| 岳西县| 深州市| 开阳县| 都昌县| 宜兴市|