Mysql作為目前世界上使用最廣泛的免費數(shù)據(jù)庫,在實際的生產(chǎn)環(huán)境中喊巍,由單臺Mysql作為獨立的數(shù)據(jù)是不能完全滿足實際需求的路媚,無論是在安全性、高可用性還是高并發(fā)等各個方面苗缩。
因此饵蒂,一般來說都是通過主從復(fù)制(Master-Slave)的方式來同步數(shù)據(jù),再通過讀寫分離(Mysql-Proxy)來提升數(shù)據(jù)庫的并發(fā)負(fù)載能力酱讶。
Mysql數(shù)據(jù)庫自身提供的主從復(fù)制功可以很方便的實現(xiàn)數(shù)據(jù)庫的多重備份退盯,實現(xiàn)數(shù)據(jù)庫的拓展。多個數(shù)據(jù)庫本分不僅可以加強數(shù)據(jù)庫的安全性,通過實現(xiàn)讀寫分離還能進(jìn)一步提升數(shù)據(jù)庫的負(fù)載性能渊迁。
一主多從數(shù)據(jù)庫間主從復(fù)制與讀寫分離模型如下圖所示:
Mysql數(shù)據(jù)庫的源碼安裝方法:Linux下安裝MySQL
示例所用數(shù)據(jù)庫版本:mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz
一 慰照、Mysql主從復(fù)制(Master-Slave)
在一主多從的數(shù)據(jù)庫體系中,多個從服務(wù)器采用異步的方式更新主數(shù)據(jù)庫的數(shù)據(jù)變化琉朽,業(yè)務(wù)服務(wù)器在執(zhí)行寫或者相關(guān)修改數(shù)據(jù)庫的操作是在主服務(wù)器上進(jìn)行的毒租,讀操作則是在各個從服務(wù)器上進(jìn)行的。如果配置了多個從服務(wù)器則又會涉及到負(fù)載均衡的問題漓骚。
Mysql主從復(fù)制的實現(xiàn)原理圖如下:
MySQL主從數(shù)據(jù)庫之間數(shù)據(jù)的復(fù)制基礎(chǔ)是二進(jìn)制日志文件蝌衔。主數(shù)據(jù)庫(Master)啟用二進(jìn)制日志后,它的數(shù)據(jù)庫中的所有操作都會以“事件”的方式記錄在二進(jìn)制日志中蝌蹂,其他從數(shù)據(jù)庫(Slave)通過一個I/O線程與主數(shù)據(jù)庫保持通信噩斟,并監(jiān)控Master的二進(jìn)制日志文件的變化,如果Slave發(fā)現(xiàn)Master中二進(jìn)制日志文件發(fā)生變化孤个,則會把變化復(fù)制到自己的中繼日志中剃允,然后Slave的一個SQL線程會把相關(guān)的“事件”執(zhí)行到自己的數(shù)據(jù)庫中,從而保持主從數(shù)據(jù)庫的一致性齐鲤,也就實現(xiàn)了主從數(shù)據(jù)復(fù)制斥废。
實現(xiàn)MySQL主從復(fù)制的配置方式
數(shù)據(jù)庫主從復(fù)制,最好能夠滿足以下兩點要求:主從數(shù)據(jù)庫庫版本最好一致给郊;主從數(shù)據(jù)庫內(nèi)數(shù)據(jù)保持一致牡肉。
主服務(wù)器:開啟二進(jìn)制日志;配置唯一的server-id;獲取master二進(jìn)制日志文件名和位置淆九;創(chuàng)建一個用于主從通信的用戶賬號统锤。
從服務(wù)器:配置唯一的server-id;使用主服務(wù)器分配的用戶賬號讀取master二進(jìn)制日志;啟用slave服務(wù)炭庙。
0饲窿、如果主庫中已經(jīng)存在數(shù)據(jù),可以現(xiàn)在主庫中執(zhí)行 FLUSH TABLES WITH READ LOCK; 禁用表寫入焕蹄。同步完成后逾雄,執(zhí)行 UNLOCK TABLES; 解除表寫入限制。
1腻脏、修改主數(shù)據(jù)庫配置
打開my.cnf文件(一般在/etc/my.cnf鸦泳,根據(jù)你安裝時新建位置確定,如果不確定位置可以使用find / - name my.cnf命令進(jìn)行查找)永品,在[mysqld]下添加:
[mysqld]
log-bin=mysql-bin
server-id=2 #用于標(biāo)識唯一數(shù)據(jù)庫辽故,在從庫必須設(shè)置為不同的值
binlog-do-db=test #指定需要同步的數(shù)據(jù)庫
2、修改完配置后腐碱,重啟mysql
service mysqld restart
3誊垢、進(jìn)入mysql掉弛,賦予從庫權(quán)限賬號,允許用戶在主庫上讀取日志喂走,并給它replication slave的權(quán)限殃饿。
創(chuàng)建數(shù)據(jù)庫賬號:root2/123456
[root@localhost ~]# mysql -uroot -p
Enter password:輸入數(shù)據(jù)庫密碼
mysql>
mysql> CREATE USER 'root2'@'%' IDENTIFIED BY '123456'; #創(chuàng)建賬號
mysql> GRANT REPLICATION SLAVE ON *.* TO 'root2'@'%'; #賦予權(quán)限
mysql>flush privileges; #刷新權(quán)限
“%”表示允許所有機(jī)器成為從庫,也可設(shè)置為固定IP
4芋肠、修改從數(shù)據(jù)庫配置
修改my.cnf文件乎芳,在[mysqld]下添加:
[mysqld]
log-bin=mysql-bin
server-id=3
replicate-do-db=test
5、重啟mysql帖池,打開mysql會話奈惑,執(zhí)行同步SQL語句。
mysql> CHANGE MASTER TO
-> MASTER_HOST='182.92.172.80',
-> MASTER_USER='root2',
-> MASTER_PASSWORD='123456',
-> MASTER_LOG_FILE='mysql-bin.000002',
-> MASTER_LOG_POS=73;
- MASTER_HOST : 主數(shù)據(jù)庫IP
- MASTER_USER : 主數(shù)據(jù)庫授權(quán)賬號
- MASTER_PASSWORD : 主數(shù)據(jù)庫授權(quán)密碼
- MASTER_LOG_FILE : 在主數(shù)據(jù)庫中通過SHOW MASTER STATUS命令獲取File字段的值
- MASTER_LOG_POS : 在主數(shù)據(jù)庫中通過SHOW MASTER STATUS命令獲取Position字段的值
主數(shù)據(jù)庫執(zhí)行 SHOW MASTER STATUS;
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 | 1485 | test | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
6睡汹、啟動從數(shù)據(jù)庫的同步進(jìn)程
mysql>start slave;
7肴甸、查看從數(shù)據(jù)的狀態(tài)
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.0.1
Master_User: root2
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 50
Relay_Log_File: iZmcZ-relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: test
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 775
Relay_Log_Space: 545
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1001
Master_UUID: e1f8-a4-1e9-8b3-0cc47ac1430e
Master_Info_File: /usr/local/mysql/data/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
當(dāng)Slave_IO_Running和Slave_SQL_Running都為YES的時候就表示主從同步設(shè)置成功了。接下來就可以進(jìn)行一些驗證了囚巴,比如在主master數(shù)據(jù)庫的test數(shù)據(jù)庫的一張表中插入一條數(shù)據(jù)原在,在slave的test庫的相同數(shù)據(jù)表中查看是否有新增的數(shù)據(jù)即可驗證主從復(fù)制功能是否有效,還可以關(guān)閉slave(mysql>stop slave;),然后再修改master彤叉,看slave是否也相應(yīng)修改(停止slave后庶柿,master的修改不會同步到slave),就可以完成主從復(fù)制功能的驗證了秽浇。