實驗前提:兩臺服務器
Master server:172.16.23.1
slave server:172.16.23.2
一、mysql主從服務器實現
簡單介紹:
MySQL支持單向、異步複製,複製過程中一個服務器充當主服務器,而一個或多個其它服務器充當從服務器。MySQL複製基於主服務器在二進制日誌中跟蹤所有對數據庫的更改(更新、刪除等等)。因此,要進行復制,必須在主服務器上啓用二進制日誌。每個從服務器從主服務器接收主服務器上已經記錄到其二進制日誌的保存的更新。當一個從服務器連接主服務器時,它通知主服務器定位到從服務器在日誌中讀取的最後一次成功更新的位置。從服務器接收從那時起發生的任何更新,並在本機上執行相同的更新。然後封鎖並等待主服務器通知新的更新。從服務器執行備份不會干擾主服務器,在備份過程中主服務器可以繼續處理更新。
1、主服務器編輯配置文件/etc/my.cnf
在[mysqld]添加如下內容
Logbin=mysql_bin
Server-id=1
2、從服務器編輯配置文件/etc/my.cnf
在[mysqld]添加如下內容
#Logbin=mysql_bin 註釋二進制日誌,不需要
Server-id=11 //主從服務器server-id不能相同,否則在主主架構上可能出現循環
Skip-slave-start=1 //讓從服務器啓動時不自動啓動兩個線程,sql線程,I/0線程
Relay-log=relay-bin //從服務器啓動中繼日誌,並起名
Relay-log-index=relay-bin.index //從服務器中繼日誌的索引
show global variables like '%relay%‘ 查看中繼日誌是否開啓
3、主服務器上建從數據庫賬號
grant replication slave,replication client on *.* to repl@'172.16.23.2' identified by ' repl';
flush privilege;
4、從服務器:指定主服務器是誰
Mysql>change master to master_host='172.16.23.1',master_user='rep1',master_password='repl';
--start slave;
-show slave status\G; //查看關態
如果是下面兩行:Slave_IO_Running: Yes
則成功 Slave_SQL_Running: Yes
二、當主服務器有大量數據時,主服務需完全備份數據,從服務器導入主的備份,這樣速度快些
1、先關閉從服務器 slave stop
2、主服務器備份,方便從服務器導入
mysqldump --all-database --lock-all-tables --master-data=2 >/root/slave.sql
--master-data=2開啓主備份時二進制所在位置,方便從恢復
3、複製到從服務器,打開備份的文件打二進制日誌位置
scp /root/slave.sql 172.16.23.2/tmp/
mysqlbinlog /tmp/slave.sql | head -50
找到備份二進制日誌位置 如:master_log_file='mysql_bin.000005',master_log_pos=4544
4、從服務器指定主服務器是誰,及從服務器要主服務器上的用戶名,密碼,二進制日誌所在的位置
change master to master_host='172.16.23.1',master_user='rep1',master_password='repl',
master_log_file='mysql_bin.000005',master_log_pos=4544
start slave
show slave status\G;
5、關閉從服務器日誌,導入主服務器的備份
mysql>source /tmp/slave.sql
set sql_log_bin=0
set sql_log_bin=1
6、從服務器驗證與主服務器對照
從服務:mysql>show databases;
如果從服務上有主服務器上所有的數據庫,說明已經導入成功
三、Mysql主主複製
簡單介紹:MySQL主主複製與主從複製不同。在主主複製時,兩臺服務器的任何一臺上面的數據庫發生了改變都會同步到另一臺服務器上,這樣兩臺服務器互爲主從,並且都能向外提供服務。
在兩臺服務器上各自建立一個具有複製權限的用戶;
Master server創建一個充許slave server來訪問master server的用戶,即用戶名密碼都是slave
mysql> grant replication slave,replication client on *.* to slave@’172.16.23.2′ identified by ‘slave′;
slave server創建一個充許master server來訪問slave server的用戶,即用戶名密碼都是master
mysql> grant replication slave,replication client on *.* to master @’172.16.23.1′ identified by master′;
2、修改配置文件:
# master 服務器上
[mysqld]
server-id = 10 //兩主主服務器id不能相同
log-bin = mysql-bin //啓動二進制日誌,方便另主服務器複製
auto-increment-increment = 2 //自動增長步長
auto-increment-offset = 1 //自動增長起始位置
# slave服務器上
[mysqld]
server-id = 20 //兩主主服務器id不能相同
log-bin = mysql-bin //啓動二進制日誌,方便另主服務器複製
auto-increment-increment = 2 //自動增長步長
auto-increment-offset = 2 //兩服務器的值分別爲1、2,這樣可以避免客戶端同時向兩臺服務器插入數據時,出現主鍵衝突。
3、如果此時兩臺服務器均爲新建立,且無其它寫入操作,各服務器只需記錄當前自己二進制日誌文件及事件位置,以之作爲另外的服務器複製起始位置即可
Master server
mysql> SHOW MASTER STATUS\G
************************** 1. row ***************************
File: mysql-bin.000001
Position: 107
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)
Slave server
mysql> SHOW MASTER STATUS\G
mysql> SHOW MASTER STATUS\G
*************************** 1. row ***************************
File: mysql-bin.000001
Position: 107
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)
4、各服務器接下來指定對另一臺服務器爲自己的主服務器
Master server:
# mysql
> CHANGE MASTER TO
> MASTER_HOST=’172.16.23.2′,
> MASTER_USER=’slave′,
> MASTER_PASSWORD=’slave′,
> MASTER_LOG_FILE=’mysql-bin.000001′,
> MASTER_LOG_POS=107;
Slave server上:
# mysql
> CHANGE MASTER TO
> MASTER_HOST=’172.16.23.1′,
> MASTER_USER=’master′,
> MASTER_PASSWORD=’master′,
> MASTER_LOG_FILE=’mysql-bin.000001′,
> MASTER_LOG_POS=107;
5、啓動複製功能
兩臺服務器同時執行
Mysql>start slave //這樣就成爲了主主複製
6、驗證
Master server上創建數據庫,及表
# mysql> create database wl;
# mysql> USE wl;
> CREATE TABLE qq(
> name varchar(20));
> \q
看slave server是否有wl數據庫及數據,再在這臺服務器上執行相似操作,看另一臺服務器上是否有,如果都能同步數據,說明成功。
四、mysql半同步實現
mysql5.5版本新特性,爲了保證主從數據的一致性,mysql發佈了半同步複製功能,之前版本爲異步複製,半同步的意思表示MASTER 只需要接收到其中一臺SLAVE的返回信息,就會commit;否則需等待直至切換成異步再提交。在異步複製的模式下會存在下面的缺點,如果主機出故障時,已經commit的事務不會被傳送到任何的slave上。mysql5.5 google 提供補丁半同步 一個主多個從,主從在一個服務器上可同步,半同步主設超時時間,1000毫秒,如果半同步如果無法在指定時間完成將自動降至異步模式
前面已經介紹過主從服務器的實現,這理將接着實現半同步.
1、在兩臺服務器上安裝模塊
# On Master
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; //安裝主模塊
show plugins; 顯示模塊是否裝成功
# On slave
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_slave.so'; //安裝從模塊
show plugins; 顯示模塊是否裝成功
在兩臺服務器修改配置文件/etc/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 開啓半同步功能
slave服務設置
mysql> stop slave
mysql>start slave
驗證是否設置成功
查看從服務器上的semi_sync是否開啓:
mysql> SHOW GLOBAL STATUS LIKE 'rpl_semi%';
查看主服務器上的semi_sync是否開啓,注意clients 變爲1 ,證明主從半同步複製連接成功:
mysql> SHOW GLOBAL STATUS LIKE 'rpl_semi%';
五、一些補充
1、如何讓從服務的mysql服務在啓支時不要自動啓動從服務器線程
服務器數據文件 ,
master.info, 記錄chang master to 傳遞參數據
relay-log.info 記錄當前服務器上中繼日誌
mysqld --verbose --help
從服務器
[mysqld]
skip-slave-start=1 啓動時不讓它主動啓動master
2、數據庫複製過濾
複製部分數據庫
主服務器
[mysqld] 兩個不能同時用
binlog-do-db=wl 白名單
binlog-ignore-db=wl 黑名單
在主服務器過濾:任何不涉及到數據庫相關的寫操作都不會被記錄到二進制日誌當中;缺點是如果有一天主服務器數據庫損壞,想做時間
點還原,那將不可能。建議不要使用。
從服務器:缺點是佔用帶寬,因爲過濾是通過過濾中繼中志進行的,從服務器中繼日誌是通過讀主服務器的二進制日誌文件進行的,因此將把所有主服務器中的二進制文件讀取過來,sql線程只執行那些定義的信息,因此仍然佔用帶寬。
只需要服務器上指定選項就可以了
主:[mysqld]兩個不能同時用,白名單生效,一般不在主服務器過濾
binlog-do-db=magedu白名單
binlog-ignore-db=mysql黑名單
主服務器過濾:任何不涉及到數據庫相關的寫操作都不會被 記錄到二進制日誌當中
從:過濾
replicate_do_db
repplicate_ignore_db 忽然數據庫
replicate_do_table
repplicate_ignore_table
replicate_wild_do_table=wl.tb% 正則表達式,tb表開頭的表都將複製
repplicate_wild_ignore_table
浪費帶寬,從主服務器服務所有到從服務器,只是服複製
在從服只複製magedu一個數據庫
[mysqld] 複製多個庫需多寫幾行
replicate_do_db=wl
replicate_do_db=wl
3、更安全複製,
主服務器崩潰,事務已經提交沒寫入二進制日誌
主服務器:
[mysqld]
sync-binlog=1 事務完成會立即寫入到二進制日誌中
innodb_flush-logs_at-trx_commit=1 每一事務提效立即刷新到日誌中
寫數據到磁盤
從服務器
skip-slave-start=1 在從服務器不讓它自動重啓
read_only=1 不讓普通用戶在從服務器上寫入數據,因爲從服務器不允放寫入數據