怎么樣配置mysql主從復(fù)制、mysql-5.5異步及半同步
下文主要給大家?guī)碓趺礃优渲?a title="mysql" target="_blank" href="http://kemok4.com/mysql/">mysql主從復(fù)制、mysql-5.5異步及半同步,希望這些內(nèi)容能夠帶給大家實際用處,這也是我編輯怎么樣配置mysql主從復(fù)制、mysql-5.5異步及半同步這篇文章的主要目的。好了,廢話不多說,大家直接看下文吧。
master
1 啟用二進制日志
log-bin = master-bin
log-bin-index = master-bin.index
2 選擇一個唯一的server id
server-id = [0~2^32]
3 創(chuàng)建具有復(fù)制權(quán)限的用戶
replication slave,復(fù)制的從節(jié)點
replication client,聯(lián)系master,獲取信息的權(quán)限
slave
1 啟用二進制日志
relay-log = relay-log
relay-log-index = relay-log.index
2 選擇一個唯一的server id,和主不同
server-id = [0~2^32]
從哪里開始復(fù)制?
1)master是新的,slave從頭開始復(fù)制
2)master已經(jīng)運行一段時間,在master執(zhí)行一次備份,記錄二進制日志文件名和事件位置,在slave還原數(shù)據(jù),連接至哪一個二進制文件的哪一個位置?
mysql> change master to master_host= ,master_port= ,master_log_file= ,master_log_pos= ,master_user= ,master_password= ;
mysql> start slave;
4 mysql復(fù)制線程
master會為每一個slave啟動1個dump線程
master:dump
slave:IO_thread,SQL_thread
可單獨啟動
mysql> start slave IO_thread
mysql> start slave SQL_thread
5 半同步復(fù)制時應(yīng)指定同步超時時間,一旦超時,降級為異步復(fù)制
mysql主從異步復(fù)制 使用二進制格式安裝mysql,并初始化、mtsql服務(wù)腳本復(fù)制、my.cnf配置文件復(fù)制。
導(dǎo)出PATH,方便使用mysql命令
# vim /etc/profile.d/mysql.sh
export PATH=$PATH:/usr/local/mysql/bin
master
1 修改配置文件
# vim /etc/my.cnf
[mysqld]
datadir = /data/mysql
innodb_file_per_table = 1
log-bin=master-bin
log-bin-index=master-bin.index
啟動mysql
# service mysqld start
2 授權(quán)slave復(fù)制
mysql> grant replication slave on *.* to 'replicationuser'@'192.168.8.31' identified by 'replicationuser';
mysql> flush privileges;
mysql> flush tables with read lock; # 鎖住table為只讀
3 查看master二進制日志文件狀態(tài),在slave上需要使用
mysql> show master status;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000001 | 355 | | |
+-------------------+----------+--------------+------------------+
mysql> show binlog events in "master-bin.000001";
slave
1 修改配置文件
# vim /etc/my.cnf
[mysqld]
datadir = /data/mysql
innodb_file_per_table = 1
relay-log = relay-log
relay-log-index = relay-log.index
server-id = 10
啟動mysql
# service mysqld start
2 配置slave同步設(shè)置,并啟動slave復(fù)制
mysql> change master to master_host='192.168.8.30',master_user='replicationuser',master_password='replicationuser',master_log_file='master-bin.000001',master_log_pos=355;
mysql> start salve;
3 查看slave的狀態(tài)
mysql> show slave status\G
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.8.30
Master_User: replicationuser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin.000001
Read_Master_Log_Pos: 438
Relay_Log_File: relay-log.000004
Relay_Log_Pos: 254
Relay_Master_Log_File: master-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 438
4 在master查看slave
mysql> show slave hosts;
其他設(shè)置和說明
1 slave上不允許數(shù)據(jù)庫的寫操作,因此在slave上設(shè)置為用戶只讀模式,但此設(shè)置對具有super權(quán)限的用戶無效
# vim /etc/my.cnf
[mysqld]
read-only = on
重啟mysql,即生效
# service mysqld restart
重啟mysqld,復(fù)制線程會自動重啟
修改配置后,或者不重啟,在數(shù)據(jù)庫中直接修改參數(shù)也可以
查看只讀模式是否生效
mysql> show global variables like 'read_only';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| read_only | ON |
+---------------+-------+
2 為了保證master bin-log不在緩沖區(qū)緩存,立即同步到磁盤上,減少主從復(fù)制的延遲時間,在master設(shè)定
[mysqld]
sync-binlog = on
重啟mysql,即生效
# service mysqld restart
重啟mysqld,復(fù)制線程會自動重啟
修改配置后,或者不重啟,在數(shù)據(jù)庫中直接修改參數(shù)也可以
查看立即同步模式是否生效
mysql> show global variables like 'sync_binlog';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sync_binlog | 0 |
+---------------+-------+
3 重啟mysqld,復(fù)制線程會自動重啟,存在哪些問題,如何禁止?
當(dāng)master執(zhí)行了一些誤操作,由于延遲原因,誤操作還未同步slave;此時在slave關(guān)閉mysql,備份數(shù)據(jù)恢復(fù)到master上,啟動slave的mysql,讓IO_thread跳過剛才的誤操作,再啟動復(fù)制功能。若slave啟動后,主從復(fù)制立即開始,還會同步剛才的誤操作。
不讓其隨mysql自動啟動,防止同步誤操作。
連接master 需要這兩個文件master.info,relay-log.info,臨時移除。slave無法連接master
在數(shù)據(jù)文件下
master.info 記錄了登陸master和相關(guān)信息
relay-log.info 記錄了relay-log和master-bin的相關(guān)信息
4 從云
服務(wù)器的相關(guān)日志會記錄在slave的錯誤日志中。
5 若master工作了一定時間,此時做主從的注意事項
5.1 master鎖表
mysql> flush tables with read lock;
5.2 master mysql的數(shù)據(jù)庫導(dǎo)出
# mysqldump mydb > mydb.sql
5.3 slave 創(chuàng)建同名數(shù)據(jù)庫,并導(dǎo)入數(shù)據(jù)庫
# mysqldump mydb < mydb.sql
5.4 此時操作和全新的數(shù)據(jù)庫是相同的,注意master_log_file,master_log_pos即可
6 mysql復(fù)制過濾
在master上
# vim /etc/my.cnf
[mysqld]
binlog-do-db=db1,db2
binlog-ignore-db=db1,db2
master binlog-ignore-db帶來的問題
不記錄部分數(shù)據(jù)庫的二進制日志,二進制日志不完整。當(dāng)云服務(wù)器崩潰時,只能恢復(fù)記錄了二進制日志的數(shù)據(jù),未記錄的將不能恢復(fù),因此不建議使用此選項。
在slave上
可以進行數(shù)據(jù)庫級別的過濾,也可以進行表級別的過濾
# vim /etc/my.cnf
[mysqld]
數(shù)據(jù)庫級別
replicate-do-db=
replicate-ignore-db=
表級別
replicate-do-table=
replicate-ignore-table=
在表級別使用通配
replicate-wild-do-table=mydb.tb% # 僅復(fù)制mydb中以tb開頭的所有表
replicate-wild-ignore-table=mydb.tb_ # 僅復(fù)制mydb中以tb開頭的、后面跟上一個字符的表
slave replicate-ignore-db帶來的問題
使用此選項,雖不記錄指定slave數(shù)據(jù)庫的二進制日志,但是中繼日志是完整的,因此會占有slave的帶寬資源。
綜上,如果必須對表進行過濾,建議在slave上進行。
半同步主從復(fù)制
1 master 添加模塊
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
mysql> set global rpl_semi_sync_master_enabled = 1;
mysql> show variables like 'rpl%';
+------------------------------------+-------+
| Variable_name | Value |
+------------------------------------+-------+
| rpl_recovery_rank | 0 |
| rpl_semi_sync_master_enabled | ON |
| rpl_semi_sync_master_timeout | 10000 | # 異步復(fù)制超時時間,單位ms
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_no_slave | ON | # 是否必須等待slave上線
+------------------------------------+-------+
2 slave 添加模塊
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
mysql> set global rpl_semi_sync_slave_enabled = 1;
mysql> show variables like 'rpl%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| rpl_recovery_rank | 0 |
| rpl_semi_sync_slave_enabled | ON |
| rpl_semi_sync_slave_trace_level | 32 |
+---------------------------------+-------+
3 若此時主從同步是開啟的,設(shè)置不會立即生效,需重啟slave io_thread
3.1 master狀態(tài)查看
mysql> show global status like 'rpl%';
+--------------------------------------------+-------------+
| Variable_name | Value |
+--------------------------------------------+-------------+
| Rpl_semi_sync_master_clients | 0 |
| Rpl_semi_sync_master_net_avg_wait_time | 0 |
| Rpl_semi_sync_master_net_wait_time | 0 |
| Rpl_semi_sync_master_net_waits | 0 |
| Rpl_semi_sync_master_no_times | 0 |
| Rpl_semi_sync_master_no_tx | 0 |
| Rpl_semi_sync_master_status | ON |
| Rpl_semi_sync_master_timefunc_failures | 0 |
| Rpl_semi_sync_master_tx_avg_wait_time | 0 |
| Rpl_semi_sync_master_tx_wait_time | 0 |
| Rpl_semi_sync_master_tx_waits | 0 |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
| Rpl_semi_sync_master_wait_sessions | 0 |
| Rpl_semi_sync_master_yes_tx | 0 |
| Rpl_status | AUTH_MASTER |
+--------------------------------------------+-------------+
3.2 slave狀態(tài)查看
mysql> show global status like 'rpl%';
+----------------------------+-------------+
| Variable_name | Value |
+----------------------------+-------------+
| Rpl_semi_sync_slave_status | OFF |
| Rpl_status | AUTH_MASTER |
+----------------------------+-------------+
4 只重啟io_thread即可
mysql> stop slave io_thread;
mysql> start slave io_thread;
4.1 master狀態(tài)查看
mysql> show global status like 'rpl%';
+--------------------------------------------+-------------+
| Variable_name | Value |
+--------------------------------------------+-------------+
| Rpl_semi_sync_master_clients | 1 |
+--------------------------------------------+-------------+
4.2 slave狀態(tài)查看
mysql> show global status like 'rpl%';
+----------------------------+-------------+
| Variable_name | Value |
+----------------------------+-------------+
| Rpl_semi_sync_slave_status | ON |
| Rpl_status | AUTH_MASTER |
+----------------------------+-------------+
5 測試
當(dāng)半同步超時后(10000ms)一次后,會降級為異步復(fù)制。
在slave停止io_thread
mysql> stop slave io_thread;
在master進行寫操作時,會卡住100000ms,之后降級為異步復(fù)制,恢復(fù)速度;
6 為了使參數(shù)永久生效,在Master和Slave的my.cnf中編輯:
# On Master
[mysqld]
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000 # 1 second
# On Slave
[mysqld]
rpl_semi_sync_slave_enabled=1
7 mysql主從機制比較脆弱,若需重啟master,需先要停止slave復(fù)制,即stop slave。
監(jiān)控和監(jiān)控主從復(fù)制工具
percona-toolkit(mattkit-tools)
https://www.percona.com/downloads/percona-toolkit/
# yum localinstall -y percona-toolkit-2.2.18-1.noarch.rpm --nogpgcheck
安裝之后會出現(xiàn)一大堆pt命令
pt-slave-delay:使slave比master慢一些時間
pt-table-checksum:通過單向加密比較主從的數(shù)據(jù)是否一致
rhel使用的是光盤中的rpm庫,無法解決percona的依賴
yum localinstall時出現(xiàn)如下提示
You could try using --skip-broken to work around the problem
You could try running: package-cleanup --problems
package-cleanup --dupes
rpm -Va --nofiles --nodigest
The program package-cleanup is found in the yum-utils package
mysql ssl 簡要說明
授權(quán)時,增加ssl選項,強制使用ssl;若無此選項,不受限制,即使啟用了ssl功能,復(fù)制時使用和不使用ssl都可以
mysql> grant replication slave on *.* to 'replicationuser'@'192.168.8.31' identified by 'replicationuser' require ssl;
ssl需要的內(nèi)容
mysql> show global variables like '%ssl%';
+---------------+----------+
| Variable_name | Value |
+---------------+----------+
| have_openssl | DISABLED |
| have_ssl | DISABLED |
| ssl_ca | |
| ssl_capath | |
| ssl_cert | |
| ssl_cipher | |
| ssl_key | |
+---------------+----------+
對于以上關(guān)于怎么樣配置mysql主從復(fù)制、mysql-5.5異步及半同步,大家是不是覺得非常有幫助。如果需要了解更多內(nèi)容,請繼續(xù)關(guān)注我們的行業(yè)資訊,相信你會喜歡上這些內(nèi)容的。