mysql拉荐_荐 一步一步教你MySQL主从复制读写分离
本次我們通過docker搭建環境
虛擬機搭建對機器配置有要求,并且安裝mysql步驟繁瑣
一臺機器上可以運行多個Docker容器
Docker容器之間相互獨立,有獨立ip,互不沖突
Docker使用步驟簡便,啟動容器在秒級別
MySQL的主從復制
主從復制(也稱 AB 復制)允許將來自一個MySQL數據庫服務器(主服務器)的數據復制到一個或多個MySQL數據庫服務器(從服務器)。
主從復制的有好處
MySQL中復制的優點包括:
橫向擴展解決方案 - 在多個從站之間分配負載以提高性能。在此環境中,所有寫入和更新都必須在主服務器上進行。但是,讀取可以在一個或多個從設備上進行。該模型可以提高寫入性能(因為主設備專用于更新),同時顯著提高了越來越多的從設備的讀取速度。
數據安全性 - 因為數據被復制到從站,并且從站可以暫停復制過程,所以可以在從站上運行備份服務而不會破壞相應的主數據。
分析 - 可以在主服務器上創建實時數據,而信息分析可以在從服務器上進行,而不會影響主服務器的性能。
遠程數據分發 - 您可以使用復制為遠程站點創建數據的本地副本,而無需永久訪問主服務器。
讀寫分離示意圖
主從復制原理
主服務器上面的任何修改都會通過自己的 I/O tread(I/O 線程)保存在二進制日志 Binary log 里面。
從服務器上面也啟動一個 I/O thread,通過配置好的用戶名和密碼, 連接到主服務器上面請求讀取二進制日志,然后把讀取到的二進制日志寫到本地的一個Realy log(中繼日志)里面。
從服務器上面同時開啟一個 SQL thread 定時檢查 Realy log(這個文件也是二進制的),如果發現有更新立即把更新的內容在本機的數據庫上面執行一遍。
一主多從
如果一主多從的話,這時主庫既要負責寫又要負責為幾個從庫提供二進制日志。此時可以稍做調整,將二進制日志只給某一從,這一從再開啟二進制日志并將自己的二進制日志再發給其它從。或者是干脆這個從不記錄只負責將二進制日志轉發給其它從,這樣架構起來性能可能要好得多,而且數據之間的延時應該也稍微要好一些。
MySQL主從復制搭建步驟
由于我們依托于docker容器,所以要求大家預先有docker的知識鋪墊。
服務器規劃
服務器
軟件
用途
192.168.0.108
docker
啟動MySQL容器master
192.168.0.109
docker
啟動MySQL容器slave
192.168.0.1010
docker
啟動MySQL容器slave
主服務器搭建
步驟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
創建目錄mysql-conf
[
root@bogon mysql-conf
]
# pwd
/usr/local/mysql-conf
在當前目錄中創建配置文件my.cnf,次文件要映射到mysql的docker容器中的配置文件,文件中加入[mysqld]
[
root@bogon mysql-conf
]
# vi my.cnf
[
root@bogon mysql-conf
]
# more my.cnf
[
mysqld
]
步驟2:主機MySQL容器創建
創建主機容器
Master對外映射的端口是5566,Slave對外映射的端口是5577。因為docker容器是相互獨立的,每個容器有其獨立的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
查看容器運行情況
[
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
進入容器內可以查看到數據卷映射后的結果
[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
步驟四:賦予從機權限
登錄mysql,授予192.168.0.109, 192.168.0.110 slave從機復制權限
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
查看主機狀態
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
從服務器搭建
步驟1:啟動兩臺從機
從節點配置文件創建
在192.168.0.109和192.168.0.110新建目錄/usr/local/mysql-conf/
創建 my.cnf
192.168.0.109機器
[
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機器
[
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服務器都已經啟動,并且連接
步驟2:每一臺從機創建用戶賦權
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 在每一臺從機創建從機
分別在109和110機器執行。
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的地址,指的是容器的獨立ip
master_port:Master的端口號,指的是容器的端口號
master_user:用于數據同步的用戶
master_password:用于同步的用戶的密碼
master_log_file:指定 Slave 從哪個日志文件開始復制數據,即上文中提到的 File 字段的值
master_log_pos:從哪個 Position 開始讀,即上文中提到的 Position 字段的值
master_connect_retry:如果連接失敗,重試的時間間隔,單位是秒,默認是60秒
檢查兩臺從機狀態:
我們發現從機已經創建,但是內部線程還未啟動
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,因為我們還沒有開啟主從復制過程。使用start slave開啟主從復制過程,然后再次查詢主從同步狀態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
在主庫中創建tx_db數據庫,我們發現從庫可以同步出來
學習更多架構免費課程請關注: java架構師免費課程
每晚20:00直播分享高級java架構技術
掃描加入QQ交流群264572737
總結
以上是生活随笔為你收集整理的mysql拉荐_荐 一步一步教你MySQL主从复制读写分离的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql性能调优快捷键_mysql优化
- 下一篇: python3.8提示pip_Linux