mysql拉荐_荐 一步一步教你MySQL主从复制读写分离
本次我們通過docker搭建環(huán)境
虛擬機(jī)搭建對機(jī)器配置有要求,并且安裝mysql步驟繁瑣
一臺機(jī)器上可以運(yùn)行多個Docker容器
Docker容器之間相互獨(dú)立,有獨(dú)立ip,互不沖突
Docker使用步驟簡便,啟動容器在秒級別
MySQL的主從復(fù)制
主從復(fù)制(也稱 AB 復(fù)制)允許將來自一個MySQL數(shù)據(jù)庫服務(wù)器(主服務(wù)器)的數(shù)據(jù)復(fù)制到一個或多個MySQL數(shù)據(jù)庫服務(wù)器(從服務(wù)器)。
主從復(fù)制的有好處
MySQL中復(fù)制的優(yōu)點包括:
橫向擴(kuò)展解決方案 - 在多個從站之間分配負(fù)載以提高性能。在此環(huán)境中,所有寫入和更新都必須在主服務(wù)器上進(jìn)行。但是,讀取可以在一個或多個從設(shè)備上進(jìn)行。該模型可以提高寫入性能(因為主設(shè)備專用于更新),同時顯著提高了越來越多的從設(shè)備的讀取速度。
數(shù)據(jù)安全性 - 因為數(shù)據(jù)被復(fù)制到從站,并且從站可以暫停復(fù)制過程,所以可以在從站上運(yùn)行備份服務(wù)而不會破壞相應(yīng)的主數(shù)據(jù)。
分析 - 可以在主服務(wù)器上創(chuàng)建實時數(shù)據(jù),而信息分析可以在從服務(wù)器上進(jìn)行,而不會影響主服務(wù)器的性能。
遠(yuǎn)程數(shù)據(jù)分發(fā) - 您可以使用復(fù)制為遠(yuǎn)程站點創(chuàng)建數(shù)據(jù)的本地副本,而無需永久訪問主服務(wù)器。
讀寫分離示意圖
主從復(fù)制原理
主服務(wù)器上面的任何修改都會通過自己的 I/O tread(I/O 線程)保存在二進(jìn)制日志 Binary log 里面。
從服務(wù)器上面也啟動一個 I/O thread,通過配置好的用戶名和密碼, 連接到主服務(wù)器上面請求讀取二進(jìn)制日志,然后把讀取到的二進(jìn)制日志寫到本地的一個Realy log(中繼日志)里面。
從服務(wù)器上面同時開啟一個 SQL thread 定時檢查 Realy log(這個文件也是二進(jìn)制的),如果發(fā)現(xiàn)有更新立即把更新的內(nèi)容在本機(jī)的數(shù)據(jù)庫上面執(zhí)行一遍。
一主多從
如果一主多從的話,這時主庫既要負(fù)責(zé)寫又要負(fù)責(zé)為幾個從庫提供二進(jìn)制日志。此時可以稍做調(diào)整,將二進(jìn)制日志只給某一從,這一從再開啟二進(jìn)制日志并將自己的二進(jìn)制日志再發(fā)給其它從。或者是干脆這個從不記錄只負(fù)責(zé)將二進(jìn)制日志轉(zhuǎn)發(fā)給其它從,這樣架構(gòu)起來性能可能要好得多,而且數(shù)據(jù)之間的延時應(yīng)該也稍微要好一些。
MySQL主從復(fù)制搭建步驟
由于我們依托于docker容器,所以要求大家預(yù)先有docker的知識鋪墊。
服務(wù)器規(guī)劃
服務(wù)器
軟件
用途
192.168.0.108
docker
啟動MySQL容器master
192.168.0.109
docker
啟動MySQL容器slave
192.168.0.1010
docker
啟動MySQL容器slave
主服務(wù)器搭建
步驟1:鏡像拉取
首先在192.168.0.108拉取docker鏡像,我們這里使用5.7版本的mysql
[
root@bogon ~
]
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/mysql 5.7 e1e1680ac726 7 months ago 373 MB
創(chuàng)建目錄mysql-conf
[
root@bogon mysql-conf
]
# pwd
/usr/local/mysql-conf
在當(dāng)前目錄中創(chuàng)建配置文件my.cnf,次文件要映射到mysql的docker容器中的配置文件,文件中加入[mysqld]
[
root@bogon mysql-conf
]
# vi my.cnf
[
root@bogon mysql-conf
]
# more my.cnf
[
mysqld
]
步驟2:主機(jī)MySQL容器創(chuàng)建
創(chuàng)建主機(jī)容器
Master對外映射的端口是5566,Slave對外映射的端口是5577。因為docker容器是相互獨(dú)立的,每個容器有其獨(dú)立的ip,所以不同容器使用相同的端口并不會沖突。
docker run -p 5566:3306 --name master-mysql -v/usr/local/mysql-conf/:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD
=
123456 -d mysql:5.7
查看容器運(yùn)行情況
[
root@bogon mysql-conf
]
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1f93892498df mysql:5.7
"docker-entrypoint..."
4 minutes ago Up 4 minutes 33060/tcp, 0.0.0.0:5566-
>
3306/tcp master-mysql
步驟3:修改外部映射文件my.cnf
[
root@bogon mysql-conf
]
# more my.cnf
[
mysqld
]
skip-name-resolve
server-id
=
1
log-bin
=
mysql-bin
binlog-do-db
=
tx_db
binlog-ignore-db
=
mysql
binlog-ignore-db
=
information_schema
進(jìn)入容器內(nèi)可以查看到數(shù)據(jù)卷映射后的結(jié)果
[root@bogon mysql-conf]# docker exec -it 1f93892498df /bin/bash
root@1f93892498df:/etc/mysql/conf.d# more my.cnf
[mysqld]
skip-name-resolve
server-id=1
log-bin=mysql-bin
binlog-do-db=tx_db
binlog-ignore-db = mysql
binlog-ignore-db = information_schema
重啟容器
docker restart 1f93892498df
步驟四:賦予從機(jī)權(quán)限
登錄mysql,授予192.168.0.109, 192.168.0.110 slave從機(jī)復(fù)制權(quán)限
mysql> grant replication slave,replication client on *.* to slave@'192.168.0.109' identified by "123456";
Query OK, 0 rows affected
mysql> flush privileges;
Query OK, 0 rows affected
mysql> grant replication slave,replication client on *.* to slave@'192.168.0.110' identified by "123456";
Query OK, 0 rows affected
mysql> flush privileges;
Query OK, 0 rows affected
查看主機(jī)狀態(tài)
mysql> show master status;
+------------------+----------+--------------+--------------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+--------------------------+-------------------+
| mysql-bin.000001 | 154 | tx_db | mysql,information_schema | |
+------------------+----------+--------------+--------------------------+-------------------+
1 row in set
從服務(wù)器搭建
步驟1:啟動兩臺從機(jī)
從節(jié)點配置文件創(chuàng)建
在192.168.0.109和192.168.0.110新建目錄/usr/local/mysql-conf/
創(chuàng)建 my.cnf
192.168.0.109機(jī)器
[
root@file mysql-conf
]
# more my.cnf
[
mysqld
]
skip-name-resolve
server-id
=
2
log-bin
=
mysql-bin
replicate-do-db
=
tx_db
binlog-ignore-db
=
mysql
binlog-ignore-db
=
information_schema
192.168.0.110機(jī)器
[
root@file mysql-conf
]
# more my.cnf
[
mysqld
]
skip-name-resolve
server-id
=
3
log-bin
=
mysql-bin
replicate-do-db
=
tx_db
binlog-ignore-db
=
mysql
binlog-ignore-db
=
information_schema
啟動slave1(109)
[
root
@file
mysql
-
conf
]
# docker run -p 5577:3306 --name slave-mysql1 -v /usr/local/mysql-conf/:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
啟動slave1(110)
[
root
@localhost
mysql
-
conf
]
# docker run -p 5588:3306 --name slave-mysql1 -v /usr/local/mysql-conf/:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
此時我們可以看到三臺MySQL服務(wù)器都已經(jīng)啟動,并且連接
步驟2:每一臺從機(jī)創(chuàng)建用戶賦權(quán)
mysql
>
CREATE
USER
'slave'
@'
%
' IDENTIFIED BY '
123456
';
Query OK, 0 rows affected
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO '
slave
'@'
%
'
;
Query OK
,
0
rows
affected
mysql
>
flush
privileges
;
Query OK
,
0
rows
affected
mysql
>
stop slave
;
Query OK
,
0
rows
affected
mysql
>
步驟3 在每一臺從機(jī)創(chuàng)建從機(jī)
分別在109和110機(jī)器執(zhí)行。
mysql
>
change master
to
master_host
=
'192.168.0.108'
,
master_user
=
'slave'
,
master_password
=
'123456'
,
master_port
=
5566
,
master_log_file
=
'mysql-bin.000002'
,
master_log_pos
=
154
,
master_connect_retry
=
30
;
Query OK
,
0
rows
affected
說明:
master_host :Master的地址,指的是容器的獨(dú)立ip
master_port:Master的端口號,指的是容器的端口號
master_user:用于數(shù)據(jù)同步的用戶
master_password:用于同步的用戶的密碼
master_log_file:指定 Slave 從哪個日志文件開始復(fù)制數(shù)據(jù),即上文中提到的 File 字段的值
master_log_pos:從哪個 Position 開始讀,即上文中提到的 Position 字段的值
master_connect_retry:如果連接失敗,重試的時間間隔,單位是秒,默認(rèn)是60秒
檢查兩臺從機(jī)狀態(tài):
我們發(fā)現(xiàn)從機(jī)已經(jīng)創(chuàng)建,但是內(nèi)部線程還未啟動
mysql
>
show
slave
status
\G
;
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
1.
row
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
Slave_IO_State:
Master_Host:
192.168
.0
.108
Master_User: slave
Master_Port:
5566
Connect_Retry:
30
Master_Log_File: mysql
-
bin
.
000002
Read_Master_Log_Pos:
154
Relay_Log_File: d55404be5426
-
relay
-
bin
.
000001
Relay_Log_Pos:
4
Relay_Master_Log_File: mysql
-
bin
.
000002
Slave_IO_Running:
No
Slave_SQL_Running:
No
Replicate_Do_DB: tx_db
正常情況下,SlaveIORunning 和 SlaveSQLRunning 都是No,因為我們還沒有開啟主從復(fù)制過程。使用start slave開啟主從復(fù)制過程,然后再次查詢主從同步狀態(tài)show slave status \G;。
mysql
>
show
slave
status
\G
;
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
1.
row
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
Slave_IO_State: Waiting
for
master
to
send event
Master_Host:
192.168
.0
.108
Master_User: slave
Master_Port:
5566
Connect_Retry:
30
Master_Log_File: mysql
-
bin
.
000002
Read_Master_Log_Pos:
154
Relay_Log_File: d55404be5426
-
relay
-
bin
.
000002
Relay_Log_Pos:
320
Relay_Master_Log_File: mysql
-
bin
.
000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: tx_db
在主庫中創(chuàng)建tx_db數(shù)據(jù)庫,我們發(fā)現(xiàn)從庫可以同步出來
學(xué)習(xí)更多架構(gòu)免費(fèi)課程請關(guān)注: java架構(gòu)師免費(fèi)課程
每晚20:00直播分享高級java架構(gòu)技術(shù)
掃描加入QQ交流群264572737
總結(jié)
以上是生活随笔為你收集整理的mysql拉荐_荐 一步一步教你MySQL主从复制读写分离的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql性能调优快捷键_mysql优化
- 下一篇: python3.8提示pip_Linux