MySQL數(shù)據(jù)庫主從復制

2017年2月24日00:26:48 發(fā)表評論 4,046 ℃

MySQL主從復制

二進制日志

事務日志

錯誤日志

一般查詢?nèi)罩?/span>

中繼日志

慢查詢?nèi)罩?/span>

二進制日志:

數(shù)據(jù)目錄

mysql-bin.XXXXXX

滾動:達到最大上限,flush logs,服務器重啟

mysql> PURGE 

二進制日志的格式:

statement

row

mixed

mysql-bin.index: 二進制日志文件索引文件

mysql> SHOW MASTER STATUS;

mysql> SHOW BINARY LOGS;

mysql> SHOW BINLOG EVENTS IN "file";

event:

timestamp

position, offset,OPERATION, server-id

即時點還原:

MySQL: tx1

MySQL隔離級別:

READ-UNCOMMITTED

READ-COMMITTED

REPEATABLE-READ

SERIALIZABLE

復制的作用:

輔助實現(xiàn)備份

高可用

異地容災

scale out:分攤負載

主從架構中,不使用MySQL代理,如何讓主的負責寫,從的負責讀?

雙主:無法減輕寫操作;
雙主模型:

讀寫分離:

mysql-proxy

amoeba

數(shù)據(jù)拆分:

cobar: 

一個從只能屬于一個主服務器


MySQL 5.5: 
MySQL 5.6: gtid, multi-thread replication

配置MySQL復制基本步驟:

一、master

1、啟用二進制日志

log-bin = master-bin

log-bin-index = master-bin.index

2、選擇一個惟一server-id

server-id = {0-2^32}

3、創(chuàng)建具有復制權限的用戶

REPLICATION SLAVE

REPLICATION CLIENT

二、slave

1、啟用中繼日志

relay-log = relay-log

relay-log-index = 

2、選擇一個惟一的server-id

server-id = {0-2^32}

3、連接至主服務器,并開始復制數(shù)據(jù);

mysql> CHANGER MASTER TO MASTER_HOST='',MASTER_PORT='',MASTER_LOG_FILE='',MASTER_LOG_FIEL_POS='',MASTER_USER='',MASTER_PASSWORD='';

mysql> START SLAVE;

mysql> START SLAVE IO_Thread; 

mysql> START SLAVE SQL_Thread; 

復制線程:

master: dump

slave: IO_Thread, SQL_Thread

read- YES

在從服務器上設定,但對具有SUPER權限的用戶不生效;

sync-binlog = ON 

在主服務器上設定,用于事務安全;

percona: percona-tools

mattkit-tools

SSL:
Dual MASTER:

1、從服務器能不能執(zhí)行“寫”操作?

CREATE 

INSERT 

如何阻止寫從服務器?

my.cnf

[mysqld]

read- 1

不能阻止 SQL Thread

如果某用戶有SUPER權限,則不被阻止;

mysql> FLUSH TABLES WITH READ LOCK;

2、一個主服務器可否多從?可以

一從是否多主?不行


3、主-->從:異步

mysql 5.5 google 補丁

半同步: semisync

半同步如果無法在指定時間完成-->自動 降到異步模式;

4、如何從服務器的mysql服務在啟動時候不要自動啟動從服務線程?

master.info

relay-log.info

在從服務器上:

[mysqld]

skip-slave-start=1

5、數(shù)據(jù)庫復制過濾

在主服務器上實現(xiàn):

binlog-do-db=testdb

binlog-do-db=mydb

binlog-ignore-db=mysql

主服務器

[mysqld]

binlog-do-db=

OR

binlog-ignore-db=

在主服務器過濾:任何不涉及到數(shù)據(jù)庫相關的寫操作都不會被記錄到二進制日志當中;

從服務器:

replicate_do_db

rpplicate_ignore_db

replicate_do_table

replicate_ignore_table

replicate_wild_do_table

replicate_wild_ignore_table

在從服務器上只復制mageedu一個數(shù)據(jù)庫:

[mysqld]

replicate_do_db=mageedu

replicate_do_db=mysql

設置半同步步驟:

在Master和Slave的mysql命令行運行如下代碼:

# On Master  

mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';  

mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;  

mysql> SET GLOBAL rpl_semi_sync_master_timeout = 1000;  

# On Slave  

mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';  

mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;  

mysql> STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;  

在Master和Slave的my.cnf中編輯:

# On Master  

[mysqld]  

rpl_semi_sync_master_enabled=1  

rpl_semi_sync_master_timeout=1000 # 1 second  

# On Slave  

[mysqld]  

rpl_semi_sync_slave_enabled=1  

# 也可通過設置全局變量的方式來設置,如下:

set global rpl_semi_sync_master_enabled=1 

# 取消加載插件

mysql> UNINSTALL PLUGIN rpl_semi_sync_master;

==============================================

查看從服務器上的semi_sync是否開啟:

mysql> SHOW GLOBAL STATUS LIKE 'rpl_semi%';

查看主服務器上的semi_sync是否開啟,注意clients 變?yōu)? ,證明主從半同步復制連接成功:

mysql> SHOW GLOBAL STATUS LIKE 'rpl_semi%';

6、主服務器崩潰,事務已經(jīng)提交-->寫入二進制日志;

在主-從架構上建議使用的配置:

主服務器:

sync_binlog=1

innodb_flush_logs_at_trx_commit=1

從服務器:

skip_slave_start=1

read_>

SSL:

REQURIED SSL

auto_increment

1,3,5

2,4,8

設置主-主復制:

1、在兩臺服務器上各自建立一個具有復制權限的用戶;

2、修改配置文件:

# 主服務器上

[mysqld]

server-id = 10

log-bin = mysql-bin

relay-log = relay-mysql

relay-log-index = relay-mysql.index

auto-increment-increment = 2

auto-increment-offset = 1

# 從服務器上

[mysqld]

server-id = 20

log-bin = mysql-bin

relay-log = relay-mysql

relay-log-index = relay-mysql.index

auto-increment-increment = 2

auto-increment-offset = 2

3、如果此時兩臺服務器均為新建立,且無其它寫入操作,各服務器只需記錄當前自己二進制日志文件及事件位置,以之作為另外的服務器復制起始位置即可

server1|mysql> SHOW MASTER STATUS\G

************************** 1. row ***************************

            File: mysql-bin.000001

        Position: 710

    Binlog_Do_DB: 

Binlog_Ignore_DB: 

1 row in set (0.00 sec)

server2|mysql> SHOW MASTER STATUS\G

mysql> SHOW MASTER STATUS\G

*************************** 1. row ***************************

            File: mysql-bin.000003

        Position: 811

    Binlog_Do_DB: 

Binlog_Ignore_DB: 

1 row in set (0.00 sec)

4、各服務器接下來指定對另一臺服務器為自己的主服務器即可:

server1|mysql> CHANGE MASTER TO ...,MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=811

server2|mysql> CHANGE MASTER TO ...,MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=710

A: 查看B的二進制日志文件及位置,并以及作為自己的復制起點;

B:

配置主從復制的基本步驟:

1、master

啟用二進制日志、惟一server-id、具有復制權限的用戶(REQUIRE SSL);

2、slave

啟用中繼日志、惟一server-id、連接主服務器并啟動復制線程(IO_THREAD, SQL_THREAD);

MySQL讀寫分離:

master: 寫

slave: 只讀

mysql-proxy、amoeba

cobar:

php --> MySQL

LAMP: php語言開發(fā)的應用程序

blackhole: 存儲引擎,多級復制時,

memcached: 緩存服務器

key: value

O(1)

MySQL: semisync_master.so, semisync_slave.so

MySQL主從復制原理、主從復制、半同步復制、基于SSL復制或主主復制;

MySQL-5.6主從復制;(GTID, 多線程復制); 

MySQL-proxy實現(xiàn)讀寫分離;

MySQL: 數(shù)據(jù)庫復制過濾

binlog-do-db:僅將指定數(shù)據(jù)庫的相關修改操作記入二進制日志

binlog-ignore-db

從服務器

replicate-do-db=  #白名單

replicate-ignore-db=  #忽略

replicate-do-table=

replicate-ignore-table=

replicate-dild-do-table=  #支持通配符

replicate-dild-ignore-table=

MySQL-5.6: GTID

每個數(shù)據(jù)庫僅能適應一個線程

復制涉及到多個數(shù)據(jù)庫時多線程復制才有意義

slave-parallel-workers=0

0: 表示禁用多線程功能;

mysqlreplicate:快速啟動mysql從服務器,快速啟動復制功能

mysqlrplcheck:檢查復制環(huán)境是否符合需求

mysqlrplshow:顯示復制關系圖

mysqlfailover:提升master

mysqlrpladmin:

/etc/mysql.cnf

[mysql-proxy]

【騰訊云】云服務器、云數(shù)據(jù)庫、COS、CDN、短信等云產(chǎn)品特惠熱賣中

發(fā)表評論

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: