1. 程式人生 > >Mycat安裝並實現mysql讀寫分離,分庫分表

Mycat安裝並實現mysql讀寫分離,分庫分表

轉載請表明出處 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
    /bin # Tomcat require this env export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
  • 重新整理
    source /etc/profile
    
  • 檢視是否成功
    java -version
    

安裝mycat

建立資料夾

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相關配置在哪個節點上
  • 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屬性,如果要分片必須配置
  • 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從

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
      mysql -h127.0.0.1 -uroot -proot -P8066 
      
      出現mycat就表示成功在這裡插入圖片描述
    • 視覺化工具
      在這裡插入圖片描述
  • 如果有錯誤,檢視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主從裡已經添加了資料
    在這裡插入圖片描述
    在這裡插入圖片描述
    在這裡插入圖片描述