目錄
- 一、問題導入
- 二、Mycat 的簡介
- 三、Mycat的名詞解釋
- 四、Mycat的配置文件(*mycat的核心*)
- 五、實戰mycat的配置文件
- 5.1 寫一個schema.xml 文件
- 5.2 rule.xml 文件(我們沒有使用別的規則,它裏面自動rule1)
- 5.3 server.xml
- 5.4 覆蓋默認的mycat 裏面的配置文件
- 5.5 重啓Mycat
- 六、Mysql的主從架構
- 七、複習主從的搭建過程
- 七、m1s2 去m1 複製數據
- 八、Mysql 的主從有什麼作用?
一、問題導入
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以上的內存!
- 新建文件夾
Cd /usr/local
Mkdir java - 下載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
- 解壓JDK
tar -zxvf xxx.gz
- 配置環境變量
vi /etc/profile
在最後追加:
5 source 刷新文件
2.2.2 Mycat的安裝
- 新建文件夾/usr/local
- 下載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
-
解壓壓縮包
-
認識Mycat的目錄
- 啓動Mycat
./mycat start
./mycat start|stop|status|restart
- 查看Mycat 是否啓動成功
1 ./mycat status
2: jps
-
查看啓動的日誌:
我們發現Mycat 啓動時,需要在它的目錄的logs 文件夾裏面寫一個pid的文件,但是此時沒有logs這個文件夾
解決方案:新建logs文件夾
再次啓動:
-
嘗試連接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 語句
我們從機要從主機裏面去複製數據,我們必須在主機裏面新建一個用戶,告訴從機,讓它使用該用戶去主機裏面複製數據!
- 我們必須在主機裏面新建用戶!
create user ‘rep’@’%’ identified by ‘123456’;
grant replication slave on . to ‘rep’@’%’;
flush privileges;
- 我們必須告訴從機該用戶,讓從機使用該用戶去主機複製數據!
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 我們必須去主機查詢出來:
- 在從機裏面開啓主從,查看狀態
- 查詢主從複製的狀態
6.5 對m1s2 和m1s1 是一樣的
6.6 測試主從
我們在主機裏面新建一個數據庫,查詢從機裏面是否有該數據庫
在m1 裏面新建數據庫:
從機有沒有複製過去:
七、複習主從的搭建過程
7.1 (複習)主機裏面的配置
server-id=
log-bin=xxx
7.2 主機裏面的sql 語句
- 創建用戶(create user ‘rep’@’%’ identified by ‘123456’)
- 授予用戶主從複製的權力 (grant replication slave on . to ‘rep’@’%’)
- 刷新(flush privileges)
7.3 從機裏面的配置文件
server-id=xx(必須大於主機的id)
7.4 從機裏面的sql 語句
- 配置要複製主機的信息
change master to msater_host=””,master_port=,master_username=””,master_password=””,master_log_file=””,master_log_pos=, - 開啓主從
start slave ; - 查看狀態
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 高可用的問題
-
Mycat 怎麼知道M1 掛了
-
Mycat 怎麼把寫的主機切換到M2 上面