基於Mycat分散式MySQL資料庫部署實踐指南
Mycat 是一款基於Java開發的開源資料庫中介軟體,是分散式資料庫架構的可選方案。
MySQL、CentOS、Mycat、Java 版本號分別是:
# mysql mysql> select version(); +------------+ | version() | +------------+ | 5.7.17-log | +------------+ # centos ~ cat /etc/centos-release CentOS Linux release 7.2.1511 (Core) # mycat mysql> show @@version; +-----------------------------------------+ | VERSION | +-----------------------------------------+ | 5.6.29-mycat-1.6-RELEASE-20161028204710 | +-----------------------------------------+ # java java -version java version "1.7.0_79" Java(TM) SE Runtime Environment (build 1.7.0_79-b15) Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)
MySQL 主從同步配置
- Master:192.168.7.103
- Slave:192.168.7.117
Master配置
1、授權Slave伺服器
在 master 伺服器 分配帳號 “repl” 給 Slave 伺服器使用。
mysql>GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.%' IDENTIFIED BY 'repl'; mysql>FLUSH PRIVILEGES;
2、修改 Master 的 my.conf 配置
主要改動的地方有:開啟 bin-log、設定 server-id,指定需要同步的資料庫和不需要同步的資料庫,可以指定多個
vim /etc/my.conf
[mysqld] server-id=1 log-bin=mysql-bin log-bin-index=master-bin.index binlog_format=mixed sync-binlog=1 binlog-ignore-db=mysql binlog-ignore-db=test binlog-do-db=ceshi binlog-do-db=users
3、重啟MySQL服務
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld /etc/init.d/mysqld restart
4、檢查 Master 狀態
mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000003 | 1177 | ceshi | mysql | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
二進位制日誌名和偏移量是Slave將要從此處開始複製的位置。
Salve 配置
1、修改 slave 配置資訊 /etc/my.cnf
[mysqld] # log-bin=binlog log-bin=mysql-bin server-id=2 replicate-do-db=ceshi replicate-do-db=users
2、連線 Master
mysql> change master to master_host='192.168.7.103',\ master_user='repl',\ master_password='repl',\ master_log_file='mysql-bin.000003',\ master_log_pos=154;
master_log_file 和 master_log_pos 就是從 Master 開始複製的位置。如果上面命令報錯,那麼需要先執行 stop slave 停止 slave,再執行 reset slave 清空 slave 的配置,然後再從頭開始配置。
3、啟動 Slave 複製
mysql> start slave;
4、檢視同步狀態
mysql> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.7.103 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000003 Read_Master_Log_Pos: 154 Relay_Log_File: lzjun-PC-relay-bin.000002 Relay_Log_Pos: 320 Relay_Master_Log_File: mysql-bin.000003 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: ceshi Replicate_Ignore_DB: Exec_Master_Log_Pos: 154 Relay_Log_Space: 530 Master_Server_Id: 1 1 row in set (0.00 sec)
Slave_IO_Running 和 Slave_SQL_Running 是 YES 表示配置成功。主從同步,如果遇到問題,比如 Slave_SQL_Running 是 No,想重新從0開始同步,可以這樣:
# master RESET MASTER; FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS; mysqldump -u root -p --all-databases > /a/path/mysqldump.sql UNLOCK TABLES; # slave mysql -uroot -p < mysqldump.sql RESET SLAVE; CHANGE MASTER TO master_host='192.168.7.103',\ master_user='repl',\ master_password='repl',\ MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=98; START SLAVE; SHOW SLAVE STATUS;
檢視Slave_IO_Running 和 Slave_SQL_Running 是否為 YES
同步 Master 資料到 Slave
master
# 鎖錶停止更新操作 mysql>flush tables with read lock; # 備份資料 mysqldump -uroot -p123456 ceshi > ceshi.sql # 解鎖 mysql>unlock tables;
slave
# 停止slave mysql> stop slave ; # 新建資料庫 mysql> create database ceshi default charset utf8; # 匯入資料 mysql -uroot -p123456 ceshi<ceshi.sql # 啟動slave mysql>start slave;
至此,MySQL 的主從搭建完了,接下來使用 MyCat 實現讀寫分離
MyCat 讀寫分離配置
Mycat 安裝
安裝mycat的前置條件是安裝JVM
wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/7u79-b15/jdk-7u79-linux-x64.rpm" sudo yum localinstall jdk-7u79-linux-x64.rpm
mycat 下載地址: https://github.com/MyCATApache/Mycat-download 直接下載,解壓既可以,另外一個可選的下載地址是:http://dl.mycat.io/1.6-RELEASE/
配置 Mycat
Mycat 的核心配置檔案是 server.xml 和 schema.xml,server.xml 是Mycat伺服器調優配置和使用者授權的配置檔案
1、修改 server.xml
<user name="test"> <property name="password">test</property> <property name="schemas">TESTDB</property> </user>
使用者名稱 test,密碼 test,資料庫 TESTDB,這是 mycat 的邏輯庫,由應用程式連線該資料庫
2、修改 schema.xml
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"> <table name="account" dataNode="dn1"/> <table name="orders" dataNode="dn1"/> </schema> <dataNode name="dn1" dataHost="localhost1" database="bao_db" /> <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="hostM1" url="127.0.0.1:3306" user="baouser" password="baouser&56"> <readHost host="hostS2" url="192.168.7.117:3306" user="mycat_test" password="123456" /> </writeHost> </dataHost>
- schema 中的 TESTDB 就是 server.xml 中指定的邏輯庫,裡面的邏輯表要對映到物理庫中的表。
- dataHost 配置的真正的物理庫,這裡面我指定了一個寫庫 hostM1 和一個讀庫 hostS2
3、啟動 mycat
/usr/local/mycat/bin/mycat start
用 lsof 確定是否正常啟動
[[email protected] bin]# lsof -i:9066 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 89491 root 90u IPv6 2006454 0t0 TCP *:9066 (LISTEN)
也可以使用 ps 命令
[[email protected] bin]# ps -ef |grep mycat root 89489 1 0 10:01 ? 00:00:00 /usr/local/mycat/bin/./wrapper-linux-x86-64 /usr/local/mycat/conf/wrapper.conf wrapper.syslog.ident=mycat wrapper.pidfile=/usr/local/mycat/logs/mycat.pid wrapper.daemonize=TRUE wrapper.lockfile=/var/lock/subsys/mycat
4、連線 mycat
mysql -utest -ptest -P9066 -dTESTDB
引數都是server.xml 中指定的值,mycat 的埠預設是9066
常見問題
啟動 mycat 報錯
STATUS | wrapper | 2017/04/26 09:57:23 | Launching a JVM... ERROR | wrapper | 2017/04/26 09:57:23 | Unable to start JVM: No such file or directory (2)
這是因為mycat找不到jvm執行環境,首先確定系統是否已經安裝了jvm,然後確定是否設定好了環境變數。
vim /etc/proflie
export JAVA_HOME=/usr/local/jre export JRE_HOME=/usr/local/jre export CLASS_PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib export PATH=.:$PATH:$JAVA_HOME/bin
wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz ./mycat start # 啟動 ./mycat stop # 停止 ./mycat status # 檢視啟動狀態 mysql -uroot -proot -P8066 -h127.0.0.1 # 通過mycat連線mysql 使用者和密碼就是mysql的使用者的密碼
Skip one error in the replication
STOP SLAVE; SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; START SLAVE;
參考文件:
- http://www.cnblogs.com/ivictor/p/5131480.html
- http://www.cnblogs.com/LCX/archive/2010/03/10/1682227.html
- https://github.com/MyCATApache/Mycat-Server
關注公眾號「Python之禪」(id:vttalk)獲取最新文章