mysql的主從複製

主從不能減輕寫的壓力
一、一主多從
主:
1、開啓二進制日誌及設置server_id
bin_log=my_bin
server_id=201
2、創建複製賬號(REPLICATION SLAVE,REPLICATION CLIENT)
CREATE USER repuser;
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON . TO repuser@'%' IDENTIFIED BY 'smile';
3、
從:
1、開啓中繼日誌及設置唯一server_id
relay_log=relay_log
server_id=202
skip_slave_start=1 #啓動時不自動啓用從庫同步

2、使用複製賬號連接主並啓動SQL及I/O進程
CHANGE MASTER TO option [, option] ...
option:
MASTER_BIND = 'interface_name'
| MASTER_HOST = 'host_name' 主服務器地址
| MASTER_USER = 'user_name' 有複製權限的用戶名
| MASTER_PASSWORD = 'password' 用戶密碼
| MASTER_PORT = port_num 主服務器的端口
| MASTER_CONNECT_RETRY = interval 連接重試時間間隔
| MASTER_HEARTBEAT_PERIOD = interval 心跳檢測時間間隔
| MASTER_LOG_FILE = 'master_log_name' 主服務器二進制日誌文件
| MASTER_LOG_POS = master_log_pos 二進制日誌文件中的位置
| RELAY_LOG_FILE = 'relay_log_name'
| RELAY_LOG_POS = relay_log_pos
| MASTER_SSL = {0|1}
| MASTER_SSL_CA = 'ca_file_name'
| MASTER_SSL_CAPATH = 'ca_directory_name'
| MASTER_SSL_CERT = 'cert_file_name'
| MASTER_SSL_KEY = 'key_file_name'
| MASTER_SSL_CIPHER = 'cipher_list'
| MASTER_SSL_VERIFY_SERVER_CERT = {0|1}
| IGNORE_SERVER_IDS = (server_id_list)

CHANGE MASTER TO MASTER_HOST='',MASTER_USER='',MASTER_PASSWORD='',MASTER_LOG_FILE='',MASTER_LOG_POS= ;
START SLAVE;
查看slave狀態:SHOW SLAVE STATUS;

MariaDB [(none)]> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.0.201
Master_User: repuser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: my_bin.000002
Read_Master_Log_Pos: 339
Relay_Log_File: relay_log.000006
Relay_Log_Pos: 635
Relay_Master_Log_File: my_bin.000002
Slave_IO_Running: Yes       #IO線程狀態
Slave_SQL_Running: Yes   #SQL線程狀態

關於複製的注意事項
1、從庫的只讀問題
read_only=1 還可以FLUSH TABLES WITH READ LOCK;
2、幾個保證安全的參數
1)對於InnoDB引擎來說:
sync_binlog=1
master寫binlog與innodb引擎寫redo類似,也有參數控制:sync_binlog
= 0 :表示MySQL不控制binlog的刷新,由文件系統自己控制它的緩存的刷新

0 :表示每sync_binlog次事務提交,MySQL調用文件系統的刷新操作將緩存刷下去
其中最安全的就是=1,表示每次事務提交,MySQL都會把binlog緩存刷下去,這樣在掉電等情況下,系統纔有可能丟失1個事務的數據。當sync_binlog設置爲1,對系統的IO消耗也是非常大的。
innodb_flush_log_at_trx_commit
=0 每秒write cache 並且 flush log
=1 每次事務提交後都write cache並且flush log 最安全
=2 每次事務提交後都write cache 根據innodb_flush_logs_at_timeout來flush log
innodb_support_XA=1
mysql的分佈式事務
2PC
CAP
BASE
2)從庫開機時不自動同步
SKIP_START_SLAVE=1
3)
slave讀取master的binlog日誌後,需要個文件:relay log、relay log info、master info:
relay log:即讀取過來的master的binlog,內容與格式與master的binlog一致
relay log info:記錄SQL Thread應用的relay log的位置、文件號等信息
master info:記錄IO Thread讀取master的binlog的位置、文件號、延遲等信息
master中sync_master_info
sync_relay_log=1
sync_relay_log_info=1
從MySQL5.5.X版本開始,增加了relay_log_recovery參數,這個參數的作用是:當slave從庫宕機後,假如relay-log損壞了,導致一部分中繼日誌沒有處理,則自動放棄所有未執行的relay-log,並且重新從master上獲取日誌,這樣就保證了relay-log的完整性。默認情況下該功能是關閉的,將relay_log_recovery的值設置爲 1時,可在slave從庫上開啓該功能,建議開啓。
relay_log_recovery=1
relay-log-info-repository = TABLE(mysql中有,MariaDB中沒有)
二、半同步
介於異步複製和全同步複製之間,主庫在執行完客戶端提交的事務後不是立刻返回給客戶端,而是等待至少一個從庫接收到並寫到relay log中才返回給客戶端。相對於異步複製,半同步複製提高了數據的安全性,同時它也造成了一定程度的延遲,這個延遲最少是一個TCP/IP往返的時間。所以,半同步複製最好在低延時的網絡中使用。
1)主庫安裝
安裝插件

MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

啓動模塊

MariaDB [(none)]> SET GLOBAL rpL_semi_sync_master_enabled=1;

設置超時時間

MariaDB [(none)]> SET GLOBAL rpl_semi_sync_master_timeout=20000;

2)從庫配置
全備主庫並恢復到從庫中
可使用mysqldump或者xtarbackup
安裝插件

MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
MariaDB [(none)]> SET GLOBAL rpL_semi_sync_slave_enabled=1;
MariaDB [(none)]> SET GLOBAL rpl_semi_sync_master_timeout=20000;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章