馬來(lái)西亞做網(wǎng)站一鍵搭建網(wǎng)站
Mycat適用的場(chǎng)景很豐富,以下是幾個(gè)典型的應(yīng)用場(chǎng)景:
1.單純的讀寫(xiě)分離,此時(shí)配置最為簡(jiǎn)單,支持讀寫(xiě)分離,主從切換
2.分表分庫(kù),對(duì)于超過(guò)1000萬(wàn)的表進(jìn)行分片,最大支持1000億的單表分片
3.多租戶應(yīng)用,每個(gè)應(yīng)用一個(gè)庫(kù),但應(yīng)用程序只連接mycat,從而不改造高程序本身,實(shí)現(xiàn)多租戶化報(bào)表系統(tǒng),借助于mycat的分表能力,處理大規(guī)模報(bào)表的統(tǒng)計(jì)。
4.替代hbash,分析大數(shù)據(jù),作為海量數(shù)據(jù)實(shí)時(shí)查詢(xún)的一種簡(jiǎn)單有效方案,比如100億條頻繁查詢(xún)的記錄需要在3秒內(nèi)查詢(xún)出來(lái)結(jié)果,除了基于主鍵的查詢(xún),還可能存在范圍查詢(xún)或其他屬性查詢(xún),此時(shí)mycat可能是最簡(jiǎn)單有效的選擇。
mycat長(zhǎng)期路線圖:
強(qiáng)化分布式數(shù)據(jù)庫(kù)中間件的方面的功能,使之具備豐富的插件、強(qiáng)大的數(shù)據(jù)庫(kù)只能優(yōu)化功能、全面的系統(tǒng)監(jiān)控能力、以及方便的數(shù)據(jù)運(yùn)維工具,實(shí)現(xiàn)在線數(shù)據(jù)擴(kuò)容、遷移等高級(jí)功能進(jìn)一步挺進(jìn)大數(shù)據(jù)計(jì)算領(lǐng)域,深度結(jié)合spark stream和storm等分布式實(shí)時(shí)流引擎,能夠完成快速的巨表關(guān)聯(lián)、排序、分組聚合等OLAP方向的能力,并集成一些熱門(mén)常用的實(shí)時(shí)分析算法,讓工程師以及DBA們更容易用mycat實(shí)現(xiàn)一些高級(jí)數(shù)據(jù)分析處理功能不斷強(qiáng)化Mycat開(kāi)源社區(qū)的技術(shù)水平,吸引更多的IT技術(shù)專(zhuān)家,使得Mycat社區(qū)成為中國(guó)的Apache,并將mycat推到Apache基金會(huì),稱(chēng)為國(guó)內(nèi)頂尖開(kāi)源項(xiàng)目,最終能夠讓一部分志愿者成為專(zhuān)職的mycat開(kāi)發(fā)者。
mycat可以簡(jiǎn)單概括為:
一個(gè)徹底開(kāi)源的,面向企業(yè)應(yīng)用開(kāi)發(fā)的大數(shù)據(jù)集群。
支持事務(wù)、ACID、可以替代mysql的加強(qiáng)版數(shù)據(jù)庫(kù)
一個(gè)可以視為mysql集群的企業(yè)級(jí)數(shù)據(jù)庫(kù),用來(lái)替代昂貴的oracle集群
一個(gè)融合內(nèi)存緩存技術(shù)、Nosql技術(shù)、HDFS大數(shù)據(jù)的新型SQL Server
結(jié)合傳統(tǒng)數(shù)據(jù)庫(kù)和新型分布式數(shù)據(jù)倉(cāng)庫(kù)的新一代企業(yè)級(jí)數(shù)據(jù)庫(kù)產(chǎn)品
一個(gè)新穎的數(shù)據(jù)庫(kù)中間件產(chǎn)品
mycat部署:
mycat安裝目錄結(jié)構(gòu)說(shuō)明:
bin:mycat命令,啟動(dòng),重啟,停止等運(yùn)行目錄
catlet:catlet為mycat的一個(gè)擴(kuò)展功能
conf:mycat配置信息
lib:mycat引用的jar包,mycat是java開(kāi)發(fā)的
logs:日志文件,包括mycat啟動(dòng)的日志和運(yùn)行的日志
version.txt:mycat版本說(shuō)明
mycat的常用配置文件:
mycat的配置文件都在conf目錄里面,介紹以下幾個(gè)常用的文件:
server.xml:mycat軟件本身相關(guān)的配置文件,設(shè)置賬號(hào),參數(shù)等
schema.xml:mycat對(duì)應(yīng)的物理數(shù)據(jù)庫(kù)和數(shù)據(jù)庫(kù)表的配置,讀寫(xiě)分離,高可用,分布式策略定制,節(jié)點(diǎn)控制
rule.xml:mycat分片(分庫(kù)分表)規(guī)則配置文件,記錄分片規(guī)則列表,使用方法等
mycat日志:
mycat的日志文件都在logs目錄里面*
wrapper.log:mycat啟動(dòng)日志
mycatl.log:mycat詳細(xì)工作日志
mycat的讀寫(xiě)分離實(shí)驗(yàn)
1. 環(huán)境準(zhǔn)備及架構(gòu)
mycat服務(wù)器上不能裝mysql??蛻舳伺cmysql主從服務(wù)器安裝mysql:
主機(jī)Node1作為客戶端
主機(jī)Node2作為mycat服務(wù)器,不能裝MySQL
主機(jī)Node3作為mysql主服務(wù)器
主機(jī)Node4作為mysql從服務(wù)器
客戶端登錄mycat訪問(wèn)的是mycat服務(wù)器,通過(guò)mycat服務(wù)器后臺(tái)調(diào)取mysql服務(wù)器的數(shù)據(jù)。主記錄寫(xiě)數(shù)據(jù),從記錄讀數(shù)據(jù)。
架構(gòu)如圖:
2. 初始化環(huán)境
systemctl stop firewalld #防火墻
setenforce 0 #核心防護(hù)
3. 部署主從復(fù)制,客戶端搭建mysql數(shù)據(jù)庫(kù)
Node3主,Node4從。Node1客戶端
數(shù)據(jù)庫(kù)的安裝參考我前面的博客,這里在數(shù)據(jù)庫(kù)安裝完成的前提下只做主從復(fù)制:數(shù)據(jù)庫(kù)的安裝(與主從復(fù)制原理與實(shí)現(xiàn))
Node3開(kāi)啟二進(jìn)制日志:
[root@Node3 ~]#:vim /etc/my.cnf
......
server-id=30
log-bin=/data/mysql/mysql-bin
#創(chuàng)建路徑
[root@Node3 ~]#:mkdir /data/mysql -p
#修改權(quán)限
[root@Node3 ~]#:chown -R mysql.mysql /data
#重啟
[root@Node3 ~]#:systemctl restart mysqld
[root@Node3 ~]#:systemctl status mysqld
● mysqld.service - MySQL ServerLoaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)Active: active (running) since 三 2024-07-10 15:10:33 CST; 6s agoDocs: man:mysqld(8)
......
Node4開(kāi)啟二進(jìn)制日志:
?同理,與Node3一樣,只需要修改一個(gè)server-id
[root@Node4 ~]#:vim /etc/my.cnf
server-id=40
log-bin=/data/mysql/mysql-bin
#創(chuàng)建路徑
[root@Node4 ~]#:mkdir /data/mysql -p
#修改權(quán)限
[root@Node4 ~]#:chown -R mysql.mysql /data
#重啟,查看狀態(tài)
[root@Node4 ~]#:systemctl restart mysqld
[root@Node4 ~]#:systemctl status mysqld
● mysqld.service - MySQL ServerLoaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)Active: active (running) since 三 2024-07-10 15:14:02 CST; 11s agoDocs: man:mysqld(8)
......
Node3操作:登錄數(shù)據(jù)庫(kù),查看節(jié)點(diǎn),添加一個(gè)用戶test并授權(quán):
[root@Node3 ~]#:mysql -uroot -pabc123 #用戶名和密碼(可以不遵守密碼策略!但要現(xiàn)修改密碼策略)
......
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
mysql> grant replication slave on *.* to test@'192.168.114.%' identified by 'Admin@123';
Query OK, 0 rows affected, 1 warning (0.00 sec)
Node4操作:作為從,指定主服務(wù)器:
[root@Node4 ~]#:mysql -uroot -pabc123
mysql> CHANGE MASTER TO-> MASTER_HOST='192.168.114.30',-> MASTER_USER='test',-> MASTER_PASSWORD='Admin@123',-> MASTER_PORT=3306,-> MASTER_LOG_FILE='mysql-bin.000001',-> MASTER_LOG_POS=154;
Query OK, 0 rows affected, 2 warnings (0.01 sec)#啟動(dòng)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)#查看狀態(tài),兩個(gè)線程yes。
mysql> show slave status\G
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.114.30Master_User: testMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000001Read_Master_Log_Pos: 449Relay_Log_File: Node4-relay-bin.000002Relay_Log_Pos: 615Relay_Master_Log_File: mysql-bin.000001Slave_IO_Running: YesSlave_SQL_Running: Yes
......
測(cè)試主從:
把一個(gè)準(zhǔn)備好的數(shù)據(jù)庫(kù)文件導(dǎo)入到Node3主服務(wù)器中,看從服務(wù)器是否同步!
[root@Node3 ~]#:mysql -uroot -pabc123 -e "show databases"
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
[root@Node3 ~]#:mysql -uroot -pabc123 < hellodb_innodb.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@Node3 ~]#:mysql -uroot -pabc123 -e "show databases"
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database |
+--------------------+
| information_schema |
| hellodb |
| mysql |
| performance_schema |
| sys |
+--------------------+
主上有了hellodb數(shù)據(jù)庫(kù)文件:
查看從是否同步:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| hellodb |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)#查看一個(gè)數(shù)據(jù)表teachers
mysql> select * from hellodb.teachers;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 93 | F |
+-----+---------------+-----+--------+#從上也同步了主上創(chuàng)建的test用戶
mysql> select user,host from mysql.user;
+---------------+---------------+
| user | host |
+---------------+---------------+
| test | 192.168.114.% |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+---------------+---------------+
4 rows in set (0.00 sec)
已同步!
4. 安裝mycat
Node2
準(zhǔn)備一個(gè)mycat安裝包。在我的/data/下,這個(gè)是自己建的一個(gè)目錄。
創(chuàng)建一個(gè)目錄/apps/解壓到該目錄下:
[root@Node2 data]#:mkdir /apps
[root@Node2 data]#:tar xf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz -C /apps/
[root@Node2 data]#:cd /apps/
[root@Node2 apps]#:ls
mycat
#添加環(huán)境變量,也可以做軟鏈接。目的是能夠補(bǔ)全命令,而不必使用絕對(duì)路徑
[root@Node2 apps]#:echo "PATH=/apps/mycat/bin:$PATH" > /etc/profile.d/mycat.sh
[root@Node2 apps]#:source /etc/profile.d/mycat.sh
啟動(dòng)mycat:
[root@Node2 apps]#:mycat
#只有以下參數(shù)
Usage: /apps/mycat/bin/mycat { console | start | stop | restart | status | dump }
[root@Node2 apps]#:mycat start
Starting Mycat-server...
#查看狀態(tài):
[root@Node2 apps]#:mycat status
Mycat-server is running (8372).
is running啟動(dòng)起來(lái)了
mycat安裝成功!成功啟動(dòng)!
使用客戶端Node1登錄mycat測(cè)試:
-u用戶名
-p密碼,默認(rèn)123456
-h主機(jī),是Node2,我的ip為192.168.114.20
-P端口號(hào),默認(rèn)8066
[root@Node1 ~]#:mysql -uroot -p123456 -h192.168.114.20 -P8066
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.29-mycat-1.6.7.4-release-20200105164103 MyCat Server (OpenCloudDB)Copyright (c) 2000, 2023, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB |
+----------+
1 row in set (0.00 sec)mysql>
?TESTDB虛表??蛻舳嗽L問(wèn)mycat是虛表。
5. 修改mycat配置文件使其與后端mysql主從服務(wù)器聯(lián)系
進(jìn)入/apps/mycat/conf/下。配置文件,修改server.xml文件,45行取消注釋,修改一個(gè)端口號(hào)為3306,客戶端不用指定8066端口號(hào)了,直接指定用戶,密碼,主機(jī)即可。
[root@Node2 apps]#:cd /apps/mycat/conf/
[root@Node2 conf]#:vim server.xml
......
<property name="serverPort">3306</property> <property name="managerPort">9066</property>
<property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property>
<property name="dataNodeIdleCheckPeriod">300000</property>
<property name="frontWriteQueueSize">4096</property> <property name="processors">32</property>
......
修改schema配置參數(shù),文件清空,把下面配置復(fù)制進(jìn)去,注意修改IP地址:
[root@Node2 conf]#:vim schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/"><schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema><dataNode name="dn1" dataHost="localhost1" database="hellodb" /><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="host1" url="192.168.114.30:3306" user="root" password="Admin@123"><readHost host="host2" url="192.168.114.40:3306" user="root" password="Admin@123"/></writeHost></dataHost>
</mycat:schema>
解釋:
#dataNode:表存儲(chǔ)到哪些節(jié)點(diǎn),多個(gè)節(jié)點(diǎn)用逗號(hào)分隔。節(jié)點(diǎn)為下文dataNode設(shè)置的name
#dataNode標(biāo)簽: 定義mycat中的數(shù)據(jù)節(jié)點(diǎn),也是通常說(shuō)的數(shù)據(jù)分片,也就是分庫(kù)相關(guān)配置
#database: 物理數(shù)據(jù)庫(kù)中數(shù)據(jù)庫(kù)名,該屬性用于定義該分片屬性哪個(gè)具體數(shù)據(jù)庫(kù)實(shí)例上的具體庫(kù)
#balance: 均衡負(fù)載的方式
#writeType: 寫(xiě)入方式
#host:用于標(biāo)識(shí)不同實(shí)例,一般 writeHost 我們使用*M1,readHost 我們用*S1。
#url:后端實(shí)例連接地址。Native:地址:端口 JDBC:jdbc的url
#user:后端存儲(chǔ)實(shí)例需要的用戶名字
#password:后端存儲(chǔ)實(shí)例需要的密碼
重啟并查看狀態(tài):會(huì)先開(kāi)一下,如果有問(wèn)題,還會(huì)再關(guān)閉,可以多看一下是否真正的起來(lái)
[root@Node2 conf]#:mycat restart
Stopping Mycat-server...
Stopped Mycat-server.
Starting Mycat-server...
[root@Node2 conf]#:mycat status
Mycat-server is running (8863).
[root@Node2 conf]#:mycat status
Mycat-server is running (8863).
[root@Node2 conf]#:mycat status
Mycat-server is running (8863).
6. 主從服務(wù)器創(chuàng)建一個(gè)root用戶給mycat連接并授權(quán)
在主上創(chuàng)建好一個(gè)root用戶后,從服務(wù)器也就同步了。
[root@Node3 ~]#:mysql -uroot -pabc123
......
mysql> GRANT ALL ON *.* TO 'root'@'192.168.114.%' IDENTIFIED BY 'Admin@123';
Query OK, 0 rows affected, 1 warning (0.01 sec)
在從上查看用戶:同步過(guò)來(lái)了
[root@Node4 ~]#:mysql -uroot -pabc123
......
mysql> select user,host from mysql.user;
+---------------+---------------+
| user | host |
+---------------+---------------+
| root | 192.168.114.% |
| test | 192.168.114.% |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+---------------+---------------+
5 rows in set (0.01 sec)
主從兩臺(tái)服務(wù)器開(kāi)啟通用日志:都需要開(kāi)通:
mysql> set global general_log=1;
Query OK, 0 rows affected (0.00 sec)
7. 測(cè)試讀寫(xiě)分離
兩臺(tái)服務(wù)器實(shí)時(shí)(tail -f 日志文件)檢測(cè)日志文件,在/var/lib/mysql/下有一個(gè)與主機(jī)名同名的日志文件:
主:Node3.log
從:Node4.log
監(jiān)控:主服務(wù)器監(jiān)控寫(xiě)操作,從服務(wù)器監(jiān)控讀操作:在主從服務(wù)器上實(shí)時(shí)查看通用日志
使用Node1客戶端訪問(wèn)mycat,插入一條數(shù)據(jù)到表teachers。再查看表數(shù)據(jù)。觀察主從的日志變化,是否在主上能看得到寫(xiě)操作,在從上能看得到讀的操作。進(jìn)而實(shí)現(xiàn)讀寫(xiě)分離試驗(yàn)。
客戶端登錄mycat服務(wù)器:不需要端口號(hào)了
[root@Node1 ~]#:mysql -uroot -p123456 -h192.168.114.20
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 73
Server version: 5.6.29-mycat-1.6.7.4-release-20200105164103 MyCat Server (OpenCloudDB)Copyright (c) 2000, 2023, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql>
客戶端登錄mycat,進(jìn)入數(shù)據(jù)庫(kù)TESTDB:查看teachers表,查看表結(jié)構(gòu),插入數(shù)據(jù),再查看數(shù)據(jù)
[root@Node1 ~]#:mysql -uroot -p123456 -h192.168.114.20
......
mysql> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB |
+----------+
1 row in set (0.00 sec)
#進(jìn)入數(shù)據(jù)庫(kù)
mysql> use TESTDB
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed
#查看數(shù)據(jù)
mysql> select * from teachers;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 93 | F |
+-----+---------------+-----+--------+
4 rows in set (0.01 sec)
#查看結(jié)構(gòu)
mysql> desc teachers;
+--------+----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+----------------------+------+-----+---------+----------------+
| TID | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| Name | varchar(100) | NO | | NULL | |
| Age | tinyint(3) unsigned | NO | | NULL | |
| Gender | enum('F','M') | YES | | NULL | |
+--------+----------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
#插入數(shù)據(jù)
mysql> insert into teachers values(5,'zs',18,'M');
Query OK, 1 row affected (0.03 sec)
mysql> select * from teachers;
+-----+---------------+-----+--------+
| TID | Name | Age | Gender |
+-----+---------------+-----+--------+
| 1 | Song Jiang | 45 | M |
| 2 | Zhang Sanfeng | 94 | M |
| 3 | Miejue Shitai | 77 | F |
| 4 | Lin Chaoying | 93 | F |
| 5 | zs | 18 | M |
+-----+---------------+-----+--------+
5 rows in set (0.00 sec)
查看主從日志:
主服務(wù)器日志:寫(xiě)入操作:
[root@Node3 ~]#:tail -f /var/lib/mysql/Node3.log
?從服務(wù)器日志:讀取操作:
?[root@Node4 ~]#:tail -f /var/lib/mysql/Node4.log
實(shí)現(xiàn)了mycat讀寫(xiě)分離!
---end---