MySql多例項配置及一主多從環境搭建
主從複製原理
- 當 master 主伺服器上的資料發生改變時,則將其改變寫入二進位制日誌檔案中
- salve 從伺服器會在一定時間間隔內對 master 主伺服器上的二進位制日誌進行探測,探測其是
否發生過改變 - 如果探測到 master 主伺服器的二進位制日誌發生了改變,則開始一個 I/O Thread 請求
master 二進位制日誌 - 同時 master 主伺服器為每個 I/O Thread 啟動一個 dump Thread,用於向其傳送二進位制日
志 - slave 從伺服器將接收到的二進位制事件儲存至自己本地的中繼日誌檔案中
- salve 從伺服器將啟動 SQL Thread 從中繼日誌中讀取二進位制日誌,在本地重放,使得其資料
和主伺服器保持一致 - 最後 I/O Thread 和 SQL Thread 將進入睡眠狀態,等待下一次被喚醒;
MySQL 主從複製原理圖
多例項概述
- MySQL多例項是指安裝MySQL之後,我們可以在一臺Linux伺服器上同時啟動多個MySQL資料庫(例項),不需要安裝多個MySQL
-
如果是有多臺Linux伺服器,那麼我們需要每臺伺服器都分別安裝MySQL
-
在一臺Linux伺服器上啟動多個MySQL資料庫(例項),通過為各個資料庫例項配置獨立的配置檔案來實現,即每個資料庫例項有自己單獨的配置檔案
多例項配置
-
在MySQL安裝主目錄下建立/data/3307, /data/3308/兩個目錄
-
執行資料庫初始化,在MySQL的/usr/local/mysql-5.7.18/bin目錄下執行命令
-
./mysqld --initialize-insecure --basedir=/usr/local/mysql-5.7.18 --datadir=/usr/local/mysql-5.7.18/data/3307 --user=mysql
./mysqld --initialize-insecure --basedir=/usr/local/mysql-5.7.18 --datadir=/usr/local/mysql-5.7.18/data/3308 --user=mysql
-
其中 initialize-insecure 表示不生成MySQL資料庫root使用者的隨機密碼,即root密碼為空
-
在/data/3307, /data/3308/兩個目錄下分別建立一個my.cnf檔案
-
配置兩個MySQL資料庫服務的my.cnf檔案
-
[client]
port = 3307
socket = /usr/local/mysql-5.7.18/data/3307/mysql.sock
default-character-set=utf8
[mysqld]
port = 3307
socket = /usr/local/mysql-5.7.18/data/3307/mysql.sock
datadir = /usr/local/mysql-5.7.18/data/3307
log-error = /usr/local/mysql-5.7.18/data/3307/error.log
pid-file = /usr/local/mysql-5.7.18/data/3307/mysql.pid
character-set-server=utf8
lower_case_table_names=1
autocommit = 1
-
多資料庫例項就搭建好了
多例項啟動多例項啟動
-
切換到/usr/local/mysql-5.7.18/bin目錄下,使用 msyqld_safe 命令指定配置檔案並啟動MySQL服務
-
./mysqld_safe --defaults-file=/usr/local/mysql-5.7.18/data/3307/my.cnf &
./mysqld_safe --defaults-file=/usr/local/mysql-5.7.18/data/3308/my.cnf &
啟動後配置
- 登入進入mysql,在mysql-5.7.18/bin目錄下執行命令
-
./mysql -uroot -p -S /usr/local/mysql-5.7.18/data/3307/mysql.sock
-
其中 -p 是指定密碼,如果沒有密碼則可以不寫 -p,-S是指定sock檔案,mysql.sock檔案是伺服器與本機客戶端進行通訊的ip與埠檔案
或者使用用埠、主機登入 ./mysql -uroot -p -P3307 -h127.0.0.1 登入進入MySQL
-
修改mysql的密碼,執行:
-
alter user 'root'@'localhost' identified by '123456';
(其中123456是我們設定的密碼)
-
授權遠端訪問,執行命令:(這樣遠端客戶端才能訪問)
-
grant all privileges on *.* to [email protected]'%' identified by '123456';
-
其中*.* 的第一個*表示所有資料庫名,第二個*表示所有的資料庫表;
[email protected]'%' 中的root表示使用者名稱,%表示ip地址,%也可以指定具體的ip地址,比如[email protected],[email protected]
-
執行以下如下命令重新整理許可權:
-
執行以下如下命令重新整理許可權:
-
Tip:修改密碼,授權遠端訪問,重新整理許可權三行命令一起執行
alter user 'root'@'localhost' identified by '123456';
grant all privileges on *.* to [email protected]'%' identified by '123456';
flush privileges;
多例項關閉
- 切換到/usr/local/mysql-5.7.18/bin目錄下,使用 mysqladmin 命令 shutdown
-
方式一: ./mysqladmin -uroot -p -S /usr/local/mysql-5.7.18/data/3307/mysql.sock shutdown
-
方式二:./mysqladmin -uroot -p -P3307 -h127.0.0.1 shutdown
-
方式三: 如果已經進入到了MySQL的命令列,可以直接執行 shutdown;
-
退出MySQL命令列,執行: exit
一主多從環境搭建,一主多從和一主一從只是從機器多配置了幾個,其他都是一樣的
環境配置
- 配置主從MySQL配置檔案my.cnf
-
主(3307)裡面加入
-
log-bin=mysql-bin #表示啟用二進位制日誌
-
server-id=3307 #表示server編號,編號要唯一,可以是數字1,2,3......,但是不能重複,一般用埠號表示
-
從(3308)裡面加入
server-id=3308 #表示server編號,編號要唯一
-
*****************************************************************************
-
配置主伺服器 3307 my.cnf
[client]
port = 3307
socket = /usr/local/mysql-5.7.18/data/3307/mysql.sock
default-character-set=utf8
[mysqld]
port = 3307
socket = /usr/local/mysql-5.7.18/data/3307/mysql.sock
datadir = /usr/local/mysql-5.7.18/data/3307
log-error = /usr/local/mysql-5.7.18/data/3307/error.log
pid-file = /usr/local/mysql-5.7.18/data/3307/mysql.pid
character-set-server=utf8
lower_case_table_names=1
autocommit = 1
### Master Slave ###
log-bin=mysql-bin
server-id=3307
-
*****************************************************************************
-
配置從伺服器 3308 my.cnf
[client]
port = 3308
socket = /usr/local/mysql-5.7.18/data/3308/mysql.sock
default-character-set=utf8
[mysqld]
port = 3308
socket = /usr/local/mysql-5.7.18/data/3308/mysql.sock
datadir = /usr/local/mysql-5.7.18/data/3308
log-error = /usr/local/mysql-5.7.18/data/3308/error.log
pid-file = /usr/local/mysql-5.7.18/data/3308/mysql.pid
character-set-server=utf8
lower_case_table_names=1
autocommit = 1
### Master Slave ###
server-id=3308
-
*****************************************************************************
服務啟動
-
進入/usr/local/mysql-5.7.18/bin目錄,重啟兩個MySQL服務,啟動時指定配置檔案啟動:
-
./mysqld_safe --defaults-file=/usr/local/mysql-5.7.18/data/3307/my.cnf &
./mysqld_safe --defaults-file=/usr/local/mysql-5.7.18/data/3308/my.cnf &
設定主從關係
- 在主伺服器上建立複製資料的賬號並授權:
-
grant replication slave on *.* to 'copy'@'%' identified by '123456';
- 建議重置一下主服務狀態,執行命令:reset master;
-
要不要重置,你可以檢視一下master的狀態
show master status; 命令檢視master的狀態
如果二進位制日誌檔案的偏移量座標不是154,建議重置一下master的狀態
-
在主伺服器上執行命令,獲取主伺服器二進位制binlog檔名及座標(二進位制檔名和座標值在後面會用到)
show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+在從伺服器上執行命令,設定從伺服器的master
-
建議重置一下slave的狀態
stop slave;
reset slave;
你可以先檢視一下slave的狀態
show slave status; 命令檢視slave的狀態
如果slave的狀態是空的,那可以不用重置slave的狀態,否則就需要重置一下
-
在從伺服器上執行,很核心的一步,設定主從關係
change master to master_host='master的ip',master_user='copy',
master_port=3307,master_password='123456',
master_log_file='mysql-bin.000001',master_log_pos=154;
-
在從機器上執行開始複製命令
start slave;
主從驗證
- 檢查從伺服器複製功能狀態
-
mysql> show slave status;
-
Slave_IO_Running和Slave_SQL_Running為YES,就是正常狀態。
-
在主伺服器上建立資料庫、表、資料,然後在從伺服器上檢視是否已經複製
-
以上操作過程顯示正常,則主從伺服器配置完成;
-
檢視主從複製binlog日誌檔案內容:show binlog events in 'mysql-bin.000001';
-
配置完成