主從複製實驗步驟和半同步的實現方法

實驗環境:

    主節點IP:172.16.2.16

    從節點IP:172.16.2.17

    MariaDB的版本是5.5.36,使用二進制方式安裝。已安裝完成。

實驗目的:

    瞭解主從複製,各個節點的工作方式。

    

操作步驟:

1,主服務器需要開啓二進制日誌記錄,並且授權一個用戶給從節點。

主服務器的主配置文件[mysqld]內容如下。

[mysqld]
port= 3306
socket= /tmp/mysql.sock
skip-external-locking
key_buffer_size = 256M
max_allowed_packet = 1M
table_open_cache = 256
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size= 16M
thread_concurrency = 8
log-bin=/mydata/binlog/mysql-bin   定義二進制日誌的位置,生產環境中不應當與數據庫文件在一個磁盤上。
binlog_format=mixed
server-id= 1        server-id就使用默認的1
datadir=/mydata/data
sync_binlog = 1              產生二進制日誌就寫入磁盤


給從節點授權一個複製使用的用戶

MariaDB [(none)]> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO slaveuser@'172.16.2.17' IDENTIFIED BY 'slavepass';
MariaDB [(none)]> FLUSH PRIVILEGES;

從節點配置:

mysql的主配置文件[mysqld]段如下

[mysqld]
port= 3306
socket= /tmp/mysql.sock
skip-external-locking
key_buffer_size = 256M
max_allowed_packet = 1M
table_open_cache = 256
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size= 16M
thread_concurrency = 8
#log-bin=mysql-bin        因爲節點無需二進制日誌,所以把這項註釋掉了
relay-log=/mydata/relaylog/relay-log       定義中繼日誌
binlog_format=mixed
server-id= 2           server-id定義爲2
datadir=/mydata/data
read_only = 1            設定數據庫爲只讀,但對於超級用戶無效。只能針對普通用戶。

在mysql中執行

CHANGE MASTER TO MASTER_HOST='172.16.2.15', MASTER_USER='realuser', MASTER_PASSWORD='passwd', MASTER_LOG_FILE='master_bin.000001', MASTER_LOG_POS=495;    
START SLAVE;

配置完成後,在主庫創建數據庫和表,然後到從庫查看。如果有說明配置成功。

查看從節點狀態的命令是:SHOW SLAVE STATUS; 其它含意解釋如下。                 

MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
Slave_IO_State:                      當前從節點IO的狀態                      
Master_Host: 172.16.2.16      主節點的IP  
Master_User: slave                  使用那個用戶連接的主節點
Master_Port: 3306                  主節點使用的TCP端口
Connect_Retry: 60                    多長時間讀取一次
Master_Log_File: mysql-bin.000005    當前主節點的二進制日誌文件
Read_Master_Log_Pos: 581                      當前主節點二進制日誌文件位置
Relay_Log_File: relay-log.000001        當前從節點中繼日誌文件
Relay_Log_Pos: 4                                當前從節點中繼日誌文件中記錄的位置
Relay_Master_Log_File: mysql-bin.000005  正在中繼主節點的日誌文件是那個
Slave_IO_Running: No                            從節點的IO_THREAD線程是否啓動,如果爲NO表示還沒有向主節點請求二進制日誌文件。這個線程工作內容是把主節點的二進制日誌一條一條的同步到從節點的中繼日誌中。
Slave_SQL_Running: No                 從節點的SQL線程是否啓用,這個線程的任務是把中繼日誌中的SQL語句一條一條的讀的MySQL中執行,以實現數據的寫入。
Master_Server_Id: 0               主節點的ID


-------------------------------------------------------------------------------------------

    當數據庫已經運行了一段時間後,主節點已經有大量的數據。這時如果添加一臺從節點,最好把主節點做一個完整備份,恢復到從節點。然後再配置從節點到主節點複製數據,這樣能快速把主從節點數據同步一致。

                

    1,先對主服務器做一個完整備份。然後把備份好的數據發送到從節點上。

               # mysqldump --lock-all-tables --all-databases --master-data=2 > master.sql

               # scp master.sql 172.16.2.17:/root 

           需要創建從節點連接主節點使用的數據庫。

                mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO  realuser@'172.16.2.13'  IDENTIFIED BY 'passwd'

                mysql> FLUSH PRIVILEGES;

    2,定義好從節點的工作特性。然後恢復數據。

            在配置文件中[mysqld]加入以下段,並且註釋二進制日誌,因爲從節點要二進制日誌沒用,白白浪費空間。

                relay-log  =  /mydata/relaylog/relay-log

                server-id = 2             serviceID 一定不能與主節點的ID重複。

                read_only = 1           設置數據庫爲只讀模式,但對於超級用戶無效。普通用戶只能讀,不能修改。

            # mysql < /root/master.sql    把主節點備份的數據恢復到庫中

    3,恢復數據時需要在備份的文件中找到,備份主節點時二進制日誌文件使用到那個文件了,二進制日誌文件中事件id所在的位置。大概如下:

        -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000009', MASTER_LOG_POS=7925;

        然後到數據庫執行連接到主服務器。

            CHANGE MASTER TO MASTER_HOST='172.16.2.15', MASTER_USER='realuser', MASTER_PASSWORD='passwd', MASTER_LOG_FILE='master_bin.000001', MASTER_LOG_POS=495;

        啓動IO_THREAD線程和SQL_THREAD線程

            START SLAVE;

------------------------------------------------------------------------------------------

複製總結:

    1,對於master 需要啓動二進制日誌,有惟一的server-id

    2,binlog dump : 將從服務的 io  thread 發出的讀取二進制日誌事件請求的數據發送給對方 。

    3,slave 必須啓用中繼日誌,關閉二進制日誌(建議),有惟一的server-id。

            IO thread:向master請求二進制日誌並保存到本地的中繼日誌。

            SQL thread:把本的中繼日誌中的sql語句一條一條的讀取並執行

    4,對於從服務器,一般只有一個主服務器。否則會造成中繼日誌混亂。

    5, MariaDB 10 版本支持多源複製。從服務器支持多個主服務器,但是多個數據庫。

    6, 可以多級複製,但從服務器如果做爲其它從服務器的主服務器,需要開啓二進制日誌

    7, 從服務器可以有多個。

    8, 因爲是異步複製,從服務器的數據可能會落後於主服務器。這個問題一很難避免。

-------------------------------------------------------------------------------------------


如何啓用半同步?    從mysql5.5.8後纔有的功能。由google貢獻給mysql的補丁,以插件式安裝,默認沒有安裝。位於mysql的安裝目錄下的 lib/plugin下的 semisync_master.so 和 semisync_slave.so 一個是主節點專用,一個是從節點專用。

    什麼叫半同步: master至少要等待一個從節點把數據完全複製過去。

    使用INSTALL 命令安裝。配置文件中[mysql]下的plugin_dir= 用來指定插件文件的保存位置。如果有其它插件保存在其它位置,需要在這裏定義,這樣INSTALL命令可以找到。

在mysql下的安裝方法 

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

安裝過後引入幾個新的服務器變量: 查看方法: SHOW GLOBAL VARIABLES LIKE '%semi%';

      | rpl_semi_sync_master_enabled     | OFF |   是否開啓此插件
      | rpl_semi_sync_master_timeout      | 10000 |    等待從節點最多多長時間,單位是毫秒。如果從節點在等待時間內沒有響應,就不再等待,從半同步模式變爲異步模式。
      | rpl_semi_sync_master_trace_level    | 32 |
      | rpl_semi_sync_master_wait_no_slave | ON       如果沒有從節點是否還需要等待。

需要在配置文件中的[mysql]段中寫入

 rpl_semi_sync_master_enabled=1
 rpl_semi_sync_master_timeout=1000

設置好後重新啓動服務就可以了。

在從節點上的設置方法

MariaDB> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
MariaDB> SHOW GLOBAL VARIABLES LIKE 'rpl_semi%';       查看安裝插件後生成的服務器變量
      | rpl_semi_sync_slave_enabled      | OFF    是否開啓了此插件,ON爲開啓。
      | rpl_semi_sync_slave_trace_level  | 32     此項需要與主節點保持一致。

在主配置文件中的[mysql] 段中寫入

rpl_semi_sync_slave_enabled=1

在從節點上重啓IO THREAD線程就可以了。

MariaDB> STOP SLAVE IO_THREAD;
MariaDB> START SLAVE IO_THREAD;

查看是否已經啓用半同步模式,需要在MASTER上查看。

MariaDB> SHOW GLOBAL STATUS LIKE '%semi%';
     Rpl_semi_sync_master_clients    工作於半同步的客戶端有幾個
     Rpl_semi_sync_master_net_avg_wait_time   主節點爲等待IO_THREAD平均等待的時間
     Rpl_semi_sync_master_net_wait_time     主節點爲等待IO_THREAD等待的時間
     Rpl_semi_sync_master_net_waits           主節點爲等待IO_THREAD等待的次數
     Rpl_semi_sync_master_tx_avg_wait_time  主節點爲等待IO_THREAD等待的事務



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