共計 7619 個字符,預計需要花費 20 分鐘才能閱讀完成。
行業資訊
數據庫
MySQL 數據庫
基于 mysql+mycat 如何搭建穩定高可用集群負載均衡主備復制讀寫分離操作
自動寫代碼機器人,免費開通
這篇文章主要介紹基于 mysql+mycat 如何搭建穩定高可用集群負載均衡主備復制讀寫分離操作,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
主要思路
簡單說,實現 mysql 主備復制 – 利用 mycat 實現負載均衡。
比較了常用的讀寫分離方式,推薦 mycat,社區活躍,性能穩定。
測試環境
MYSQL 版本:Server version: 5.5.53,到官網可以下載 WINDWOS 安裝包。
注意:確保 mysql 版本為 5.5 以后,以前版本主備同步配置方式不同。
linux 實現思路類似,修改 my.cnf 即可。
A 主 mysql。192.168.110.1:3306, 用戶 root,密碼 root。操作系統:win7 x64,內存:4g
安裝路徑:C:\Program Files\MySQL\MySQL Server 5.5\bin
B 備 mysql。192.168.110.2:3306, 用戶 root,密碼 root。操作系統:win2003 x64,內存:1g
安裝路徑:C:\Program Files\MySQL\MySQL Server 5.5\bin
A 主、B 備的 mysql 中創建 sync_test 數據庫
實現 mysql 主備復制
主要思路:A 主 mysql 開啟日志,B 備 mysql 讀取操作日志,同步執行。
一般為主備同步,主主同步不推薦使用。
配置 A 主 mysql
1)修改 my.ini。需要在 log-bin= C:/Program Files/MySQL/MySQL Server 5.5/log/mysql-bin.log 的相關位置創建 log 目錄,以及 mysql-bin.log 文件。
[mysqld]
server-id=1 # 主機標示,整數
port=3306
log-bin= C:/Program Files/MySQL/MySQL Server 5.5/log/mysql-bin.log # 確保此文件可寫
read-only=0 # 主機,讀寫都可以
binlog-do-db=sync_test # 需要備份數據庫,多個寫多行
binlog-ignore-db=mysql # 不需要備份的數據庫,多個寫多行
2)允許 MYSQL 遠程訪問
# 登錄 mysql console
進入 %home%/bin,執行 mysql -uroot -proot
#授權。允許 root 用戶,從 192.168.110.* 的 IP 范圍 遠程訪問 A 主 mysql
mysql GRANT ALL PRIVILEGES ON *.* TO root @ 192.168.110.* IDENTIFIED BY root WITH GRANT OPTION;
#生效。該操作很重要!mysql FLUSH PRIVILEGES;
3)重啟 A 主 mysql 數據庫
進入 %home%/bin,執行 mysql -uroot -proot
mysql net stop mysql;
mysql net start mysql;
4)查看主 mysql 日志狀態
mysql show master status\G;
*************************** 1. row ***************************
File: mysql-bin.000003
Position: 107
Binlog_Do_DB: sync_test
Binlog_Ignore_DB: mysql
1 row in set (0.00 sec)
ERROR:
No query specified
配置 B 備 mysql
1)修改 my.ini。需要在 log-bin= C:/Program Files/MySQL/MySQL Server 5.5/log/mysql-bin.log 的相關位置創建 log 目錄,以及 mysql-bin.log 文件。
[mysqld]
# add for sycn test
server-id=2 # 從機標識
log-bin= C:/Program Files/MySQL/MySQL Server 5.5/log/mysql-bin.log # 確保此文件可寫
#master-host= 192.168.110.1 # 主機 Ip
#master-user=root # 數據庫訪問用戶名
#master-pass=root # 數據庫訪問密碼
#master-port=3306 # 主機端口
#master-connect-retry=60 # 如果從服務器發現主服務器斷掉,重新連接的時間差 (秒)
replicate-do-db=sync_test # 只復制某個庫
replicate-ignore-db=mysql # 不復制某個庫
2)重啟 B 備 mysql 數據庫
進入 %home%/bin,執行 mysql -uroot -proot
mysql net stop mysql;
mysql net start mysql;
3)配置 B 備數據庫的數據來源,核實高亮處的狀態是否正常。
mysql change master to master_host= 192.168.110.1 ,master_port= 3306 ,master_user= root ,master_password= root
mysql slave start;
mysql show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send even
Master_Host: 192.168.110.1
Master_User: root
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 107
Relay_Log_File: wjt-1c698d8a032-relay-bin.00001
Relay_Log_Pos: 253
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: sync_test
Replicate_Ignore_DB: mysql
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: 107
Relay_Log_Space: 565
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:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
1 row in set (0.00 sec)
ERROR:
No query specified
驗證同步配置結果
A 主 mysql:使用 navicat 工具,在 sync_test 庫中創建 sync_table 表,并添加一些數據
B 備 mysql:使用 navicat 工具,查看 sync_test 庫,可以看到 sync_table 表和數據已被同步
實現讀寫分離
主要思路:使用 mycat 中間件,轉發 sql 指令到后端 mysql 節點。mycat 不負責數據庫同步。
安裝 mycat
mycat 是什么?可以認為它是一個數據庫訪問中間件,但更像 f5、ngnix 等產品,具備訪問路由、多表分表分片操作等功能。總之很強大。
下載:http://www.mycat.io/,本文使用的是:1.6-RELEASE
解壓 Mycat-server-1.6-RELEASE-20161012170031-win.tar,到 D:\dev-bin\mycat 目錄
確保 java 環境為 jdk1.7 以上,否則 mycat 將不支持
安裝完畢
配置 mycat
1)server.xml。配置訪問用戶及權限。修改高亮處信息,其中 admin、user 為訪問 mycat 的用戶,TESTDB 為 mycat 虛擬的數據庫,供上層應用訪問。
user name= admin
property name= password admin /property
property name= schemas TESTDB /property
!-- 表級 DML 權限設置 --
!--
privileges check= false
schema name= TESTDB dml= 0110
table name= tb01 dml= 0000 /table
table name= tb02 dml= 1111 /table
/schema
/privileges
--
/user
user name= user
property name= password user /property
property name= schemas TESTDB /property
property name= readOnly true /property
/user
2)schema.xml。這部分不太好理解,精簡了一下,主要分 schema、dataNode、dataHost 三個主要配置。
scheme 節點定義了 mycat 的虛擬數據庫為 TESTDB,balance= 1:write 操作路由到 A 機,讀操作路由到 B。
?xml version= 1.0 ?
!DOCTYPE mycat:schema SYSTEM schema.dtd
mycat:schema xmlns:mycat= http://io.mycat/
schema name= TESTDB checkSQLschema= false sqlMaxLimit= 100 dataNode= dn1
!-- 這里不配置,代表所有的表分片到 dn1 節點 --
/schema
dataNode name= dn1 dataHost= localhost1 database= sync_test /
dataHost name= localhost1 maxCon= 1000 minCon= 10 balance= 1
writeType= 0 dbType= mysql dbDriver= native switchType= 1 slaveThreshold= 100
heartbeat select user() /heartbeat
!-- can have multi write hosts --
writeHost host= hostM1 url= 192.168.110.1:3306 user= root password= root
!-- can have multi read hosts --
readHost host= hostS2 url= 192.168.110.2:3306 user= root password= root /
/writeHost
/dataHost
/mycat:schema
啟動 mycat
1)啟動 mycat
D:\dev-bin\mycat\bin startup_nowrap.bat
后臺信息如下:
D:\dev-bin\mycat\bin startup_nowrap.bat
D:\dev-bin\mycat\bin REM check JAVA_HOME java
D:\dev-bin\mycat\bin set JAVA_CMD=C:\Program Files (x86)\Java\jdk1.7.0_13/bin/java
D:\dev-bin\mycat\bin if C:\Program Files (x86)\Java\jdk1.7.0_13 == goto noJavaHome
D:\dev-bin\mycat\bin if exist C:\Program Files (x86)\Java\jdk1.7.0_13\bin\java.exe goto mainEntry
D:\dev-bin\mycat\bin REM set HOME_DIR
D:\dev-bin\mycat\bin set CURR_DIR=D:\dev-bin\mycat\bin
D:\dev-bin\mycat\bin cd ..
D:\dev-bin\mycat set MYCAT_HOME=D:\dev-bin\mycat
D:\dev-bin\mycat cd D:\dev-bin\mycat\bin
# 如果啟動失敗,請修改 D:\dev-bin\mycat\bin\startup_nowrap.bat 文件中的以下參數。默認占用內存為 2G
D:\dev-bin\mycat\bin C:\Program Files (x86)\Java\jdk1.7.0_13/bin/java -server -Xms512m -Xmx512m -XX:MaxPermSize=64M -XX:+AggressiveOpts -XX:MaxDirectMemorySize=768m -DMYCAT_HOME=D:\
p ..\conf;..\lib\* io.mycat.MycatStartup
MyCAT Server startup successfully. see logs in logs/mycat.log #啟動成功將看到如下信息。
注意:如日志中出現 192.168.110.2 not connected 等信息,請允許 B 備 mysql 遠程訪問。
# 登錄 mysql console
進入 %home%/bin,執行 mysql -uroot -proot
#授權。允許 root 用戶,從 192.168.110.* 的 IP 范圍 遠程訪問 Bmysql
mysql GRANT ALL PRIVILEGES ON *.* TO root @ 192.168.110.* IDENTIFIED BY root WITH GRANT OPTION;
#生效, 該操作很重要!mysql FLUSH PRIVILEGES;
測試讀寫分離
驗證是否同步
使用 navicat 連接 mycat,操作方式和連接物理 mysql 庫一致,用戶 admin,密碼 admin,端口 8066
在 TESTDB 虛擬庫中,創建新表 test2,增加一些數據
查看 A 節點、B 節點數據已同步
關閉 B 備 mysql 的同步,驗證讀寫分離
mysql slave stop;
Query OK, 0 rows affected (0.00 sec)
mysql show slave status\G;
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: 192.168.110.1
Master_User: root
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 478
Relay_Log_File: wjt-1c698d8a032-relay-bin.00001
Relay_Log_Pos: 624
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: No
Slave_SQL_Running: No
Replicate_Do_DB: sync_test
Replicate_Ignore_DB: mysql
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: 478
Relay_Log_Space: 936
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: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
1 row in set (0.00 sec)
ERROR:
No query specified
3)使用 navicat 連接 mycat,操作方式和連接物理 mysql 庫一致,用戶 admin,密碼 admin,端口 8066
連接成功后,將看到 TESTDB 數據庫和 test 數據表
在 test 表中添加一些數據,保存
執行 select * from test 查看 test 操作,將看到數據未更新
原因:mycat 將查詢 sq 路由到 B,因此讀取的結果集不一致。
最后,mycat 使用可以參見官網的權威指南學習。雙主雙備架構待后續更新。
以上是“基于 mysql+mycat 如何搭建穩定高可用集群負載均衡主備復制讀寫分離操作”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注丸趣 TV 行業資訊頻道!
向 AI 問一下細節