mycat分庫分表

一 分庫分表
1 什麼是分庫分表
– 將存放在一個數據庫(主機)中的數據,按照特定方式進行拆分,分散存放到多個數據庫(主機)中,以達到分散單臺設備負載的效果。
2 垂直分隔
1) 縱向切分(分多個表)
–將單個表,拆分成多個表,分散到不同的數據庫
–將單個數據庫的多個表進行分類,按業務分類分散到不同的數據庫上。
3 水平分隔
1) 橫向切分(一個表分行)
–按照表中的某個字段的某種規則,把表中的許多記錄按行切分,分散到多個數據庫中

mycat 介紹
1 mycat 是基於java的分佈式數據庫系統中間層,爲高併發的分佈式訪問提供解決方案
– 支持JDBC形式連接
– 支持mysql,oracle,sqlserver,mongodb等
– 可以實現數據庫服務器的高可用
– 提供數據讀寫分離服務
– 提供數據分片服務
– 基與阿里巴巴Cobar進行研發的開源軟件
– 適合數據大量寫入的數據存儲需求

分片規則:
1)枚舉法 sharding-by-infile
2)固定分片 rule1
3)範圍約定 auto_sharding-long
4) 求模法 mod-long
5) 日期列分區法 sharding-by-date
6) 通配取模 sharding-by-pattern
7) ASCII 碼求模通配 sharding-by-prefixpattern
8) 編程指定 sharding-by-substring
9) 字符串拆分hash解析 sharding-by-stringhash
10) 一致性hash sharding-by-murmur
缺點: 查詢速度變慢,不適合讀取的環境。適合大併發寫入的環境
如何解決讀取數度慢的問題?

3 mycat工作過程:
當mycat收到一個SQL查詢時:
– 先解析這個SQL查詢涉及到的表
– 然後看此表的定義,如果有分片規則,則獲取SQL裏的分片字段的值。並分配函數,獲取分片列表
– 然後將SQL發往這些分片去執行
– 最後收集和處理所有分片的結果數據,並返回到客戶端

部署mycat
1.裝 jdk(讓java 跑起來的軟件)
rpm -qa | grep -i jdk
java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64
java-1.8.0-openjdk-headless-1.8.0.131-11.b12.el7.x86_64
java-1.8.0-openjdk-devel-1.8.0.131-11.b12.el7.x86_64
copy-jdk-configs-2.2-3.el7.noarch
java -version
openjdk version “1.8.0_131”
OpenJDK Runtime Environment (build 1.8.0_131-b12)
OpenJDK 64-Bit Server VM (build 25.131-b12, mixed mode)
2.解包
tar -zxvf Mycat-server-1.4-beta-20150604171601-linux.tar.gz
3 將主配置文件移動到/usr/local/下
mv mycat /usr/local/
4 Mycat目錄結構說明
–bin //mycat 命令,如啓動 停止等
–catlet //擴展文件
– conf //配置文件
–lib //mycat使用的jar
–logs //mycat啓動日誌和運行日誌
–wrapper.log //mycat服務啓動日誌
–mycat.log //記錄SQL腳本執行後報錯的信息
version.txt //版本介紹
5 重要配置文件說明:
–server.xml 設置連接mycat的帳號信息
–schema.xml 配置mycat的真實庫表
–rule.xml 定義mycat分片規則

6 配置標籤說明:
<user……</user 定義連mycat用戶信息
<datanode……</datanode 指定數據節點
<datahost……</datahost 指定數據庫地址及用戶信息

vim /usr/local/mycat/conf/server.xml

34 ------------------------(連接mycat帳號爲 test 密碼 爲 test)
35 test
36 TESTDB
37
38
39
40 user
41 TESTDB
42 true --------(定義只讀)

cp schema.xml /tmp/ (備份)
定義分片信息

vim /usr/local/mycat/conf/schema.xml (配置mycat的真實庫表)
7

(有幾臺加幾臺 本實驗只有兩臺 (刪除dn3))
5 (與server.xml表要對應)
37
38
39 (註釋)
47 <writeHost host=“hostM1” url=“192.168.4.54:3306” user=“root”
48 password=“123456”>

43 <dataHost name=“localhost2” maxCon=“1000” minCon=“10” balance=“0” --------------(複製一份指定dn2 IP 『<datahost……</datahost 指定數據庫地址及用戶信息』 )
44 writeType=“0” dbType=“mysql” dbDriver=“native” switchType=“1” slaveThreshold=“100”>
45 select user()
46
47 <writeHost host=“hostM1” url=“192.168.4.55:3306” user=“root”
48 password=“123456”>
49 ————————————————————————(黃色部分都是註釋的)
50
51
52
54
55

1.在數據庫 54 55 創建 表
55主機 (創建 db1) 56 主機 (創建 db2)
驗證 : 用56 主機 驗證
2.在 數據庫 54 55 設置授權用戶
grant all on . to root@"%" identified by “123456”;
3.在數據庫54 55 配置文件(/etc/my.cnf)
lower_case_table_names = 1 (添加) ------//表名忽略大小寫
4.在主機56 啓動服務
/usr/local/mycat/bin/mycat start (啓動)
/usr/local/mycat/bin/mycat status (看進程)
Mycat-server is running (15112).
ss -nutlp | grep :8066 (看狀態)
tcp LISTEN 0 100 :::8066 ::😗 users:((“java”,pid=15114,fd=49))
/usr/local/mycat/bin/mycat stop (停止)
kill -9 15114 (如停止不了殺進程)
在客戶機(50)訪問
mysql -h192.168.4.56 -uadmin -p123456 -P8066
創建employee表
create table employee (
-> ID int primary key auto_increment,
-> sharding_id int,
-> name char(12),
-> age tinyint unsigned default 28);
insert into employee(sharding_id,name) values(10000,“jim”); (存在db1)
insert into employee(sharding_id,name) values(10010,“bom”); (存在db2)
vim /usr/local/mycat/conf/schema.xml

(employee 表對應的算法爲枚舉法) vim /usr/local/mycat/conf/rule.xml sharding_id hash-int


partition-hash-int.txt
vim /usr/local/mycat/conf/partition-hash-int.txt (查看算法對應的規則)
10000=0
10010=1
表示(寫10000 存在 表db1–54主機上 寫10010 存在55 主機上)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章