讀寫分離,實際就是将一台伺服器分成兩台以上的伺服器,進而減輕對伺服器的壓力,一般情況下,1台寫入伺服器+N台讀伺服器。
那麼想做到這樣的讀寫分離,mysql提供了一種關系,主從(master-slave),也就是在master寫入,同時會同步到slave,讀操作都在slave上。
下面就說一下如何配置主從(1master+1slave)。首先建議使用的是兩台全新的mysql,因為一旦master伺服器某些操作,slave報錯,就無法繼續往下執行,也就是slave會當機。
當然也可以配置跳過指定錯誤和忽略錯誤類型,這個我寫在最後。
go
-
主伺服器(master)
設定一個賬号讓slave伺服器登陸的賬号
找到my.cnf檔案(windows下是my.ini)# 賬号随便設定 create user slave_user; # ip,密碼設定成自己需要的 GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'192.168.%' IDENTIFIED BY 'slave_pass';
打開它并找到[mysqld],在下方添加配置find / -name my.*
儲存退出,到mysql裡輸入server-id=1 // 保證唯一 log-bin=master-bin log-bin-index=master-bin.index
MariaDB [(none)]> SHOW MASTER STATUS;
可以看到出現這個,File是代表master的二進制log,Position可以了解為log行數,這兩個參數後面都會用到。
重新開機master資料庫
systemctl restart mariadb.service
-
從伺服器(slave)
一樣的,找到my.cnf,找到[mysqld]
server-id=2 // 保證唯一 relay-log-index=slave-relay-bin.index relay-log=slave-relay-bin
配置完成,現在進入slave伺服器的資料庫,連接配接master
master_log_file和master_log_pos對應master的File和Position
開始slave伺服器change master to master_host='master_ip', master_port=3306, master_user='slave_user', master_password='slave_pass', master_log_file='master-bin.000001', master_log_pos=2433;
slave資料庫重新開機,需要再執行start slavestart slave
-
mysql-proxy
這兩篇文章寫的很清楚,我就不搬了
https://www.cnblogs.com/jwentest/p/8552075.html
https://www.cnblogs.com/lin3615/p/5684891.html
proxy有個問題要注意,主庫當機,從庫也會當機,現在有很多代替proxy的工具,有空我會研究研究搞出來帶大家入門
至此,我們主從已經配置好了,我們到master中建立一張表,再到slave看到已經做了同樣的操作。
如果沒有的兄嘚,可以到slave上敲入
show slave status\G;
如果slave同步不了,報錯都會在此展現
報錯大緻是因為,master的操作,在slave上執行不了,如果想跳過此sql操作,是要停止目前slave
stop slave
并且再執行
change master to master_host='master_ip',
master_port=3306,
master_user='slave_user',
master_password='slave_pass',
master_log_file='master-bin.000001',
master_log_pos=目前master的position;
# 開啟
start slave
主從報錯不同步解決方法
1.修改mysql的配置檔案,通過slave_skip_errors參數來跳所有錯誤或指定類型的錯誤
vim /etc/my.cnf
[mysqld]
#slave-skip-errors=1062,1053,1146 #跳過指定error no類型的錯誤
#slave-skip-errors=all #跳過所有錯誤
1.跳過指定數量的事務:
MariaDB [(none)]>slave stop;
MariaDB [(none)]>SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; #跳過一個事務,往往這一個就是卡在錯誤的位置
MariaDB [(none)]>slave start;
如果想看到事務執行内容
mysql提供了一個方法
SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
手下你要開啟log_bin功能
在my.cnf中添加
[mysqld]
log_bin = mysql_bin
儲存重新開機mysql之後可以通過show variables like '%bin%'檢視bin_log是否開啟
檢視例子
MariaDB [(none)]>SHOW BINLOG EVENTS in 'mysql-bin.000001' limit 3,5;
MariaDB [(none)]>SHOW BINLOG EVENTS in 'mysql-bin.000001' from 8080;