mycat配置分片

機器信息

機器IP 安裝服務 暴露端口
192.168.177.128 mycat服務 對外暴露端口8066
192.168.177.131 mysql1 對外暴露端口3306
192.168.177.132 mysql2 對外暴露端口3306

1.安裝mycat

1.1 安裝包下載(建議版本保持一致,成功後自己可以嘗試新版本)
mycat下載
jdk下載
在這裏插入圖片描述
1.2 解壓安裝

#解壓
tar -zxf jdk-8u251-linux-x64.tar.gz
tar -zxf Mycat-server-1.6.5-release-20180122220033-linux.tar.gz

我這邊是把解壓後的文件都移動到了/usr/local目錄,這個看個人習慣,如果不移動,後面配置jdk和mycat環境變量時候,目錄要修改下
在這裏插入圖片描述
1.3配置環境變量
/etc/目錄下的profile文件,在文件最後加上環境變量配置
如果jdk和mycat路徑不一致,記得修改

export JAVA_HOME=/usr/local/java/jdk1.8.0_251
export MYCAT_HOME=/usr/local/mycat
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar

export PATH=$PATH:$JAVA_HOME/bin:$MYCAT_HOME/bin

在這裏插入圖片描述
編輯完成,保存退出,並執行如下命令。

#刷新環境變量配置
source profile
#驗證環境變量配置是否生效
java -version

2.準備mysql實例

2.1 準備兩臺mysql實例
我這邊是直接用docker起了兩個msyql5.7的容器,在做這種演示的時候,docker是非常方便快捷的,一行命令搞定。

docker run --name Mymysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

注意:

  1. 以上命令要先安裝docker,安裝方法參考往期docker文章
  2. 你可以在同一臺機器上起兩個mysql容器,那麼記得修改端口映射,例如一個是 -p 3306:3306另一個就得配置 -p {自定義端口}:3306;如果你是每臺機器起一個mysql示例,那麼上面命令不用做任何修改,直接分別執行就好(此處只做演示用,沒有配置掛載數據卷及其它一些mysql配置)
  3. 記得開防火牆

2.2 初始化數據庫以及表
每個示例建立一個user數據庫,以及一張user表,作爲我們後面分片實驗使用。

-- 導出 user 的數據庫結構
CREATE DATABASE IF NOT EXISTS `user` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin */;
USE `user`;

-- 導出  表 user.user 結構
CREATE TABLE IF NOT EXISTS `t_user` (
  `id` bigint(20) NOT NULL COMMENT 'id',
  `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '名字',
  `age` int(11) DEFAULT NULL COMMENT '年齡',
  `address` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '地址',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='用戶表';

3.配置分片

mycat有三個很重要的配置文件:server.xml、schema.xml、rule.xml,這裏不做展開講,因爲每一個文件都有大量配置,都可以寫一整篇文章,而且網上相關介紹資料也很多,大家可以自行查閱。
在這裏插入圖片描述
3.1 配置分片rule
修改rule.xml配置分片規則

	<tableRule name="partitionByMod-id-2">
		<rule>
			<columns>id</columns>
			<algorithm>PartitionByMod</algorithm>
		</rule>
	</tableRule>
	<function name="PartitionByMod" class="io.mycat.route.function.PartitionByMod">
		<property name="count">2</property>
	</function>

在這裏插入圖片描述

  • tableRule - name:我們定義的規則名稱,自己取,最好見文知意。rule.xml文件不能有相同的tableRule name
  • cloumns:對那個字段進行分片
  • algorithm:和下面的function標籤name對應上就好
  • function - class:定義分片算法,io.mycat.route.function.PartitionByMod,mycat提供了很多種分片算法
  • property name=“count”:分片節點數,對應schema.xml中,table標籤 dataNode配置數量

3.2 配置schema

<!-- schema name配置邏輯庫名,可以定義;table name配置的邏輯表名和準備的兩個數據庫,表名保持一致 -->
<schema name="demo" checkSQLschema="false" sqlMaxLimit="100">
	<table name="t_user" primaryKey="id" dataNode="dn1,dn2" rule="partitionByMod-id-2"/>
</schema>
<!-- 配置兩個dataNode,database和兩個mysql庫名一致 -->
<dataNode name="dn1" dataHost="host1" database="user" />
<dataNode name="dn2" dataHost="host2" database="user" />
<!-- 配置host1代表的是那個數據庫實例 -->
<dataHost name="host1" maxCon="1000" minCon="10" balance="0"
		  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
	<heartbeat>select user()</heartbeat>
	<writeHost host="hostS1" url="192.168.177.131:3306" user="root" password="123456">
	</writeHost>
</dataHost>
<!-- 配置host2代表的是那個數據庫實例 -->
<dataHost name="host2" maxCon="1000" minCon="10" balance="0"
		  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
	<heartbeat>select user()</heartbeat>
	<writeHost host="hostS2" url="192.168.177.132:3306" user="root" password="123456">
	</writeHost>
</dataHost>

在這裏插入圖片描述

3.3 配置server.xml

<!-- mycat賬號 -->
<user name="root" defaultAccount="true">
	<!-- mycat密碼 -->
	<property name="password">123456</property>
	<!-- 邏輯庫名 -->
	<property name="schemas">demo</property>
</user>

在這裏插入圖片描述

4.啓動mycat測試

4.1 啓動:

#或者 mycat restart
mycat start

4.2 查看mycat的日誌,看是否啓動成功

 tail -f /usr/local/mycat/logs/wrapper.log 

在這裏插入圖片描述
看到這一行日誌,並且前面沒報錯,說明啓動成功。

4.3 測試
我這邊使用python進行的測試,因爲代碼簡單。(我是個python菜鳥QAQ)

import MySQLdb
import random
import string

conn = MySQLdb.connect(host="192.168.177.128",port=8066,user="root",passwd ="123456",db="demo",charset='utf8')
conn.autocommit(1)
# 使用cursor()方法獲取操作遊標
cursor = conn.cursor()
for i in range(1,10):
    ran_str = ''.join(random.sample(string.ascii_letters + string.digits, 8))
    sqlStr = "insert into t_user(id,name,age,address)values('{}','{}',18,'廣東省深圳市')".format(i,ran_str)
    cursor.execute(sqlStr)

在這裏插入圖片描述
在這裏插入圖片描述
最後可以看到數據根據id對2取模分到兩個庫的t_user表中。

補充:
id對2取模,這些都是定義在rule.xml中的。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章