踩的坑多了,做个小记
案例:基于四台服务器实现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