Mycat安裝並實現mysql讀寫分離,分庫分表
阿新 • • 發佈:2018-12-22
轉載請表明出處 https://blog.csdn.net/Amor_Leo/article/details/85204592 謝謝
Mycat安裝並實現mysql讀寫分離,分庫分表
jdk安裝
建立資料夾
mkdir -p /usr/local/java
cd /usr/local/java
下載jdk並配置
- 去官網下載,並用xftp把下載的jdk放入/usr/local/java
- 解壓
tar -zxvf jdk-8u192-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
- 重新整理
source /etc/profile
- 檢視是否成功
java -version
安裝mycat
- 首先搭建mysql的主從複製,二擇其一 :
- 環境
- mysql主 192.168.0.131
- mysql從 192.168.0.108
- mycat 192.168.0.131
建立資料夾
mkdir -p /usr/local/mycat
cd /usr/local/mycat
下載
- 去官網下載,並用xftp把下載的mycat放入/usr/local/mycat
- 解壓
tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
mycat的使用方法
- 官網
- 命令
./mycat start 啟動 ./mycat stop 停止 ./mycat console 前臺執行 ./mycat restart 重啟服務 ./mycat pause 暫停 ./mycat status 檢視啟動狀態
mycat具體配置
- server.xml : 是Mycat伺服器引數調整和使用者授權的配置檔案
- schema.xml : 是邏輯庫定義和表以及分片定義的配置檔案
- rule.xml : 是分片規則的配置檔案,分片規則的具體一些引數資訊單獨存放為檔案
server.xml
<property name="sequnceHandlerType">0</property>
<user name="root">
<property name="password">root</property>
<property name="schemas">test</property>
</user>
- sequnceHandlerType
- 0 : 使用本地方式作為資料庫自增,設定 sequence_conf.properties配置檔案
- GLOBAL.HISIDS=
- GLOBAL.MINID=10001 最小值
- GLOBAL.MAXID=20000 最大值
- GLOBAL.CURID=10000 當前值
- 1 : 使用的是本地資料庫的方式,需要在一個分節點建立MYCAT_SEQUENCE表和儲存過程,其中MYCAT_SEQUENCE必須為大寫
- 2 : 自動生成64為的時間戳,設定配置sequence_db_conf.properties,指定sequence相關配置在哪個節點上
- 0 : 使用本地方式作為資料庫自增,設定 sequence_conf.properties配置檔案
- name : 使用者名稱
- password : 使用者密碼
- schemas : mycat邏輯庫,對應schemas.xml裡schema標籤的name屬性,多個邏輯庫用逗號隔開
schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="test" checkSQLschema="false" sqlMaxLimit="100">
<table name="tb_user" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2,dn3,dn4" rule="userrule" />
<table name="tb_category" primaryKey="id" dataNode="dn1,dn2,dn3,dn4" rule="categoryrule" />
</schema>
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<dataNode name="dn4" dataHost="localhost1" database="db4" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.0.131:3306" user="root"
password="root">
<readHost host="hostS2" url="192.168.0.108:3306" user="root" password="root" />
</writeHost>
</dataHost>
</mycat:schema>
- schema : 是實際邏輯庫的配置,多個schema代表多個邏輯庫
- table : 是邏輯表的配置
- name : 代表表名
- primaryKey : 主鍵
- autoIncrement : 開啟自動增長,不使用自動增長就不要加
- dataNode : 代表表對應的分片,Mycat預設採用分庫方式,也就是一個表對映到不同的庫上,對應dataNode標籤的name,多個用逗號隔開
- rule代表表要採用的資料切分方式,名稱對應到rule.xml中tableRule標籤的name屬性,如果要分片必須配置
- table : 是邏輯表的配置
- dataNode : 是邏輯庫對應的分片,如果配置多個分片只需要多個dataNode即可
- name : dataNode的名
- dataHost : 是實際的物理庫配置地址,可以配置多主主從等其他配置,對應dataHost標籤的name屬性
- database : 對映實際的物理庫
- dataHost : 配置物理庫分片對映
- balance : 讀的負載均衡型別
- balance=“0” : 不開啟讀寫分離機制,所有讀操作都發送到當前可用的writeHost上
- balance=“1” : 全部的readHost與stand by writeHost參與select語句的負載均衡,簡單的說,當雙主雙從模式(M1->S1,M2->S2,並且M1與 M2互為主備),正常情況下,M2,S1,S2都參與select語句的負載均衡
- balance=“2” : 所有讀操作都隨機的在writeHost、readhost上分發
- balance=“3” : 所有讀請求隨機的分發到wiriterHost對應的readhost執行,writerHost不負擔讀壓力注意,只在 1.4 及其以後版本有
- writeType : 寫的負載均衡型別
- writeType=“0” : 所有寫操作傳送到配置的第一個 writeHost,第一個掛了切到還生存的第二個 ,writeHost,重新啟動後已切換後的為準,切換記錄在配置檔案中:dnindex.properties
- writeType=“1” : 所有寫操作都隨機的傳送到配置的 writeHost,1.5 以後廢棄不推薦
- switchType : 切換的模式
- switchType="-1" : 表示不自動切換
- switchType=“1” : 預設值,表示自動切換
- switchType=“2” : 基於MySQL主從同步的狀態決定是否切換,心跳語句為 show slave status;
- switchType=“3” : 基於MySQL galary cluster的切換機制(適合叢集)心跳語句為 show status like ‘wsrep%’;
- writeHost : 邏輯主機(dataHost)對應的後端的物理主機對映.mysql主
- readHost : mysql從
- balance : 讀的負載均衡型別
sequence_conf.properties
- “sequnceHandlerType” 0
- autoIncrement=“true”
TB_USER.HISIDS=
TB_USER.MINID=1
TB_USER.MAXID=20000
TB_USER.CURID=1
rule.xml
<tableRule name="userrule">
<rule>
<columns>id</columns>
<algorithm>func1</algorithm>
</rule>
</tableRule>
<tableRule name="categoryrule">
<rule>
<columns>id</columns>
<algorithm>jump-consistent-hash</algorithm>
</rule>
</tableRule>
- tableRule
- name : schema.xml中table標籤中對應的rule屬性,也就是配置表的分片規則
- columns : 是表的切分欄位
- algorithm : 是規則對應的切分規則,對應function標籤的name屬性
- function : 配置是分片規則的配置
- name : 切分規則的名稱,對應tableRule標籤的algorithm屬性
- class : 是切分規則對應的切分類,寫死,需要哪種規則則配置哪種
- property : 標籤是切分規則對應的不同屬性,不同的切分規則配置不同
啟動mycat
- 配置實際mysql資料庫,在mysql主上建4個數據庫db1,db2,db3,db4(不要操作從機)
- 啟動mycat
cd /usr/local/mycat/mycat/bin
./mycat start
- 連線mycat
- Linux
出現mycat就表示成功mysql -h127.0.0.1 -uroot -proot -P8066
- 視覺化工具
- Linux
- 如果有錯誤,檢視logs/wrapper.log
tail -f /usr/local/mycat/mycat/logs/wrapper.log
- 管理埠執行管理命令
mysql -h127.0.0.1 -uroot -proot -P9066
- 檢視所有命令
show @@help;
- 開始建立剛剛配置的邏輯庫,邏輯表
show databases;
use test;
CREATE TABLE `tb_user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`username` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '使用者名稱',
`password` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '密碼,加密儲存',
`phone` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '註冊手機號',
`email` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '註冊郵箱',
`created` datetime(0) NOT NULL,
`updated` datetime(0) NOT NULL,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `username`(`username`) USING BTREE,
UNIQUE INDEX `phone`(`phone`) USING BTREE,
UNIQUE INDEX `email`(`email`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 54 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '使用者表' ROW_FORMAT = Compact;
我們就可以看到mycat,mysql主從都建立了該表
再建一張表
CREATE TABLE `tb_category` (
`id` varchar(5) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`name` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '名字',
`sort_order` int(4) NOT NULL DEFAULT 1 COMMENT '排列序號,表示同級類目的展現次序,如數值相等則按名稱次序排列。取值範圍:大於零的整數',
`created` datetime(0) NULL DEFAULT NULL,
`updated` datetime(0) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
INDEX `updated`(`updated`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
再插入資料
INSERT INTO `tb_user`(id,username,password,phone,email,created,updated) VALUES (7, 'zhangsan', 'e10adc3949ba59abbe56e057f20f883e', '13488888888', '[email protected]', '2015-04-06 17:03:55', '2015-04-06 17:03:55');
如果報ERROR 1064 (HY000): insert must provide ColumnList
插入資料時一定要把所有欄位帶上
- 我們就可以看到mysql主從裡已經添加了資料