1、主從同步的做用
mysql
一、數據分佈sql
二、負載均衡(load balancing)數據庫
四、高可用性(high availability)和容錯安全
2、主從同步原理ruby
一、二進制日誌
服務器
想要作主從複製必須得有這個二進制日誌,那二進制日誌記錄的是什麼呢?二進制日誌中保存的只是跟服務器修改相關的操做,也叫複製日誌
網絡
二進制日誌爲了不日誌文件過大,要進行不停地滾動,其主要有兩個功能:
負載均衡
(1)即時點恢復
ide
(2)複製
測試
由於二進制日誌有即時點恢復功能,因此萬一某天一個不當心失誤把數據庫刪了,只要二進制日誌文件保存無缺,就能夠把咱們的數據恢復回來。可見二進制日誌是很是重要的,所以二進制日誌千萬不要和你的數據庫目錄放到一塊兒,而要另找一個位置保存
今天咱們要作的是利用他的第二個功能完成主從複製
二、中繼日誌
中繼日誌和複製相關,中繼日誌是從服務器從主服務器上讀取主服務器上二進制日誌中的事件,每讀一個過來,並保存到本地。
三、主從同步原理
原理詳解:
1)主服務器發生數據更改操做,數據寫入到數據文件和二進制文件中,而後去喚醒從服務器的I/O線程(IO thread)
2)從服務器的IO thread來請求主服務器並把從主服務器的binlog dump線程返回結果寫入到本地中繼日誌中
3)從服務器的SQL thread每讀一條中繼日誌,而後寫一條到本地數據文件中
4)此過程當中,從服務器只是同步主服務器的數據,因此他無需開啓二進制日誌,並且從服務器最好設爲只讀模式
5)主從複製並非一個備份的過程,它只是一個數據同步的過程,由於,若是你在主服務器上刪除一個庫,那你會發現從服務器上也沒有了
6)從服務器並不能負載主服務器的寫操做,它只能夠負載主服務器的讀操做;由於,無論你主服務器寫多少,從服務器都會經過它的中繼日誌和主服務器的二進制日誌同步到它本地的
主從同步配置過程總結
一、主服務器
1)修改server-id
2)啓用二進制日誌
3)建立有複製權限的帳號
二、從服務器
1)修改server-id
2)啓用中繼日誌
3)鏈接主服務器
4)啓程複製線程
3、主從同步的實現
一、修改主服務器的配置文件,我這裏的數據目錄在/mydata/data下,爲了安全,我把二進制日誌放到了/mydata/binlogs下,別忘了給這幾個目錄設置屬主和屬組爲mysql用戶,mysql組
datadir=/mydata/data 指定數據目錄 # binary logging is required for replication log-bin=/mydata/binlog/master-bin 二進制日誌目錄 # binary logging format - mixed recommended binlog_format=mixed 二進制格式設爲混合模型 # required unique id between 1 and 2^32 - 1 # defaults to 1 if master-host is not set # but will not function as a master if omitted server-id = 1 主服務id爲1
啓動服務器 service mysqld start
二、在主服務器上建立有複製權限的帳號
mysql> grant replication slave,replication client on *.* to'repluser'@'192.168.%.%' identified by 'replpass'; Query OK, 0 rows affected (0.01 sec) mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec)
三、在從服務器上修改主配置文件,方法同上一步
[root@xuxu ~]# mkdir /mydata/relaylogs 建立中繼日誌目錄
[root@xuxu ~]# chown -R mysql.mysql /mydata/relaylogs
datadir=/mydata/data 指定數據目錄 read-only = on 開啓只讀 server-id = 11 id改成11 relay-log = /mydata/relaylogs/relay-bin 開啓中繼日誌
四、查看從服務器的中繼日誌是否啓動成功
mysql> show global variables like '%relay%'; +-----------------------+-----------------------------+ | Variable_name | Value | +-----------------------+-----------------------------+ | max_relay_log_size | 0 | | relay_log | /mydata/relaylogs/relay-bin | | relay_log_index | | | relay_log_info_file | relay-log.info | | relay_log_purge | ON | | relay_log_recovery | OFF | | relay_log_space_limit | 0 | | sync_relay_log | 0 | | sync_relay_log_info | 0 | +-----------------------+-----------------------------+
五、在主服務器上查看其狀態信息
mysql> show master status; +-------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +-------------------+----------+--------------+------------------+ | master-bin.000003 | 358 | | | +-------------------+----------+--------------+------------------+ 1 row in set (0.00 sec)
六、查看從服務器的狀態信息,檢查是否鏈接主服務器成功
mysql> SHOW SLAVE STATUS\G *************************** 1. row *************************** Slave_IO_State: Master_Host: 192.168.211.133 主服務器 Master_User: repluser 主機名 Master_Port: 3306 端口號 Connect_Retry: 60 Master_Log_File: Read_Master_Log_Pos: 4 Relay_Log_File: relay-bin.000001 還沒開始寫哩 Relay_Log_Pos: 4 Relay_Master_Log_File: Slave_IO_Running: No 線程還沒啓動 Slave_SQL_Running: No
七、開啓線程
mysql> start slave; Query OK, 0 rows affected (0.01 sec) mysql> SHOW SLAVE STATUS\G *************************** 1. row *************************** Slave_IO_State: Connecting to master Master_Host: 192.168.211.133 Master_User: repluser Master_Port: 3306 Connect_Retry: 60 Master_Log_File: Read_Master_Log_Pos: 4 Relay_Log_File: relay-bin.000001 Relay_Log_Pos: 4 Relay_Master_Log_File: Slave_IO_Running: Connecting 說明沒有開啓鏈接 Slave_SQL_Running: Yes
真對以上問題:網上文章大都只是指出了可能的三種錯誤:
1. 網絡不通
2. 密碼不對
3. pos不對
我測試網絡是能夠ping通的。密碼也對,pos也對。
後來想了好久,忽然想起來了防火牆好像沒有關閉!一檢查果真。
因此第四種錯誤是:
4. 防火牆沒有關閉。
相關命令以下:
關閉命令: service iptables stop
永久關閉防火牆:chkconfig iptables off
兩個命令同時運行,運行完成後查看防火牆關閉狀態
service iptables status
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
mysql> SHOW SLAVE STATUS\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.211.133 Master_User: repluser Master_Port: 3306 Connect_Retry: 60 Master_Log_File: master-bin.000003 Read_Master_Log_Pos: 1218 Relay_Log_File: relay-bin.000002 Relay_Log_Pos: 254 Relay_Master_Log_File: master-bin.000003 Slave_IO_Running: Yes Slave_SQL_Running: Yes
八、在主服務器上建立一個數據庫
mysql> CREATE DATABASE xiaoxiao; Query OK, 1 row affected (0.01 sec) mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | | mydb | | mysql | | performance_schema | | test | | tests | | xiaoxiao | +--------------------+
主服務器建立一個xiaoxiao庫。。
九、在從服務器上啓動複製線程,測試hlbrc這個庫是否同步成功
mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | MY | | mydb | | mysql | | performance_schema | | test | | tests | | xiaoxiao | +--------------------+ 從服務器中出現xiaoxiao庫,,,說明同步成功》》》》》》 |