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