docker版MyCat分庫分表實現

2021-10-01 11:51:14 字數 3313 閱讀 2788

安裝mycat

mkdir mycat

cd mycat

wget

mv mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz mycat.tar.gz

tar -zxvf mycat.tar.gz -c /usr/local/

vi dockerfile

from openjdk:8

add mycat.tar.gz /usr/local/

expose 8066 9066

cmd ["/usr/local/mycat/bin/mycat", "console","&"]

docker run -it -d -v /usr/local/mycat/conf:/usr/local/mycat/conf -v /usr/local/mycat/logs:/usr/local/mycat/logs -p 8066:8066 -p 9066:9066 --name mycat mycat:1.6.7.1

安裝mysql
docker pull mysql:5.7.28

docker run -itd --name mysql1 -v /home/mysql1/data:/var/lib/mysql -v /home/mysql1/conf:/etc/mysql -p 33061:3306 -e mysql_root_password=*** mysql:5.7.28

docker run -itd --name mysql2 -v /home/mysql2/data:/var/lib/mysql -v /home/mysql2/conf:/etc/mysql -p 33062:3306 -e mysql_root_password=*** mysql:5.7.28

docker run -itd --name mysql3 -v /home/mysql3/data:/var/lib/mysql -v /home/mysql3/conf:/etc/mysql -p 33063:3306 -e mysql_root_password=*** mysql:5.7.28

已啟動的容器如下

mysql 5.7容器啟動後會發現宿主機配置目錄並沒有my.cnf檔案,原因是目前已經不需要配置即可完全啟動,而mysql 5.7預設開啟 group by 合法性檢查,sql_mode值包含only_full_group_by,可以在配置檔案中關閉,故三個mysql的宿主機conf目錄中執行

vi /home/mysql1/conf/my.cnf

[mysqld]

sql_mode=strict_trans_tables,no_zero_in_date,no_zero_date,error_for_division_by_zero,no_auto_create_user,no_engine_substitution

然後使用 mysql 連線工具連線三個mysql伺服器

mycat連線mysql

mycat的server.xml可根據需要自行個性化配置,這裡不修改。關鍵在schema.xml檔案,官方說明是配置邏輯庫(schema)、分片(datanode)、物理庫分片對映(datahost)的檔案,其實就是配置連線mysql的地方。

這裡使用預設的邏輯表配置,三個mysql庫分別新增company表,mysql1和mysql2新增employee表

schema.xml預設邏輯表配置

分片,分別取三個mysql容器的資料庫

localhost1指向mysql1容器,localhost2指向mysql2容器,localhost3指向mysql3容器,這裡要使用容器位址,不知道位址可以使用docker inspect 容器名得到

重新啟動三個mysql容器:docker restart mysql1…

測試使用msql工具連線mycat(和連線mysql一樣),插入兩條公司資訊,會發現三個庫都插入了資料,因為company邏輯表型別設定了全域性global。

insert into company(id, name) values(1, "name1");

insert into company(id, name) values(2, "name2");

插入兩條雇員資訊

insert into employee(id, name, sharding_id) values(1, "name1", 10000);

insert into employee(id, name, sharding_id) values(2, "name2", 10010);

會發現第一條在mysql1庫,第二條在mysql2庫,因為employee配置datanode=「dn1,dn2」 rule=「sharding-by-intfile」,在rule.xml中可以看到,分片規則是sharding-by-intfile,指定了sharding_id為10000時放在第乙個庫dn1,為10010時放在第二個庫dn2

檢視分片情況:explain select * from employee;

Mycat分庫分表

schema.xml 配置 name dn1 datahost localhost1 database db1 name dn2 datahost localhost1 database db2 name dn3 datahost localhost1 database db3 把localhost...

mycat分庫分表

一 修改schema.xml select user 二 修改server.xml 0 0 10 011m 1k0 384m true 123456 testdb user testdb true 三 啟動關閉1 進入bin目錄,2 啟動輸入.mycat start。關閉命令 mycat stop ...

mycat分庫分表

mycat是資料庫分庫分表的中介軟體,mycat使用最多的兩個功能是 讀寫分離和分庫分表功能,支援全域性表和e r關係 這兩個比較實用 mycat相當於是乙個 可以將多個實際資料庫組合成乙個完整的虛擬資料庫 我們可以直接訪問mycat的埠,其使用的是mysql原生的協議連線資料庫進行通訊 mycat...