目錄
ー:爲什麼要使用主從複製 ?
答:在數據庫主從複製中,一個主數據庫有一個或者多個從數據庫,我們可以對主數據庫進行寫入操作(insert,delete,update),對一個或者多個從數據庫進行讀取操作(select)。這個的操作方式,就是大量的查詢請求也會分佈到各個從數據庫上,達到負載均衡,
主要是解決日益增長的請求數與 mysql client 連接數之間的妥協。
二:到底要不要使用相關組件保證高可用 ?
答:看業務,引入主從的切換一般能保證主從庫的切換。但是主從之間的延遲會造成一部分主庫的數據還未寫入 binlog 造成一定的數據的丟失,具體情況如下。
主庫 A1,A2,A3 數據已經寫入了主庫的 binlog ,但是因爲網絡的問題從庫的 binlog 只讀取到了 A1;發生了主從切換,則從庫當主庫繼續提供服務。而從庫之後生成的主鍵可能爲 A1,A2,於是現在的從庫(原主庫)就會發生主鍵衝突。並結束主從同步。可能還會有其他的坑。
在我們公司業務中,只是使用了簡單的主從複製。爲了保證業務數據的一致性。主庫宕機既停止服務。因爲請求量並不是很大。並做了主從來做讀寫分離,還有緩存和 ES 等擋住流量。所以暫時沒有發生宕機問題。
三:配置主從複製
主從節點配置說明:
主機名 |
IP地址 |
任務角色 |
數據庫 |
node1 |
192.168.204.122 |
master1 |
MySQL |
node2 |
192.168.204.133 |
slave1 |
MySQL |
首先我們要在 node1、node2 上安裝 MySQL 數據庫,安裝方式可以參考 linux-centos7 安裝 mysql5.7.27 的安裝 MySQL 部分,這裏就不展開講了。
安裝完成之後要對數據庫做一些配置,如下:
node1 的數據庫是 node2 的數據庫的主數據庫
主庫 node1 數據庫的配置文件 /etc/my.cnf 如下:被 # 號包圍的爲主從需要配置
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
default-character-set=utf8 # 設置編碼方式
lower_case_table_names=1 # 不區分字母大小寫
###############################################################
log-bin=mysql-bin # 開啓二進制日誌
server-id=1 # 設置server-id
# 不同步哪些數據庫
binlog-ignore-db = mysql
binlog-ignore-db = test
binlog-ignore-db = information_schema
# 只同步哪些數據庫,除此之外,其他不同步
# binlog-do-db = game
################################################################
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
從庫 node2 數據庫的配置文件 /etc/my.cnf 如下:主要是指定了一個服務 id
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
default-character-set=utf8
lower_case_table_names=1
server-id=2 #設置server-id,必須唯一
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
爲了方便,關閉各虛擬機的防火牆
service iptables stop
全部都修改了配置文件,所以全部都要重啓 MySQL 數據庫:
service mysqld restart
我們進入到 node1 數據庫中,輸入以下命令查看相關信息:
mysql> show master status;
+------------------+----------+--------------+-------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+-------------------------------+
| mysql-bin.000007 | 106 | | mysql,test,information_schema |
+------------------+----------+--------------+-------------------------------+
1 row in set (0.00 sec)
# 當前 binlog 文件爲 mysql-bin.000007 , 106 行, 忽略的 db 有 mysql,test,information_schema
根據 node1 這個主數據庫的信息,開始配置 node2 的從數據庫,進入到 node2 數據庫 中,輸入以下命令,注意 master_log_file 和 master_log_pos 來自於上一步獲取到的 node1 主數據庫的信息:
在執行下一條命令之前,要保證 slave 是關閉的,如果沒用關閉,使用以下命令關閉:
mysql> stop slave;
mysql> change master to master_host='192.168.204.122', master_user='root', master_password='root', master_log_file='mysql-bin.000007', master_log_pos=106;
配置完成之後,要啓動 slave,執行下面的命令啓動 slave:
mysql> start slave;
其中完成之後使用以下命令查看啓動的情況:
mysql> show slave status;
正常情況下輸出以下內容,要保證 Slave_IO_Running 和 Slave_SQL_Running 是Yes:
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.204.122
Master_User: root
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000007
Read_Master_Log_Pos: 106
Relay_Log_File: mysqld-relay-bin.000002
Relay_Log_Pos: 251
Relay_Master_Log_File: mysql-bin.000007
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
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: 106
Relay_Log_Space: 407
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:
1 row in set (0.00 sec)
錯誤情況有以下幾種:
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.
查看狀態
Last_IO_Errno: 0
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.
解決辦法:因爲服務器克隆的時候提交 UUID 產生了重複 ,解決辦法,在從服務器刪掉該文件
cat /etc/my.cnf
find / -name auto.cnf
cd /var/lib/mysql
rm -rf auto.cnf
全部正常之後可以連接主庫進行插入等操作。觀察從庫的數據。有一定的時間延遲