MyCat-06之centos7上使用mycat部署水平分表全局表

一、目標

在Centos7.6上安裝mycat部署,並設定mysql水平分表全局表。理解什麼叫mysql水平分表全局表。(無坑版)

水平分表:即原來是單獨數據庫,表也是單獨的。由於表太大了影響到性能了。就再弄一臺服務器,建一樣的數據庫,然後把某些表分割成兩份放到兩臺服務器上,這樣能減輕服務器壓力。但水平分表後是無法使用join的。

水平分表ER表:在水平分表的基礎上,增加子表(子表就被稱爲ER表),讓主表能夠join子表。

mycat水平分表全局表:即某張表在所有的mysql服務器上都有同樣的數據,此種表一般用於數據量較小的,而且每臺mysql服務器都會用得到的表

二、平臺

[[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_for_linux

(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>
           <table name="xuser" dataNode="dn1,dn2" type="global"></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="10.100.100.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="10.100.100.32:3306" user="root"
                                   password="123123">
                </writeHost>
        </dataHost>
</mycat:schema>
EOF

註釋:
絕大部分參數在之前的博客中有介紹《MyCat-03之centos7上使用mycat部署垂直分庫》。
基於上一篇帖子《MyCat-05之centos7上使用mycat部署水平分表ER表》,本次不同的是,
#跟上次的mycat水平分表ER表相比,本次又多出一行全局表的配置:
<table name="xuser" dataNode="dn1,dn2" type="global"></table>,xuser指的是全局表的表名,分部在兩臺mysql上,類型是全局global。 (這裏截圖中的ip地址是用的另一臺電腦做的,你只在乎ip地址的最後一段即可

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));

4-3.在兩臺服務器上把全局表xuser也都建好

mysql -uroot -p123123
use xkahn;
create table xuser(xid int(10) not null unique primary key,name varchar(20) not null,createtime datetime,note 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

並插入數據student表的數據

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.在mycat31上的mycat數據管理平臺插入全局表的數據

mysql -umycat -p123456 -h 10.100.100.31 -P 8066
use TESTDB;
show tables;
insert into xuser (xid,name,createtime,note) VALUES (1,'admin001','2020-03-01','the first administrator');
insert into xuser (xid,name,createtime,note) VALUES (2,'admin002','2020-03-02','the second administrator');
insert into xuser (xid,name,createtime,note) VALUES (3,'admin003','2020-03-03','the thirdly administrator');
insert into xuser (xid,name,createtime,note) VALUES (4,'admin004','2020-03-04','the fourthly administrator');
insert into xuser (xid,name,createtime,note) VALUES (5,'admin005','2020-03-05','the fifth administrator');

 

12.去兩臺物理機上檢驗是否都有數據存在?如果都有就說明成功了。

發現兩臺物理服務器上的mycat全局表xuser的數據是完全一樣的。這樣的效果就對了,這就是Mycat全局表。

----------------------END---------------------2020年3月23日23:07:36----------------------------

實驗5分鐘,截圖寫博客50分鐘,真TM耗時間。

老鐵,雙擊666點個贊

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