目錄
1、服務(wù)器規(guī)劃
2、主從同步流程
3、主從搭建
3.1、master節(jié)點上配置文件修改
3.2、master節(jié)點創(chuàng)建同步用戶和權(quán)限
3.3、slave1和slave2節(jié)點配置文件修改
3.4、slave1和slave2節(jié)點執(zhí)行同步任務(wù)
3.5、解決虛擬機克隆導(dǎo)致mysql所有服務(wù)器uuid都一樣的問題
4、bin-log相關(guān)說明
5、主從同步注意事項
1、服務(wù)器規(guī)劃
服務(wù)器名稱 |
規(guī)劃 |
ip和端口 |
bigdata01 |
master |
192.168.118.121:3306 |
bigdatamodel |
slave01 |
192.168.118.120:3306 |
bigdata02 |
slave02 |
192.168.118.122:3306 |
2、主從同步流程
Mysql的主從復(fù)制中主要有三個線程:
master(binlog dump thread)、slave(I/O thread 、SQL thread),Master一條線程和Slave中的兩條線程。
master(binlog dump thread)主要負責(zé)Master庫中有數(shù)據(jù)更新的時候,會按照binlog格式,將更新的事件類型寫入到主庫的
binlog文件中。并且,Master會創(chuàng)建log dump線程通知Slave主庫中存在數(shù)據(jù)更新,這就是為什么主庫的binlog日志一定要開啟的原因。
I/O thread線程在Slave中創(chuàng)建,該線程用于請求Master,Master會返回binlog的名稱以及當(dāng)前數(shù)據(jù)更新的位置、binlog文件位置的副本。
然后,將binlog保存在?「relay log(中繼日志)」?中,中繼日志也是記錄數(shù)據(jù)更新的信息。
SQL線程也是在Slave中創(chuàng)建的,當(dāng)Slave檢測到中繼日志有更新,就會將更新的內(nèi)容同步到Slave數(shù)據(jù)庫中,這樣就保證了主從的數(shù)據(jù)的同步。
以上就是主從復(fù)制的過程,當(dāng)然,主從復(fù)制的過程有不同的策略方式進行數(shù)據(jù)的同步,主要包含以下幾種:
- 「同步策略」:Master會等待所有的Slave都回應(yīng)后才會提交,這個主從的同步的性能會嚴(yán)重的影響。
- 「半同步策略」:Master至少會等待一個Slave回應(yīng)后提交。
- 「異步策略」:Master不用等待Slave回應(yīng)就可以提交。
- 「延遲策略」:Slave要落后于Master指定的時間。
3、主從搭建
3.1、master節(jié)點上配置文件修改
root@bigdata01 etc]# vim my.cnf
[mysqld]
server-id=1
log-bin=mysql-bin
#[可選] 0(默認)表示讀寫(主機),1表示只讀(從機)
read-only=0
#設(shè)置日志文件保留的時長,單位是秒
binlog_expire_logs_seconds=6000
#控制單個二進制日志大小。此參數(shù)的最大和默認值是1GB
max_binlog_size=200M
#[可選]設(shè)置不要復(fù)制的數(shù)據(jù)庫
binlog-ignore-db=information_schema,mysql,quartz
#[可選]設(shè)置需要復(fù)制的數(shù)據(jù)庫,默認全部記錄。比如:binlog-do-db=atguigu_master_slave
binlog-do-db=tokercart
#[可選]設(shè)置binlog格式
binlog_format=STATEMENT
# 寫緩存多少次,刷一次磁盤,默認 0 表示這個操作由操作系統(tǒng)根據(jù)自身負載自行決定多久寫一次磁盤
# 1 表示每一條事務(wù)提交都會立即寫磁盤,n 則表示 n 個事務(wù)提交才會寫磁盤
sync_binlog=0
#character config
character_set_server=utf8mb4
explicit_defaults_for_timestamp=true
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
# 每次commit 日志緩存中的數(shù)據(jù)刷到磁盤中。通常設(shè)置為 1,意味著在事務(wù)提交前日志已被寫入磁盤, 事務(wù)可以運行更長以及服務(wù)崩潰后的修復(fù)能力
innodb_flush_log_at_trx_commit=1
啟動失敗,查看日志找到原因,有個參數(shù)設(shè)置錯誤
[root@bigdata01 etc]# systemctl start mysqld
Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe" for details.
[root@bigdata01 etc]# cat /var/log/mysqld.log |grep ERROR
2022-11-26T13:15:09.415695Z 0 [ERROR] unknown variable 'binlog_expire_logs_seconds=6000'
2022-11-26T13:15:09.415711Z 0 [ERROR] Aborting
在mysql 8.0版本中新增了binlog_expire_logs_seconds,該參數(shù)表示binlog的失效日期單位秒。8.0之前的版本,binlog的失效日志用expire_logs_days來配置,單位是天
修改my.cnf后,#設(shè)置日志文件保留的天數(shù) expire_logs_days=10 重啟成功,分別查看當(dāng)前serverid、是否開啟bin-log以及master節(jié)點上所有的的日志名稱和position
[root@bigdata01 etc]# systemctl start mysqld
[root@bigdata01 etc]# mysql -uroot -p
............................................................................................
mysql> show global variables like '%server%';
+---------------------------------+--------------------------------------+
| Variable_name | Value |
+---------------------------------+--------------------------------------+
| character_set_server | utf8mb4 |
| collation_server | utf8mb4_general_ci |
| innodb_ft_server_stopword_table | |
| server_id | 1 |
| server_id_bits | 32 |
| server_uuid | 542516d8-1c3a-11ed-986c-000c290154b1 |
+---------------------------------+--------------------------------------+
6 rows in set (0.00 sec)
mysql> show global variables like '%log_bin%';
+---------------------------------+--------------------------------+
| Variable_name | Value |
+---------------------------------+--------------------------------+
| log_bin | ON |
| log_bin_basename | /var/lib/mysql/mysql-bin |
| log_bin_index | /var/lib/mysql/mysql-bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
+---------------------------------+--------------------------------+
5 rows in set (0.01 sec)
mysql> show master logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 177 |
| mysql-bin.000002 | 154 |
+------------------+-----------+
2 rows in set (0.00 sec)
3.2、master節(jié)點創(chuàng)建同步用戶和權(quán)限
mysql> grant replication slave on . TO 'slave1'@'%' identified by 'toker';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
mysql>grant replication slave on *.* TO 'slave1'@'%' identified by 'Test#2021';
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> show grants for 'slave1'@'%';
+------------------------------------------------+
| Grants for slave1@% |
+------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'%' |
+------------------------------------------------+
1 row in set (0.00 sec)
查看master節(jié)點日志最新狀態(tài)和binlog名稱
mysql> show master status;
+------------------+----------+--------------+---------------------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+---------------------------------+-------------------+
| mysql-bin.000002 | 591 | tokercart | information_schema,mysql,quartz | |
+------------------+----------+--------------+---------------------------------+-------------------+
1 row in set (0.00 sec)
3.3、slave1和slave2節(jié)點配置文件修改
+------------------+----------+--------------+---------------------------------+-------------------+
slave1節(jié)點my.cnf
[mysqld]
server-id=2
relay-log=mysql-salve1-log
+------------------+----------+--------------+---------------------------------+-------------------+
slave2節(jié)點my.cnf
[mysqld]
server-id=3
relay-log=mysql-salve2-log
3.4、slave1和slave2節(jié)點執(zhí)行同步任務(wù)
命令如下:
CHANGE MASTER TO MASTER_HOST='192.168.118.121',MASTER_USER='slave1',MASTER_PASSWORD='Test#2021',MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=1313;
啟動start slave; 如果啟動碰到錯誤可以執(zhí)行reset slave; #刪除SLAVE數(shù)據(jù)庫的relaylog日志文件,并重新啟用新的relaylog文件,然后重新執(zhí)行change命令和start slave即可.
mysql> CHANGE MASTER TO MASTER_HOST='192.168.118.121',MASTER_USER='slave1',MASTER_PASSWORD='Test#2021',MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=1313;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: 192.168.118.121
Master_User: slave1
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 1313
Relay_Log_File: mysql-salve2-log.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Running: No
Slave_SQL_Running: Yes
.....................................
Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.
.....................................
上述show slave status\G;查看同步狀態(tài)的時候發(fā)現(xiàn) Slave_IO_Running: No,仔細看下面錯誤有一條:
The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.
- 首先我們通過配置文件排除了server-id一致性的問題,我配置的server-id=1,server-id=2,server-id=3,所以不是此處問題
- 查看server_uuid屬性,發(fā)現(xiàn)幾臺機器的server_uuid確實一樣。為什么呢?因為我們的幾臺服務(wù)器都是虛擬機克隆出來的
mysql> show variables like '%server_uuid%';
+---------------+--------------------------------------+
| Variable_name | Value |
+---------------+--------------------------------------+
| server_uuid | 542516d8-1c3a-11ed-986c-000c290154b1 |
+---------------+--------------------------------------+
1 row in set (0.00 sec)
3.5、解決虛擬機克隆導(dǎo)致mysql所有服務(wù)器uuid都一樣的問題
解決方法就是找到主機和從機的auto.cnf文件修改uuid值或刪除auto.cnf這個文件。但是通過,查詢uuid值還是一樣
后來發(fā)現(xiàn)/var/lib/mysql/auto.cnf還有一個auto.cnf文件
[root@bigdata02 etc]# cd /var/lib/mysql
[root@bigdata02 mysql]# ls
auto.cnf ca.pem client-key.pem ibdata1 ib_logfile1 master.info mysql mysql-salve2-log.index mysql.sock.lock private_key.pem quartz server-cert.pem sys
ca-key.pem client-cert.pem ib_buffer_pool ib_logfile0 ibtmp1 mydb mysql-salve2-log.000002 mysql.sock performance_schema public_key.pem relay-log.info server-key.pem
[root@bigdata02 mysql]# vi auto.cnf
[auto]
server-uuid=542516d8-1c3a-11ed-986c-000c290154b1
刪除掉從服務(wù)器的mysql下的auto.cnf,重啟mysqld即可
[root@bigdata02 mysql]# rm -f auto.cnf
[root@bigdata02 mysql]# systemctl restart mysqld
[root@bigdata02 mysql]# vi auto.cnf
[auto]
server-uuid=8270d752-6d97-11ed-9c83-000c295a2050
[root@bigdata02 mysql]# mysql -uroot -p
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.118.121
Master_User: slave1
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 1313
Relay_Log_File: mysql-salve2-log.000004
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
........................................................................
4、bin-log相關(guān)說明
根據(jù) MySQL 官方文檔的介紹,開啟 binlog 之后,大概會有 1% 的性能損,binlog主要用作數(shù)據(jù)恢復(fù)和主從復(fù)制
MySQL 5.7.3以后版本必須配置server-id,否則無法啟用MySQL二進制日志
binlog格式說明:MySQL默認采用的是STATEMENT,建議使用MIXED
binlog_format = MIXED
- STATEMENT模式(SBR)
基于SQL語句的復(fù)制(statement-based replication),每一條會修改數(shù)據(jù)的sql語句都會記錄到binlog中。
優(yōu)點:
不需要記錄每一條sql語句和每一行的數(shù)據(jù)變化,減少了binlog日志量,節(jié)約IO,提高性能
缺點:
某些情況會導(dǎo)致master-slave中的數(shù)據(jù)不一致,例如sleep(),last_insert_id()等
- ROW模式(RBR)
基于行的復(fù)制(row-based replication),不記錄每條sql語句的上下文信息,僅記錄哪條數(shù)據(jù)被修改了,修改成什么樣。
優(yōu)點:
任何情況都可以復(fù)制,并且不會出現(xiàn)特定情況下存儲過程、function等調(diào)用或者觸發(fā)無法被正確復(fù)制的問題
缺點:
binlog日志文件會非常大
master上執(zhí)行update語句時,所有變化都會寫到binlog里面,SBR只會寫一次,所以會導(dǎo)致頻繁發(fā)生binlog的并發(fā)寫問題
- MIXED模式
上面兩種模式的混合使用,一般的復(fù)制使用STATEMENT模式保存binlog,對于STATEMENT模式無法復(fù)制的操作使用ROW模式保存binlog,MySQL會根據(jù)執(zhí)行的SQL語句選擇日志保存方式。
5、主從同步注意事項
- 搭建完主從,再去創(chuàng)建數(shù)據(jù)庫(因為主從之前的數(shù)據(jù)庫不在binlog里)
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.118.121
Master_User: slave1
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 1830
Relay_Log_File: mysql-salve1-log.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 1146
解決辦法:文章來源:http://www.zghlxwxcb.cn/news/detail-677698.html
先把庫從線下手動拷貝過去,然后重啟從節(jié)點的slave即可文章來源地址http://www.zghlxwxcb.cn/news/detail-677698.html
mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
到了這里,關(guān)于Mysql主從數(shù)據(jù)庫搭建(一主兩從)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!