一、目标
在Centos7.6上安裝mycat部署,并設定mysql水準分表ER表。了解什麼叫mysql水準分表ER表。(無坑版)
水準分表:即原來是單獨資料庫,表也是單獨的。由于表太大了影響到性能了。就再弄一台伺服器,建一樣的資料庫,然後把某些表分割成兩份放到兩台伺服器上,這樣能減輕伺服器壓力。但水準分表後是無法使用join的。
水準分表ER表:在水準分表的基礎上,增加子表(子表就被稱為ER表),讓主表能夠join子表。
二、平台
[[email protected] ~]# uname -a
Linux client 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
[[email protected] ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
Mycat-server-1.6.7.5-test-20200303154735-linux.tar.gz
三、實驗拓撲
主機名 ip 所裝必須的軟體 角色
mycat31 192.168.73.31 java1.8及以上,mycat1.6.7.5,mysql5.7 mycat伺服器、mysql庫xkahn的部分表存儲地
mycat32 192.168.73.32 mysql5.7 mysql庫xkahn的部分表存儲地
四、準備工作
1.兩台主機上均關閉防火牆,禁用防火牆開機自啟
2.mycat伺服器必須安裝java1.8及以上的環境
3.兩台主機均已安裝好mysql5.7,這有一篇教程《Centos7筆記之Mysql5.7安裝》
4.測試兩台互通,而且兩台mysql都能互相遠端登入對方的mysql資料庫,方法如:mysql -uroot -p123123 -h 192.168.73.31 -P 3306(這是在32主機上去連接配接31主機上的mysql,31上的mysql的root密碼是123123,31上的mysql端口是3306),再啰嗦,必須兩台互相做一下mysql互通。
5.如果你做過mysql主從複制,最好把主從複制給停掉(my.cnf中不必要的設定注釋掉)
五、前言啰嗦
1.mycat官網http://www.mycat.io/
2.mycat下載下傳位址http://dl.mycat.io/
3.schema.xml----->定義邏輯庫,表,分片節點等内容
4.rule.xml----->定義分片規則
5.server.xml----->定義使用者以及系統相關變量、端口等。
6.到mycat/bin目錄下做控制台啟動mycat-------> ./mycat console
7.到mycat/bin目錄下做背景啟動mycat-----------> ./mycat start
8.mycat的運作是依賴java的,是以事先需要在主機上安裝jdk,關于jdk的安裝略過了。使用指令java -version查本機是否安裝了java環境,jdk至少需要1.8及以上的版本才可以。
六、下載下傳并安裝mycat
(mycat31上執行)下載下傳并安裝mycat
mkdir -p /opt/software/mycat
cd /opt/software/mycat
wget -P /opt/software/mycat/ http://dl.mycat.io/1.6.7.5/2020-3-3/Mycat-server-1.6.7.5-test-20200303154735-linux.tar.gz
tar -zxvf Mycat-server-1.6.7.5-test-20200303154735-linux.tar.gz
cp -r mycat/ /usr/local/
七、設定mycat配置檔案,使其支援本次實驗的mycat水準分表
1.(mycat31上執行)修改配置檔案/usr/local/mycat/conf/server.xml中的預設啟動賬号從root改為為mycat
(這裡的賬号mycat是mycat的管理賬号,而非linux系統上的賬号。)
cp /usr/local/mycat/conf/server.xml{,.bak}
sed -i 's/name="root"/name="mycat"/g' /usr/local/mycat/conf/server.xml

注釋:
<user name="mycat" ----->定義mycat的管理賬号叫mycat(即登入mycat管理程式的賬号,而非linux系統賬号)
<property name="password">123456 ----->定義mycat的管理賬号的密碼
<property name="schemas">TESTDB ----->定義mycat的邏輯資料庫名,這裡需要和schema.xml中的<schema name="TESTDB"保持一緻。
2.(mycat31上執行)修改配置檔案/usr/local/mycat/conf/schema.xml
cat > /usr/local/mycat/conf/schema.xml <<EOF
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
<table name="teacher" dataNode="dn2"></table>
<table name="student" dataNode="dn1,dn2" rule="mod_rule">
<childTable name="student_record" primaryKey="xid" joinKey="student_id" parentKey="xid" />
</table>
</schema>
<dataNode name="dn1" dataHost="host1" database="xkahn" />
<dataNode name="dn2" dataHost="host2" database="xkahn" />
<dataHost name="host1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url=",192.168.73.31:3306" user="root"
password="123123">
</writeHost>
</dataHost>
<dataHost name="host2" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.73.32:3306" user="root"
password="123123">
</writeHost>
</dataHost>
</mycat:schema>
EOF
注釋:
絕大部分參數在之前的部落格中有介紹《MyCat-03之centos7上使用mycat部署垂直分庫》。
基于上一篇文章《MyCat-04之centos7上使用mycat部署水準分表》,本次不同的是,
#注釋,跟上次比的變化是這三行
#<table name="student" dataNode="dn1,dn2" rule="mod_rule"> ---->這個上次已經做過了水準分表(相當于本次的主表)
# <childTable name="student_record" primaryKey="xid" joinKey="student_id" parentKey="xid" /> ---->定義子表,子表的表名叫student_record,第一個xid是子表student_record的主鍵,本子表還有一列叫student_id準備被關聯相當于student的外鍵,第二個xid指的是student表的主鍵字段名
#</table>
3.(mycat31上執行)修改配置檔案rule.xml
cp /usr/local/mycat/conf/rule.xml{,.bak}
vim /usr/local/mycat/conf/rule.xml
3-1.(mycat31上執行)添加自定義規則
sid代表schema.xml中定義的資料庫xkahn中的表student中的column列的名字叫sid。(mycat拿我們自定義的列sid用一定的算法把一張表分割到兩台mysql上)
在<mycat:rule xmlns:mycat="http://io.mycat/">的下面添加7行内容(包含最後一行空白行)
<tableRule name="mod_rule">
<rule>
<columns>xid</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
注釋:這裡的<columns>xid</columns>中的xid上次寫的是sid,這次改成xid,為啥要改?因為怕有歧義,什麼歧義?因為做er水準分表的話,主表和子表(被join的表)都是用rule.xml中的一個算法去做水準分表,分表的算法都用xid去做mod-long去水準分。是以說主表和子表的主鍵id必須要保持一緻,而且都叫xid。(原來sid意為student的id,現在既然必須一樣了,那就搞成xid吧)
3-2.(mycat31上執行)修改系統預定義的算法mod-long的mysql主機數量
原本mod-long預設的是3台mysql主機,因為我們測試的就兩台,是以就寫成2。
将
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">3</property>
</function>
改為
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">2</property>
</function>
3-3.如果是照着上一篇做的試驗,那麼就把之前的兩台伺服器上的資料庫給删掉
mysql -uroot -p123123
drop database xkahn;
4-1.在兩台伺服器上都重新建立xkahn資料庫和表student
CREATE DATABASE IF NOT EXISTS xkahn DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
use xkahn;
create table student(xid int(10) not null unique primary key,name varchar(20) not null);
4-2.在兩台伺服器上把子表ER表也先建立上
create table student_record(xid int(10) not null unique primary key,student_id int(10),record varchar(500));
5.在mycat31上啟動mycat服務(新開一個mycat31的終端)
cd /usr/local/mycat/bin
./mycat console
6.再打開個mycat31的終端,用于登入mycat資料管理平台
mysql -umycat -p123456 -h 10.100.100.31 -P 8066
并插入資料
insert into student(xid,name) values (1,'serena');
insert into student(xid,name) values (2,'xishi');
insert into student(xid,name) values (3,'kahn');
insert into student(xid,name) values (4,'songsuer');
insert into student(xid,name) values (5,'liuduoyan');
insert into student(xid,name) values (6,'cuiseqi');
insert into student(xid,name) values (7,'yiwanka');
insert into student(xid,name) values (8,'linzhiling');
insert into student(xid,name) values (9,'xiaozemaria');
insert into student(xid,name) values (10,'jizemingbu');
7.去兩台實體資料庫伺服器上檢驗student表是否被分到了
mysql -uroot -p123123
use xkahn;
select * from student;
#必須保證都分到資料了,不然說明水準分表是失敗的
8-1.然後在mycat31的mycat8066往student_record表中插入資料
mysql -umycat -p123456 -h 10.100.100.31 -P 8066
use TESTDB;
insert into student_record(xid,student_id,record) values (1,1,'serena record, form shanghai,175cm');
insert into student_record(xid,student_id,record) values (2,2,'xishi,aaaaaaaaaa,171cm');
insert into student_record(xid,student_id,record) values (3,3,'kahn666666,180cm');
insert into student_record(xid,student_id,record) values (4,4,'songsuer,model,korea,171cm');
insert into student_record(xid,student_id,record) values (5,5,'liuduoyan,meinvchemo.com,172cm');
insert into student_record(xid,student_id,record) values (6,6,'cuiseqi,korea south,170cm');
insert into student_record(xid,student_id,record) values (7,7,'yiwanka,dadaoUSAhuozhuo10000ka,170cm');
insert into student_record(xid,student_id,record) values (8,8,'linzhiling,laonvrenxiaoriben,173cm');
insert into student_record(xid,student_id,record) values (9,9,'xiaozemaria,fromjp,166cm');
insert into student_record(xid,student_id,record) values (10,10,'jizelaoshi66666,163cm');
8-2.順手查一下剛才插入的資料select * from student_record;
9.再去兩台mysql實體伺服器上檢視一下子表的資料是否也被分割到了兩台伺服器上select * from student_record;
(兩台伺服器上的student_record資料必須被分割,不然說明水準分割ER表是失敗的)
10.檢驗ER表的join功能是否能實作
在mycat的8066上join查詢
SELECT s.*,r.record FROM student AS s INNER JOIN student_record AS r ON s.xid=r.student_id;
(必須能實作查到資料,不然就說明水準分表ER表是失敗的了)
11.結束。
老鐵,輕按兩下666,