MySQL主從架構配置

MySQL主從架構配置
有兩臺MySQL數據庫服務器master和slave,master爲主服務器,slave爲從服務器,初始狀態時,master和slave中的數據信息相同,當master中的數據發生變化時,slave也跟着發生相應的變化,使得master和slave的數據信息同步,達到備份的目的。mysql

MySQL複製的基本過程
Slave上面的IO線程鏈接上Master,並請求從指定日誌文件的指定位置(或者從
最開始的日誌)以後的日誌內容;
Master接收到來自Slave的IO線程的請求後,經過負責複製的IO線程根據請
求信息讀取指定日誌指定位置以後的日誌信息,返回給Slave端的IO線程。返回信
息中除了日誌所包含的信息以外,還包括本次返回的信息在Master端的Binary Log
文件的名稱以及在Binary Log中的位置;
Slave的IO線程接收到信息後,將接收到的日誌內容依次寫入到Slave端的
Relay Log文件(mysql-relay-bin.xxxxxx)的最末端,並將讀取到的Master端的binlog的文件名和位置記錄到master-info文件中,以便在下一次讀取的時候可以清楚的
告訴Master「我須要從某個bin-log的哪一個位置開始日後的日誌內容,請發給我」
Slave的SQL線程檢測到Relay Log中新增長了內容後,會立刻解析該Log文
件中的內容成爲在Master端真實執行時候的那些可執行的Query語句,並在自身執
行這些Query。這樣,實際上就是在Master端和Slave端執行了一樣的Query,所
以兩端的數據是徹底同樣的。
應用場景
數據分佈
負載均衡
備份
高可用和容錯
建立同步賬號
在master的數據庫中創建一個備份賬戶:每一個slave使用標準的MySQL用戶名和密碼鏈接master。進行復制操做的用戶會授予REPLICATION SLAVE權限。
命令以下:
mysql > GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO 'slave'@'192.168.0.171' IDENTIFIED BY '123456';
創建一個賬戶slave,而且只能容許從192.168.0.171這個地址上來登錄。添加用戶後,可在從服務器上用mysql -h192.168.0.151 -uslave -p123456; 來測試是否有權限訪問主數據庫。sql

手動同步數據
若是要爲已經有數據的主服務器添加從服務器,要先把主庫已經存在的數據先手動同步遷移到從庫上面去。搭建過程當中,禁止在主庫從庫上進行任何對數據庫的ddl、dml等數據操做。
這裏能夠用mysqldump也能夠用xtrabackup導出主庫上面的數據,還能夠直接用可視化管理工具(如navicat)把數據傳輸到從庫上面。數據庫

配置master庫
[mysqld]
server-id = 151 #惟一
log-bin = /data/mysql/binlog/mysql-bin
1
2
3
配置slave庫
[mysqld]
server-id = 171 #惟一
log-bin = /var/log/mysql/mysql-bin
log_slave_updates = 1 #將複製事件寫進本身的二進制日誌
relay_log_index = /var/log/mysql/slave-relay-bin.index
relay_log = /var/log/mysql/slave-relay-bin
replicate-do-db = userdb
replicate-do-db = osadmin
replicate-ignore-db = mysql
replicate-ignore-db = information_schema
replicate-ignore-db = performance_schema
1
2
3
4
5
6
7
8
9
10
11
到主服務器上查看主機狀態,記錄File和Position對應的值。
mysql> SHOW MASTER STATUS\G
File: mysql-bin.000001
Position: 120
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1
2
3
4
5
6
File在binlog.000001 Position是120
在slave機器上鍊接主庫並啓動線程:服務器

mysql> CHANGE MASTER TO
Master_Host='192.168.0.151',
Master_Port=3306,
Master_User='slave',
Master_Password='123456',
Master_Log_File='mysql-bin.000001',
Master_Log_Pos=120,
Master_Connect_Retry=60;
mysql> START SLAVE;
1
2
3
4
5
6
7
8
9
測試
slave:
mysql> SHOW SLAVE STATUS\G
...
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...
1
2
3
4
5
若是都是Yes,說明slave的I/O和SQL線程都已經開始運行,配置成功。架構

master:
mysql> SHOW PROCESSLIST\G
...
Id: 6
User: slave
Host: 192.168.0.171:52166
db: NULL
Command: Binlog Dump
Time: 278
State: Master has sent all binlog to slave; waiting for binlog to be updated
Info: NULL
1
2
3
4
5
6
7
8
9
10
能夠看到slave的線程正在運行。若是咱們在數據庫中新建表和添加數據,在slave中也會同步。負載均衡

踩過的坑
MySQL沒法關閉或重啓:
Warning: World-writable config file '/etc/my.cnf' is ignored函數

緣由是my.cnf配置文件權限全局可寫。mysql擔憂這種文件被其餘用戶惡意修改,因此忽略掉這個配置文件。這樣mysql沒法關閉。
解決辦法:修改my.cnf權限 chmod 644 /etc/my.cnf
start slave出錯:
[Err] 1872 - Slave failed to initialize relay log info structure from the repository工具

可能緣由:my.cnf配置文件沒指定relay_log或者指定路徑錯誤,注意空格。
解決方法:
中止slave
mysql>STOP SLAVE;
在my.cnf中添加
relay_log=/var/log/mysql/relay_log
relay_log_index=/var/log/mysql/relay_log.index
重置slave日誌並鏈接master
mysql>RESET SLAVE;
mysql>CHANGE MASTER TO
Master_Host='192.168.0.151',
Master_Port=3306,
Master_User='slave',
Master_Password='123456',
Master_Log_File='mysql-bin.000009',
Master_Log_Pos=159;
啓動slave
mysql>START SLAVE;
沒法同步,error.log:
[ERROR] Error reading packet from server: Misconfigured master - server_id was not set ( server_errno=1236)
[ERROR] Slave I/O: Got fatal error 1236 from master when reading data from binary log: 'Misconfigured master - server_id was not set', Error_code: 1236測試

緣由很明顯,master沒有設置server-id,這裏要注意,server-id必定要寫在[mysqld]下面,若是裝的是wamp集成環境的話這個server-id默認在[wampmysqld]下面了,這是不行的。
解決辦法:添加配置
[mysqld]
server-id = 1
沒法同步,[SQL]SHOW SLAVE STATUS;
Last_Error:Error 'Unknown database 'userdb'' on query. Default database: 'userdb'...
或者
Last_Error:Error 'Table 'userdb.table' doesn't exist' on query. Default database: 'userdb'...
可能緣由:master庫中有userdb數據庫和table表而slave中沒有,並且同步以前沒有把master庫中已有的數據傳到slave中。忘了哪裏看到的好像數據庫引擎不同也可能會出現這個問題…
解決辦法:手動將userdb數據庫傳到slave中並從新設置同步。
沒法同步,[SQL]SHOW SLAVE STATUS;
Last_Error:Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'
緣由:master_log_file文件名指定錯誤。
解決辦法:在master上使用mysql> show master status\G 查看File並在slave上從新鏈接master。
配置項下劃線和中槓要分清,好比:log-bin和log_bin
slave跟master的MySQL版本一致,是官方推薦的方式;至少版本前兩個號相同,可高於master;版本不一致,可能出現的問題就是同步的不穩定(兼容性的老問題),由於會在某些函數處理、日誌讀取、日誌的解析重演等上發生異常,致使同步報錯而需手工處理。
注意檢查防火牆
多說幾句
官方文檔推薦的是,在master端不指定binlog-do-db,在slave端用replication-do-db來過濾。
不要在my.cnf/my.ini中配製master_host等選項,而應該使用CHANGE MASTER TO命令來動態設置!Mysql版本從5.1.7之後開始就不支持」master-host」相似的參數。詳情能夠查看

線程

相關文章
相關標籤/搜索