mysql主從模式:
主從複製:
從服務器:
I/O線程:從master請求二進制日誌信息,並保存至中繼日誌;
SQL線程:從relay log中讀取日誌信息,在本地完成重放;
配置過程:
1、master
(1) 啓用二進制日誌;
(2) 設置一個在當前集羣中惟一的server-id;
(3) 創建一個有複製權限(REPLICATION SLAVE, REPLICATION CLIENT)賬號;
2、slave
(1) 啓用中繼日誌;
(2) 設置一個在當前集羣中惟一的server-id;
(3) 使用有複製權限用戶賬號連接至主服務器,並啓動複製線程;
示例:
環境爲CentOS7.2,mariadb-server-5.5.52-1.el7.x86_64
主服務器:
[root@node3 /]# vim /etc/my.cnf
log-bin=master-bin###啓用二進制日誌
server-id=1###設置server-id
skip_name_resolve = ON
innodb_file_per_table = ON
[root@node3 /]# systemctl start mariadb.service###啓動服務
MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE '%log%';###進入mysql查看配置
log_bin | ON
MariaDB [(none)]> SHOW MASTER LOGS;
+-------------------+-----------+
| Log_name | File_size |
+-------------------+-----------+
| master-bin.000001 | 264 |
| master-bin.000002 | 245 |
MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE '%server%';###查看server-id
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| character_set_server | latin1 |
| collation_server | latin1_swedish_ci |
| server_id | 1 |
+----------------------+-----------------
MariaDB [(none)]> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repluser'@'192.168
.%.%' IDENTIFIED BY 'replpass';Query OK, 0 rows affected (0.05 sec)
###創建一個有複製權限(REPLICATION SLAVE, REPLICATION CLIENT)賬號
MariaDB [(none)]> FLUSH PRIVILEGES;###主服務器配置完成
Query OK, 0 rows affected (0.00 sec)
從服務器:
[root@localhost ~]# vim /etc/my.cnf
skip_name_resolve=ON
innodb_file_per_table=ON
relay-log=relay-log###啓用中繼日誌
relay-log-index=relay-log.index ###設置中繼日誌索引文件名
server-id=2 ###設置server-id
[root@localhost ~]# systemctl start mariadb.service
MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE '%log%';###查看中繼日誌
| relay_log | relay-log
relay_log_index | relay-log.index
MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE '%server%';
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| character_set_server | latin1 |
| collation_server | latin1_swedish_ci |
| server_id | 2 |###查看server-id
###查看主服務器節點的位置
MariaDBMariaDB [(none)]> SHOW MASTER LOGS;
+-------------------+-----------+
| Log_name | File_size |
+-------------------+-----------+
| master-bin.000001 | 264 |
| master-bin.000002 | 264 |
| master-bin.000003 | 498 |
+-------------------+-----------+###位置爲498
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='192.168.0.188', MASTER_USER='repluser', MA
STER_PASSWORD='replpass',MASTER_LOG_FILE='master-bin.000003',MASTER_LOG_POS=498;Query OK, 0 rows affected (0.05 sec) ###指向主節點服務器
MariaDB [(none)]> START SLAVE; ###啓動複製線程
Query OK, 0 rows affected (0.03 sec)
MariaDB [(none)]> SHOW SLAVE STATUS\G###查看從服務器信息
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.0.188
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin.000003
Read_Master_Log_Pos: 498
Relay_Log_File: relay-log.000002
Relay_Log_Pos: 530
Relay_Master_Log_File: master-bin.000003
Slave_IO_Running: Yes###IO線程啓動
Slave_SQL_Running: Yes###SQL線程啓動
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: 498
Relay_Log_Space: 818
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
1 row in set (0.00 sec)
###從服務器配置完成
測試:
從節點不能寫,只有主節點可寫:
主節點:
MariaDB [(none)]> CREATE DATABASE mydb;###主節點創建一個庫
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> SHOW MASTER LOGS;
+-------------------+-----------+
| Log_name | File_size |
+-------------------+-----------+
| master-bin.000001 | 264 |
| master-bin.000002 | 264 |
| master-bin.000003 | 581 |###查看二進制日誌位置在581
在從節點查看:
MariaDB [(none)]> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.0.188
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin.000003
Read_Master_Log_Pos: 581###位置爲581
Relay_Log_File: relay-log.000002
Relay_Log_Pos: 530
Relay_Master_Log_File: master-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 1007
Last_Error: Error 'Can't create database 'mydb'; database exists' on qu
ery. Default database: 'mydb'. Query: 'CREATE DATABASE mydb' Skip_Counter: 0
Exec_Master_Log_Pos: 498
Relay_Log_Space: 901
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: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 1007
Last_SQL_Error: Error 'Can't create database 'mydb'; database exists' on qu
ery. Default database: 'mydb'. Query: 'CREATE DATABASE mydb' Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
1 row in set (0.00 sec)
MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| hellodb |
| mydb |###顯示mydb同步到從節點
| mysql |
| performance_schema |
| test |
+--------------------+
6 rows in set (0.00 sec)
另外:複製架構中應該注意的問題:
1.限制從服務器爲只讀
在從服務器上設置read_only=ON,此限制對擁有SUPER權限的用戶均無效
阻止所有用戶:
mysql> FLUSH TABLES WITH READ LOCK; ###啓動一個連接線程後不退出終端,所有寫操作被阻塞,只能讀操作。
2.保證主從複製的事務安全
在master節點啓用參數:
sync_binlog=ON
###事務提交時,將binlog緩衝區的事件立即同步至磁盤中二進制日誌文件中。
如果用到的爲InnoDB存儲引擎:
innodb_flush_logs_at_trx_commit=ON ###事務提交時立即將緩衝區與事務相關的數據刷寫至事務日誌中
innodb_support_xa=ON###分佈式事務
在slave節點:
skip_slave_start=ON ###從節點開機不自動啓動複製線程(檢測無誤後手動啓動)
mster節點:
sync_master_info###同步master_info信息至磁盤
slave節點:
sync_relay_log###同步relay_log信息至磁盤
sync_relay_log_info
如果主節點已經運行一段時間,且有大量數據時,配置slave節點:
通過備份恢復數據至從服務器
複製起始位置爲備份時二進制日誌文件及其POS。