實驗環境:mysql
主節點IP:172.16.2.16
sql
從節點IP:172.16.2.17數據庫
MariaDB的版本是5.5.36,使用二進制方式安裝。已安裝完成。bash
實驗目的:服務器
瞭解主從複製,各個節點的工做方式。
異步
操做步驟:socket
1,主服務器須要開啓二進制日誌記錄,而且受權一個用戶給從節點。ide
主服務器的主配置文件[mysqld]內容以下。google
[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 產生二進制日誌就寫入磁盤
給從節點受權一個複製使用的用戶spa
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等待的事務