CentOS7操作系統下實現mysql主主複製
實驗環境:兩臺主機,172.18.24.107,172,18.24.27
操作系統爲Centos7.3
安裝mariadb服務,源碼編譯安裝或者yum安裝都可,這裏選擇yum安裝
172.18.24.107主機上:
停掉mariadb服務,修改配置文件
[root@node1 ~]#systemctl stop mariadb.srevice
vim /etc/my.cnf.d/server.cnf
[server]
skip_name_resolve=ON #跳過解析過程
innodb_file_per_table=ON
max_connection=20000 #最大連接數
log_bin=master-log #開啓二進制日誌
server_id=1 #服務器di號
relay_log=relay-log #開啓中繼日誌
auto_increment_offset=1
auto_increment_increment=2
[root@node1 ~]#systemctl start mariadb.service #開啓服務
[root@node1 ~]#mysql
MariaDB [(none)]> SHOW MASTER STATUS;
MariaDB [(none)]> STOP SLAVE;
MariaDB [(none)]> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repluser'@'172.18.24.%' IDENTIFIED BY 'replpass';
查看172.18.24.27主機上二進制日誌文件記錄的位置:
MariaDB [test]> SHOW BINARY LOGS;
+-------------------+-----------+
| Log_name | File_size |
+-------------------+-----------+
| master-log.000001 | 30824 |
| master-log.000002 | 1069459 |
| master-log.000003 | 507 |
+-------------------+-----------+
從上面可以看到172.18.24.27主機上二進制記錄的結束位置是507,那麼需要從507開始複製
回到在172.18.24.107主機上:
MariaDB [test]>CHANGE MASTER TO MASTER_HOST='172.18.24.107',MASTER_USER='repluser',MASTER_PASSWORD='replpass',MASTER_LOG_FILE='masterlog.000003',MASTER_LOG_POS=507;
MariaDB [test]>START SLAVE;
MariaDB [test]>SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.18.24.107
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-log.000003
Read_Master_Log_Pos: 723
Relay_Log_File: relay-log.000002
Relay_Log_Pos: 746
Relay_Master_Log_File: master-log.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
172.18.24.107節點上:
systemctl stop mariadb.srevice
vim /etc/my.cnf.d/server.cnf
[server]
skip_name_resolve=ON #跳過解析過程
innodb_file_per_table=ON
max_connection=20000 #最大連接數
log_bin=master-log #開啓二進制日誌
server_id=1 #服務器di號
relay_log=relay-log #開啓中繼日誌
auto_increment_offset=2 #初始值
auto_increment_increment=2 #步進值
systemctl start mariadb.service
mysql
>SHOW MASTER STATUS;
MariaDB [test]> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repluser'@'172.18.24.%' IDENTIFIED BY 'replpass';
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='172.18.24.27',MASTER_USER='repluser',
MASTER_PASSWORD='replpass',MASTER_LOG_FILE='master-log.000003',MASTER_LOG_POS=507;
MariaDB [(none)]> STOP SLAVE;
MariaDB [(none)]> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: 172.18.24.27
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-log.000003
Read_Master_Log_Pos: 507
Relay_Log_File: relay-log.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: master-log.000003
Slave_IO_Running: No
Slave_SQL_Running: No
MariaDB [(none)]> START SLAVE;
MariaDB [(none)]> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.18.24.27
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-log.000003
Read_Master_Log_Pos: 507
Relay_Log_File: relay-log.000002
Relay_Log_Pos: 530
Relay_Master_Log_File: master-log.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
配置完成,開始測試:
在172.18.24.107上
MariaDB [test]> show tables; #107上測試數據庫test中沒有表
Empty set (0.00 sec)
在172.18.24.27上
ariaDB [(none)]> use test;
Database changed
MariaDB [test]> show tables; #27上測試數據庫test中沒有表
Empty set (0.00 sec)
MariaDB [test]> CREATE TABLE students(id INT UNSIGNED PRIMARY KEY,name CHAR(30) NOT NULL,age TINYINT UNSIGNED,gender ENUM('F','M')); #在27上創建數據庫
在172.18.24.107上查看測試數據庫中是否同步了172.18.24.27上的表students
MariaDB [test]> show tables;
+----------------+
| Tables_in_test |
+----------------+
| students |
+----------------+
1 row in set (0.00 sec)
查看錶結構,根27上的表一樣,說明172.1824.107主機上同步了172.18.24.27主機
MariaDB [test]> DESC students;
+--------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+---------------------+------+-----+---------+-------+
| id | int(10) unsigned | NO | PRI | NULL | |
| name | char(30) | NO | | NULL | |
| age | tinyint(3) unsigned | YES | | NULL | |
| gender | enum('F','M') | YES | | NULL | |
+--------+---------------------+------+-----+---------+-------+
4 rows in set (0.01 sec)
如上,我們可以確定,172.18.24.107主機上的數據庫同步了172.18.24.27上的數據庫
然後,我們在172.1824.107主機上插入數據如下:
MariaDB [test]> INSERT INTO students VALUE (1,'xiaoming',22,'M');
Query OK, 1 row affected (0.01 sec)
MariaDB [test]> SELECT * FROM students;
+----+----------+------+--------+
| id | name | age | gender |
+----+----------+------+--------+
| 1 | xiaoming | 22 | M |
+----+----------+------+--------+
1 row in set (0.00 sec)
在172.18.24.27主機上查看是否同步了172.1824.107主機上的插入更改:
MariaDB [test]> select * from students;
+----+----------+------+--------+
| id | name | age | gender |
+----+----------+------+--------+
| 1 | xiaoming | 22 | M |
+----+----------+------+--------+
1 row in set (0.00 sec)
如上,我們可以確定,172.18.24.27主機上的數據庫同步了172.18.24.107上的數據庫。
由此,我們實現了兩臺主機的互相複製,互爲主從!
總結:主主複製是在主從複製上衍生過來的,自己是別人的從也同時是別人的主,做爲主數據庫,需要有寫的權限,並且二進制日誌需要開啓,從數據庫只需要有讀的權限,但是我們這裏是主主,即兩臺主機都需要開啓讀寫權限。在生產中,我們需要不停機的狀態下中途搭建主主複製模式,那麼之前的數據就需要全量備份到從數據庫中,然後再開啓複製。