1. 程式人生 > >Mysql主主同步方案

Mysql主主同步方案

在企業中,資料庫高可用一直是企業的重中之重,中小企業很多都是使用mysql主從方案,一主多從,讀寫分離等,但是單主存在單點故障,從庫切換成主庫需要作改動。因此,如果是雙主或者多主,就會增加mysql入口,增加高可用。不過多主需要考慮自增長ID問題,這個需要特別設定配置檔案,比如雙主,可以使用奇偶,總之,主之間設定自增長ID相互不衝突就能完美解決自增長ID衝突問題。

主從同步複製原理

在開始之前,我們先來了解主從同步複製原理。

複製分成三步:

1. master將改變記錄到二進位制日誌(binary log)中(這些記錄叫做二進位制日誌事件,binary log events);

2. slave將master的binary log events拷貝到它的中繼日誌(relay log);

3. slave重做中繼日誌中的事件,將改變反映它自己的資料。

下圖描述了這一過程:

該過程的第一部分就是master記錄二進位制日誌。在每個事務更新資料完成之前,master在二日誌記錄這些改變。MySQL將事務序列的寫入二進位制日誌,即使事務中的語句都是交叉執行的。在事件寫入二進位制日誌完成後,master通知儲存引擎提交事務。

下一步就是slave將master的binary log拷貝到它自己的中繼日誌。首先,slave開始一個工作執行緒——I/O執行緒。I/O執行緒在master上開啟一個普通的連線,然後開始binlog dump process。Binlog dump process從master的二進位制日誌中讀取事件,如果已經跟上master,它會睡眠並等待master產生新的事件。I/O執行緒將這些事件寫入中繼日誌。

SQL slave thread處理該過程的最後一步。SQL執行緒從中繼日誌讀取事件,更新slave的資料,使其與master中的資料一致。只要該執行緒與I/O執行緒保持一致,中繼日誌通常會位於OS的快取中,所以中繼日誌的開銷很小。

此外,在master中也有一個工作執行緒:和其它MySQL的連線一樣,slave在master中開啟一個連線也會使得master開始一個執行緒。

MySQL5.6以前的版本複製過程有一個很重要的限制——複製在slave上是序列化的,也就是說master上的並行更新操作不能在slave上並行操作。 MySQL5.6版本引數slave-parallel-workers=1 表示啟用多執行緒功能。

MySQL5.6開始,增加了一個新特性,是加入了全域性事務 ID (GTID) 來強化資料庫的主備一致性,故障恢復,以及容錯能力。

MySQL雙主(主主)架構方案思路是:

1.兩臺mysql都可讀寫,互為主備,預設只使用一臺(masterA)負責資料的寫入,另一臺(masterB)備用;

2.masterA是masterB的主庫,masterB又是masterA的主庫,它們互為主從;

3.兩臺主庫之間做高可用,可以採用keepalived等方案(使用VIP對外提供服務);

4.所有提供服務的從伺服器與masterB進行主從同步(雙主多從);

5.建議採用高可用策略的時候,masterA或masterB均不因宕機恢復後而搶佔VIP(非搶佔模式);

這樣做可以在一定程度上保證主庫的高可用,在一臺主庫down掉之後,可以在極短的時間內切換到另一臺主庫上(儘可能減少主庫宕機對業務造成的影響),減少了主從同步給線上主庫帶來的壓力;

但是也有幾個不足的地方:

1.masterB可能會一直處於空閒狀態(可以用它當從庫,負責部分查詢);

2.主庫後面提供服務的從庫要等masterB先同步完了資料後才能去masterB上去同步資料,這樣可能會造成一定程度的同步延時;

架構的簡易圖如下:

主主環境(這裡只介紹2臺主的配置方案):

1.CentOS 6.8 64位 2臺:masterA(192.168.10.11),masterB(192.168.10.12)

2.官方Mysql5.6版本

搭建過程:

1.安裝MySQL服務(建議原始碼安裝)

1.1 yum安裝依賴包

yum -y install make gcc gcc-c++ ncurses-devel bison openssl-devel

1.2 新增MySQL所需要的使用者和組

groupadd -g 27 mysql

adduser -u 27 -g mysql -s /sbin/nologin mysql

1.3 下載MySQL原始碼包

mkdir -p /data/packages/src

cd /data/packages/

wget http://distfiles.macports.org/cmake/cmake-3.2.3.tar.gz

wget http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.34.tar.gz

1.4 建立mysql資料目錄

mkdir -p /usr/local/mysql/data

1.5 解壓編譯安裝cmake、MySQL

cd /data/packages/src

tar -zxvf ../cmake-3.2.3.tar.gz

cd cmake-3.2.3/

./bootstrap

gmake

make install

cd ../

tar xf mysql-5.6.34.tar.gz

cd mysql-5.6.34

cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DSYSCONFDIR=/etc \

-DWITH_SSL=bundled -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci \

-DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MYISAM_STORAGE_ENGINE=1 \

-DMYSQL_TCP_PORT=3306 -DMYSQL_UNIX_ADDR=/tmp/mysql.sock \

-DMYSQL_DATADIR=/usr/local/mysql/data

make && make install

1.6 新增開機啟動指令碼

cp support-files/mysql.server /etc/rc.d/init.d/mysqld

1.7 新增masterA配置檔案/etc/my.cnf

[client]

port = 3306

socket = /tmp/mysql.sock

[mysqld]

basedir = /usr/local/mysql

port = 3306

socket = /tmp/mysql.sock

datadir = /usr/local/mysql/data

pid-file = /usr/local/mysql/data/mysql.pid

log-error = /usr/local/mysql/data/mysql.err

server-id = 1

auto_increment_offset = 1

auto_increment_increment = 2 #奇數ID

log-bin = mysql-bin #開啟二進位制功能,MASTER主伺服器必須開啟此項

binlog-format=ROW

binlog-row-p_w_picpath=minimal

log-slave-updates=true

gtid-mode=on

enforce-gtid-consistency=true

master-info-repository=TABLE

relay-log-info-repository=TABLE

sync-master-info=1

slave-parallel-workers=0

sync_binlog=0

binlog-checksum=CRC32

master-verify-checksum=1

slave-sql-verify-checksum=1

binlog-rows-query-log_events=1

#expire_logs_days=5

max_binlog_size=1024M #binlog單檔案最大值

replicate-ignore-db = mysql #忽略不同步主從的資料庫

replicate-ignore-db = information_schema

replicate-ignore-db = performance_schema

replicate-ignore-db = test

replicate-ignore-db = zabbix

max_connections = 3000

max_connect_errors = 30

skip-character-set-client-handshake #忽略應用程式想要設定的其他字符集

init-connect='SET NAMES utf8' #連線時執行的SQL

character-set-server=utf8 #服務端預設字符集

wait_timeout=1800 #請求的最大連線時間

interactive_timeout=1800 #和上一引數同時修改才會生效

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES #sql模式

max_allowed_packet = 10M

bulk_insert_buffer_size = 8M

query_cache_type = 1

query_cache_size = 128M

query_cache_limit = 4M

key_buffer_size = 256M

read_buffer_size = 16K

skip-name-resolve

slow_query_log=1

long_query_time = 6

slow_query_log_file=slow-query.log

innodb_flush_log_at_trx_commit = 2

innodb_log_buffer_size = 16M

[mysql]

no-auto-rehash

[myisamchk]

key_buffer_size = 20M

sort_buffer_size = 20M

read_buffer = 2M

write_buffer = 2M

[mysqlhotcopy]

interactive-timeout

[mysqldump]

quick

max_allowed_packet = 16M

[mysqld_safe]

1.8 特別引數說明

log-slave-updates = true #將複製事件寫入binlog,一臺伺服器既做主庫又做從庫此選項必須要開啟

#masterA自增長ID

auto_increment_offset = 1

auto_increment_increment = 2 #奇數ID

#masterB自增加ID

auto_increment_offset = 2

auto_increment_increment = 2 #偶數ID

1.9 新增masterB配置檔案/etc/my.cnf

[client]

port = 3306

socket = /tmp/mysql.sock

[mysqld]

basedir = /usr/local/mysql

port = 3306

socket = /tmp/mysql.sock

datadir = /usr/local/mysql/data

pid-file = /usr/local/mysql/data/mysql.pid

log-error = /usr/local/mysql/data/mysql.err

server-id = 2

auto_increment_offset = 2

auto_increment_increment = 2 #偶數ID

log-bin = mysql-bin #開啟二進位制功能,MASTER主伺服器必須開啟此項

binlog-format=ROW

binlog-row-p_w_picpath=minimal

log-slave-updates=true

gtid-mode=on

enforce-gtid-consistency=true

master-info-repository=TABLE

relay-log-info-repository=TABLE

sync-master-info=1

slave-parallel-workers=0

sync_binlog=0

binlog-checksum=CRC32

master-verify-checksum=1

slave-sql-verify-checksum=1

binlog-rows-query-log_events=1

#expire_logs_days=5

max_binlog_size=1024M #binlog單檔案最大值

replicate-ignore-db = mysql #忽略不同步主從的資料庫

replicate-ignore-db = information_schema

replicate-ignore-db = performance_schema

replicate-ignore-db = test

replicate-ignore-db = zabbix

max_connections = 3000

max_connect_errors = 30

skip-character-set-client-handshake #忽略應用程式想要設定的其他字符集

init-connect='SET NAMES utf8' #連線時執行的SQL

character-set-server=utf8 #服務端預設字符集

wait_timeout=1800 #請求的最大連線時間

interactive_timeout=1800 #和上一引數同時修改才會生效

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES #sql模式

max_allowed_packet = 10M

bulk_insert_buffer_size = 8M

query_cache_type = 1

query_cache_size = 128M

query_cache_limit = 4M

key_buffer_size = 256M

read_buffer_size = 16K

skip-name-resolve

slow_query_log=1

long_query_time = 6

slow_query_log_file=slow-query.log

innodb_flush_log_at_trx_commit = 2

innodb_log_buffer_size = 16M

[mysql]

no-auto-rehash

[myisamchk]

key_buffer_size = 20M

sort_buffer_size = 20M

read_buffer = 2M

write_buffer = 2M

[mysqlhotcopy]

interactive-timeout

[mysqldump]

quick

max_allowed_packet = 16M

[mysqld_safe]

1.10 初始化MySQL

cd /usr/local/mysql

scripts/mysql_install_db --user=mysql

1.11 為啟動指令碼賦予可執行許可權並啟動MySQL

chmod +x /etc/rc.d/init.d/mysqld

/etc/init.d/mysqld start

2. 配置主從同步

2.1 新增主從同步賬戶

masterA上:

mysql> grant replication slave on *.* to 'repl'@'192.168.10.12' identified by '123456';

mysql> flush privileges;

masterB上:

mysql> grant replication slave on *.* to 'repl'@'192.168.10.11' identified by '123456';

mysql> flush privileges;

2.2 檢視主庫的狀態

masterA上:

mysql> show master status;

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

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

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

| mysql-bin.000003 | 120 | | | |

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

1 row in set (0.00 sec)

masterB上

mysql> show master status;

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

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

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

| mysql-bin.000003 | 437 | | | |

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

1 row in set (0.00 sec)

2.3 配置同步資訊:

masterA上:

mysql> change master to master_host='192.168.10.12',master_port=3306,master_user='repl',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=437;

mysql> start slave;

mysql> show slave status\G;

顯示有如下狀態則正常:

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

masterB上:

#本人是測試環境,可以保證沒資料寫入,否則需要的步驟是:先masterA鎖表-->masterA備份資料-->masterA解鎖表 -->masterB匯入資料-->masterB設定主從-->檢視主從

mysql> change master to master_host='192.168.10.11',master_port=3306,master_user='repl',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=120;

start slave;

mysql> show slave status\G;

顯示有如下狀態則正常:

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

3.測試主從同步

3.1 在masterA上建立一個數據庫測試同步效果

mysql> show databases;

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

| Database |

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

| information_schema |

| mysql |

| performance_schema |

| test |

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

4 rows in set (0.00 sec)

mysql> create database test01;

Query OK, 1 row affected (0.00 sec)

mysql> show databases;

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

| Database |

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

| information_schema |

| mysql |

| performance_schema |

| test |

| test01 |

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

5 rows in set (0.00 sec)

mysql> quit

Bye

[[email protected] data]#

3.2 到masterB檢視是否已經同步建立資料庫

mysql> show databases;

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

| Database |

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

| information_schema |

| mysql |

| performance_schema |

| test |

| test01 |

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

5 rows in set (0.00 sec)

mysql> quit

Bye

[[email protected] data]#

4. 開啟MySQL5.6的GTID功能

masterA和masterB分別執行如下命令:

mysql> stop slave;

Query OK, 0 rows affected (0.00 sec)

mysql> change master to MASTER_AUTO_POSITION=1;

Query OK, 0 rows affected (0.01 sec)

mysql> start slave;

Query OK, 0 rows affected (0.00 sec)

5. 遇到的問題

一種主從報錯折騰了我半天:

Last_IO_Errno: 1236

Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Could not open log file'

後面修改主從同步相關 引數,確認原因是my.cnf增加了如下引數:

log-bin = mysql-bin

relay-log = mysql-bin

從正常主主同步時的二進位制日誌檔案顯示,有2套二進位制日誌。因此推斷上面2個引數導致不能產生2套二進位制檔案,故導致二進位制檔案錯亂和丟失。

相關推薦

Mysql跨機房同步方案

Mysql跨機房同步方案 原  尚浩宇 釋出於 2016/05/19

Mysql同步方案

在企業中,資料庫高可用一直是企業的重中之重,中小企業很多都是使用mysql主從方案,一主多從,讀寫分離等,但是單主存在單點故障,從庫切換成主庫需要作改動。因此,如果是雙主或者多主,就會增加mysql入

LVS+KEEPALIVED+MYSQL單點寫入讀負載均衡同步高可用方案

LVS+KEEPALIVED+MYSQL 單點寫入讀負載均衡主主同步高可用方案安裝教程 一、         安裝環境 Ø  軟體版本 CENTOS 6.5 KEEPALIVED 1.2.12 | 下載 LVS 1.2.6 | 下載 MYSQL 5.6.17(社群版) |

mysql Heartbeat同步方案

  Heartbeat高可用Mysql主主同步方案 本方案使用heartbeat+mysql主主同步來實現mysql資料庫的高可用, 當伺服器或者master的heartbeat宕掉以後會自動切換到backup上,伺服器或者master的heartbeat恢復以後可以

Mysql實現數據庫主從復制、復制、半同步復制

mysql 數據庫復制 主主復制 主從復制 半同步復制 --------------Mysql實現數據庫主從復制架構----------------一、環境準備:centos系統服務器2臺、一臺用戶做Mysql主服務器,一臺用於做Mysql從服務器,配置好yum源、防火墻關閉、各節點時鐘服

MySQL備份,恢復方案,mysqlbinlog,mysqldump,主從,復制

庫存 讀寫 sel erro l數據庫 reat 當前 password ima DBMS數據庫管理系統的三層模型:物理層,邏輯層以及視圖層。 物理層:決定數據的存儲形式。 邏輯層:是一張有一張的表,一行行的數據記錄。 視圖層:讓用戶看起來更方便,可有可無。 存

mysql同步模式

restart 完成 .cn 二進制日誌 creat cati 偏移 ast 關閉 主192.168.56.20 和 從都新建數據庫db1 db2 db3(如果數據庫在用,需要上鎖後手動從主備份,然後在從恢復)mysql> create database db1;Qu

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

兩個 white serve 執行 密碼連接 進行 st3 提交 復制 1 概述互為主從:兩個節點各自都要開啟binlog和relay log; 1、數據不一致; 2、自動增長id;為了防止id沖突,解決辦法是一個服務器使用奇數id,另一個服務器使用偶數id,合並的時候一

Mysql DBA 高級運維學習筆記-mysql及多同步過程

配置 ble use key 間隔 into base fse char 1.Mysql雙主及多主同步實戰,互為主從 使用主主前提: a.表的主鍵自增(M庫id1,3,5;M庫id 2,4,6) 準備:兩臺機器,這裏用多實例來講解 第一臺: Ip:192.168.1.115

MYSQL高可用方案部署實例

tro dmi admin route pts service firewall oop sql king01與king02互為master-slave[root@king01 ~]# mysql -uroot -pabcd.1234mysql> show slave

MySQL(雙)數據同步

主主同步 雙主同步 mysql主主同步 mysql雙主同步 1. 兩臺mysql都可以讀寫,互為主備,默認只是用一臺(masterA)負責數據的寫入,另一臺(masterB)備用;2. masterA是masterB的主庫,masterB又是masterA的主庫,他們互為主從; 不足之處:1.

MySQL運維進階-MySQL(master-master)+半同步(Semisync Repl

MySQL運維進階-MySQL雙主(maMySQL --> MariaDB --> Percona-Server MySQL: oracle ,commutity : 社區版 5.5 5.6 5.7 8.0MariaDB:5.5 10.xPercona:Percona-Ser

mysql主從同步/同步

got 如果 status not unlock sql數據庫 cati 重啟 stop Centos環境198.168.1.20198.168.1.21 master操作: 修改mysql配置文件(my.cnf) [mysqld] server-id=1 log-bin=

MYSQL之一多從搭建方案

原理 方案 環境 虛擬機器兩臺:192.168.153.11/12 系統:Centos6.7x64位(磁力下載) 資料版本:mysql-5.5.60-linux-glibc2.12-x86_64.tar.gz(可以通過迅雷或者shell命令wget在li

SUSE12-SP2 mysql同步

1. 修改兩臺伺服器配置檔案 修改主伺服器配置檔案,增加如下 #vi /etc/my.cnf  [mysqld] server-id=1 log-bin=mysql-bin log-slave-updates binlog-ignore-db = my

MySQL同步

異地 間隔 雙機 請求 位置 沖突 負載 插入 off MySQL主主同步 雙機熱備的概念簡單說一下,就是要保持兩個數據庫的狀態自動同步。對任何一 個數據庫的操作都自動應用到另外一個數據庫,始終保持兩個數據庫數據一致。 這樣做的好處多。 1. 可以做災備,其中一個壞

mysql主從(備)同步一鍵配置,配自動檢測功能

主從一鍵shell配置 做個筆記。 #!/bin/bash #Mysql sync #chenglee #master機器ip MasterIP="192.168.137.174" #slave機器ip SlaveIp="192.168.137.170" #主從同步賬號密碼 MAST

MYSQL 的 MASTER到MASTER的迴圈同步

[原文]:http://blog.csdn.net/yueliangdao0608/article/details/3173231 以前抽空做的MYSQL 的主主同步。 不過心理做好準備,對效能會有一定的影響!把步驟寫下來,至於會出現的什麼問題,以後隨時更新。這裡我同步的資料庫是TES

MySQL5.7 利用keepalived來實現mysql高可用方案的詳細過程

伺服器準備Keepalived:192.168.13.15Keepalived:192.168.13.16Mysql-m1: 192.168.13.15Mysql-m2: 192.168.13.161,在m1、m2上準備mysql5.7環境2,在m1上部署keepalived

[bigdata-60]mysql的高可用同步複製及其在阿里雲上的實踐

1. 技術資料 http://www.linuxidc.com/Linux/2015-06/118767.htm http://blog.csdn.net/mchdba/article/details/51377989 http://blog.sina.com.cn/s/b