一、Mycat簡介
Mycat是一個開源的分布式資料庫系統,其核心功能是分庫分表,即將一個達標水平分割成多個小表,存盤在后端MySQL或者其他資料庫里,取名Mycat原因一是簡單好記,另一個則是希望未來能夠入駐 Apache,Apache的開源產品Tomcat也是一只貓,MyCAT 是一個徹底開源的,面向企業應用開發的“大資料庫集群” 支持事務、ACID、可以替代Mysql的加強版資料庫; 一個可以視為“Mysql”集群的企業級資料庫,用來替代昂貴的Oracle集群 ; 一個融合記憶體快取技術、Nosql技術、HDFS大資料的新型SQL Server; 結合傳統資料庫和新型分布式資料倉庫的新一代企業級資料庫產品 ; 一個新穎的資料庫中間件產品,
二、Mycat實驗測驗
1. Mycat基礎架構準備
1.1 環境準備:
兩臺虛擬機 mysql1 mysql2
1.2 每臺創建相關目錄初始化資料
// mysql1:
mkdir /data/33{07..10}/data -p
#初始化
mysqld --initialize-insecure --user=mysql --datadir=/data/3307/data --basedir=/usr/local/mysql
mysqld --initialize-insecure --user=mysql --datadir=/data/3308/data --basedir=/usr/local/mysql
mysqld --initialize-insecure --user=mysql --datadir=/data/3309/data --basedir=/usr/local/mysql
mysqld --initialize-insecure --user=mysql --datadir=/data/3310/data --basedir=/usr/local/mysql
// mysql2:
mkdir /data/33{07..10}/data -p
#初始化
mysqld --initialize-insecure --user=mysql --datadir=/data/3307/data --basedir=/usr/local/mysql
mysqld --initialize-insecure --user=mysql --datadir=/data/3308/data --basedir=/usr/local/mysql
mysqld --initialize-insecure --user=mysql --datadir=/data/3309/data --basedir=/usr/local/mysql
mysqld --initialize-insecure --user=mysql --datadir=/data/3310/data --basedir=/usr/local/mysql
1.3 準備mysql1和mysql2組態檔和啟動腳本,
注意:server_id不能一致,要不然主從是做不了的
//mysql1
cat >/data/3307/my.cnf<<EOF
[mysqld]
basedir=/usr/local/mysql
datadir=/data/3307/data
socket=/data/3307/mysql.sock
port=3307
log-error=/data/3307/mysql.log
log_bin=/data/3307/mysql-bin
binlog_format=row
skip-name-resolve
server-id=7
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
EOF
cat >/data/3308/my.cnf<<EOF
[mysqld]
basedir=/usr/local/mysql
datadir=/data/3308/data
port=3308
socket=/data/3308/mysql.sock
log-error=/data/3308/mysql.log
log_bin=/data/3308/mysql-bin
binlog_format=row
skip-name-resolve
server-id=8
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
EOF
cat >/data/3309/my.cnf<<EOF
[mysqld]
basedir=/usr/local/mysql
datadir=/data/3309/data
socket=/data/3309/mysql.sock
port=3309
log-error=/data/3309/mysql.log
log_bin=/data/3309/mysql-bin
binlog_format=row
skip-name-resolve
server-id=9
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
EOF
cat >/data/3310/my.cnf<<EOF
[mysqld]
basedir=/usr/local/mysql
datadir=/data/3310/data
socket=/data/3310/mysql.sock
port=3310
log-error=/data/3310/mysql.log
log_bin=/data/3310/mysql-bin
binlog_format=row
skip-name-resolve
server-id=10
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
EOF
cat >/etc/systemd/system/mysqld3307.service<<EOF
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/data/3307/my.cnf
LimitNOFILE = 5000
EOF
cat >/etc/systemd/system/mysqld3308.service<<EOF
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/data/3308/my.cnf
LimitNOFILE = 5000
EOF
cat >/etc/systemd/system/mysqld3309.service<<EOF
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/data/3309/my.cnf
LimitNOFILE = 5000
EOF
cat >/etc/systemd/system/mysqld3310.service<<EOF
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/data/3310/my.cnf
LimitNOFILE = 5000
EOF
//mysql2
cat >/data/3307/my.cnf<<EOF
[mysqld]
basedir=/usr/local/mysql
datadir=/data/3307/data
socket=/data/3307/mysql.sock
port=3307
log-error=/data/3307/mysql.log
log_bin=/data/3307/mysql-bin
binlog_format=row
skip-name-resolve
server-id=17
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
EOF
cat >/data/3308/my.cnf<<EOF
[mysqld]
basedir=/usr/local/mysql
datadir=/data/3308/data
port=3308
socket=/data/3308/mysql.sock
log-error=/data/3308/mysql.log
log_bin=/data/3308/mysql-bin
binlog_format=row
skip-name-resolve
server-id=18
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
EOF
cat >/data/3309/my.cnf<<EOF
[mysqld]
basedir=/usr/local/mysql
datadir=/data/3309/data
socket=/data/3309/mysql.sock
port=3309
log-error=/data/3309/mysql.log
log_bin=/data/3309/mysql-bin
binlog_format=row
skip-name-resolve
server-id=19
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
EOF
cat >/data/3310/my.cnf<<EOF
[mysqld]
basedir=/usr/local/mysql
datadir=/data/3310/data
socket=/data/3310/mysql.sock
port=3310
log-error=/data/3310/mysql.log
log_bin=/data/3310/mysql-bin
binlog_format=row
skip-name-resolve
server-id=20
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
EOF
cat >/etc/systemd/system/mysqld3307.service<<EOF
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/data/3307/my.cnf
LimitNOFILE = 5000
EOF
cat >/etc/systemd/system/mysqld3308.service<<EOF
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/data/3308/my.cnf
LimitNOFILE = 5000
EOF
cat >/etc/systemd/system/mysqld3309.service<<EOF
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/data/3309/my.cnf
LimitNOFILE = 5000
EOF
cat >/etc/systemd/system/mysqld3310.service<<EOF
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/data/3310/my.cnf
LimitNOFILE = 5000
EOF
1.4 修改一下權限,啟動多實體
// mysql1
chown -R mysql.mysql /data/*
systemctl start mysqld3307
systemctl start mysqld3308
systemctl start mysqld3309
systemctl start mysqld3310
// -e不登錄mysql,執行sql內部命令,查看自己的serverid,目的是檢測是否啟動配置成功
mysql -S /data/3307/mysql.sock -e "show variables like 'server_id'"
mysql -S /data/3308/mysql.sock -e "show variables like 'server_id'"
mysql -S /data/3309/mysql.sock -e "show variables like 'server_id'"
mysql -S /data/3310/mysql.sock -e "show variables like 'server_id'"
// 如果是桌面安裝可以過濾一下埠號看看開沒開起
netstat -anput | grep 33
// mysql2
chown -R mysql.mysql /data/*
systemctl start mysqld3307
systemctl start mysqld3308
systemctl start mysqld3309
systemctl start mysqld3310
// 查看自己的sever_id號
mysql -S /data/3307/mysql.sock -e "show variables like 'server_id'"
mysql -S /data/3308/mysql.sock -e "show variables like 'server_id'"
mysql -S /data/3309/mysql.sock -e "show variables like 'server_id'"
mysql -S /data/3310/mysql.sock -e "show variables like 'server_id'"
1.5 節點主從規劃

1.6 開始配置主從
// mysql1-3307 創建一個連接用戶并附復制權
mysql -S /data/3307/mysql.sock -e "grant replication slave on *.* to repl@'192.168.8.%' identified by '123';"
// mysql1-3308 創建一個連接用戶并附復制權
mysql -S /data/3307/mysql.sock -e "grant replication slave on *.* to repl@'192.168.8.%' identified by '123';"
// mysql2-3307 創建一個連接用戶并附復制權
mysql -S /data/3307/mysql.sock -e "grant replication slave on *.* to repl@'192.168.8.%' identified by '123';"
// mysql2-3308 創建一個連接用戶并附復制權
mysql -S /data/3307/mysql.sock -e "grant replication slave on *.* to repl@'192.168.8.%' identified by '123';"
//第一組四節點結構
## mysql1(8.129)3307-(8.130)3307:
// 連接8.130 3307埠的mysql并認作主
mysql -S /data/3307/mysql.sock -e "CHANGE MASTER TO MASTER_HOST='192.168.8.130', MASTER_PORT=3307, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='123';"
// 開啟slave
mysql -S /data/3307/mysql.sock -e "start slave;"
// 查看slave狀態
mysql -S /data/3307/mysql.sock -e "show slave status\G"
## mysql2(8.129)3308-(8.130)3308:
// 連接8.129 3307埠的mysql并認作主
mysql -S /data/3307/mysql.sock -e "CHANGE MASTER TO MASTER_HOST='192.168.8.129', MASTER_PORT=3307, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='123';"
// 開啟slave
mysql -S /data/3307/mysql.sock -e "start slave;"
// 查看slave狀態
mysql1 -S /data/3307/mysql.sock -e "show slave status\G"
## mysql1(8.129) 3309-3307:
// 連接8.129 3307埠的mysql并認作主
mysql -S /data/3307/mysql.sock -e "CHANGE MASTER TO MASTER_HOST='192.168.8.129', MASTER_PORT=3307, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='123';"
// 開啟slave
mysql -S /data/3307/mysql.sock -e "start slave;"
// 查看slave狀態
mysql -S /data/3307/mysql.sock -e "show slave status\G"
## mysql1(8.130) 3309-3307:
// 連接8.130 3307埠的mysql并認作主
mysql -S /data/3307/mysql.sock -e "CHANGE MASTER TO MASTER_HOST='192.168.8.130', MASTER_PORT=3307, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='123';"
// 開啟slave
mysql -S /data/3307/mysql.sock -e "start slave;"
// 查看slave狀態
mysql -S /data/3307/mysql.sock -e "show slave status\G"
## mysql1(8.129) 3310-3308:
// 連接8.129 3307埠的mysql并認作主
mysql -S /data/3307/mysql.sock -e "CHANGE MASTER TO MASTER_HOST='192.168.8.129', MASTER_PORT=3307, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='123';"
// 開啟slave
mysql -S /data/3307/mysql.sock -e "start slave;"
// 查看slave狀態
mysql -S /data/3307/mysql.sock -e "show slave status\G"
## mysql1(8.130) 3310-3308:
// 連接8.130 3307埠的mysql并認作主
mysql -S /data/3307/mysql.sock -e "CHANGE MASTER TO MASTER_HOST='192.168.8.130', MASTER_PORT=3307, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='123';"
// 開啟slave
mysql -S /data/3307/mysql.sock -e "start slave;"
// 查看slave狀態
mysql -S /data/3307/mysql.sock -e "show slave status\G"
1.7 重新檢測主從狀態
// mysql1過濾是否有8個yes
mysql -S /data/3307/mysql.sock -e "show slave status\G"|grep Yes
mysql -S /data/3308/mysql.sock -e "show slave status\G"|grep Yes
mysql -S /data/3309/mysql.sock -e "show slave status\G"|grep Yes
mysql -S /data/3310/mysql.sock -e "show slave status\G"|grep Yes
// mysql2過濾是否有8個yes
mysql -S /data/3307/mysql.sock -e "show slave status\G"|grep Yes
mysql -S /data/3308/mysql.sock -e "show slave status\G"|grep Yes
mysql -S /data/3309/mysql.sock -e "show slave status\G"|grep Yes
mysql -S /data/3310/mysql.sock -e "show slave status\G"|grep Yes
// 如果中間出現錯誤,在每個節點執行以下命令,從1.6部重新開始
mysql -S /data/3307/mysql.sock -e "stop slave; reset slave all;"
mysql -S /data/3308/mysql.sock -e "stop slave; reset slave all;"
mysql -S /data/3309/mysql.sock -e "stop slave; reset slave all;"
mysql -S /data/3310/mysql.sock -e "stop slave; reset slave all;"
2. Mycat安裝
2.1 預先安裝Java運行環境
// 配好網路yum源,直接下載java
yum -y install java
2.2 下載mycat包
http://www.mycat.org.cn/
2.3 解壓檔案
// tar解壓到指定目錄里
tar xf Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz -C /usr/local
2.4 啟動和連接
// 配置環境變數
vim /etc/profile
// 在最后一行添加環境變數
export PATH=/usr/local/mycat/bin:$PATH
// 重啟檔案
source /etc/profile
// 添加Mycat的最長啟動時間,如果300秒內啟動不成功會自動斷開連接
vim /usr/local/mycat/conf/wrapper.conf
wrapper.startup.timeout=300
// 啟動Mycat
mycat start
// 檢查是否開啟成功
tail -f /usr/local/mycat/logs/wrapper.conf
//連接Mycat
mysql -uroot -p123456 -h 127.0.0.1 -P8806
## 解釋一下為什么密碼是123456,這個密碼可以在/usr/local/mycat/conf/server.xml里改,埠和密碼都是默認的,
3. 資料庫分布式架構方式
3.1 垂直拆分
一個資料庫由很多表的構成,每個表對應著不同的業務,垂直切分是指按照業務將表進行分類,分布到不同的資料庫上面,這樣也就將資料或者說壓力分擔到不同的庫上面,可實作單庫單表,
3.2 水平拆分
可以將一個大表拆分成很多小表,可分為
范圍拆分:可分多個表,可以自定義,ID列1-50分一個表,50-100分一個表,
取模拆分:如果有ID列都會除2,余0分一個表,余1分個表,
列舉拆分:比如一個名單,有男有女,可以將男孩分一個表,女孩分一個表,
3.3 組態檔結構介紹
// 創建root用戶,并把資料匯入
## mysql1(在mycat下載點上創建):
mysql -S /data/3307/mysql.sock
grant all on *.* to root@'192.168.8.%' identified by '123';
source /root/world.sql
mysql -S /data/3308/mysql.sock
grant all on *.* to root@'192.168.8.%' identified by '123';
source /root/world.sql
// 將root目錄下的world表匯入到資料庫中,因為做了主從,導兩個節點所有節點都會有,
// 進入目錄
cd /usr/local/mycat/conf
// 將檔案改名
mv schema.xml schema.xml.bak
cat schema.xml.bak
##開頭
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
## mycat 邏輯庫定義:
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="sh1">
</schema>
##資料節點定義:
<dataNode name="sh1" dataHost="laotian1" database= "world" />
## 后端主機定義:
<dataHost name="laoli1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1">
<heartbeat>select user()</heartbeat>
<writeHost host="db1" url="192.168.8.129:3307" user="root" password="123">
<readHost host="db2" url="192.168.8.129:3309" user="root" password="123" />
</writeHost>
</dataHost>
## 檔案結尾
</mycat:schema>
3.4 Mycat高可用+讀寫分離
## 編輯schema.xml檔案
vim /usr/local/mycat/conf/schema.xml
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="sh1">
</schema>
<dataNode name="sh1" dataHost="laoli1" database= "world" />
<dataHost name="laoli1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1">
<heartbeat>select user()</heartbeat>
## 寫1
<writeHost host="db1" url="192.168.8.129:3307" user="root" password="123">
## 讀1
<readHost host="db2" url="192.168.8.129:3309" user="root" password="123" />
</writeHost>
## 寫2
<writeHost host="db3" url="192.168.8.130:3307" user="root" password="123">
## 讀2
<readHost host="db4" url="192.168.8.130:3309" user="root" password="123" />
</writeHost>
</dataHost>
</mycat:schema>
備注:
balance屬性
負載均衡型別,目前的取值有3種:
1. balance="0", 不開啟讀寫分離機制,所有讀操作都發送到當前可用的writeHost上,
2. balance="1",全部的readHost與standby writeHost參與select陳述句的負載均衡,簡單的說,
當雙主雙從模式(M1->S1,M2->S2,并且M1與 M2互為主備),正常情況下,M2,S1,S2都參與select陳述句的負載均衡,
3. balance="2",所有讀操作都隨機的在writeHost、readhost上分發,
writeType屬性
負載均衡型別,目前的取值有2種:
1. writeType="0", 所有寫操作發送到配置的第一個writeHost,
第一個掛了切到還生存的第二個writeHost,重新啟動后已切換后的為主,切換記錄在組態檔中:dnindex.properties .
2. writeType=“1”,所有寫操作都隨機的發送到配置的writeHost,但不推薦使用
switchType屬性
-1 表示不自動切換
1 默認值,自動切換
2 基于MySQL主從同步的狀態決定是否切換 ,心跳陳述句為 show slave status
datahost其他配置
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1">
PS:本文章出自田寫作,一篇文章固然講不通Mycat的實際用法,大家可以按照我的步驟把Mycat裝上,具體任務具體分析,希望大家能在IT行業越走越遠,謝謝~
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/294172.html
標籤:其他
下一篇:Ribbon負載均衡服務呼叫
