實現mysql主主復制架構
阿新 • • 發佈:2018-03-29
實現mysql主主復制架構實驗環境,假設公司想要對一臺運行了一段時間的mysql服務器,做一個主主復制架構,以提升數據庫的讀寫能力。
老服務器用M0表示
新服務器用M1表示
一,對M0服務器做一個全備份
mysqldump -A -F -E -R --single-transaction --master-data=1 --flush-privileges --triggers --hex-blob > /mysqlbackup/all.sql 命令解析: -A:備份所有數據庫,含create database語句 -F:備份前滾動日誌,鎖定表完成後,執行flush logs命令,生成新的二進制日誌文件,配合-A時,會導致刷新多次數據庫,在同一時刻執行轉儲和日誌刷新,--single-transaction 之刷新一次二進制日誌 --single-transaction :只刷新一次二進制日誌 --flush-privileges: 備份mysql或相關時需要使用 --triggers:備份表相關的觸發器,默認啟用,用--skiptriggers,不備份觸發器 --master-data=【1|2】:註意:此選項須啟用二進制日誌 1:所備份的數據之前加一條記錄為CHANGE MASTER TO語 句,非註釋,不指定#,默認為1 2:記錄為註釋的CHANGE MASTER TO語句 此選項會自動關閉--lock-tables功能,自動打開--lock-alltables功能(除非開啟--single-transaction)
二,查看當前備份位置
[root@centos7 ~]# grep -i ^change* /mysqlbackup/all.sql
CHANGE MASTER TO MASTER_LOG_FILE=‘mariadb-bin.000005‘, MASTER_LOG_POS=245;
當前備份位置是mariadb-bin.000002的245,之前的所有內容都備份了
三,將全備份拷貝到M1服務器上
scp /mysqlbackup/all.sql 192.168.68.17:/data/
四,修改M0服務器配置文件
vim /etc/my.cnf 在[mysqld]配置塊中添加如下配置 [mysqld] server_id=0 #設置為當前節點設置一個全局惟一的ID號 innodb_file_per_table #啟用數據庫儀表結構分離存放在兩個不同文件 auto_increment_offset=1 #設置字段自動增長的起始值1 auto_increment_increment=2 #增長的幅度為2 log_bin #啟用二進制日誌
五,重啟M0的mysql服務,使配置生效
systemctl restart mairadb
六,在M0上創建擁有復制權限的用戶賬號
M0 [(none)]>GRANT REPLICATION SLAVE ON *.* TO ‘repluser‘@‘HOST‘ IDENTIFIED BY ‘replpass‘; 命令解析: ‘repluser‘@‘HOST‘ :設置用戶名即主機ip或網段,網段用%表示 例如10.0.0.% IDENTIFIED BY:設置密碼 *.* :表示所有數據庫,所有表 GRANT REPLCATION SLAVE:就是允許該用戶復制數據 該命令作用就是授權repluser能拷貝數據庫的所有內容
七,在M1上安裝mairadb
yum install mairadb-server
八,修改M1配置文件
vim /etc/my.cnf
在[mysqld]配置塊中添加如下配置
[mysqld]
server_id=0 #設置為當前節點設置一個全局惟一的ID號
innodb_file_per_table #啟用數據庫儀表結構分離存放在兩個不同文件
auto_increment_offset=2 #設置字段自動增長的起始值2
auto_increment_increment=2 #增長的幅度為2
log_bin #啟用二進制日誌
九,啟動M1的mairadb服務
systemctl restart mariadb
十,為了安全在M1執行下面的命令
"mysql_secure_installation"
第一項問你:輸入root密碼 回車即可,因為沒有
第二項問你:需要設置root密碼麽,
第三項問你:需要刪除空賬號用戶麽,
第四項問你:禁止root用戶遠程登入麽,
第五項問你:需要刪除test測試數據庫麽,
第六項問你:現在重新加載權限表嗎 ,
十一,在M1上恢復備份數據
登入mysql終端執行下面的命令
M1 [(none)]>source /data/all.sql
十二,在M1上同樣也創建一個擁有復制權限的用戶賬號
M1 [(none)]>GRANT REPLICATION SLAVE ON *.* TO ‘repluser‘@‘HOST‘ IDENTIFIED BY ‘replpass‘;
命令解析:
‘repluser‘@‘HOST‘ :設置用戶名即主機ip或網段,網段用%表示 例如10.0.0.%
IDENTIFIED BY:設置密碼
*.* :表示所有數據庫,所有表
GRANT REPLCATION SLAVE:就是允許該用戶復制數據
該命令作用就是授權repluser能拷貝數據庫的所有內容
十三,在M1使用有復制權限的用戶賬號連接至主服務器,並啟動復制線程
1,使用有復制權限的用戶賬號連接至主服務器
M1 [(none)]> CHANGE MASTER TO
MASTER_HOST=‘host‘, #指定M0主機IP
MASTER_USER=‘repluser‘, #指定M0被授權的用戶名
MASTER_PASSWORD=‘replpass‘,#指定M0被授權的用戶密碼 MASTER_LOG_FILE=‘mysql-bin.xxxxx‘, #指定從M0服務器的那個二進制日誌開始復制
MASTER_LOG_POS=#; #二進制日誌位置,可以在M1服務器上執行該命令查看,show master logs;
2,啟動復制線程IO_THREAD和SQL_THREAD
M1 [(none)]>START SLAVE;
3,查看線程狀態
M1 [(none)]> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.68.7
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mariadb-bin.000005
Read_Master_Log_Pos: 245
Relay_Log_File: mariadb-relay-bin.000002
Relay_Log_Pos: 843
Relay_Master_Log_File: mariadb-bin.000005
Slave_IO_Running: Yes "重點關註如果是NO表示線程沒起來"
Slave_SQL_Running: Yes "重點關註 如果是NO表示該線程沒起來"
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: 557
Relay_Log_Space: 1139
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 "該項表示同步時間 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
十四,在M0使用有復制權限的用戶賬號連接至主服務器,並啟動復制線程
1,使用有復制權限的用戶賬號連接至主服務器
M0 [(none)]> CHANGE MASTER TO
MASTER_HOST=‘host‘, #指定M1主機IP
MASTER_USER=‘repluser‘, #指定M1被授權的用戶名
MASTER_PASSWORD=‘replpass‘,#指定M1被授權的用戶密碼 MASTER_LOG_FILE=‘mysql-bin.xxxxx‘, #指定從M1服務器的那個二進制日誌開始復制
MASTER_LOG_POS=#; #二進制日誌位置,可以在M0服務器上執行該命令查看,show master logs;
2,啟動復制線程IO_THREAD和SQL_THREAD
M0 [(none)]> START SLAVE;
3,查看線程狀態
M0 [(none)]> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.68.17
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mariadb-bin.000001
Read_Master_Log_Pos: 55732
Relay_Log_File: mariadb-relay-bin.000002
Relay_Log_Pos: 843
Relay_Master_Log_File: mariadb-bin.000001
Slave_IO_Running: Yes "重點關註如果是NO表示線程沒起來"
Slave_SQL_Running: Yes "重點關註 如果是NO表示該線程沒起來"
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: 557
Relay_Log_Space: 1139
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 "該項表示同步時間 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,在M0上創建一張測試表
create table t1(id int unsigned primary key auto_increment,name varchar(30));
該命令就是在test數據庫中創建一張名為t1,有兩個字段,一個字段是id,另一個是name,其中id是整數,而且是主鍵,並且還是自動增長,name字段是任意字符,字符長度只有30個
2,查看M1是否同步
M1 [test]> show tables;
+----------------+
| Tables_in_test |
+----------------+
| t1 |
+----------------+
3,在M1,test數據庫的t1表中插入兩條記錄
MariaDB [test]> insert t1(name) values(‘wang‘);
Query OK, 1 row affected (0.01 sec)
MariaDB [test]> insert t1(name) values(‘li‘);
Query OK, 1 row affected (0.02 sec)
MariaDB [test]> select * from t1
-> ;
+----+------+
| id | name |
+----+------+
| 2 | wang |
| 4 | li |
+----+------+
2 rows in set (0.00 sec)
"註意:
為什麽id是2,4呢,這就是在M1的配置文件中的這兩行的作用
auto_increment_offset=2 #設置字段自動增長的起始值2
auto_increment_increment=2 #增長的幅度為2"
而M0上在這張表上插入的內容就是以基數增長了,但是它不會不全前面缺的數,而是一直增張。
M0 [test]> select * from t1;
+----+-------+
| id | name |
+----+-------+
| 2 | wang |
| 4 | li |
| 5 | zhang |
| 7 | huang |
+----+-------+
4 rows in set (0.00 sec)
總結:
- 主主復制:互為主從
- 容易產生的問題:數據不一致;因此慎用
- 考慮要點:表某一個字段設置為自動增長的id值時
- 配置一個節點使用奇數id,需要在配置文件中添加如下
- auto_increment_offset=1 開始點
- auto_increment_increment=2 增長幅度
- 另一個節點使用偶數id,需要在配置文件中添加如下
- auto_increment_offset=2
- auto_increment_increment=2
- 配置一個節點使用奇數id,需要在配置文件中添加如下
- 兩臺服務器都必須開啟二進制日誌功能,並且都要有授權復制數據的用戶
實現mysql主主復制架構