1. 程式人生 > 實用技巧 >Linux安裝Mysql8.0.20並配置主從複製(一主一從,雙主雙從)

Linux安裝Mysql8.0.20並配置主從複製(一主一從,雙主雙從)

1. 主從複製解釋

  將主資料庫的增刪改查等操作記錄到二進位制日誌檔案中,從庫接收主庫日誌檔案,根據最後一次更新的起始位置,同步複製到從資料庫中,使得主從資料庫保持一致。

2. 主從複製的作用

  • 高可用性:主資料庫異常可切換到從資料庫
  • 負載均衡:實現讀寫分離
  • 備份:進行日常備份

3. Mysql主從複製過程


  Binary log:主資料庫的二進位制日誌;Relay log:從伺服器的中繼日誌。

複製過程:
  (1)主資料庫在每次事務完成前,將該操作記錄到binlog日誌檔案中;
  (2)從資料庫中有一個I/O執行緒,負責連線主資料庫服務,並讀取binlog日誌變化,如果發現有新的變動,則將變動寫入到relay-log,否則進入休眠狀態;
  (3)從資料庫中的SQL Thread讀取中繼日誌,並序列執行SQL事件,使得從資料庫與主資料始終保持一致。

注意事項:
  (1)涉及時間函式時,會出現資料不一致。原因是,複製過程的兩次IO操作和網路、磁碟效率等問題勢必導致時間戳不一致;
  (2)涉及系統函式時,會出現不一致。如:@@hostname,獲取主機名稱,主從資料庫伺服器名稱不一致導致資料不一致;
  (3)......

4. 一主一從配置

  • 伺服器劃分
伺服器IP 角色
192.168.133.129 Master1
192.168.133.130 Slave1
  • 從資料庫安裝
# 進入目錄
cd /opt

# 下載安裝包
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz

# 解壓
tar -xvf mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz

# 拷貝到/usr/local
mv /opt/mysql-8.0.20-linux-glibc2.12-x86_64 /usr/local

# 進入/usr/local
cd /usr/local

# 修改名稱為mysql-8.0.20
mv mysql-8.0.20-linux-glibc2.12-x86_64 mysql-8.0.20

# 建立存放資料資料夾
mkdir /usr/local/mysql-8.0.20/data

# 建立使用者及使用者組
groupadd mysql
useradd -g mysql mysql

# 授權
chown -R mysql.mysql /usr/local/mysql-8.0.20

# 初始化資料庫(記錄臨時密碼)
cd /usr/local/mysql-8.0.20/

./bin/mysqld --user=mysql --lower-case-table-names=1 --basedir=/usr/local/mysql-8.0.20/ --datadir=/usr/local/mysql-8.0.20/data/ --initialize ;

# 配置my.cnf
vi /etc/my.cnf

# 清空,使用下面內容
// 檔案內容開始

[mysqld]
basedir=/usr/local/mysql-8.0.20
datadir=/usr/local/mysql-8.0.20/data
character-set-server=utf8
lower-case-table-names=1
default_authentication_plugin=mysql_native_password

# 主從複製-主機配置
# 主伺服器唯一ID
server-id=1
# 啟用二進位制日誌
log-bin=mysql-bin
# 設定不要複製的資料庫(可設定多個)
binlog-ignore-db=sys
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
# 設定需要複製的資料庫(可設定多個)
binlog-do-db=test
# 設定logbin格式
binlog_format=STATEMENT

// 檔案內容結束

# 建立Mysql服務
cp -a ./support-files/mysql.server /etc/init.d/mysql
chmod +x /etc/init.d/mysql
chkconfig --add mysql

# 檢查服務是否生效
chkconfig --list mysql

# 啟動、停止、重啟
service mysql start
service mysql stop
service mysql restart

# 建立軟連線
ln -s /usr/local/mysql-8.0.20/bin/mysql /usr/bin 

# 登入(使用臨時密碼)
mysql -uroot -p

# 修改密碼
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'new password';

# 退出,使用新密碼登入
quit
mysql -uroot -p

# 修改root許可權,增加遠端連線
use mysql
update user set host ='%' where user='root';
alter user 'root'@'%' identified with mysql_native_password by 'new password';
flush privileges;

# 退出
quit
  • 主資料庫安裝
      和主資料庫安裝一致,當配置檔案內容不同。
# 配置my.cnf
vi /etc/my.cnf

# 清空,使用下面內容
// 檔案內容開始

[mysqld]
basedir=/usr/local/mysql-8.0.20
datadir=/usr/local/mysql-8.0.20/data
character-set-server=utf8
lower-case-table-names=1
default_authentication_plugin=mysql_native_password

# 主從複製-從機配置
# 從伺服器唯一ID
server-id=2
# 啟用中繼日誌
relay-log=mysql-relay

// 檔案內容結束
  • 關閉主從資料庫伺服器防火牆或開放3306埠
# 檢視防火牆狀態
systemctl status firewalld

# 關閉防火牆
systemctl stop firewalld
  • 主從資料庫測試是否已經可以遠端訪問
# 主資料庫伺服器測試從資料庫
mysql -uroot -p -h192.168.133.130 -P3306

# 從資料庫伺服器測試主資料庫
mysql -uroot -p -h192.168.133.129 -P3306
  • 主資料庫建立使用者slave並授權
# 登入
mysql -uroot -p

# 建立使用者
create user 'slave'@'%' identified with mysql_native_password by 'password';

# 授權
grant replication slave on *.* to 'slave'@'%';

# 重新整理許可權
flush privileges;
  • 從資料庫驗證slave使用者是否可用
mysql -uslave -p -h192.168.133.129 -P3306
  • 主資料庫查詢服務ID及Master狀態
# 登入
mysql -uroot -p

# 查詢server_id是否可配置檔案中一致
show variables like 'server_id';

# 若不一致,可設定臨時ID(重啟失效)
set global server_id = 1;

# 查詢Master狀態,並記錄File和Position的值
show master status;

# 注意:執行完此步驟後退出主資料,防止再次操作導致File和Position的值發生變化
  • 從資料庫中設定主資料庫
# 登入
mysql -uroot -p

# 查詢server_id是否可配置檔案中一致
show variables like 'server_id';

# 若不一致,可設定臨時ID(重啟失效)
set global server_id = 2;

# 設定主資料引數
change master to master_host='192.168.133.129',master_port=3306,master_user='slave',master_password='password',master_log_file='mysql-bin.000002',master_log_pos=156;

# 開始同步
start slave;

# 若出現錯誤,則停止同步,重置後再次啟動
stop slave;
reset slave;
start slave;

# 查詢Slave狀態
show slave status\G

# 檢視是否配置成功
# 檢視引數 Slave_IO_Running 和 Slave_SQL_Running 是否都為yes,則證明配置成功。若為no,則需要檢視對應的 Last_IO_Error 或 Last_SQL_Error 的異常值。
  • 測試
      通過工具連線主從資料庫或者在伺服器連線。
      注意:主資料庫的配置檔案中配置了需要同步的資料庫,因此只會同步配置的資料庫,不配置則同步全部。
# 在主資料庫建立資料庫test
create database test;

# 從資料庫檢視
show databases;

# 在主資料庫建立表
use test;
create table t_user(id int, name varchar(20));

# 插入資料
insert into t_user values(1, 'C3Stones');

# 在從資料庫檢視
use test;
select * from t_user;

# 其他刪改查操作請自行測試

5. 雙主雙從配置

  雙主雙從即兩臺主機分別存在兩臺從機,每臺從機只複製對應的主機,兩臺主機互為主備。

  • 伺服器劃分
伺服器IP 角色
192.168.133.129 Master1
192.168.133.130 Slave1
192.168.133.131 Master2
192.168.133.132 Slave2
  • 安裝資料庫請參考上述安裝主資料庫
    四個配置檔案替換如下:
    (1)Mater1
[mysqld]
basedir=/usr/local/mysql-8.0.20
datadir=/usr/local/mysql-8.0.20/data
character-set-server=utf8
lower-case-table-names=1
default_authentication_plugin=mysql_native_password

# 主從複製-主機1配置
# 主伺服器唯一ID
server-id=1
# 啟用二進位制日誌
log-bin=mysql-bin
# 設定不要複製的資料庫(可設定多個)
binlog-ignore-db=sys
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
# 設定需要複製的資料庫(可設定多個)
binlog-do-db=test
# 設定logbin格式
binlog_format=STATEMENT
# 寫入操作更新二進位制日誌檔案
log-slave-updates
# 自增長欄位起始值,預設值為1,取值範圍:1 ~ 65535
auto-increment-increment=2
# 自增長欄位遞增量,取值範圍:1 ~ 65535
auto-increment-offset=1

(2)Mater2

[mysqld]
basedir=/usr/local/mysql-8.0.20
datadir=/usr/local/mysql-8.0.20/data
character-set-server=utf8
lower-case-table-names=1
default_authentication_plugin=mysql_native_password

# 主從複製-主機2配置
# 主伺服器唯一ID
server-id=3
# 啟用二進位制日誌
log-bin=mysql-bin
# 設定不要複製的資料庫(可設定多個)
binlog-ignore-db=sys
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
# 設定需要複製的資料庫(可設定多個)
binlog-do-db=test
# 設定logbin格式
binlog_format=STATEMENT
# 寫入操作更新二進位制日誌檔案
log-slave-updates
# 自增長欄位起始值,預設值為1,取值範圍:1 ~ 65535
auto-increment-increment=2
# 自增長欄位遞增量,取值範圍:1 ~ 65535
auto-increment-offset=2

(3)Slave1

[mysqld]
basedir=/usr/local/mysql-8.0.20
datadir=/usr/local/mysql-8.0.20/data
character-set-server=utf8
lower-case-table-names=1
default_authentication_plugin=mysql_native_password

# 主從複製-從機1配置
# 從伺服器唯一ID
server-id=2
# 啟用中繼日誌
relay-log=mysql-relay

(4)Slave2

[mysqld]
basedir=/usr/local/mysql-8.0.20
datadir=/usr/local/mysql-8.0.20/data
character-set-server=utf8
lower-case-table-names=1
default_authentication_plugin=mysql_native_password

# 主從複製-從機2配置
# 從伺服器唯一ID
server-id=4
# 啟用中繼日誌
relay-log=mysql-relay
  • 雙主雙從資料庫均重啟
service restart mysql
  • 四臺伺服器均關閉防火牆
systemctl stop firewalld
  • 兩臺主資料庫分別建立使用者slave並授權
# 登入
mysql -uroot -p

# 建立使用者
create user 'slave'@'%' identified with mysql_native_password by 'password';

# 授權
grant replication slave on *.* to 'slave'@'%';

# 重新整理許可權
flush privileges;
  • 主從資料庫驗證slave使用者是否可用
# 主資料庫1伺服器測試
mysql -uslave -p -h192.168.133.130 -P3306
mysql -uslave -p -h192.168.133.131 -P3306

# 從資料庫1伺服器測試主資料庫1
mysql -uroot -p -h192.168.133.129 -P3306

# 主資料庫2伺服器測試
mysql -uslave -p -h192.168.133.129 -P3306
mysql -uslave -p -h192.168.133.132 -P3306

# 從資料庫1伺服器測試主資料庫1
mysql -uroot -p -h192.168.133.131 -P3306
  • 兩臺主資料庫查詢服務ID及Master狀態
# 登入
mysql -uroot -p

# 查詢server_id是否可配置檔案中一致
show variables like 'server_id';

# 若不一致,可設定臨時ID(重啟失效)
set global server_id = 1;

set global server_id = 3;

# 查詢Master狀態,並記錄File和Position的值
show master status;

# 注意:執行完此步驟後退出主資料,防止再次操作導致File和Position的值發生變化
  • 從資料庫1中設定主資料庫1
# 登入
mysql -uroot -p

# 查詢server_id是否可配置檔案中一致
show variables like 'server_id';

# 若不一致,可設定臨時ID(重啟失效)
set global server_id = 2;

# 設定主資料引數
change master to master_host='192.168.133.129',master_port=3306,master_user='slave',master_password='password',master_log_file='mysql-bin.000003',master_log_pos=156;

# 開始同步
start slave;

# 若出現錯誤,則停止同步,重置後再次啟動
stop slave;
reset slave;
start slave;

# 查詢Slave狀態
show slave status\G

# 檢視是否配置成功
# 檢視引數 Slave_IO_Running 和 Slave_SQL_Running 是否都為yes,則證明配置成功。若為no,則需要檢視對應的 Last_IO_Error 或 Last_SQL_Error 的異常值。
  • 從資料庫2中設定主資料庫2
# 登入
mysql -uroot -p

# 查詢server_id是否可配置檔案中一致
show variables like 'server_id';

# 若不一致,可設定臨時ID(重啟失效)
set global server_id = 4;

# 設定主資料引數
change master to master_host='192.168.133.131',master_port=3306,master_user='slave',master_password='password',master_log_file='mysql-bin.000001',master_log_pos=156;

# 開始同步
start slave;

# 若出現錯誤,則停止同步,重置後再次啟動
stop slave;
reset slave;
start slave;

# 查詢Slave狀態
show slave status\G

# 檢視是否配置成功
# 檢視引數 Slave_IO_Running 和 Slave_SQL_Running 是否都為yes,則證明配置成功。若為no,則需要檢視對應的 Last_IO_Error 或 Last_SQL_Error 的異常值。
  • 主資料庫1中設定主資料庫2
# 登入
mysql -uroot -p

# 設定主資料引數
change master to master_host='192.168.133.131',master_port=3306,master_user='slave',master_password='password',master_log_file='mysql-bin.000001',master_log_pos=156;

# 開始同步
start slave;

# 若出現錯誤,則停止同步,重置後再次啟動
stop slave;
reset slave;
start slave;

# 查詢Slave狀態
show slave status\G

# 檢視是否配置成功
# 檢視引數 Slave_IO_Running 和 Slave_SQL_Running 是否都為yes,則證明配置成功。若為no,則需要檢視對應的 Last_IO_Error 或 Last_SQL_Error 的異常值。
  • 主資料庫2中設定主資料庫1
# 登入
mysql -uroot -p

# 設定主資料引數
change master to master_host='192.168.133.129',master_port=3306,master_user='slave',master_password='password',master_log_file='mysql-bin.000003',master_log_pos=156;

# 開始同步
start slave;

# 若出現錯誤,則停止同步,重置後再次啟動
stop slave;
reset slave;
start slave;

# 查詢Slave狀態
show slave status\G

# 檢視是否配置成功
# 檢視引數 Slave_IO_Running 和 Slave_SQL_Running 是否都為yes,則證明配置成功。若為no,則需要檢視對應的 Last_IO_Error 或 Last_SQL_Error 的異常值。
  • 測試
      通過工具連線雙主雙從資料庫或者在伺服器連線。
      注意:主資料庫的配置檔案中配置了需要同步的資料庫,因此只會同步配置的資料庫,不配置則同步全部。
# 在主資料1庫建立資料庫test
create database test;

# 其他三個資料庫檢視
show databases;

# 在主資料庫1建立表
use test;
create table t_user(id int, name varchar(20));

# 插入資料
insert into t_user values(1, 'C3Stones');

# 其他三個資料庫檢視
use test;
select * from t_user;

# 其他刪改查操作請自行測試