基於 MySQL 實現主從複製,MySQL 版本 5.7.25

目錄

ー:爲什麼要使用主從複製 ?

二:到底要不要使用相關組件保證高可用 ?

三:配置主從複製


ー:爲什麼要使用主從複製 ?


答:在數據庫主從複製中,一個主數據庫有一個或者多個從數據庫,我們可以對主數據庫進行寫入操作(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_filemaster_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_RunningSlave_SQL_RunningYes

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

全部正常之後可以連接主庫進行插入等操作。觀察從庫的數據。有一定的時間延遲

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章