返回列表 发帖

CentOS8_Mycat实现MySQL的读写分离

Mycat是基于Java语言编写的数据库中间件,后端可支持MySQL、MariaDB、SQL Server、Oracle、DB2等主流数据库;其核心功能是分库、分表;可实现数据库集群。

图片1.png
2021-3-22 10:12



Mycat:192.168.168.154
MySQL-1(master):192.168.168.130
MySQL-2(slave):192.168.168.131

笺注:Mycat服务器上无需安装MySQL/MariaDB软件。



在Mycat服务器上进行配置:
[root@centos8 ~]# cat /etc/redhat-release
CentOS Linux release 8.2.2004 (Core)
[root@centos8 ~]#
[root@centos8 ~]# uname -r
4.18.0-193.el8.x86_64



本地光盘Yum源里就有Java环境的相关软件包:
yum list |grep java-1.8
图片2.png
2021-3-22 10:12



安装Java环境(Mycat基于Java)
[root@centos8 ~]# yum -y install java-1.8.0-openjdk.x86_64

第三列前面有 @ 代表已经安装了:
yum list |grep java-1.8
图片3.png
2021-3-22 10:13



查看Java的版本:
[root@centos8 ~]# java -version
openjdk version "1.8.0_252"
OpenJDK Runtime Environment (build 1.8.0_252-b09)
OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)



安装Mycat:
[root@centos8 ~]# tar -zxvf Mycat-server-1.6.5-release-20180122220033-linux.tar.gz

移动解压出来的文件夹到/usr/local下:
mv mycat /usr/local/

创建专门运行mycat的用户
adduser mycat

更改指定目录、文件的属主和属组:
chown -R mycat:mycat /usr/local/mycat


配置环境变量:
[root@centos8 ~]# vi /etc/profile
文件最后追加:
export JAVA_HOME=/usr
export MYCAT_HOME=/usr/local/mycat

刷新环境变量:
[root@centos8 ~]# source /etc/profile


切换到mycat用户:
[root@centos8 ~]# su - mycat

切换目录,启动mycat:
cd /usr/local/mycat/bin/
./mycat start
图片4.png
2021-3-22 10:14




开机自动启动Mycat:
[root@centos8 ~]# vi /etc/rc.d/rc.local
文件最后追加:
su - mycat -c "/usr/local/mycat/bin/mycat start"


[root@centos8 ~]# chmod a+x /etc/rc.d/rc.local



######
配置读写分离的信息:
[root@centos8 ~]# cat /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="data1" checkSQLschema="false" dataNode="dn1">
        </schema>
        <dataNode name="dn1" dataHost="192.168.168.154" database="data1" />
        <dataHost name="192.168.168.154" maxCon="10000" minCon="10" balance="1"
  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="m1" url="192.168.168.130:3306" user="zhuohua" password="168">
                <readHost host="s1" url="192.168.168.131:3306" user="zhuohua" password="168" />
                <readHost host="s2" url="192.168.168.132:3306" user="zhuohua" password="168" />
                </writeHost>
       <writeHost host="m2" url="192.168.168.180:3306" user="zhuohua" password="168" />
        </dataHost>
</mycat:schema>

如下图:
图片1.png
2021-3-22 10:26


备注:
schema name="data1"  要对应文件server.xml里的schemas的name;
192.168.168.154  为Mycat服务器的IP地址;
database="data1"  为实际数据库名称;
m1  为writeHost(写入数据库服务器);
m2  为stand by writeHost(备用写入数据库服务器),会在m1宕机后自动进行替代;
s1、s2  为readHost(读取数据库服务器);
m1、m2、s1、s2  都是在这里自定义的,无需去修改其他文件;

实验中,s2、m2都不存在的,但不影响读写分离。

maxCon="10000",Mycat的最大连接数
minCon="10",Mycat的最小连接数

balance="0",不开启读写分离机制,所有读操作都发送到当前可用的writeHost;
balance="1",开启读写分离机制,全部的readHost与stand by writeHost(s1,s2,m2)都参与读操作,即参与select语句的负载均衡;

writeType="0",所有写操作发送到第一个writeHost,第一个writeHost宕机了就切换到还生存的第二个writeHost;
writeType="1",所有写操作随机的发送到可用的writeHost;


switchType :(数据库服务器宕机时)
1 默认值,自动切换;
-1 表示不自动切换;



######
配置Mycat的连接信息(帐号、密码等):
[root@centos8 ~]# vi /usr/local/mycat/conf/server.xml
图片2.png
2021-3-22 10:27


修改为:
        <user name="Python" defaultAccount="true">
                <property name="password">123456</property>
                <property name="schemas">data1</property>
        </user>

如下图:
图片3.png
2021-3-22 10:28


注释:
Mycat的帐号自定义为Python,密码123456;应用程序都连接这个Mycat帐号;
schemas的name(data1)要对应文件schema.xml的schema name


重启Mycat服务:
图片4.png
2021-3-22 10:28



TCP 9066为管理端口,Mycat服务正常运行时才会打开的:
[root@centos8 ~]# dnf -y install net-tools
[root@centos8 ~]#
[root@centos8 ~]# netstat -anp |grep 9066
tcp6       0      0 :::9066                 :::*                    LISTEN      1883/java

TCP 8066为应用程序的连接端口,Mycat服务正常运行时才会打开的:
[root@centos8 ~]# netstat -anp |grep 8066
tcp6       0      0 :::8066                 :::*                    LISTEN      1883/java  



Mycat服务器要在防火墙打开以下端口:(TCP 9066、8066)
[root@centos8 ~]# firewall-cmd --zone=public --add-port={9066/tcp,8066/tcp} --permanent
success
[root@centos8 ~]# firewall-cmd --reload
success


关闭SELinux:
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config





######
######

所有数据库服务器都要有库data1,并且创建数据库用户zhuohua@192.168.168.154:
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| data1              |
| data2              |
| mysql              |
| performance_schema |
+--------------------+
5 rows in set (0.00 sec)

mysql> grant all on data1.* to zhuohua@192.168.168.154 identified by '168';
Query OK, 0 rows affected (0.00 sec)

注释:允许客户端使用IP地址192.168.168.154管理库data1即可。



######

测试读写分离:(只连接Mycat帐号、Mycat服务器的IP地址;TCP 9066为管理端口)
[root@oracle-linux6 ~]# mysql -u"Python" -p"123456" -h192.168.168.154 -P9066
图片5.png
2021-3-22 10:30



查看Mycat的版本信息:
mysql> show @@version;
+-------------------------------------------+
| VERSION                                   |
+-------------------------------------------+
| 5.6.29-mycat-1.6.5-release-20180122220033 |
+-------------------------------------------+
1 row in set (0.00 sec)


查看逻辑数据库:
mysql> show @@databases;
+----------+
| DATABASE |
+----------+
| data1    |
+----------+
1 row in set (0.00 sec)


查看数据源:(离线状态的主机的IDLE的值都为0
mysql> show @@datasource;
+----------+------+-------+-----------------+------+------+--------+------+-------+---------+-----------+------------+
| DATANODE | NAME | TYPE  | HOST            | PORT | W/R  | ACTIVE | IDLE | SIZE  | EXECUTE | READ_LOAD | WRITE_LOAD |
+----------+------+-------+-----------------+------+------+--------+------+-------+---------+-----------+------------+
| dn1      | m1   | mysql | 192.168.168.130 | 3306 | W    |      0 |    6 | 10000 |      69 |         0 |          0 |
| dn1      | m2   | mysql | 192.168.168.180 | 3306 | W    |      0 |    0 | 10000 |       0 |         0 |          0 |
| dn1      | s1   | mysql | 192.168.168.131 | 3306 | R    |      0 |    6 | 10000 |      59 |         0 |          0 |
| dn1      | s2   | mysql | 192.168.168.132 | 3306 | R    |      0 |    0 | 10000 |       0 |         0 |          0 |
+----------+------+-------+-----------------+------+------+--------+------+-------+---------+-----------+------------+
4 rows in set (0.01 sec)

注释:数据库服务正常运行的192.168.168.130 、192.168.168.131的IDLE的值都不为0( 一旦数据库服务停止,其IDLE的值就会变为0 )





应用程序只连接Mycat帐号、Mycat服务器的IP地址,默认连接端口为TCP 8066
图片6.png
2021-3-22 10:32


图片7.png
2021-3-22 10:37



创建表、插入数据:
USE data1;
CREATE TABLE class168 (id INT,NAME VARCHAR(8));
INSERT INTO class168(id,NAME) VALUES (1,'happy');
INSERT INTO class168(id,NAME) VALUES (2,'lily');
INSERT INTO class168(id,NAME) VALUES (3,'zhuohua');
图片8.png
2021-3-22 10:40



查询数据:
USE data1;
SELECT * FROM class168;
图片9.png
2021-3-22 10:40


注释:数据库服务器之间做了主从同步,所以写入数据后,读取到的数据是一样的。


在数据库主、从服务器看到的数据也是一样的:
select * from data1.class168;
图片10.png
2021-3-22 10:40



笺注:Mycat服务器重启后,也是可以正常进行读写分离的。




相关文章:
MySQL5.6主从/主主同步
CentOS6_Mycat实现MariaDB的读写分离

使用SQLyog远程管理MySQL

CentOS8_Yum仓库
CentOS8_Keepalived+LVS(二)

返回列表