每日一句:我解過那麼多數學題,可是我卻解不開你的。mysql作為資料庫,儲存系統中所有的需要持久化的資料,那麼當單機的效能和儲存已經無法滿足程式的要求了,就需要對mysql進行擴充套件,下面就簡單介紹一下mysql的可擴充套件性
mysql的擴充套件主要圍繞的主要方面有:cpu、記憶體、磁碟、網路等
向內擴充套件
mysql集群
總結彩蛋
mysql在什麼樣的場景下,或者從什麼維度認為mysql是需要進行擴充套件了
使用者量:和資料量太大基本一致,使用者量過大會導致儲存大量的資料檔案和讓查詢變慢
當出現以上情況或者為更好的效能做規劃時,那麼就需要對mysql的擴充套件性進行計畫,mysql的擴充套件有哪些方面呢?向上擴充套件(垂直擴充套件),保持mysql單機節點,增加效能更好的硬體來提高mysql的效能,主要有增加更多的cpu、增加記憶體、增加磁碟等
在資料量並不是特別大的場景下,採用這種方式較好,高可用可以使用定期備份的方式來彌補向外擴充套件(水平擴充套件),可以從三個方面來進行水平擴充套件:複製、拆分、水平分片。主要為增加多個mysql節點的方式
複製主從複製的方式即複製的場景,將mysql的資料儲存到多個節點,來減少單點的負載,並且同時可以實現可用性。
資料的強一致性可以保證,不過就無法保證併發度和效能,分別有兩種方式:拆分mysql5.5的特性—半同步複製
全同步複製
將mysql按照不同的功能拆分為多個節點,每個節點連線不同的程式,可以用來做備份、報表等不同的業務,某些功能可以在執行的時候會增加mysql的負載,所以單獨的使用mysql節點不會相互影響,可以提高效率和可用性
資料分片
資料分片即將資料根據策略拆分到不同的mysql例項中,減少mysql單點的資料量,提高mysql的高可用
動態分片
使用中間查詢表的方式,將每個資料對映到指定的分片,需要做乙個對映表來維護每個分割槽鍵和分片之間的關係。根據分割槽鍵就可以得到指定的分片,可以指定分割槽鍵對應的分片
混合動態分配和固定分配
在大量資料的情況下, 那麼中間的查詢表也是非常大的表,查詢速度和可維護性會變差,解決方式為通過固定分配+動態分配的方式來解決。
對每條資料進行雜湊取模,將資料雜湊到固定數目的桶中,然後將分配的桶根據查詢表的方式對映到不同的分片
全域性唯一id
在資料分片(分表)時,在不同的庫之間插入資料的時候,如何保證主鍵的唯一性,如果是單點,則mysql會維護主鍵的自增,在分布式的環境下,如果保證主鍵的唯一性
mysql>show variables like 'auto_inc%'
; +--------------------------+-------+
| variable_name | value |
+--------------------------+-------+
| auto_increment_increment | 1 |
| auto_increment_offset | 1 |
+--------------------------+-------+
2 rows in
set(0.15 sec)
保證分布式環境下唯一性
server1中的主鍵總是奇數,server2中的主鍵總是偶數,不會出現重複如果為多個節點,則設定不同的偏移量開始,或者每次自增的數不同保證不出現重複即可
唯一鍵表
在某個中心節點維護乙個中間表,該表中通過使用主鍵自增來作為唯一主鍵,每個節點生成的主鍵值為該節點的自增主鍵值。可以保證主鍵的唯一性,不過無法實現高可用,並且併發量較大時效率較低,主鍵自增會出現鎖競爭
redis自增key
redis作為高效能的nosql資料庫,並且在分布式環境下,可以高效的獲取到指定的key,redis中的incr
為原子性命令,可以保證在分布式環境的value的唯一性,在應用程式中生成主鍵
uuid
uuid可以保證唯一性,但是uuid是字串型別,並且較長、無序,所以在效能方面表現並不好
snowflake
雪花演算法可以保證在分布式環境下的唯一性,並且可以保證自增的特性,其主要依賴於時間,如果時間回撥,可能會出現重複
向內擴充套件的最好的方式即冷備份,將大資料量的資料表中不再需要的資料進行歸檔或者建立備份表來儲存冷資料。可以減少資料表的大小,提高mysql的效率
通過mysql集群的方式來保證在分布式環境在mysql單點的問題,提高mysql的可用性,保證高吞吐量和低延遲,保證mysql例項的負載能力
多個mysql例項組成mysql的集群,保證了mysql的高可用性,但是如何在應用程式連線mysql?如果直接連線和單點的方式並沒有什麼區別負載均衡
使用多節點的方式,並通過軟體負載均衡或者硬體負載均衡來實現mysql的擴充套件,在mysql集群中,可以使用負載均衡的方式實現統一的管理,並且可以保證故障自動切換,節點中的流量相對分配均衡,集群的節點可以動態的配置
使用負載均衡可以保證可擴充套件性、高效性、可用性、一致性
隨機
最小併發數
雜湊
權重
資料庫分庫分表了解嗎
mysql在單點無法滿足資料量的增長或者查詢效率的時候,也可以選擇分庫分表來保證高可用和高效能,分庫即將不同的表拆分到不同的資料庫中,然後不同的應用連線不同的資料庫(微服務模式),分表可以分為水平分表和垂直分表,垂直分表即將乙個表中業務關聯性不強的字段拆分到其他表或者新錶中,減少單個表的字段和資料檔案的大小,提高查詢效率。水平分表即將表從指定行拆分到其他的表中,這些表具有相同的字段,不過儲存有不同的資料,多個表聯合起來才是完整的資料,減少了單個表的資料量(最好的提公升查詢效率的方式)可以採用hash取模的方式進行水平拆分,不過水平拆分相對增加了系統的複雜度
目前對於分庫分表的中介軟體也有很多,並且使用也相對簡單
mycat
:中介軟體形式,應用連線mycat像操作mysql一樣,在執行sql操作時, mycat再去運算元據庫shardingsphere:分布式資料庫的解決方案,包含有下面2個模組
sharding-jdbc
:客戶端**的方式實現,即直接引入jar包加入配置,就可以直接操作,它會幫你實現分布式資料庫的查詢和運算元據
sharding-proxy
:中介軟體形式實現,應用程式連線sharding-proxy操作即可
非常簡單的說明一下,如果有不太正確的地方,歡迎指出討論
你的點讚和關注是寫文章最大的動力~
mysql編碼不得不知的問題
1 檢視mysql相關編碼 檢視mysql資料庫所支援的編碼 showcharacterset 檢視當前變數中的一些編碼情況 show variableslike character 檢視某個資料庫的編碼 showcreatedatabasedb name 檢視某個表的字符集 showcreatet...
HTTP協議不得不知的基礎
http超文字傳輸協議,是乙個引用層協議,基於 請求與響應 模式,以url作為網路資源的定位。url的格式 http host port path 其中,host 為合法的internet主機網域名稱或者ip位址,port是埠值,預設埠為80,path為請求資源的路徑 資源定位 url 資源管理 六...
你不得不知的生活常識。。。。
1,涼水洗腳有損健康.2,夏季多吃苦味有益健康.3,多喝水能防腎結石.4,夏季不宜光著上身睡覺.5,冬季養生宜多食熱粥.6,冬季洗澡次數不宜多.7,冬季不宜長期待在溫暖房間.8,不宜長時間停留在冬季霧氣中.9,冬天不宜把圍巾當口罩用.10,冬天早晨不宜洗頭.11,健身前熱身活動很重要.12,運動損傷...