使用mycat搭建實現mysql資料庫叢集管理
今天來使用mycat管理mysql叢集, 隨著資料量的提升, 我們如果把所有資料儲存在一個數據庫中, 對資料的各種操作就會變得非常的困難. 自然我們又想到了資料庫也進行叢集部署, 將一個數據庫的資料分散到不同的資料庫中儲存, 進而提升資料操作的效能.
本文的定義是簡潔快速的使用mycat, 讓讀者可以快速的入門mycat, 因此本文聚焦於mycat的安裝, 使用, 簡易配置, 常用配置檔案和標籤的介紹. 如果需要全面深入的瞭解建議去讀一讀官方推薦的文件.
什麼是mycat?
Mycat 是基於阿里巴巴曾經開源的知名產品 - cobar 演變而來, 簡單來說MyCAT就是一個數據庫中介軟體產品支援mysql叢集, 你可以像使用mysql一樣使用mycat, 對於開發人員來說根本感覺不到mycat的存在.
其實可以這麼簡單理解: 你有多個數據庫, 那麼你存資料的時候存到哪個資料庫呢? 所以我們需要一個儲存策略, 而mycat就是做這個事情的, 簡單來說: mycat就是管理資料庫叢集的.
mycat的分片策略
本文主要目的是為了快速搭建使用起來, 不是為了深入分析概念, 因此就簡單列舉介紹下, 建議讀者可以到官方文件或百度瞭解概念. 也可以到這篇博文了解一下詳細的每個引數和屬性有什麼作用: https://www.cnblogs.com/joylee/p/7513038.html.
- 首先什麼是分片?
- 分片就是指將同一個資料庫中的資料分散儲存到多個數據庫中, 以達到分散單臺裝置負載的效果, 這就是分片.
- 資料切分的方式
- 垂直切分
- 垂直切分就是按照表來切分
- 橫向切分
- 橫向切分就是把單表按照記錄來切分, 例如ID (將1,2切分到一個庫表, 3,4切分到一個庫表)
- 垂直切分
- mycat的分片策略
- 邏輯庫 (schema)
- 邏輯庫不是真實存在的, 想要把資料儲存到物理庫中, 就需要通過邏輯庫來操作, 簡單來說: 邏輯庫是來管理和排程物理庫的.
- 邏輯表 (table)
- 邏輯表的概念是類似於邏輯庫的, 邏輯表是來管理和排程物理表的.
- 分片節點 (dataNode)
- ip+資料庫名
- 節點主機 (dataHost)
- 分片節點所在的主機
- 分片規則 (rule)
- 就是拆分的演算法, 如何來拆分呢? 就要用到分片規則, mycat有10中分片規則, 基本上我們的應用場景都包含在內了, 這方面mycat做的很贊!
- 邏輯庫 (schema)
好了, 不多說, 下面我們正式進入正題.
首先我們需要現有一個已經裝好jdk和mysql的linux系統, 為什麼需要jdk呢? 因為mycat是java程式碼寫的, 所以需要jdk環境.
安裝mysql步驟
第一步: 檢視是否已經安裝mysql
rpm -qa | grep mysql
第二步: 解除安裝你查詢到的mysql
#rpm -e --nodeps 要解除安裝的mysql
#例如:
rpm -e --nodeps mysql-libs-5.1.73-8.el6_8.x86_64
第三步: 上傳mysql壓縮包, 解壓
第四步: 安裝服務端
rpm -ivh 服務端程式 --nodeps --force
第五步: 安裝客戶端
rpm -ivh 客戶端程式 --nodeps --force
第六步: 啟動和關閉mysql
啟動mysql: service mysql start
關閉mysql: service mysql stop
重啟mysql: service mysql restart
第七步: 連線mysql
mysql -u root -p
這裡有個需要注意: 如果你安裝的是5.6版本的, 會自動生成一個隨機密碼
1)進入該檔案檢視密碼
vi /root/.mysql_secret
2)使用這個密碼登入mysql
mysql –u root –p
3)修改密碼
SET PASSWORD = PASSWORD(‘123456’);
第八步: 設定遠端登入許可權
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY '123456' WITH GRANT OPTION;
然後使用SQLyog, 或者Navicat等軟體連線遠端mysql.
MyCat安裝及啟動
這裡要注意是linux的壓縮檔案.
第一步: 上傳到linux系統, 解壓縮.
第二步: 啟動mycat
進入bin目錄
啟動 ./mycat start
查詢狀態 ./mycat status
mycat 支援的命令 { console | start | stop | restart | status | dump }
第三步: 啟動之後, 我們通過mysql客戶端連線mycat
使用者名稱和密碼都是test, 這是mycat預設的.
預設埠是8066
但是這裡, 我在連線的時候報了2003的錯誤:
ERROR 2003 (HY000): Can’t connect to MySQL server on ‘192.168.179.133’ (0)
然後去查詢了下mycat的啟動狀態, 發現是not running, 並沒有連線上.
然後我使用./mycat console 命令監測
Running Mycat-server...
wrapper | --> Wrapper Started as Console
wrapper | Launching a JVM...
jvm 1 | Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=64M; support was removed in 8.0
wrapper | JVM exited while loading the application.
jvm 1 | 錯誤: 代理丟擲異常錯誤: java.net.MalformedURLException: Local host name unknown: java.net.UnknownHostException: simple01: simple01: 未知的名稱或服務
這個錯誤的原因是因為位置的host名稱, 所以我們需要在hosts檔案中配置當前主機IP
vim /etc/hosts
在127.0.0.1 和 ::1 中間加上你的主機IP, 儲存退出後, 重新啟動mycat.
再次使用客戶端連線, 發現連線成功.
第四步: 分片配置
這裡分為三步:
- 連線mysql, 建立三個資料庫db1, db2, db3 (注意是連線mysql, 不是mycat)
- 修改schema.xml檔案
- 修改server.xml檔案
- 連線mysql, 建立三個資料庫db1, db2, db3
- 配置schema.xml檔案
看上圖, 我們配置了哪些東西呢?
<schema name=“TESTDB” 這個是邏輯庫名
- 配置server.xml檔案
server.xml幾乎儲存了所有mycat需要的系統配置資訊。最常用的是在此配置使用者名稱、密碼及許可權。
在system中新增UTF-8字符集設定,否則儲存中文會出現問號
<property name="charset">utf8</property>
修改user的設定 , 我們這裡為 TESTDB設定了兩個使用者
<user name="test">
<property name="password">test</property>
<property name="schemas">TESTDB</property>
</user>
<user name="root">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
</user>
name=“root” 是使用者名稱, 下面的password自然是密碼
第五步: 測試分片
我們用mysql客戶端連線mycat, 在mycat中執行下面的SQL語句, 建立一張tb_test表
我們來看一下, 是否會在其他的三個資料庫中同步建立呢?
CREATE TABLE tb_test (
id BIGINT(20) NOT NULL,
title VARCHAR(100) NOT NULL ,
PRIMARY KEY (id)
) ENGINE=INNODB DEFAULT CHARSET=utf8
我們再檢視MySQL的3個庫, 發現表都自動建立好了.
接下來是插入表資料, 我們來插入一些資料 (注意, 這裡mycat自動將tb_test變成了大寫TB_TEST)
INSERT INTO TB_TEST(ID,TITLE) VALUES(1,'goods1');
INSERT INTO TB_TEST(ID,TITLE) VALUES(2,'goods2');
INSERT INTO TB_TEST(ID,TITLE) VALUES(3,'goods3');
INSERT INTO TB_TEST(ID,TITLE) VALUES(5000001,'goods5000001');
INSERT INTO TB_TEST(ID,TITLE) VALUES(10000001,'goods10000001');
檢視結果, 我們發現前3條資料插入到了db1中, 第4條資料插入到了db2中, 第5條資料插入到了db3中…
很顯然是因為我們採用的分片規則是每節點儲存500萬條資料, 所以超過了500萬就存到了db2, 超過1000萬就存到了db3.
第六步: 分片規則配置
我們還記得, 在配置scheme.xml檔案時, 我們的分片規則是auto-sharding-long
那現在, 我們就進入rule.xml中, 來搜尋下這個名字
接著, 又看到這個分片規則的演算法是rang-long, 我們繼續搜尋
接著, 又看到這個演算法是在autopartition-long.txt這個檔案中, 看來我們必須到這個檔案中, 才能看到廬山真面目了.
接著, 在conf目錄下找到了這個檔案, 進去看看
果然, 原來是在這裡配置了. 這其實是最簡單的一種分片規則了, 接下來我想把我的資料均勻的分配到3個分片中, 所以我要用到 “一致性雜湊” 分片規則.
一致性雜湊 murmur (這個我一般讀作 嬤嬤, 好記, 哈哈)
我們依然是到rule.xml檔案中, 搜尋這個嬤嬤
這裡我們把count改成3, 這個count就是要分片的資料庫節點數量
然後找到表規則定義, 這個規則指定的列是id ,如果我們的表主鍵不是id, 而是order_id, 那麼我們應該重新定義一個tableRule:
<tableRule name="sharding-by-murmur-order">
<rule>
<columns>order_id</columns>
<algorithm>murmur</algorithm>
</rule>
</tableRule>
在schema.xml中配置新的邏輯表時, 指定規則為sharding-by-murmur-order
注意:修改完配置,重新啟動mycat
第七步: 測試一致性雜湊分片規則
建立tb_order表
插入多條資料, 測試是否平均分佈在3個庫表中
測試的SQL語句這裡就不貼上了, 直接看下測試結果: 發現db1的TB_ORDER表中插入了19條資料, db2的TB_ORDER中插入了22條資料, db3的TB_ORDER表中插入了28條資料.
有的讀者可能納悶了, 這是成功了還是失敗了呢? 為啥不是平均的呢?
其實一致性雜湊演算法並不能做到完全平均, 而是資料量越大越趨近與平均. 有興趣的讀者可以專門去研究研究一致性雜湊演算法到底是個什麼東東…
關於資料庫讀寫分離
資料庫讀寫分離對於大型系統或者訪問量很高的網際網路應用來說, 是必不可少的一個重要功能. 對於MySQL來說, 標準的讀寫分離是主從模式, 一個寫節點Master後面跟著多個讀節點, 讀節點的數量取決於系統的壓力, 通常是1-3個讀節點的配置.
Mycat讀寫分離和自動切換機制,需要mysql的主從複製機制配合。後面我們會有專門的一片文章來研究mycat的讀寫分離, 本文就到這裡啦~~
嗯~~文章的最後一句話屬於我自己啦, 今天是國慶10月1日, 明天準備會老家看看親人. 我們在一天天長大, 親人在一天天變老, 不想也不能等到子欲養而親不待的一天啊. 其實想想我們能陪伴在親人身邊的日子很少很少, 一定一定隔一段時間抽出來時間回家裡看看她們, 給她們買點禮物, 聽聽她們的嘮叨, 很幸福.