安裝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;