數據庫 之 Mysql的主主同步(雙主模型)
互為主從:兩個節點各自都要開啟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的主主同步(雙主模型)