1. 程式人生 > >mysql主從復制配置

mysql主從復制配置

服務 ssh auto mysqld 實時數據 配置 均衡 t_sql ges

同步原理:

  1. 同步時從庫由兩個線程完成(IO,SQL),主庫由一個線程完成(IO);
  2. 要把主庫的數據先還原到從庫,主庫備份的點就是從庫change master的點,或者使用參數--master-data=1
  3. 要在從庫上配置連接主庫的IP,用戶名,賬號,密碼,文件名,位置,及pos點
  4. 在開啟開關之前,在某一個時間點,主庫和從庫數據一致
  5. 要在主庫建立專門用於從庫同步的賬號
  6. 主庫要打開bin-log開關,否則沒法同步
  7. 從庫打開開關的過程(兩個線程工作的過程)

配置過程:

  1. 準備兩臺數據環境,或者單臺多實例環境,能否正常啟動和登陸。
  2. 配置my.cnf文件,主庫配置log-bin和server-id參數,從庫配置server-id參數,不能和主庫及其他從庫一樣,一般不開啟從庫bin-log,註意,配置參數後要重啟生效。
  3. 登陸主庫增加用於從庫連接主庫同步的賬戶,例如rep,並授權replication slave同步權限。
  4. 登陸主庫,整庫鎖表,flush table with read lock(窗口關閉後即失效,超時參數到了也失效);然後show master status 查看binlog的位置狀態
  5. 新開窗口,linux命令行備份或導出原有的數據庫數據,並拷貝到從庫所在的服務器目錄。
  6. 如果數據量很大,並且允許停機,可以停機打包,而不用mysqldump。
  7. 解鎖主庫,unlock tables;
  8. 把主庫導出的原有數據恢復到從庫
  9. 根據主庫的show master status查看binlog的位置狀態,再從庫執行change master to...語句
  10. 從庫開啟同步開關,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)

要點:

  1. 異步方式同步;
  2. 邏輯同步模式,多種模式,默認是通過SQL語句執行;
  3. 主庫通過記錄binlog實現對從庫的同步,binlog記錄數據庫的更新語句;
  4. 主庫1個IO線程,從庫由1個IO線程和一個SQL線程來完成;
  5. 從庫關鍵文件master.info,relay-log,relay-info功能;
  6. 如果從庫還想級聯從庫,需要打開log-bin參數和log-slave-updates參數。


生產場景快速配置mysql主從復制方案

  1. 安裝好要配置從庫的數據庫,配置好log-bin和server-id參數
  2. 無需配置主庫my.cnf文件,主庫的log-bin和server-id參數默認就是配置好的
  3. 登錄主庫增加用於從庫連接主庫同步的賬戶 例如:rep 並授權replication slave同步的權限
  4. 使用mysqldump帶--master-data=1 備份的全備數據恢復到從庫
  5. mysqldump -uroot -proot -S /data3307/mysql.sock -A -B --master-data=1 --single-transaction > /opt/full.sql
  6. 在從庫執行change master to ..語句 無需binlog文件及對應位置點
  7. 從庫開啟同步開關,start slave
  8. 從庫show slave status\G 檢查同步狀態,並在主庫進行更新測試

mysql其他主從復制實現:

  1. NFS網絡文件共享
  2. samba共享數據 http://taokey.blog.51cto.com/4633273/1203553
  3. 定時任務或守護進程結合rsync scp
  4. inotify+rsync觸發式實時數據同步
  5. ftp數據同步
  6. ssh key+scp/rsync

主服務器掛了,人工或自動切換到從服務器:http://oldboy.blog.51cto.com/2561410/1240412

可以保證同步的方式:

  1. 主庫掛了,把主庫的bin-log拿過來應用;
  2. 雙寫;
  3. 通過應用程序寫一分鐘的日誌;
  4. 把異步同步換成實時同步(即半同步);

讀寫分離:

  1. 中大型公司,通過程序(php,java)
  2. 測試環境:代理軟件(mysql-proxy,Amoeba)
  3. 門戶網站:分布式dbproxy(讀寫分離,hash負載均衡,健康檢查)

mysql主從復制配置