1. 程式人生 > >mycat資料庫及分片式儲存

mycat資料庫及分片式儲存

軟體介紹
• Mycat 是基於 Java 的分散式資料庫系統中間層,為高併發下的分散式提供解決方案
– 支援 JDBC 形式連線
– 支援 MySQL 、 Oracle 、 Sqlserver 、 Mongodb 等
– 提供資料讀寫分離服務
– 可以實現資料庫伺服器的高可用
– 提供資料分片服務
– 基於阿里巴巴 Cobar 進行研發的開源軟體
– 適合資料大量寫入資料的儲存需求

  • 配置mycat服務 步驟:

1 裝包

]# rpm  -qa  | grep  -i  jdk
]# java -version
]# tar -zxvf  Mycat-server-1.4-beta-20150604171601-linux.tar.gz
]# mv mycat /usr/local/
]# ls /usr/local/mycat/
bin  catlet  conf  lib  logs  version.txt

2 修改配置檔案
• 重要配置檔案說明
– server.xml 設定連線 mycat 服務的賬號 、密碼等
– schema.xml 配置 mycat 使用的真實資料庫和表
– rule.xml 定義 mycat 分片規則
• 配置標籤說明

– <user>.......</user> 定義連線 mycat 服務時使用的使用者和密碼及邏輯庫的名字
– <datanode>......</datanode> 指定資料節點(物理庫的主機名和儲存分片資料的資料庫名)
– <datahost>......</datahost> 指定資料庫伺服器的 IP地址 及連線資料庫時使用的授權使用者名稱及密碼

• 修改配置檔案 /usr/local/mycat/conf/server.xml

<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property> # 定義只讀許可權,使用定義的 user 使用者連線 mycat 服務後只有讀記錄的許可權
</user>

• 修改配置檔案 /usr/local/mycat/conf/schema.xml– 定義分片資訊

2.1 定義客戶連線mycat時使用的使用者名稱及密碼和訪問許可權、邏輯庫的名稱

]# vim /usr/local/mycat/conf/server.xml
 34         <user name="admin">
 35                 <property name="password">123456</property>
 36                 <property name="schemas">TESTDB</property>
 37         </user>
 38 
 39         <user name="user">
 40                 <property name="password">user</property>
 41                 <property name="schemas">TESTDB</property>
 42                 <property name="readOnly">true</property>
 43         </user>
:wq

3 根據配置檔案的設定在資料庫伺服器上做對應的配置

mysql54]# vim /etc/my.cnf
[mysqld]
lower_case_table_names = 1
]# systemctl   restart mysqld
mysql> create  database db1;
mysql> grant  all  on  *.*  to [email protected]"%" identified by "123qqq...A";
]# vim /etc/my.cnf
[mysqld]
lower_case_table_names = 1
]# systemctl   restart mysqld
mysql> create  database db2;
mysql> grant  all  on  *.*  to [email protected]"%" identified by "123qqq...A";

4 啟動服務

]#vim /usr/local/mycat/logs/wrapper.log 
]#/usr/local/mycat/bin/mycat start
]#/usr/local/mycat/bin/mycat stop

5 查服務資訊

]#netstat -utnlp  | grep  :8066

6 客戶端測試配置

 ]# mysql -h192.168.4.56 -P8066 -uadmin -padmin
mysql> show  databases;
mysql> use TESTDB;
mysql> show tables;
mysql>  create table  employee (
id int(2) primary key  auto_increment,  
name char(10),
age tinyint(2) default 18,
sex enum("boy","girl") default "boy",
sharding_id  int(2)
);
mysql> desc  employee;
mysql> insert into employee(name,sharding_id)
values("bob",10000),("tom",10010);
mysql> insert into employee(name,sharding_id) 
values("jerry",10010);
select  *  from employee;
  • MySQL效能優化
    搭建監控伺服器:監控服務的硬體使用率
    CPU 記憶體 儲存 網路流量
    資料庫服務執行引數:
    mysql> set global 選項=值;
    vim /etc/my.cnf
    [mysqld]
    選項=值
    mysql> set global max_connections = 300;
    mysql> show variables like “max_connections”;

分庫分表

• 什麼是分庫分表
– 通過某種特定條件,將存放在一個數據庫 ( 主機 ) 中的資料,分散存放到多個數據庫 ( 主機 ) 中。
– 已達到分散單臺裝置負載的效果,即分庫分表
– 資料的切分根據其切分規則的型別,分為 2 種切分模式
– 垂直分割 ( 縱向 ) 和 水平分割 ( 橫向 )

• 縱向切分
– 把單一的表,拆分成多個表,並分散到不同的資料庫( 主機 ) 上。
– 一個數據庫由多個表構成,每個表對應不同的業務,可以按照業務對錶進行分類,將其分佈到不同的資料庫 ( 主機 ) 上,實現專庫專用,讓不同的庫 ( 主機 ) 分擔不同的業務。

• 橫向切分
– 按照表中某個欄位的某種規則,把向表中寫入的記錄分散到多個庫 ( 主機 ) 中。
– 簡單來說,就是按照資料行切分,將表中的某些行儲存到指定的資料庫 ( 主機 ) 中。

工作過程

• 當 Mycat 收到一個 SQL 時 – 會先解析這個 SQL 查詢涉及到的表,然後看此表的定 義
– 如果有分片規則,則獲取到 SQL 裡分片欄位的值,並 匹配分片函式,得到該 QL 對應的分片列表 – 然後將 SQL發往這些分片去執行,最後收集和處理所 有分片返回的結果資料,並輸出到客戶端 以 select * from Orders where prov=? 語句為例,查到 prov=wuhan , 按照分片函式, wuhan 返回 dn1 ,於是 SQL 就發給了 MySQL1,去 取 DB1 上的查詢結果,並返回給使用者。 如果上述 SQL 改為 elect * from Orders where prov in (‘wuhan’,‘beijing’) ,那麼, SQL 就會發給 ySQL1 與 MySQL2 去執行,然後結果集合並後輸出給使用者。但通常業務中我們的 SQL 會有 Order By 以及 Limit 翻頁語法,此時就涉及到結果集在 Mycat 端的二次處 理。

分片規則

• mycat 服務提供 10 種分片規則。
– 1 列舉法 sharding-by-intfile
– 2 固定分片 hash 演算法 rule1
– 3 範圍約定 auto-sharding-long
– 4 求模法 mod-long
– 5 日期列分割槽法 sharding-by-date
– 6 通配取模 sharding-by-pattern
– 7ASCII 碼求模通配 sharding-by-prefixpattern
– 8 程式設計指定 sharding-by-substring
– 9 字串拆分 hash 解析 sharding-by-stringhash
– 10 一致性 hash sharding-by-murmur

分片演算法

• 每種分片規則對應一種演算法。
– 1 列舉法 sharding-by-intfile -> hash-int
– 2 固定分片 rule1 -> func1
– 3 範圍約定 auto-sharding-long -> rang-long
– 4 求模法 mod-long -> mod-long
– 5 日期列分割槽法 sharding-by-date ->sharding-by-date
– 6 通配取模 sharding-by-pattern -> sharding-by-pattern
– 7ASCII 碼求模通配 sharding-by-prefixpattern -> sharding-by-prefixpattern
– 8 程式設計指定 sharding-by-substring -> sharding-by-substring
– 9 字串拆分 hash 解析 sharding-by-stringhash ->sharding-by-stringhash
– 10 一致性 hash sharding-by-murmur ->murmur