資料庫集群的情況下,如果自動增長id產生重複的話,如何解決?
1.採用uuid形式設定為id。
缺點
2.設定步長。缺點:不利於後期伺服器的擴容。
在資料庫集群環境下,預設自增方式存在問題,因為都是從1開始自增,可能會存在重複,應該設定每台節點自增步長不同。
查詢自增的步長
show variables like 'auto_increment%'
修改自增的步長
set @@auto_increment_increment=10;
修改起始值
set @@auto_increment_offset=5;
假設有兩台mysql資料庫伺服器
節點①自增 1 3 5 7 9 11 ….
節點②自增 2 4 6 8 10 12 ….
缺點:在最開始設定好了每台節點自增方式步長後,確定好了mysql集群數量後,無法擴充套件新的mysql,不然生成步長的規則可能會發生變化。
假設有三颱mysql伺服器集群,三颱伺服器分別的起始值和步長為多少?
起始值為 1 2 3.,步長為3.
其它方案:使用redis、雪花演算法。
1. 在資料庫分表分庫原則中,遵循二個設計理論 垂直拆分、水平拆分。垂直拆分是把不同的表拆到不同的資料庫中,而水平拆分是把同乙個表拆到不同的資料庫中。
垂直拆分:就是根據不同的業務進行拆分的,拆分成不同的資料庫,比如會員資料庫、訂單資料庫、支付資料庫、訊息資料庫等,垂直拆分在大型電商專案中使用比較常見。
優點:拆分後業務清晰,拆分規則明確,系統之間整合或擴充套件更加容易。
缺點:部分業務表無法join,跨資料庫查詢比較繁瑣(必須通過介面形式通訊(http+json))、會產生分布式事務的問題,提高了系統的複雜度。舉栗子:不可能出現,在訂單服務中,訂單服務直接連線會員服務的資料庫這種情況。
水平拆分:把同一張表中的資料拆分到不同的資料庫中進行儲存、或者把一張表拆分成 n 多張小表。
相對於垂直拆分,水平拆分不是將表的資料做分類,而是按照某個欄位的某種規則來分散到多個庫之中,每個表中包含一部分資料。簡單來說,我們可以將資料的水平切分理解為是按照資料行的切分,就是將表中 的某些行切分到乙個資料庫,而另外的某些行又切分到其他的資料庫中,主要有分表,分庫兩種模式 該方式提高了系統的穩定性跟負載能力,但是跨庫join效能較差。
mycat支援10種分片策略
1、求模演算法
2、分片列舉
3、範圍約定
4、日期指定
5、固定分片hash演算法
6、通配取模
7、ascii碼求模通配
8、程式設計指定
9、字串拆分hash解析
詳細:分片列舉
分片列舉演算法:就是根據不同的列舉(常量),進行分類儲存的。舉栗子:有些業務需要按照省份或區縣來做儲存,而全國的省份區縣固定的,這類業務使用這一規則。
環境搭建:
1.案例步驟: 建立資料庫userdb_1 、 userdb_2、userdb_3
2.修改partition-hash-int.txt規則 sahgnhai=0、beijing=1、shenzhen=2,定義列舉(地區) 每個地區指定的資料庫存放位置。
根據地區進行分庫 上海資料庫、北京資料庫 、深圳資料庫。
求模演算法
求摸法分片,根據id進行十進位制求摸運算,運算結果為分割槽索引
注意:資料庫節點分片數量無法更改。 和es集群非常相似的。
舉栗子:在mycat中執行 select * from user_info; 這個簡單的sql查詢可以查詢出來對應所有分表的資料。
原因:mycat中的 乙個 sql 語句,相當於三個sql 語句在不同的資料表都進行查詢。
select * fromdb1_user_info;
select * fromdb2_user_info;
select * fromdb3_user_info;
然後三條語句查詢出來的結果進行組裝在返回給mycat。
select * from user_info where id=1;
1.如果是根據mycat的分片字段作為條件進行查詢,則只會有一條匹配到對應分片欄位的資料表中執行sql語句查詢。
2.如果查詢的條件是非分片字段,則會在每個分表中都會執行sql語句。如果查詢條件不是根據分片字段作為條件去查詢,不建議使用mycat。
select * from user_info limit 0,3;
執行分頁查詢語句,會在每乙個分表中都執行該sql語句,但是mycat 返回的結果就是從這三個返回的結果集中隨機的抽取一對進行資料顯示。
效果圖如下,查詢所有的資料如下:
分頁查詢sql語句,下面是同一條sql 執行三次 查詢出來的結果,查詢出來的結果是隨機的,可能執行三次查詢出來的結果都一樣的。
1.資料庫關聯查詢的問題(水平拆分導致的)
2.資料同步的問題
3.id自增的問題
垂直拆分和水平拆分
前言 做資料庫分表的時候,總是能看到水平切分 垂直切分,但是並不能理解何為水平 何為垂直。僅此做個記錄。一般情況下說的水平切分 垂直切分,都是指的資料庫層面的。隨著業務量的增加,資料量肯定快速增長,拿mysql來說,單錶資料量在百萬級內讀取效率還是可以的,可是一旦達到千萬級,效能會有較大的降低。如果...
水平拆分和垂直拆分
網際網路時代談論最多的話題就是拆分。拆分一般分為水平拆分和垂直拆分,這並不單指對資料庫或者快取的拆分,主要是表達一種分而治之的思想。水平拆分是指由於單一節點無法滿足需求,需要擴充套件為多個節點,多個節點具有一直的功能,組成乙個服務池,乙個節點服務一部分請求量,所有節點共同處理大規模高併發的請求量。垂...
Mysql 水平拆分和垂直拆分
1,水平分割 例 qq的登入表。假設qq的使用者有100億,如果只有一張表,每個使用者登入的時候資料庫都要從這100億中查詢,會很慢很慢。如果將這一張表分成100份,每張表有1億條,就小了很多,比如qq0,qq1,qq1.qq99表。使用者登入的時候,可以將使用者的id 100,那麼會得到0 99的...