Windows上模擬MySQL主從設置,讀寫分離

對於互聯網架構來說,MySQL讀寫分離是很重要的。所以今天我決定在我自己的電腦上模擬下。

我一開始本以爲可以用一個MySQL服務,建立兩個數據庫來模擬。但是網上的教程都是修改MySQL的配置文件,所以我只好另外又安裝了個MySQL。爲了避免不必要的麻煩,我們儘量保證MySQL版本一致。

我第一個MySQL是msi安裝包安裝的,在網上我下載的第二個MySQL是壓縮包形式的。所以,我們從配置這種解壓好的MySQL開始,如果自己會配置的話請忽略。

爲了避免命令衝突,第二個MySQL我並不打算配置環境變量。以MySQL5.7版本爲例,新建my.ini配置文件和data文件夾用來保存數據(有的版本帶有此文件或文件夾,那就請可以直接編輯這個文件了)。

[mysqld]
port = 3307
basedir=F:/mysql5.7
datadir=F:/mysql5.7/data 
max_connections=200
character-set-server=utf8
default-storage-engine=INNODB
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
[mysql]
default-character-set=utf8

然後把上面的內容複製到my.ini文件裏面,注意port,端口號不要衝突。原來的MySQL是3306,這次我搞成了3307。然後就是兩個目錄配置,改成自己的目錄。

然後用管理員打開dos窗口,進入到MySQL安裝目錄的bin目錄下,輸入命令  .\mysqld -install mysqld,等出現成功後繼續輸入  .\mysqld --initialize-insecure --user=mysql 初始化。第一個命令是把MySQL安裝爲一個服務,因爲相同版本的MySQL服務名都是MySQL,所以我們修改這個3307的從庫服務名爲mysqld(兩個數據庫不在一個服務器上的請忽略,端口都可以不變)。

此時,我們打開剛剛創建的data目錄,就發現裏面多了很多東西。接下來,我們進入MySQL,並且更改密碼。用戶名爲root,初始是沒有密碼的。當我使用mysqladmin -u root -p password命令設置密碼時,我發現這個從庫的MySQL密碼還是空,原來的MySQL密碼變了。鬱悶。不過,我們可以使用navicat來解決這種窘境,具體navicat怎麼修改用戶密碼請出門百度。

 

然後大家看到了麼,我這就出現了兩個MySQL服務。姐下來,我們就可以開始着手配置MySQL主從架構了。

然後我們去修改my.ini。突然意識到,MySQL5.7安裝包裏面沒有my,ini呀!其實不是沒有,而是在C:\ProgramData\MySQL\MySQL Server 5.7這個目錄下。總之就是ProgramData這個文件夾下面。如果找不到ProgramData文件夾的話請放棄IT行業。

首先我們去改主庫的配置文件。

這個log-bin默認是註釋掉的,代表主庫的二進制日誌。熟悉主從複製原理的同學們應該知道,MySQL從庫就是讀取這個文件去拷貝數據的,我們把它打開並且賦值爲mysql-bin。然後,配置從庫不需要賦值的數據庫

[mysqld]

replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema

服務器的id我們先不用管,但是必須和從庫不一樣。就是這個字段

主庫的配置到此就差不多了,接下來去從庫配置。

我們去改從庫的server-id,設置成2就好了,反正每個數據庫都要讓他不一樣。

然後,設置不需要去拷貝的數據庫

replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema

配置好了重啓兩個MySQL服務。

有些人願意讓每個從庫以新用戶的身份去主庫複製數據,因爲我們做的是小demo,所以直接使用root用戶操作。

去主庫執行show master status,記住File和Position的值。

再去從庫執行

change master to master_host='127.0.0.1',master_user='root',master_password='1234',master_log_file='mysql_bin.000001',
master_log_pos=0,master_port=3306;

注意,host,log_filr,port要改成自己的。然後從庫執行start slave;

然後show slave status,你就發現了喜人的狀態。具體看Salve_IO_Running和Slave_SQL_Running,如果都是yes,那就沒問題了。

注意,在start slave之前,必須要把主庫的數據手動複製一遍去從庫(可以導出sql去從庫執行一遍),否則如果主庫直接去現有數據庫操作數據時,從庫會因爲找不到此數據庫而報錯。如果我們沒有這麼做,此時,我們查看從庫狀態,發現從庫的io線程仍在運行,但是sql線程不在運行了。這時候,我們可以去主庫鎖定所有表,防止再有數據更改。

flush tables with read lock;

然後去從庫停止,

stop slave

再設置錯誤sql跳過,你可以設置爲1,show slave status。如果sql線程還沒有啓動,那就設置爲2,直到sql線程啓動。

然後start slave,別忘了去主庫unlock tables解鎖哦!

測試主從配置是否成功,在navicat裏面新建數據庫tttt,新建表id,保存後,發現從庫自己就同步過來了,啊哈哈哈

至此,我們的demo配置就完成了。

注意事項

  • 一般我們需要設置從庫只允許讀,不允許寫。只需要去配置文件裏面,【mysqld】下面加入read-only = 1就好了。這個值爲0表示支持可讀寫、1的話表明僅支持可讀
  • 其實主從數據庫的配置區別主要就是server-id和這個read-only
  • 最好在從庫啓動之前先把主庫的數據拷貝過來,此時一般需要鎖住MySQL主庫。
  • 如果出現錯誤了,我們需要根據情況去決策,我這裏是跳過此錯誤,但是實際生產上,往往是重新備份的。
  • 其實可以直接指定從庫的master_log_pos,賦值爲剛剛要你記住的主庫的Position值,這樣就不會出現錯誤了,但是同步之前的數據是不會被拷貝過來的。

 

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