踩的坑多了,做個小記
案例:基於四臺服務器實現mysql讀寫分離,一臺mycat代理服務器,另三臺配置mysql一主多從,實現讀的負載均衡
一:環境準備
Mycat代理服務器
ip: 192.168.1.113 centos 7
mycat : Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz(二進制包)
mariadb master :
ip: 192.168.1.21 centos 7
mariadb: mariadb yum 5.5.65
mariadb slave1 :
ip: 192.168.1.22 centos 7
mariadb: mariadb yum 5.5.65
mariadb slave2 :
ip: 192.168.1.23 centos 7
mariadb: mariadb yum 5.5.65
二、配置主從
過程請見我上次文章:“centos7 mysql主從(mariadb)”
https://blog.csdn.net/oToyix/article/details/106511065
三、安裝mycat
1、安裝環境支持jdk,直接yum安裝search到的最高版本
[root@localhost ~]# yum install java-1.8.0-openjdk –y
2、安裝mycat
[root@localhost ~]# cd /usr/src/
[root@localhost src]# wget http://dl.mycat.io/1.6.7.1/Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz
[root@localhost src]# mkdir /usr/local/mycat
[root@localhost src]# tar -xvf Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz -C /usr/local/
[root@localhost src]# cd /usr/local/mycat/
[root@localhost mycat]# ls
bin catlet conf lib logs version.txt
配置mycat環境變量
[root@localhost ~]# echo "export PATH=/usr/local/mycat/bin:$PATH" >/etc/profile.d/mycat.sh
[root@localhost ~]# chmod +x /etc/profile.d/mycat.sh
[root@localhost ~]# source /etc/profile.d/mycat.sh
四、配置讀寫分離
1、在主從庫中設置對mycat服務器的授權
因做了主從,只在主庫上設置一遍即可,從庫會自動同步過去
192.168.1.21:master中
[root@localhost ~]# mysql
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 6
Server version: 5.5.65-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> grant all on *.* to "mycat-proxy"@"192.168.1.113" identified by "123456";
Query OK, 0 rows affected (0.01 sec)
MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
對IP爲192.168.1.113,用戶名:mycat-proxy密碼:123456授權
2、配置mycat
[root@localhost ~]# vim /usr/local/mycat/conf/server.xml設置邏輯用戶、邏輯庫,給前端程序連接使用
100 <user name="mycat" defaultAccount="true">
101 <property name="password">123456</property>
102 <property name="schemas">mycatdb</property>
103
104 <!-- 表級 DML 權限設置 -->
105 <!--
106 <privileges check="false">
107 <schema name="TESTDB" dml="0110" >
108 <table name="tb01" dml="0000"></table>
109 <table name="tb02" dml="1111"></table>
110 </schema>
111 </privileges>
112 -->
113 </user>
114
115 <user name="user">
116 <property name="password">user</property>
117 <property name="schemas">mycatdb</property>
118 <property name="readOnly">true</property>
119 </user>
120
121 </mycat:server>
注:
1)、user name=“mycat” 爲邏輯用戶,是給前端使用的
2)、mycatdb 爲邏輯庫,給前端使用的,跟後端真實庫名可以不一樣
3)、defaultAccount=“true” 開啓用戶讀寫功能,一般把這一段給前端
3、配置schema.xml
配置後端真實數據庫信息(讀寫分離)
[root@localhost ~]# cp /usr/local/mycat/conf/schema.xml{,.bak} 先備份
[root@localhost ~]# vim /usr/local/mycat/conf/schema.xml
vim /usr/local/mycat/conf/schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="mycatdb" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<dataNode name="dn1" dataHost="localhost1" database="tb" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.1.21:3306" user="mycat-proxy" password="123456">
<readHost host="hostS2" url="192.168.1.22:3306" user="mycat-proxy" password="123456" />
<readHost host="hostS3" url="192.168.1.23:3306" user="mycat-proxy" password="123456" />
</writeHost>
<writeHost host="hostM2" url="192.168.1.22:3306" user="mycat-proxy" password="123456" />
<writeHost host="hostM3" url="192.168.1.23:3306" user="mycat-proxy" password="123456" />
</dataHost>
</mycat:schema>
上面配置解釋:
主庫(寫庫): 192.168.1.21:3306
從庫(讀庫): 192.168.1.22:3306 192.168.1.23:3306
正常情況下,主庫寫,從庫讀
當主庫down機時,從庫寫,從庫讀
注:
balance=0 只走主庫
balance=1 所有庫都參與且有均衡,主從各一下
balance=2 所有庫都參與,但是隨機的
balance=3 所有讀都走從庫,寫不參與,只均衡讀庫,但不影響主庫的寫入
schema name=“mycatdb” 對應server中的邏輯庫
checkSQLschema=“false” 檢查語法
sqlMaxLimit=“100” sql返回數據限制100行
dataNode=“dn1” 數據節點,不是真實數據庫,一個標識
dataHost=“localhost1” 一般寫主機名,可以知道數據在後端哪臺服務器上,可以不改,本配置文件中要一致
dataNode=“wordpress” 對應後臺真實數據庫
maxCon=“1000” 最大鏈接,併發1000
minCon=“10” 最小鏈接,支持10個
database=“tb” 後端真實數據庫名
五、後端服務器給mycat授權
grant all on . to “mycat-proxy”@“192.168.1.11” identified by “123456”;
MariaDB [(none)]> grant all on *.* to "mycat-proxy"@"192.168.1.113" identified by "123456";
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
六、測試
在現有的數據庫tb中新建表,:
1、在從庫192.168.1.22上新建表:slave22
MariaDB [tb]> create table slave22 (name varchar(20));
2、從從庫192.168.1.23上新建表:slave23
MariaDB [tb]> create table slave23 (name varchar(20));
3、然後在mycat代理服務器上輸入mysql -h 127.0.0.1 -umycat -p123456 -P8066 -e "use mycat;show tables;"來查看結果
[root@localhost ~]# mysql -h 127.0.0.1 -umycat -p123456 -P8066 -e "use mycatdb;show tables;"
+--------------+
| Tables_in_tb |
+--------------+
| slave23 |
+--------------+
[root@localhost ~]# mysql -h 127.0.0.1 -umycat -p123456 -P8066 -e "use mycatdb;show tables;"
+--------------+
| Tables_in_tb |
+--------------+
| slave22 |
+--------------+
[root@localhost ~]# mysql -h 127.0.0.1 -umycat -p123456 -P8066 -e "use mycatdb;show tables;"
+--------------+
| Tables_in_tb |
+--------------+
| slave23 |
+--------------+
[root@localhost ~]# mysql -h 127.0.0.1 -umycat -p123456 -P8066 -e "use mycatdb;show tables;"
+--------------+
| Tables_in_tb |
+--------------+
| slave22 |
+--------------+
[root@localhost ~]# mysql -h 127.0.0.1 -umycat -p123456 -P8066 -e "use mycatdb;show tables;"
+--------------+
| Tables_in_tb |
+--------------+
| slave22 |
+--------------+
結果:查詢發生在從庫22與23之中,實現了讀的負載均衡
注:
8066爲給前端端口,9066爲管理端口
-------------end