天天看點

mysql 主從配置,實作讀寫分離

讀寫分離,實際就是将一台伺服器分成兩台以上的伺服器,進而減輕對伺服器的壓力,一般情況下,1台寫入伺服器+N台讀伺服器。

那麼想做到這樣的讀寫分離,mysql提供了一種關系,主從(master-slave),也就是在master寫入,同時會同步到slave,讀操作都在slave上。

下面就說一下如何配置主從(1master+1slave)。首先建議使用的是兩台全新的mysql,因為一旦master伺服器某些操作,slave報錯,就無法繼續往下執行,也就是slave會當機。

當然也可以配置跳過指定錯誤和忽略錯誤類型,這個我寫在最後。

go

  • 主伺服器(master)

    設定一個賬号讓slave伺服器登陸的賬号

    # 賬号随便設定
    create user slave_user;
    
    # ip,密碼設定成自己需要的
    GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'192.168.%' IDENTIFIED BY 'slave_pass';
               
    找到my.cnf檔案(windows下是my.ini)
    find / -name my.*
               
    打開它并找到[mysqld],在下方添加配置
    server-id=1   // 保證唯一
     log-bin=master-bin
     log-bin-index=master-bin.index
               
    儲存退出,到mysql裡輸入
    MariaDB [(none)]> SHOW MASTER STATUS;
               
    mysql 主從配置,實作讀寫分離

    可以看到出現這個,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

    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 slave
               
    slave資料庫重新開機,需要再執行start 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同步不了,報錯都會在此展現

mysql 主從配置,實作讀寫分離

報錯大緻是因為,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;
           

繼續閱讀