企業之mysql5.7的主從複製


    mysql的主從複製是指從一個mysql主服務器(MASTER)將數據複製到另一臺或多臺mysql從服務器(SLAVE)的過程,將主數據庫的DDL和DML操作通過二進制日誌傳到複製服務器上,然後在從服務器上對這些日誌重新執行,從而使從服務器的數據保持同步。

     首先,主服務器會記錄二進制日誌,每個事務更新完畢數據之前,主服務器將這些操作的信息記錄在二進制日誌裏面,在事件寫入二進制日誌完成後,主服務器 通知存儲引擎提交事務。

    SLAVE上面的I/O進程連接上MASTER,併發出日誌請求,MASTER接收到來自SLAVE的I/O進程的請求後,通過負責複製的I/O進程根據請求信息讀取指定日誌位置之後的日誌信息,返回給SLAVE的I/O進程。SLAVE的I/O進程接收到信息後,將接收到的日誌內容依次添加到SLAVE端的relay-log文件的最末端,並將讀取到的MASTER端的binlog文件名和位置記錄到master-Info文件中

     SLAVE的SQL進程檢測到relay-log中新增了內容後,會馬上解析relay-log的內容成爲在master端真實執行時候的那些可執行內容,並在自身執行。

GTID的工作原理

1、當一個事務在主庫端執行並提交時,產生GTID,一同記錄到binlog日誌中。
2、binlog傳輸到slave,並存儲到slave的relaylog後,讀取這個GTID的這個值設置
gtid_next變量,即告訴Slave,下一個要執行的GTID值。
3、sql線程從relay log中獲取GTID,然後對比slave端的binlog是否有該GTID。
4、如果有記錄,說明該GTID的事務已經執行,slave會忽略。
5、如果沒有記錄,slave就會執行該GTID事務,並記錄該GTID到自身的binlog,   
在讀取執行事務前會先檢查其他session持有該GTID,確保不被重複執行。
6、在解析過程中會判斷是否有主鍵,如果沒有就用二級索引,如果沒有就用全部掃描。


 
準備工作:

/etc/init.d/iptables stop
172.25.85.2  server2.example.com  master
172.25.85.3  server3.example.com  slave

    [server2和server3]上:
1.tar xf mysql-5.7.11-1.el6.x86_64.rpm-bundle.tar
 
   yum install mysql-community-client-5.7.11-1.el6.x86_64.rpm 

                   mysql-community-common-5.7.11-1.el6.x86_64.rpm  
                   mysql-community-server-5.7.11-1.el6.x86_64.rpm 

                   mysql-community-libs-5.7.11-1.el6.x86_64.rpm  -y
  /etc/init.d/mysqld start
  less   /var/log/mysqld.log                                 ##在mysql的日誌中有數據庫的初始密碼

  mysql_secure_installation

Securing the MySQL server deployment.

Enter password for user root:                      

                                                 ##輸入在日誌中查找到的初始密碼,並設置新的密碼 Zhang+001

       [ server2]:
   vim /etc/my.cnf

server-id=1                           ##必須爲 1 到 232–1 之間的一個正整數值
log-bin=mysql-bin                     ##啓動二進制日誌系統

 /etc/init.d/mysqld restart

   mysql -p                          ##密碼爲Zhang+001
   grant replication slave on *.*  to [email protected]  identified  by 'Zhang+001';  

                                                                                       ##數據庫的密碼
   show master status;

wKiom1eYzyzgn5VHAAAi-XbvYL8015.png-wh_50  

    server3:
   vim /etc/my.cnf

server-id=2

   /etc/init.d/mysqld restart
   mysql -p
   change master to master_host='172.25.85.2',master_user='jing',master_password='Zhang+001',master_log_file='mysql-bin.000001',master_log_pos=447 ;
   start slave;
   show slave status\G;
wKioL1eYz1_iYWBWAACLOFqPtUY340.png-wh_50 

檢測: 一邊做一邊同步 

   server2:
   mysql -pZhang+001
   create database westos;
   create table usertb( username varchar(50) not null, passwd varchar(25)  not null);
   insert into usertb value('user1','11111');

wKioL1eYz4uz-scTAABcQijWevE796.png-wh_50


   server3:

wKioL1eYz6rQq42mAABXqdIZaws360.png-wh_50



2.   server2:
   vim /etc/my.cnf
增加:

gtid-mode=on                    ##開啓gtid功能
enforce-gtid-consistency=on ##強制gtid一致性,開啓後對於特定create table不被支持

  /etc/init.d/mysqld restart
     mysql  -p
     use westos;
     drop table usertb;
 



    server3:
 
   mysql  -p
   stop slave;
   change master to master_host='172.25.85.2',master_user='jing',master_password='Zhang+001',master_auto_position=1;
 
   vim /etc/my.cnf
增加:

gtid-mode=on
enforce-gtid-consistency=on

  /etc/init.d/mysqld restart

   mysql  -p
   start slave;
   show slave status\G;
wKiom1eY0Cija5EHAACKsDJxw8U186.png-wh_50
 
 

   server2:
  mysql -pZhang+001
  use westos  
  create table usertb(username varchar(25) not null, password  varchar(25) not null);
  insert into usertb value('user1','11111');

   server3:
   mysql -pZhang+001
   select * from usertb;
wKioL1eY0EXCz-2pAAAa7mwr6Rw551.png-wh_50
   


3.   server3:
     vim /etc/my.cnf

開啓enhanced multi-threaded slave根據如下設置:

增加:
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=16
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log_recovery=ON

    開啓MTS功能後,務必將參數master_info_repostitory設置爲TABLE,這樣性能可以有50%~80%的提升。這是因爲並行複製開啓後對於元master.info這個文件的更新將會大幅提升,資源的競爭也會變大。

   若將slave_parallel_workers設置爲0,則MySQL 5.7退化爲原單線程複製,但將slave_parallel_workers設置爲1,則SQL線程功能轉化爲coordinator線程,但是隻有1 個worker線程進行回放,也是單線程複製。


    /etc/init.d/mysqld restart
    show slave  status;
wKiom1eY0GuwlRKHAABaEBjseAQ894.png-wh_50

    show processlist;

wKiom1eY0Njgq7dBAAFNuNxn0mE379.png-wh_50

  server2:
  mysql -pZhang+001
  use westos;
  drop table usertb;
  mysql -pZhang+001  westos< add.sql
  mysql -pZhang+001
  use westos;
  select * from usertb;        
  call test2;                           


    server3:
    mysql  -p
    show slave  status\G;           ##不斷的查詢進度
wKioL1eY0PuxHs_0AADidvBUgdQ100.png-wh_50





       server2:
time mysqldump -pZhang+001 westos> westos.sql
time mysqlpump --default-parallelism=2  --compress-output=lz4 westos > test

time mysqlpump  -pZhang+001  --default-parallelism=2  --compress-output=lz4 westos > test2
time mysqlpump  -pZhang+001  --default-parallelism=2   westos > test3




      





 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章