天天看點

【mycat系列二】Docker安裝mycat并實作MySQL的讀寫分離

目錄

一、前言

二、jdk安裝

三、安裝mycat

1、拉取mycat鏡像

2、建立檔案夾

3、準備挂載的配置檔案

4、啟動mycat

5、建立資料庫

四、附錄

一、前言

通過上一節,《基于 Docker 搭建 MySQL 主從複制的詳細教程》

我們可以使用docker 配置 mysql 兩主四從

【mycat系列二】Docker安裝mycat并實作MySQL的讀寫分離
【mycat系列二】Docker安裝mycat并實作MySQL的讀寫分離

通過以下指令可以檢視每個容器的ip

docker inspect --format='{{.NetworkSettings.IPAddress}}'  容器名稱|容器id
           
【mycat系列二】Docker安裝mycat并實作MySQL的讀寫分離

二、jdk安裝

建立檔案夾

mkdir -p /usr/local/java
cd /usr/local/java
           

下載下傳jdk并配置

  • 去官網下載下傳,并用xftp等傳輸工具把下載下傳的jdk放入/usr/local/java
  • 解壓
tar -zxvf  jdk-8u212-linux-x64.tar.gz
           

配置環境變量

vim /etc/profile
           
# java env
export JAVA_HOME=/usr/local/java/jdk1.8.0_192
export JRE_HOME=$JAVA_HOME/jre
export PATH=$PATH:$JAVA_HOME/bin
# Tomcat require this env
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
           

重新整理,是配置生效

source /etc/profile
           

檢視是否成功

java -version
           

【mycat系列二】Docker安裝mycat并實作MySQL的讀寫分離

三、安裝mycat

1、拉取mycat鏡像

docker pull longhronshens/mycat-docker
           

2、建立檔案夾

用于儲存mycat的主要配置檔案

mkdir -p /usr/local/mycat 
cd /usr/local/mycat
           

3、準備挂載的配置檔案

增加mycat配置:rule.xml、server.xml、schema.xml,拷貝到/usr/local/mycat目錄下

具體的配置可下載下傳mycat壓縮包,解壓,位于conf檔案夾下,修改小部分資訊即可,以下列出可要修改部分:

rule.xml,基本不用修改

【mycat系列二】Docker安裝mycat并實作MySQL的讀寫分離

server.xml,修改mycat賬戶資訊

【mycat系列二】Docker安裝mycat并實作MySQL的讀寫分離

schema.xml,配置mysql主從資訊。前提是根據上一節配置好兩主四從,url對應的是上面查詢的每個mysql容器的ip,注意對應關系即可:

【mycat系列二】Docker安裝mycat并實作MySQL的讀寫分離

4、啟動mycat

docker 啟動mycat容器,加載上面配置好的檔案

docker run --name mycat -v /usr/local/mycat/schema.xml:/usr/local/mycat/conf/schema.xml -v /usr/local/mycat/rule.xml:/usr/local/mycat/conf/rule.xml -v /usr/local/mycat/server.xml:/usr/local/mycat/conf/server.xml --privileged=true -p 8066:8066 -p 9066:9066 -e MYSQL_ROOT_PASSWORD=123456 -d longhronshens/mycat-docker
           
  • -p  8066:8066:把容器8066端口映射到主控端的8066端口;
  • -e  MYSQL_ROOT_PASSWORD=123456:設定初始密碼為123456;
  • -v  /usr/local/mycat/schema.xml:/usr/local/mycat/conf/schema.xml:把主控端内的配置檔案挂載到容器中。
【mycat系列二】Docker安裝mycat并實作MySQL的讀寫分離

5、建立資料庫

在mysql 主庫建立一個資料庫test_db,與上面schema.xml中配置的一緻(不要操作從庫)

【mycat系列二】Docker安裝mycat并實作MySQL的讀寫分離

6、建立mycat連接配接

注:使用navicat連接配接(不推薦,可能報錯)

【mycat系列二】Docker安裝mycat并實作MySQL的讀寫分離

進入mysql裡連接配接

docker exec -it mysql-master /bin/bash 

mysql -uroot -proot -P8066
           

開始建立剛剛配置的邏輯庫,邏輯表:

-- 分别在每個邏輯主機建立test_db庫(master建立test_db庫)
CREATE DATABASE IF NOT EXISTS test_db;

-- 連接配接mycat成功,在test_db庫執行以下SQL語句
CREATE TABLE IF NOT EXISTS t_test (
  id BIGINT(20) NOT NULL,
  title VARCHAR(100) NOT NULL ,
  PRIMARY KEY (id)
) ENGINE=INNODB DEFAULT CHARSET=utf8 ;


INSERT INTO t_test (id,title) VALUES ('1','test0001');
INSERT INTO t_test (id,title) VALUES ('2','test0002');
INSERT INTO t_test (id,title) VALUES ('3','test0003');
INSERT INTO t_test (id,title) VALUES ('4','test0004');
INSERT INTO t_test (id,title) VALUES ('5','test0005');
INSERT INTO t_test (id,title) VALUES ('6','test0006');
SELECT * FROM t_test;


CREATE TABLE IF NOT EXISTS t_task_test (
  id BIGINT(20) NOT NULL,
  org_code VARCHAR(100) NOT NULL ,
  title VARCHAR(100) NOT NULL ,
  PRIMARY KEY (id)
) ENGINE=INNODB DEFAULT CHARSET=utf8 ;

INSERT INTO t_task_test (id,org_code,title) VALUES ('1','W12340001','test0001');
INSERT INTO t_task_test (id,org_code,title) VALUES ('2','W12340002','test0002');
INSERT INTO t_task_test (id,org_code,title) VALUES ('3','W12340003','test0003');
INSERT INTO t_task_test (id,org_code,title) VALUES ('4','W12340004','test0004');
INSERT INTO t_task_test (id,org_code,title) VALUES ('5','W12340005','test0005');
INSERT INTO t_task_test (id,org_code,title) VALUES ('6','W12340006','test0006');
SELECT * FROM t_task_test;
           
【mycat系列二】Docker安裝mycat并實作MySQL的讀寫分離

四、附錄

期間遇到mysql-master 插入資料報錯,但是mysql-master2正常:

--資料庫中插入資料或執行sql語句時一直報下面這個錯誤:

Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'information_schema.PROFILING.SEQ' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

首先,可以先檢視一下 mysql-master 資料庫現在的sql_mode的值,sql語句為:

select version(), @@sql_mode;
           

擷取結果可能如下,不同的設定查詢出來的有差別:

【mycat系列二】Docker安裝mycat并實作MySQL的讀寫分離

然後可以使用如下語句,去設定自己需要的sql_mode.

SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
           

最後,配置好所有,就可以嘗試在mycat中操作資料庫表,檢視是否同步更新到具體的實體資料庫mysql中。

參考:

https://blog.csdn.net/Amor_Leo/article/details/85218405

https://github.com/baojingyu/docker-mycat-mysql

【mycat系列二】Docker安裝mycat并實作MySQL的讀寫分離

●阿裡巴巴為什麼能抗住90秒100億?B2B電商平台--ChinaPay銀聯電子支付功能

●學會Zookeeper分布式鎖,讓面試官對你刮目相看

【mycat系列二】Docker安裝mycat并實作MySQL的讀寫分離