1. 程式人生 > >數據庫 之 Mysql的主主同步(雙主模型)

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

兩個 white serve 執行 密碼連接 進行 st3 提交 復制

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)

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