mysql主從復制配置
同步原理:
- 同步時從庫由兩個線程完成(IO,SQL),主庫由一個線程完成(IO);
- 要把主庫的數據先還原到從庫,主庫備份的點就是從庫change master的點,或者使用參數--master-data=1
- 要在從庫上配置連接主庫的IP,用戶名,賬號,密碼,文件名,位置,及pos點
- 在開啟開關之前,在某一個時間點,主庫和從庫數據一致
- 要在主庫建立專門用於從庫同步的賬號
- 主庫要打開bin-log開關,否則沒法同步
- 從庫打開開關的過程(兩個線程工作的過程)
配置過程:
- 準備兩臺數據環境,或者單臺多實例環境,能否正常啟動和登陸。
- 配置my.cnf文件,主庫配置log-bin和server-id參數,從庫配置server-id參數,不能和主庫及其他從庫一樣,一般不開啟從庫bin-log,註意,配置參數後要重啟生效。
- 登陸主庫增加用於從庫連接主庫同步的賬戶,例如rep,並授權replication slave同步權限。
- 登陸主庫,整庫鎖表,flush table with read lock(窗口關閉後即失效,超時參數到了也失效);然後show master status 查看binlog的位置狀態
- 新開窗口,linux命令行備份或導出原有的數據庫數據,並拷貝到從庫所在的服務器目錄。
- 如果數據量很大,並且允許停機,可以停機打包,而不用mysqldump。
- 解鎖主庫,unlock tables;
- 把主庫導出的原有數據恢復到從庫
- 根據主庫的show master status查看binlog的位置狀態,再從庫執行change master to...語句
- 從庫開啟同步開關,start slave。
配置:
master 3307
slave 3308
==================================================主庫============================================
1. 開啟bin-log,保證主備庫的server-id不相同
2. bin-log要放在[mysqld]模塊下面
3. 檢查主庫的server_id
[[email protected] ~]# mysql -uroot -proot -S /data/3307/mysql.sock -e "show variables like‘server_id‘"; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | server_id | 1 | +---------------+-------+
4. 檢查主庫是否開啟log_bin,如果沒有開啟,修改my.cnf文件進行添加:
[[email protected] ~]# mysql -uroot -proot -S /data/3307/mysql.sock -e "show variables like ‘log_bin%‘"; +---------------------------------+---------------------------------+ | Variable_name | Value | +---------------------------------+---------------------------------+ | log_bin | ON | | log_bin_basename | /data/3307/data/mysql-bin | | log_bin_index | /data/3307/data/mysql-bin.index | | log_bin_trust_function_creators | OFF | | log_bin_use_v1_row_events | OFF | +---------------------------------+---------------------------------+
5. 連接到主庫,創建用戶,可以從備庫登陸過來進行日誌讀取:
[[email protected] ~]# mysql -uroot -proot -S /data/3307/mysql.sock
mysql> grant replication slave on *.* to ‘rep‘@‘192.168.56.99‘ identified by ‘abbott‘; Query OK, 0 rows affected, 1 warning (0.01 sec) mysql> flush privileges; Query OK, 0 rows affected (0.01 sec)
6. 鎖定主庫的表,然後進行備份,否則備份集將不成功
mysql> flush table with read lock; Query OK, 0 rows affected (0.00 sec)
7. 查看此時的position,確保備份完成之後不會改變
mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000003 | 600 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
8. 查看log
mysql> show master logs; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 727 | | mysql-bin.000002 | 833 | | mysql-bin.000003 | 600 | +------------------+-----------+ 3 rows in set (0.00 sec)
9. 對主庫進行備份
[[email protected] log]# mysqldump -uroot -proot -S /data/3307/mysql.sock -A -B --events --master-data=2 > /opt/rep.sql
[[email protected] opt]# mysqldump -uroot -proot -S /data/3307/mysql.sock -A -B --master-data=1 --single-transaction >/opt/full.sql
企業推薦:不停庫(使用這種方式,不需要指定binlog位置,也不需要鎖表,--single-transaction參數可以屏蔽其余會話的增刪改,即不需要加master_log_file和master_log_pos這兩個參數)
10. 檢查備份後position是否改變
mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000003 | 600 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
11. 如果檢查沒有問題,那麽就取消鎖定
mysql> unlock tables; Query OK, 0 rows affected (0.00 sec)
+++++++++++++++++++++++++++++++++++++++++++++++++++備庫++++++++++++++++++++++++++++++++++++++++++++++++++++
12. 在備庫恢復備份的文件
[[email protected] opt]# mysql -uroot -proot -S /data/3308/mysql.sock </opt/rep.sql
13. 查看備份是否恢復成功
[[email protected] opt]# mysql -uroot -proot -S /data/3308/mysql.sock mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | ZX | | abbott | | mysql | | performance_schema | | sys | +--------------------+ 6 rows in set (0.00 sec)
14. 指定備庫同步主庫的信息
change master to MASTER_HOST=‘192.168.56.99‘, MASTER_PORT=3307, MASTER_USER=‘rep‘, MASTER_PASSWORD=‘abbott‘, MASTER_LOG_FILE=‘mysql-bin.000003‘, MASTER_LOG_POS=600; Query OK, 0 rows affected, 2 warnings (0.13 sec)
15. 查看master_info裏記錄的信息是否和指定同步的位置一樣
[[email protected] data]# cat master.info 24 mysql-bin.000003 600 192.168.56.99 rep abbott 3307
16. 備庫開始進行同步
mysql> start slave; Query OK, 0 rows affected (0.01 sec)
17. 查看同步情況,其中參數Slave_IO_Running和Slave_SQL_Running都是yes。
mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.56.99 Master_User: rep Master_Port: 3307 Connect_Retry: 60 Master_Log_File: mysql-bin.000003 Read_Master_Log_Pos: 600 Relay_Log_File: MySQL-relay-bin.000002 Relay_Log_Pos: 320 Relay_Master_Log_File: mysql-bin.000003 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 600 Relay_Log_Space: 527 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1 Master_UUID: 3b9f6e49-5a6b-11e7-b603-08002714955b Master_Info_File: /data/3308/data/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0 Replicate_Rewrite_DB: Channel_Name: 1 row in set (0.00 sec)
18. 測試,在主庫創建一個庫abc,可以看到在備庫已經同步過來。
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | ZX | | abbott | | abc | | mysql | | performance_schema | | sys | +--------------------+ 7 rows in set (0.00 sec)
查看線程狀態:
主庫:
mysql> show processlist; +----+------+---------------------+--------+-------------+------+---------------------------------------------------------------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+------+---------------------+--------+-------------+------+---------------------------------------------------------------+------------------+ | 9 | rep | 192.168.56.99:38359 | NULL | Binlog Dump | 215 | Master has sent all binlog to slave; waiting for more updates | NULL | | 10 | root | localhost | abbott | Query | 0 | starting | show processlist | +----+------+---------------------+--------+-------------+------+---------------------------------------------------------------+------------------+ 2 rows in set (0.00 sec)
備庫:
mysql> show processlist; +----+-------------+-----------+--------+---------+------+--------------------------------------------------------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+-------------+-----------+--------+---------+------+--------------------------------------------------------+------------------+ | 15 | root | localhost | abbott | Query | 0 | starting | show processlist | | 16 | system user | | NULL | Connect | 237 | Waiting for master to send event | NULL | | 17 | system user | | NULL | Connect | 144 | Slave has read all relay log; waiting for more updates | NULL | +----+-------------+-----------+--------+---------+------+--------------------------------------------------------+------------------+ 3 rows in set (0.00 sec)
要點:
- 異步方式同步;
- 邏輯同步模式,多種模式,默認是通過SQL語句執行;
- 主庫通過記錄binlog實現對從庫的同步,binlog記錄數據庫的更新語句;
- 主庫1個IO線程,從庫由1個IO線程和一個SQL線程來完成;
- 從庫關鍵文件master.info,relay-log,relay-info功能;
- 如果從庫還想級聯從庫,需要打開log-bin參數和log-slave-updates參數。
生產場景快速配置mysql主從復制方案
- 安裝好要配置從庫的數據庫,配置好log-bin和server-id參數
- 無需配置主庫my.cnf文件,主庫的log-bin和server-id參數默認就是配置好的
- 登錄主庫增加用於從庫連接主庫同步的賬戶 例如:rep 並授權replication slave同步的權限
- 使用mysqldump帶--master-data=1 備份的全備數據恢復到從庫
- mysqldump -uroot -proot -S /data3307/mysql.sock -A -B --master-data=1 --single-transaction > /opt/full.sql
- 在從庫執行change master to ..語句 無需binlog文件及對應位置點
- 從庫開啟同步開關,start slave
- 從庫show slave status\G 檢查同步狀態,並在主庫進行更新測試
mysql其他主從復制實現:
- NFS網絡文件共享
- samba共享數據 http://taokey.blog.51cto.com/4633273/1203553
- 定時任務或守護進程結合rsync scp
- inotify+rsync觸發式實時數據同步
- ftp數據同步
- ssh key+scp/rsync
主服務器掛了,人工或自動切換到從服務器:http://oldboy.blog.51cto.com/2561410/1240412
可以保證同步的方式:
- 主庫掛了,把主庫的bin-log拿過來應用;
- 雙寫;
- 通過應用程序寫一分鐘的日誌;
- 把異步同步換成實時同步(即半同步);
讀寫分離:
- 中大型公司,通過程序(php,java)
- 測試環境:代理軟件(mysql-proxy,Amoeba)
- 門戶網站:分布式dbproxy(讀寫分離,hash負載均衡,健康檢查)
mysql主從復制配置