高級篇:Mycat的理解

目錄

一、問題導入

1.1高併發Mysql的速度問題怎麼解決?

Mysql的速度,最大基本上就千的級別, 2000/s ,那淘寶,jd 那麼大的併發量怎麼做的?

1.2Mysql 掛了怎麼辦?

我們現在是單機版本的Mysql ,Mysql 掛了怎麼解決?

1.3 Mysql 超過500W的數據

二、Mycat 的簡介

Mycat 是一個數據庫的中間件!
在這裏插入圖片描述
在這裏插入圖片描述

Mycat 是我們中國人開發的!LeaderUs 提出的,LeaderUs 是武漢的人!

2.1 Mycat 解決Mysql 的併發壓力的思路

2.1.1 分庫

數據庫的切分
在這裏插入圖片描述

2.1.2 分表

將一個大表分成好幾個小表
在這裏插入圖片描述

2.1.3 好處或者面試

有500w條數據,怎麼優化查詢的速度?
1 添加索引->B+Tree ,查詢速度和樹的深度相關(以後面試講)
500w 查詢一個添加索引後,可能就是10s
2 分庫分表
10s->5s
把一個表的數據分成2 個表,使用多線程同時查詢!
5->2.5
一個表->4 個,使用4個線程同時查詢

2.1.4 Mycat 額外的好處

最開始,Mysql 有容量的問題,Mysql 表裏面只能存儲500w 條數據,那現在的軟件用戶量都是億級別的,那它的用戶表怎麼搞的?
在這裏插入圖片描述
好處就是通過分表解決了Mysql的容量問題

2.2 Mycat的安裝

2.2.1 Mycat 是Java 語言寫的,安裝Mycat 必須先安裝JDK

Mycat 對服務器有性能要求,必須爲2G以上的內存!

  1. 新建文件夾
    Cd /usr/local
    Mkdir java
  2. 下載jdk的壓縮包
wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie"
 "https://download.oracle.com/otn-pub/java/jdk/8u191-b12/2787e4a523244c269598db4e85c51e0c/jdk-8u191-linux-x64.tar.gz"

Wget: 下載命令,若你沒有該命令:
yum -y install wget
在這裏插入圖片描述

  1. 解壓JDK

tar -zxvf xxx.gz

  1. 配置環境變量

vi /etc/profile
在最後追加:
在這裏插入圖片描述
5 source 刷新文件
在這裏插入圖片描述

2.2.2 Mycat的安裝

  1. 新建文件夾/usr/local
    在這裏插入圖片描述
  2. 下載Mycat的壓縮包

地址:http://dl.mycat.io/1.6.6/Mycat-server-1.6.6.1-test-20180709095126-linux.tar.gz

wget http://dl.mycat.io/1.6.6/Mycat-server-1.6.6.1-test-20180709095126-linux.tar.gz
在這裏插入圖片描述
在這裏插入圖片描述

  1. 解壓壓縮包
    在這裏插入圖片描述

  2. 認識Mycat的目錄

在這裏插入圖片描述

  1. 啓動Mycat

./mycat start

./mycat start|stop|status|restart
在這裏插入圖片描述

  1. 查看Mycat 是否啓動成功

1 ./mycat status
在這裏插入圖片描述

2: jps
在這裏插入圖片描述

  1. 查看啓動的日誌:
    在這裏插入圖片描述
    在這裏插入圖片描述
    我們發現Mycat 啓動時,需要在它的目錄的logs 文件夾裏面寫一個pid的文件,但是此時沒有logs這個文件夾
    解決方案:新建logs文件夾
    在這裏插入圖片描述
    再次啓動:
    在這裏插入圖片描述

  2. 嘗試連接Mycat

可以使用SqlYog 來連接Mycat

Sqlyog的地址:http://forspeed.onlinedown.net/down/Webyog-SQLyog-Ultimate12.0.8.0.zip

Mycat 運行在8066 端口上面!
在這裏插入圖片描述
要確保8066 被放行:

在這裏插入圖片描述
在這裏插入圖片描述

三、Mycat的名詞解釋

3.1 虛擬庫

不真實存在的庫,對於mysql 裏面的數據庫,mysql 的庫被稱爲物理庫
物理庫:有磁盤文件對應

3.2 虛擬表

不真實存在的庫,對於mysql 裏面的數據庫的表,mysql 的表被稱爲物理表
物理表:有磁盤文件對應

3.3 數據節點(**)

由一個真實的物理庫 + 物理的表構成
在這裏插入圖片描述

3.4 數據庫服務器

數據庫和數據庫服務器不同

Mysql:它是一個數據庫的服務器,並不是數據庫
一個數據庫服務器裏面可以有很多的數據庫!

四、Mycat的配置文件(mycat的核心

在這裏插入圖片描述

學習Mycat 就是要學會mycat 配置文件的寫法
它裏面的一切都是配置文件

4.1 schema.xml

4.1.1 schema (一個虛擬的庫)節點

在這裏插入圖片描述

屬性的名稱 屬性的值 屬性的說明
Name 虛擬庫的名稱 數據庫的名稱
checkSQLschema false/true Mycat 是否校驗你發的sql
SqlMaxLimit Mycat 最大查詢的數據 Mycat 或自動追加分頁

4.1.2 table 標籤

屬性的名稱 屬性的值 屬性的說明
Name 虛擬表的名稱 表的名稱
DataNode 數據節點的名稱,多個使用,分割 虛擬表不能存儲數據,實際數據的存儲在數據節點裏面
Rule 路由規則 決定數據進入那個數據的節點裏面
PrimaryKey 主鍵 表的主鍵
AutoIncrement True/false 主鍵是否增長

4.1.3 dataNode數據節點

虛擬表的數據都位於數據的節點裏面

屬性的名稱 屬性的值 屬性的說明
Name 數據節點的名稱 數據節點的名稱,不能重複
dataHost 數據庫服務器的值 具體的數據庫服務器
database 數據庫服務器裏面的那個數據庫 數據庫的名稱

DataNode = 數據庫 + 物理表嗎?
Mycat 認爲我的數據存儲在不同的庫裏面,但是表的名稱和虛擬表的保持一致!所有我們可以直接省略它,Mycat 是這樣規定的
dataHost:數據庫的服務器
表->數據庫->數據庫服務器裏面

4.1.4 DataHost:數據庫的服務器

Mycat 認爲的數據庫服務器必須高可用,高併發!
如果我們只有一臺Mysql ,根本做不到高併發和高可用!
Mycat 認爲這裏面需要填一個數據庫的主從架構

4.2 rule.xml(路由的規則)

在這裏插入圖片描述
在table 裏面使用規則,但是規則具體在rule.xml 文件裏面

4.2.1 tableRule的節點

在這裏插入圖片描述
Name: 規則的名稱,rule代表具體的規則
Columns:列,我們的路由算法,使用你的那列數據做計算
Algorithm:具體使用哪種算法來計算。寫的是算法的名稱

4.2.2 function 節點

在這裏插入圖片描述
Name:代表算法的名稱
Class:是具體的那個算法的實現類
Prop:這個算法裏面的配置的一些值

4.3 server.xml

節點多,但是我們只需要會這幾個就可以了

4.3.1 用戶的配置

在這裏插入圖片描述
Name:用戶名
defaultAccount:是否爲默認的用戶
Password:用戶的密碼
Schemas:該用戶能操作那些數據庫
當然,也可以設置更細粒度的權限控制
在這裏插入圖片描述

4.3.2 主鍵增長的節點

在這裏插入圖片描述
主鍵增長的配置:具體我們在主鍵增長的時間講解

五、實戰mycat的配置文件

5.1 寫一個schema.xml 文件

配置虛擬庫,虛擬表,數據節點,數據庫服務器。。

骨架的結構

<schema name="carrent">
   <table name="t_user" datanode="dn1,dn2,dn3,dn4" primaryKey="id" rule="rule1" />
</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="0"
	 writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100" maxRetryCount="4">
	<heartbeat>select user()</heartbeat>
		
	<writeHost host="hostM1" url="localhost:3306" user="root" password="123">
		
	<readHost host="hostS2" url="localhost:3306" user="root" password="123" />
	</writeHost>
	<writeHost host="hostS1" url="localhost:3306" user="root" password="123" />
	
	</dataHost>

具體的schema文件文件爲:

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

    <schema name="carrent" checkSQLschema="false" sqlMaxLimit="100">

      <table name="t_user" dataNode="dn1,dn2,dn3,dn4" primaryKey="id" rule="rule1" />
    </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="0"
              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100" maxRetryCount="4">
        <heartbeat>select user()</heartbeat>
        
        <writeHost host="hostM1" url="localhost:3306" user="root"
                   password="123">
        
            <readHost host="hostS2" url="localhost:3306" user="root" password="123" />
        </writeHost>
        <writeHost host="hostS1" url="localhost:3306" user="root"
                   password="123" />
    
    </dataHost>
    
</mycat:schema>

5.2 rule.xml 文件(我們沒有使用別的規則,它裏面自動rule1)

5.3 server.xml

user的節點:
在這裏插入圖片描述
此時,我們的虛擬庫名稱不是TESTDB->carrent
在這裏插入圖片描述

5.4 覆蓋默認的mycat 裏面的配置文件

在這裏插入圖片描述
在這裏插入圖片描述
把修改好的文件覆蓋到Mycat 裏面

5.5 重啓Mycat

在這裏插入圖片描述

再次使用Mycat 測試:
在這裏插入圖片描述

六、Mysql的主從架構

6.1 架構圖

在這裏插入圖片描述

6.2 機器的規劃

機器編號 Ip 端口 角色
1 120.26.80.180 3306 主機
2 120.26.80.180 3308 從機
3 120.26.80.180 3309 從機

6.3 開始搭建

6.3.1 使用三個mysql容器來模擬三臺mysql的服務器

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

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

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

6.3.2 修改配置文件

(容器的/etc/mysql/conf.d/docker.conf)
在這裏插入圖片描述
無論從機和主機,配置文件一開始都是相同的
在這裏插入圖片描述
主機的配置文件:(M1)
在這裏插入圖片描述
server-id=1 服務器的標識
log-bin=master.bin 打開日誌文件的記錄,master.bin代表日誌文件的名稱

從機的配置文件:(m1s1 和m1s2)
m1s1.cnf
在這裏插入圖片描述
m1s2.cnf
在這裏插入圖片描述
Server-id 是服務器的標識,從機的值必須大於於主機的值

6.3.3 複製配置文件到各自的容器裏面並且重啓

在這裏插入圖片描述
在這裏插入圖片描述

6.4 執行sql 語句

我們從機要從主機裏面去複製數據,我們必須在主機裏面新建一個用戶,告訴從機,讓它使用該用戶去主機裏面複製數據!

  1. 我們必須在主機裏面新建用戶!
    在這裏插入圖片描述
    在這裏插入圖片描述

在這裏插入圖片描述
create user ‘rep’@’%’ identified by ‘123456’;
grant replication slave on . to ‘rep’@’%’;
flush privileges;

  1. 我們必須告訴從機該用戶,讓從機使用該用戶去主機複製數據!
change master to master_host="",master_port=3306,master_user="rep",master_password="123456",master_log_file="",master_log_pos=;

實例:

change master to master_host=“172.16.184.109”,master_port=3306,master_user=“rep”,master_password=“123456”,master_log_filelog_file=“master.000001”,master_log_pos=745;

主機的ip 地址:使用局域網的地址
主機的日誌文件的名稱:master_log_file,,master_log_pos 我們必須去主機查詢出來:
在這裏插入圖片描述

  1. 在從機裏面開啓主從,查看狀態
    在這裏插入圖片描述
  2. 查詢主從複製的狀態
    在這裏插入圖片描述
    在這裏插入圖片描述

6.5 對m1s2 和m1s1 是一樣的

6.6 測試主從

我們在主機裏面新建一個數據庫,查詢從機裏面是否有該數據庫
在m1 裏面新建數據庫:
在這裏插入圖片描述
從機有沒有複製過去:
在這裏插入圖片描述

七、複習主從的搭建過程

7.1 (複習)主機裏面的配置

server-id=
log-bin=xxx

7.2 主機裏面的sql 語句

  1. 創建用戶(create user ‘rep’@’%’ identified by ‘123456’)
  2. 授予用戶主從複製的權力 (grant replication slave on . to ‘rep’@’%’)
  3. 刷新(flush privileges)

7.3 從機裏面的配置文件

server-id=xx(必須大於主機的id)

7.4 從機裏面的sql 語句

  1. 配置要複製主機的信息
    change master to msater_host=””,master_port=,master_username=””,master_password=””,master_log_file=””,master_log_pos=,
  2. 開啓主從
    start slave ;
  3. 查看狀態
    show slave status \G;
    有2 個yes 代表成功了

七、m1s2 去m1 複製數據

7.1 m1 保持不動

在搭建m1s2 時,我們應該清除m1 上面的數據,就是刪除之前測試新建的db1 ,db2 數據庫

7.2 m1s2的操作

7.2.1 配置文件(之前已經ok了)

7.2.2 sql 語句的運行

在這裏插入圖片描述
在這裏插入圖片描述

Master_log_file = “” 是我們第一次查詢到的主機裏面的信息
Master_log_pos=”” ,也是我們第一次查詢到的主機信息

在這裏插入圖片描述
在這裏插入圖片描述

7.3 測試

在這裏插入圖片描述
測試時:切記不用在從機裏面操作!
一切的操作都在主機裏面進行!

7.3.1 在主機裏面新建數據庫

在這裏插入圖片描述

7.3.2 查看2從機裏面的數據庫

M1S1:
在這裏插入圖片描述

M1S2:
在這裏插入圖片描述

八、Mysql 的主從有什麼作用?

8.1 讀寫分離(圖自己要畫出來)

在這裏插入圖片描述

8.2 高可用(圖自己要畫出來)

Mysql 的高可用的架構實現
在這裏插入圖片描述

8.3 實際上實現讀寫分離和高可以都必須依賴Mycat

8.3.1 使用Mycat 解決mysql 讀寫分離的問題?

主要的功能:
分離sql 語句(將客戶端發送的sql 語句分離出來)
路由sql 語句 (將讀的sql 語句路由到從機裏面,將寫的sql 語句路由的主機裏面)
在這裏插入圖片描述

8.3.2 使用Mycat 解決Mysql 高可用的問題

  1. Mycat 怎麼知道M1 掛了

  2. Mycat 怎麼把寫的主機切換到M2 上面
    在這裏插入圖片描述

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