半同步複製
出發點是保證主從數據一致性的問題,安全的考慮mysql
5.5 出現的概念,可是不建議使用,性能太差sql
5.6之後出現group commit 組提交功能,來提高開啓版同步複製的性能vim
5.7 更加完善了,在group commit基礎上出現了MGR
5.7的加強半同步複製的新特性:after commit; after sync;安全
------
恢復主從環境:wordpress
一、全備3308 (由於前面咱們作延時複製的時候, 模擬了一次故障,從庫如今是主了)
mysqldump -S /data/3308/mysql.sock -A -R --triggers --master-data=2 --single-transaction >/tmp/full3308.sql性能
二、從庫(3307)恢復備份,並開啓主從
mysql -S /data/3307/mysql.sock
mysql>set sql_log_bin=0;
mysql>source /tmp/full3308.sql測試
獲取主從複製起點:(也能夠show master status;在主庫3308上面)
-----------vim +22 /tmp/full3308.sql 第22行----------------------------------------
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=120;
------------------------------------------------------------------------------spa
從庫3307執行:
mysql>CHANGE MASTER TO
MASTER_HOST='192.168.6.181',
MASTER_USER='repl',
MASTER_PASSWORD='123',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000006',
MASTER_LOG_POS=361,
MASTER_CONNECT_RETRY=10;
mysql> start slave;
mysql> show slave status \G插件
將3308主庫只讀關閉
mysql -S /data/3308/mysql.sock
mysql>set global read_only=0;
將配置文件read_only去掉 (主庫須要正常寫入操做的,因此須要關掉只讀模式)線程
將3307從庫只讀打開
mysql -S /data/3307/mysql.sock
mysql>set global read_only=1;
將配置文件read_only=1
-------------------------------------------------------
半同步複製:
加載插件 (半同步須要加載插件才能使用半同步功能)
主3308:
mysql -S /data/3308/mysql.sock
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
從3307:
mysql -S /data/3307/mysql.sock
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
查看是否加載成功:
主3308:
mysql>show plugins;
| partition | ACTIVE | STORAGE ENGINE | NULL | GPL |
| rpl_semi_sync_master | ACTIVE | REPLICATION | semisync_master.so | GPL |
+----------------------------+----------+--------------------+--------------------+---------+
43 rows in set (0.00 sec)
從3307:
mysql>show plugins;
| partition | ACTIVE | STORAGE ENGINE | NULL | GPL |
| rpl_semi_sync_slave | ACTIVE | REPLICATION | semisync_slave.so | GPL |
+----------------------------+----------+--------------------+-------------------+---------+
43 rows in set (0.00 sec)
啓動插件:
主:
mysql -S /data/3308/mysql.sock
mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;
mysql> SET GLOBAL rpl_semi_sync_master_timeout = 1000;
修改配置文件:
[mysqld]下面添加剛纔的兩句:
rpl_semi_sync_master_enabled = 1;
rpl_semi_sync_master_timeout = 1000;
從:
mysql -S /data/3307/mysql.sock
mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;
[mysqld]下面添加剛纔的兩句:
rpl_semi_sync_slave_enabled = 1;
重啓從庫上的IO線程
mysql -S /data/3307/mysql.sock
mysql>stop SLAVE IO_THREAD;
mysql>start SLAVE IO_THREAD;
查看是否在運行
主:
mysql -S /data/3308/mysql.sock
mysql> show status like 'Rpl_semi_sync_master_status';
+-----------------------------+-------+
| Variable_name | Value |
+-----------------------------+-------+
| Rpl_semi_sync_master_status | ON |
+-----------------------------+-------+
1 row in set (0.00 sec)
從:
mysql -S /data/3307/mysql.sock
mysql> show status like 'Rpl_semi_sync_slave_status';
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON |
+----------------------------+-------+
1 row in set (0.00 sec)
到此 -- 主從半同步複製搭建好了,從庫如今已是半同步複製。
-------------------------------------
7、複製過濾(瞭解就好,工做中用的很少,大多數是用軟件實現的)
先看一張圖:
xxxxxxx
1:假如如今是一主2從(從1,從2)。主裏面有三個庫(bbs,blog,wordpress)
2: 如今我想在主從複製的時候, 只把bbs複製到從1,blog,wordpress 複製到從2
應該如何實現?
這個時候就須要複製過濾的功能;
主庫方面:(能夠這樣設置,可是不能這樣,因此不能主庫設置白黑名單)
mysql> show master status;(能夠看到Position後面還有三個參數)
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000006 | 361 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
白名單:只記錄白名單中列出的庫的二進制日誌
binlog-do-db
黑名單:不記錄黑名單列出的庫的二進制日誌
binlog-ignore-db
從庫:
白名單:只執行白名單中列出的庫或者表的中繼日誌
--replicate-do-db=test(通常狀況只設置白名單就行。只用這一句,只複製這個庫)
--replicate-do-table=test.t1
--replicate-wild-do-table=test.x*
黑名單:不執行黑名單中列出的庫或者表的中繼日誌
--replicate-ignore-db
--replicate-ignore-table
--replicate-wild-ignore-table
例子:
[root@db01 data]# vim /data/3307/my.cnf
replicate-do-db=world
停掉3307從庫。從新作主從複製:
mysqladmin -S /data/3307/mysql.sock shutdown
從新初始化數據,測試白名單。
mysqld_safe --defaults-file=/data/3307/my.cnf &
........此處省略搭建主從複製過程.....
++++++++++++++++++++
測試複製過濾:
第一次測試:
主庫:
mysql -uroot -p123 -S /data/3308/mysql.sock
use world
create table t1(id int);
從庫查看結果:
mysql -uroot -p123 -S /data/3307/mysql.sock
use world
show tables;
--------------
第二次測試:
主庫:
mysql -uroot -p123 -S /data/3308/mysql.sock
use test
create table tb1(id int);
從庫查看結果:
mysql -uroot -p123 -S /data/3307/mysql.sock
use test
show tables;
----------------------------------------------------------