MySQL資料庫的集群方案

MySQL 高可用架構:主從備份
- 為了防止資料庫的突然,掛機,我們需要對資料庫進行
高可用架構主從備份 是常見的場景 - 通常情況下都是
一主一從/(多從)
正常情況下,都是主機進行作業,從機進行備份主機資料,如果主機某天突然意外宕機,從機可以立刻作業而不會資料丟失…

MySql 主從復制原理
mysql主節點(稱master) | 從(稱slave)復制
-
首先我們要先開啟主機的
日志記錄master主機,每進行 DML的操作,向日志中寫入一條訊息記錄到二進制日志事件(binary log) -
從節點,中會指定主節點的資訊:ip 埠
二進制日志 的位置檔案...
并啟動一個執行緒,異步實時的將master的binary log events拷貝到它的中繼日志(relay log)
slave重做中繼日志中的事件,將改變反映它自己的資料(資料重演)
注意:
- 通常為了保證資料準確,主從備份之前要:確保
- 主DB server和從DB server資料庫的版本一致
- 主DB server和從DB server資料庫資料一致
- 主DB server開啟二進制日志,主DB server和從DB server的server_id
服務id都必須唯一
環境準備:
- percona-5-7-23.tar
Mysql的衍生版本Percona 通過docker進行搭建服務,這里本人直接使用提供好的tar 進行生成Docker鏡像
有網路條件的朋友可以直接 拉取最新的鏡像!
Docker 搭建Mysql 主從備份:
- 正好,前段時間,看了一段時間Dokcer 本次就直接通過Dokcer進行搭建了…
正常情況其實也無疑..
搭建Master01節點:
#本人安裝軟體的目錄:
[root@hadoop1 ~]# cd /usr/local
[root@hadoop1 local]# ls
apache-phoenix-5.0.0-HBase-2.0-bin elasticsearch haproxy-1-9-3.tar kafka_2.10-0.10.2.1 MR-1.0-SNAPSHOT.jar partition.csv zookeeper-3.4.13
apache-tomcat-7.0.85 elasticsearch-6.2.4 hbase-2.1.0 kibana-6.2.4-linux-x86_64 Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz percona-5-7-23.tar
apollo hadoop jdk1.8.0_171 logstash-6.3.0 mysql wordcount.txt
#本人沒有下載,就直接講 tar包轉換成鏡像檔案了...
[root@hadoop1 local]# docker load --input percona-5-7-23.tar
f972d139738d: Loading layer [==================================================>] 208.8MB/208.8MB
793d15bf88da: Loading layer [==================================================>] 6.144kB/6.144kB
f34bc9e37309: Loading layer [==================================================>] 303.1kB/303.1kB
39df7a5abc61: Loading layer [==================================================>] 22.46MB/22.46MB
#省略..
#查看所有鏡像
#percona Mysql衍生版本
#haproxy 代理服務器
[root@hadoop1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
haproxy 1.9.3 d1ba0f09266d 2 years ago 72.1MB
percona 5.7.23 9db94bcf28b3 2 years ago 577MB
正片開始😀
Mysql master主節點搭建
#回到根目錄 創建檔案目錄(用戶區分之前安裝的應用...)
[root@hadoop1 /]# cd /
[root@hadoop1 /]# mkdir -p /data/mysql/master01
#進入一號主節點目錄
[root@hadoop1 /]# cd /data/mysql/master01
#創建兩個目錄:conf組態檔 data日志檔案,為了方便操作容器內,創建資料卷
[root@hadoop1 master01]# mkdir conf data
[root@hadoop1 master01]# ls
conf data
#linux 設定檔案權限 777 最大!
[root@hadoop1 master01]# chmod 777 * -R
[root@hadoop1 master01]# cd /data/mysql/master01/conf
#創建撰寫組態檔 👇👇
[root@hadoop1 conf]# vim my.cnf
#生成容器
#-v 設定資料卷:容器與宿主機進行檔案管理共享,為了方便更改查看組態檔!
#-p 設定埠,因為對外訪問的是linux的埠,容器內部的埠要與宿主機進行映射所以之后的 3306只能有一個!(后面就是3307 3316別搞混)
#-e 配置資料庫默認密碼 root
[root@hadoop1 conf]# docker create --name percona-master01 -v /data/mysql/master01/data:/var/lib/mysql -v /data/mysql/master01/conf:/etc/my.cnf.d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root percona:5.7.23
cde032cb98a0465f08cee6554e83a4d53ce2b72bc95f662746d712418d4d1c91
#啟動mysql 容器 && (并且查看他的啟動日志:如果啟動報錯就可以實時的發現!
[root@hadoop1 conf]# docker start percona-master01 && docker logs -f percona-master01
#...
[root@hadoop1 ~]# docker ps -a
cde032cb98a0 percona:5.7.23 "/docker-entrypoint.…" 15 hours ago Exited (255) 15 minutes ago 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp percona-master01
my.cnf 檔案內容
#配置mysql基礎資訊
[mysqld]
#開啟二進制日志,集群必須開啟,主從互備直接通信就是通過: 二進制日志! (從節點這個可以忽略!)
log-bin=mysql-bin
#服務id,同一個集群環境下服務id不可重復!
server-id=1
- 從節點可以忽略:
log-bin=mysql-bin
因為,從節點只需要讀取,主節點的二進制日志即可!
主節點 測驗連接:

- 查看二進制日志檔案:
檔案名檔案位置...
設定:主節點配置資訊
#創建同步賬戶以及授權
CREATE USER 'wf'@'%' IDENTIFIED BY 'wf';
#配置權限, 讀庫讀表的操作 *.*
GRANT REPLICATION SLAVE ON *.* TO 'wf'@'%';
#重繪MySQL的系統權限相關表
FLUSH PRIVILEGES;
#查看master狀態
SHOW MASTER STATUS;
#查看二進制日志相關的配置項
SHOW GLOBAL VARIABLES LIKE 'binlog%';
#查看server相關的配置項
SHOW GLOBAL VARIABLES LIKE 'server%';
注意:
- 出現 [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and錯誤
解決方案,在my.cnf組態檔中設定
sql_mode=‘STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO
,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION’
搭建從節點 Slave01:
- 基本與創建Master 無區別!
##創建目錄,創建資料卷,撰寫my.cnf
[root@hadoop1 mysql]# mkdir -p /data/mysql/slave01
[root@hadoop1 slave01]# cd /data/mysql/slave01
[root@hadoop1 slave01]# mkdir conf data
[root@hadoop1 slave01]# chmod 777 * -R
[root@hadoop1 slave01]# cd /data/mysql/slave01/conf
[root@hadoop1 conf]# vi my.cnf
#創建容器
[root@hadoop1 conf]# docker create --name percona-slave01 -v /data/mysql/slave01/data:/var/lib/mysql -v /data/mysql/slave01/conf:/etc/my.cnf.d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root percona:5.7.23
3ac806767c09ce3adb6c468f45f61020afeef701cd0162e439dcae01a040338a
#啟動容器
[root@hadoop1 conf]# docker start percona-slave01 && docker logs -f percona-slave01
percona-slave01
- slave的
my.cnf檔案 不需要配置,log-bin=mysql-bin開啟二進制日志!
從節點測驗:

- 根據個人實際情況進行更改!
#設定master相關資訊
CHANGE MASTER TO
MASTER_HOST='192.168.1.110', #注意埠
MASTER_USER='wf',
MASTER_PASSWORD='wf',
MASTER_PORT=3316, #主節點的埠
MASTER_LOG_FILE='mysql-bin.000004', #指定要監聽主節點的 二級制日志檔案;
MASTER_LOG_POS=154; #二級制檔案位置
#啟動同步
START SLAVE;
#查看master狀態
SHOW SLAVE STATUS; #(Waiting for master to send event):等待主服務器發送事件
#錯誤:
#ERROR 3021 (HY000): This operation cannot be performed with a running slave io thread; run STOP SLAV
-- mysql從機上已經進行過系結主機,如果繼續系結需要先進行重置,
#停止已經啟動的系結
STOP SLAVE
#重置系結
RESET MASTER
測驗:
- 此時為了檢測主從是否同步,備份…
直接在主節點上創建一個庫/表新增資料…
在查看從機上是否同步...

- ok,驗證成功,主機發生更改從機,立刻就會同步資料!
Mysql 高可用,主從備份總結:
- Mysql主從備份…總的來說并不難, 本人使用的是Docker進行本機搭建的…
- 實際開發中,其實也就是相當于
安裝兩個資料庫一個當Master 一個當Slave - 主機開啟
日志記錄從機實時開啟一個執行緒讀取主機的執行SQL 同步執行資料…
Mycat + MySql 讀寫分離
讀寫分離 原理

-
我們一般應用對資料庫而言都是 “讀多寫少”
也就說對資料庫讀取資料的壓力比較大 -
解決方案:
采用資料庫集群的方案:
其中一個是主庫,負責寫入資料,我們稱之為:寫庫;
其它都是從庫,負責讀取資料,我們稱之為: 讀庫; 一主n從主從互備 讀寫分離架構!
那么,對我們的要求是:1. 讀庫和寫庫的資料一致2. 寫資料必須寫到寫庫3. 讀資料必須到讀庫 -
👈圖:
資料庫從之前的單節點變為多節點提供服務
主節點資料,同步到從節點資料
應用程式需要連接到2個資料庫節點,并且在程式內部實作判斷讀寫操作
這種架構存在2個問題:
應用程式需要連接到多個節點,對應用程式而言開發變得復雜可以通過中間件解決
如果在程式內部實作,可使用Spring的AOP功能實作 -
👉圖:
中間件解決:讀寫分離
應用程式只需要連接到中間件即可,無需連接多個資料庫節點
應用程式無需區分讀寫操作,對中間件直接進行讀寫操作即可
在中間件中進行區分讀寫操作,讀發送到從節點,寫發送到主節點一切交給中間件操作,無需關心資料庫
Mycat 學習
- 需要的朋友可以了解一下Mycat
環境準備
- Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz
Linux 安裝tar包
環境搭建:
- Mycat安裝非常簡單,
Windwos / Linux基本解壓即用,需要了解注意的是它的組態檔
rule 設定分片規則
schema 設定分片邏輯庫資訊…
server 設定 Mycat 用戶/密碼
#查看本人的軟體目錄
[root@hadoop1 ~]# cd /usr/local
[root@hadoop1 local]# ls
apache-phoenix-5.0.0-HBase-2.0-bin elasticsearch haproxy-1-9-3.tar kafka_2.10-0.10.2.1 MR-1.0-SNAPSHOT.jar Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz percona-5-7-23.tar
apache-tomcat-7.0.85 elasticsearch-6.2.4 hbase-2.1.0 kibana-6.2.4-linux-x86_64 mycat mysql wordcount.txt
apollo hadoop jdk1.8.0_171 logstash-6.3.0 mycat2 partition.csv zookeeper-3.4.13
#Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz 壓縮包..
#Mycat Mycat2(后面準備搭建集群)
#啟動Mycat
[root@hadoop1 local]# cd /usr/local/mycat
[root@hadoop1 mycat]# cd bin
[root@hadoop1 bin]# ls
dataMigrate.sh init_zk_data.sh mycat rehash.sh startup_nowrap.sh wrapper-linux-ppc-64 wrapper-linux-x86-32 wrapper-linux-x86-64
#Mycat命令 ./mycat { console | start啟動 | stop停止 | restart | status運行狀態 | dump }
[root@hadoop1 bin]# ./mycat start
Starting Mycat-server...
#查看服務行程是否啟動
[root@hadoop1 bin]# jps
2721 WrapperSimpleApp
2742 Jps
- Linux解壓命令:
tar -zxvf 要解壓的檔案
注意:
- Mycat 啟動,報錯不易被發現,可以查看log,進行查看.
組態檔:
- 這里提供的并不完善,而是重要的要修改的地方…
- 而且,Linux中存在,中文字符編碼的問題 不建議手動在Linux中進行修改撰寫,
可以直接通過工具對檔案直接上傳覆寫運行…

- 詳細請關注 https://blog.csdn.net/qq_45542380/article/details/115738373?spm=1001.2014.3001.5501
rule.xml
<tableRule name="mod-long">
<rule>
<columns>id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<!-- .... -->
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">1</property> <!-- 這里目前是一個Mysql主從架構, 根據多少分片規則而定!等下更改為2個 -->
</function>
<!-- .... -->
schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="wf" checkSQLschema="false" sqlMaxLimit="100">
<table name="wsm" dataNode="dn1" rule="mod-long" />
<!-- <table name="wsm" dataNode="dn1,dn2" rule="mod-long" /> -->
</schema>
<dataNode name="dn1" dataHost="cluster1" database="wsm" />
<!--<dataNode name="dn2" dataHost="cluster2" database="wsm" /> -->
<dataHost name="cluster1" maxCon="1000" minCon="10" balance="3" writeType="1" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="W1" url="192.168.1.110:3306" user="root" password="root">
<readHost host="W1R1" url="192.168.1.110:3307" user="root" password="root" />
</writeHost>
</dataHost>
<!-- <dataHost name="cluster2" maxCon="1000" minCon="10" balance="3" writeType="1" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="W1" url="192.168.1.110:3316" user="root" password="root">
<readHost host="W1R1" url="192.168.1.110:3317" user="root" password="root" />
</writeHost>
</dataHost> -->
</mycat:schema>
- 注釋的內容是
資料庫分片的內容
邏輯庫——邏輯表表名要與資料庫匹配——資料節點database指定對應的資料庫——資料庫 主機配置 - 注意:邏輯表名要與實際相同!database指定的數節點要與資料庫相同!
詳情參考上面連接學習!
server.xml
- 配置Mycat用戶密碼
連接的邏輯表
<user name="wf" defaultAccount="true">
<property name="password">wf</property>
<property name="schemas">wf</property>
</user>
測驗:

- 連接成功,并可以操作資料庫wsm
Mycat + Mysql多個 資料分片:
資料分片:
什么是資料庫分片
- 簡單來說,就是指通過某種特定的條件
- 將我們存放在同一個資料庫中的資料分散存放到多個資料庫主機上,以達到分散單臺設備負載的效果,
三種分片模式: 垂直切分 水平切分 混合切分

在次搭建一套Mysql 主從架構 集群:
重復操作…不詳細解釋了
注意更改埠,容器名!
Master02
#創建目錄
mkdir -p /data/mysql/master02
cd /data/mysql/master02
cd /data/mysql/master02
chmod 777 * -R
#創建組態檔
cd /data/mysql/master02/conf
vim my.cnf
#創建容器
docker create --name percona-master02 -v /data/mysql/master02/data:/var/lib/mysql -v /data/mysql/master02/conf:/etc/my.cnf.d -p 3316:3306 -e MYSQL_ROOT_PASSWORD=root percona:5.7.23
#啟動
docker start percona-master02 && docker logs -f percona-master02
- 別忘了,Maste節點要開啟日志
my.cnf設定用戶,分片權限

Slave02
mkdir /data/mysql/slave02
cd /data/mysql/slave02
mkdir conf data
chmod 777 * -R
#創建組態檔
cd /data/mysql/slave02/conf
vim my.cnf
#創建容器
docker create --name percona-slave02 -v /data/mysql/slave02/data:/var/lib/mysql -v /data/mysql/slave02/conf:/etc/my.cnf.d -p 3317:3306 -e MYSQL_ROOT_PASSWORD=root percona:5.7.23
#啟動
docker start percona-slave02 && docker logs -f percona-slave02
- my.cnf
別忘了
查看所有運行的容器:
[root@hadoop1 bin]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a2f509b44da7 percona:5.7.23 "/docker-entrypoint.…" 18 hours ago Up 15 seconds 0.0.0.0:3317->3306/tcp, :::3317->3306/tcp percona-slave02
1d03a6315278 percona:5.7.23 "/docker-entrypoint.…" 18 hours ago Up 4 minutes 0.0.0.0:3316->3306/tcp, :::3316->3306/tcp percona-master02
3ac806767c09 percona:5.7.23 "/docker-entrypoint.…" 21 hours ago Up About an hour 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp percona-slave01
cde032cb98a0 percona:5.7.23 "/docker-entrypoint.…" 21 hours ago Up About an hour 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp percona-master01

測驗:

- Mycat 是對 master01 和 master02 的
匯總 - 使用時候只需要,指定Mycat的ip 埠進行,增刪改查 mycat內部會對資料進行分片,讀寫分離
haproxy + Mycat中間件集群:
- mycat做了資料庫的代理,在高并發的情況下,必然也會面臨單節點性能問題,所以需要部署多個
不然,萬一它掛了,下面的Mysql服務即使沒掛,也呼叫不了了!

haproxy

環境搭建:
Mycat2 創建:
- 直接copy上一個服務
因為同一個ip 下埠要不同更改一下埠配置即可:
[root@hadoop1 local]# ls
apache-phoenix-5.0.0-HBase-2.0-bin elasticsearch haproxy-1-9-3.tar kafka_2.10-0.10.2.1 MR-1.0-SNAPSHOT.jar Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz percona-5-7-23.tar
apache-tomcat-7.0.85 elasticsearch-6.2.4 hbase-2.1.0 kibana-6.2.4-linux-x86_64 mycat mysql wordcount.txt
apollo hadoop jdk1.8.0_171 logstash-6.3.0 mycat2 partition.csv zookeeper-3.4.13
[root@hadoop1 local]#
搭建多節點mycat: 直接copy 一個更改配置!
cp mycat mycat2 -R
vim wrapper.conf
#設定jmx埠
wrapper.java.additional.7=-Dcom.sun.management.jmxremote.port=1982(默認) 1985(修改)
vim server.xml
#設定服務埠以及管理埠
<property name="serverPort">8066/ 8067</property>
<property name="managerPort">9066 / 9067</property>
#重新啟動服務

haproxy 安裝:
#拉取鏡像
docker pull haproxy:1.9.3
#創建資料卷 創建容器...
[root@hadoop1 bin]# mkdir -p /haoke/haproxy
[root@hadoop1 bin]# docker create --name haproxy --net host -v /haoke/haproxy:/usr/local/etc/haproxy haproxy:1.9.3
b6ab17da4aaa0ef43a4a5253ab23b46366db9873e0b03a307291f0086613c820
#編輯組態檔
[root@hadoop1 bin]# vim /haoke/haproxy/haproxy.cfg
#啟動容器...列印日志
[root@hadoop1 bin]# docker restart haproxy && docker logs -f haproxy
haproxy
[WARNING] 109/153326 (1) : config : 'option forwardfor' ignored for proxy 'proxy-mysql' as it requires HTTP mode.
[NOTICE] 109/153326 (1) : New worker #1 (7) forked
[WARNING] 109/153328 (7) : Server proxy-mysql/mycat_1 is DOWN, reason: Layer4 timeout, check duration: 2000ms. 1 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.
[WARNING] 109/153329 (7) : Server proxy-mysql/mycat_2 is DOWN, reason: Layer4 timeout, check duration: 2023ms. 0 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.
[ALERT] 109/153329 (7) : proxy 'proxy-mysql' has no server available!
#查看運行容器 運行成功!
[root@hadoop1 bin]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b6ab17da4aaa haproxy:1.9.3 "/docker-entrypoint.…" 2 minutes ago Up 17 seconds haproxy
a2f509b44da7 percona:5.7.23 "/docker-entrypoint.…" 39 minutes ago Up 39 minutes 0.0.0.0:3317->3306/tcp, :::3317->3306/tcp percona-slave02
haproxy 組態檔
vim /haoke/haproxy/haproxy.cfg
#創建檔案本人目前只是應用就不一一解釋:
vim /haoke/haproxy/haproxy.cfg
#日志管理
# maxconn 最大連接數4000
global
log 127.0.0.1 local2
maxconn 4000
daemon
#支持http …
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
#自帶的一套ur 管理頁面監聽web模式4001.. 賬戶密碼
listen admin_stats
bind 0.0.0.0:4001
mode http
stats uri /dbs
stats realm Global\ statistics
stats auth admin:admin123
#監聽服務 4002 指定監聽mycat配置,監聽地址
#balance roundrobin 輪詢模式.. server 兩個mycat服務
listen proxy-mysql
bind 0.0.0.0:4002
mode tcp
balance roundrobin
option tcplog
server mycat_1 192.168.1.110:8066 check port 8066 maxconn 2000
server mycat_2 192.168.1.110:8067 check port 8067 maxconn 2000
- Linux
建議洗掉中文...

- 從頁面中,可以看出已經存在了2個mycat代理服務,
- 通過mysql客戶端進行測驗:

- 因為,害怕 單個Mycat掛調,影響服務正常使用,對Mycat進行集群架構!
但就,出現了多個ip - haproxy 就是對Mycat集群Ip 進行的匯總…
有人說 haproxy掛了怎么辦?
- haproxy 不會掛!😒
- 它主要是,做代理服務器,瀏覽轉發而不做任務… 一般情況下幾乎不可能,如果出現意味抓緊喊運維!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/278837.html
標籤:其他
