docker版MyCat分庫分表實現

安裝mycat

mkdir mycat
cd mycat
wget http://dl.mycat.io/1.6.7.1/Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz
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=xxx 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=xxx 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=xxx 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;
在這裏插入圖片描述

發佈了33 篇原創文章 · 獲贊 1 · 訪問量 8742
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章