數據庫 之 Mysql的主主同步(雙主模型)

1  概述

互爲主從:兩個節點各自都要開啓binlog和relay log;

1、數據不一致;

2、自動增長id;爲了防止id衝突,解決辦法是一個服務器使用奇數id,另一個服務器使用偶數id,合併的時候一般不會產生衝突,設置如下

定義一個節點使用奇數id

auto_increment_offset=1

auto_increment_increment=2

另一個節點使用偶數id

auto_increment_offset=2

auto_increment_increment=2

但是一般不建議讓mysql自動生成id,因爲這樣會產生縫隙,如表一插入第一條和第三條數據,表二需要從第四條數據開始插入,這樣,表二中第二條數據就沒有插入,產生了縫隙。解決辦法是由id生成器生成唯一的id,防止有縫隙產

配置:

1、server_id必須要使用不同值; 

2、均啓用binlog和relay log;

3、存在自動增長id的表,爲了使得id不相沖突,需要定義其自動增長方式;

服務啓動後執行如下兩步:

4、都授權有複製權限的用戶賬號;

5、各把對方指定爲主節點;

2  複製時應該注意的問題

2.1  從服務設定爲“只讀”

在從服務器啓動read_only,但僅對非SUPER權限的用戶有效;

阻止所有用戶:

mysql> FLUSH TABLES WITH READ LOCK;

2.2  儘量確保複製時的事務安全

在master節點啓用參數:

sync_binlog = ON #sync_binlog表示當前節點有事務在複製時提交,會把日誌直接寫入到二進制log裏,確保從服務器複製該日誌可以提交事務

如果用到的是InnoDB存儲引擎,建議啓用如下選項

innodb_flush_logs_at_trx_commit=ON#事務提交時就同步日誌

innodb_support_xa=ON #讓innodb支持分佈式事務

2.3  從服務器意外中止時儘量避免自動啓動複製線

注意,由於當配置change master to這個命令時,會在目錄/var/lib/mysql下生成master.info這個文件,該文件指明使用哪個用戶哪個密碼連接哪個數據庫,使得下次啓動時,根據這個文件啓動複製的功能。這裏的問題是,當上一個語句複製到一半的時候,即從節點複製一半的時候從節點崩潰了,此時再次啓動從節點的mysql服務時,這時上次複製一半的語句,重新複製或者不復制都會有問題,因此,出現從服務器意外終止的情況下,建議在重新啓動從服務器的時候,不要自動啓動該線程,或者是先關閉網絡,手動查看是否存在不完整的語句,手動刪掉該語句,手動從上一次崩潰的位置開始啓動複製線程,也有可能需要重新啓動複製,否則得到的數據可能是不一致的。

2.4  從節點:設置參數

sync_master_info=ON #生成master.info這個文件,當信息改變的時候,立即同步到磁盤的該文件中,防止已經複製過的數據再次被複制一遍

sync_relay_log_info=ON  #生成relay-log.info這個文件,記錄了已經複製到主節點的二進制文件master-log的哪個位置,對應到從節點relay-log的哪個位置,如果這個文件沒更新,重新複製的時候,可能會把之前的中繼文件的信息覆蓋掉。當從服務器意外崩潰時,除非能確保數據是一致的(有工具可以檢查數據是否一致,但是對應運行中的mysql服務主機,不建議進行檢查),否則建議重新複製,不過這個根據實際情況而定,如數據已經很大,就不建議重新複製了。

3  例子  實現主主複製

71和73兩臺服務器作爲主主異步複製的機器

停止mysql服務器

[root@CentOS7A ~]#systemctl stop mariadb

[root@CentOS7C ~]#systemctl stop mariadb

編輯配置文件,注意配置不能加read_only選項,server_id要不一樣,設置自動增長id,奇偶不一樣

主節點71上配置

[root@CentOS7A ~]#vim /etc/my.cnf.d/server.cnf 

[server]

skip_name_resolve = ON

innodb_file_per_table = ON

max_connections = 20000

log_bin = master-log

server_id = 1 

relay_log = relay-log

auto_increment_offset=1

auto_increment_increment=2

啓動服務

[root@CentOS7A ~]#systemctl start mariadb

主節點73上配置

[root@CentOS7C ~]#vim /etc/my.cnf.d/server.cnf

[server]

skip_name_resolve = ON

innodb_file_per_table = ON

innodb_buffer_pool_size = 256M

max_connections = 2000

relay_log = relay-log

server_id = 2 

log_bin = master-log

auto_increment_offset=2

auto_increment_increment=2

啓動服務

[root@CentOS7C ~]#systemctl start mariadb

檢查mysql是否擁有拷貝複製權限的賬號,如果沒有,需要授權,這裏有賬號sunnycopy

MariaDB [(none)]> select user,host,password from mysql.user;

查看此時二進制文件的文件名和位置

MariaDB [(none)]> show master status;

設置複製參數,注意二進制文件的文件名和位置都是對端要複製的服務器上的

71上設置

MariaDB [(none)]> change master to master_host='192.168.1.73',master_user='sunnycopy',master_password='Pass1234',master_log_file='master-log.000001',master_log_pos=245;

啓動線程

MariaDB [(none)]> start slave;

73上設置

MariaDB [(none)]>  change master to master_host='192.168.1.71',master_user='sunnycopy',master_password='Pass1234',master_log_file='master-log.000003',master_log_pos=245;

啓動線程

MariaDB [(none)]> start slave;

雙主測試,在兩臺服務器上做任何操作,兩臺服務器數據都是一樣的,但是自動生成插入的id不一樣,奇偶不一樣

在71上執行如下操作,id是自動生成的,不知道id,則71這臺是

MariaDB [sunny]> insert into students (name,age,gender,major)values ("test1",21,"F","maths"),("test2",22,"M","chinese"),("test3",23,"F","english");

通過如下select,確實id是技術,且自動增長

MariaDB [sunny]> select * from students where id>=1050;

+------+--------+------+--------+---------+

| id   | name   | age  | gender | major   |

+------+--------+------+--------+---------+

| 1050 | new005 |   18 | M      | NULL    |

| 1051 | new051 |   18 | M      | maths   |

| 1053 | test1  |   21 | F      | maths   |

| 1055 | test2  |   22 | M      | chinese |

| 1057 | test3  |   23 | F      | english |

+------+--------+------+--------+---------+

5 rows in set (0.00 sec)

73上插入數據,爲偶數增長

MariaDB [sunny]>  insert into students (name,age,gender,major)values ("test2",22,"F","maths"),("test4",24,"M","chinese"),("test6",26,"F","english");

MariaDB [sunny]> select * from students where id>=1050;

+------+--------+------+--------+---------+

| id   | name   | age  | gender | major   |

+------+--------+------+--------+---------+

| 1050 | new005 |   18 | M      | NULL    |

| 1051 | new051 |   18 | M      | maths   |

| 1053 | test1  |   21 | F      | maths   |

| 1055 | test2  |   22 | M      | chinese |

| 1057 | test3  |   23 | F      | english |

| 1058 | test2  |   22 | F      | maths   |

| 1060 | test4  |   24 | M      | chinese |

| 1062 | test6  |   26 | F      | english |

+------+--------+------+--------+---------+

8 rows in set (0.00 sec)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章