Mycat 系列之读写分离

本文详细指导了如何在Linux下安装部署MySQL,设置大小写敏感性,创建测试库和用户,以及Mycat的配置过程,包括环境变量设置、日志调整、schema.xml和server.xml配置。重点介绍了读写分离和主从同步测试,以及binlog日志格式。
摘要由CSDN通过智能技术生成

安装部署 MySQL

·

1 MySQL 主从同步搭建

搭建步骤省略…,需要的可以参考文章:MariaDB 主从同步配置

注意一: Linux 下部署安装 MySQL,默认不忽略表名大小写,需要手动到 /etc/my.cnf 下配置 lower_case_table_names=1 使 Linux 环境下 MySQL 忽略表名大小写,否则使用 MyCAT 的时候会提示找不到表的错误。

注意二: 在测试过程中,MySQL 设置了指定服务端字符集的排序规则(collation-server),结果或导致 Mycat 报错。
在这里插入图片描述
·

2 创建测试库

CREATE DATABASE mycat_testdb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

·

3 创建用户并授权

grant all on mycat_testdb.* to mycat_user@"%" identified by "111111";

·

4 连接测试

mysql -umycat_user -p111111 -h 10.0.30.21
mysql -umycat_user -p111111 -h 10.0.30.22

·

安装部署 Mycat

·

1 JAVA 环境配置

PS: 必须 JDK7 或更高版本。

tar -xvf jdk-8u281-linux-x64.tar.gz -C /usr/local/

ln -vs /usr/local/jdk1.8.0_281/bin/java* /usr/bin/
ln -vs /usr/local/jdk1.8.0_281/bin/jps /usr/bin/

·

2 下载&解压二进制包

tar -xvf Mycat-server-1.5.1-RELEASE-20161130213509-linux.tar.gz -C /usr/local/

·

3 声明环境变量

cat << EOF > /etc/profile.d/mycat.sh
export MYCAT_HOME=/usr/local/mycat
EOF

source /etc/profile

·

4 修改日志格式

cd /usr/local/mycat
vim conf/log4j.xml
#
......
#日志存放路径
<param name="file" value="${MYCAT_HOME}/logs/mycat.log" />
......
#日志等级(生成环境下建议将为 info/ware,如果是研究测试,可以开启debug 模式)
<root>
    <level value="debug" />
    <appender-ref ref="ConsoleAppender" />
</root>
......

·

5 修改 schema.xml 配置文件

PS: 这种配置当 master 发生故障时,不会自动切换到备用节点。

cd /usr/local/mycat
cp -p conf/schema.xml{,.default}
vim conf/schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/" >

        <schema name="mycat_testdb" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
        </schema>

        <dataNode name="dn1" dataHost="wpf-test" database="mycat_testdb"/>

        <dataHost name="wpf-test" maxCon="1000" minCon="10" balance="1"
                writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">

                <heartbeat>select user()</heartbeat>

                <writeHost host="wpf-test-M1" url="10.0.30.21:3306" user="mycat_user" password="111111">
                        <readHost host="wpf-test-S1" url="10.0.30.22:3306" user="mycat_user" password="111111" />
                </writeHost>
        </dataHost>
</mycat:schema>

·

6 修改 server.xml 配置文件

cd /usr/local/mycat
cp -p conf/server.xml{,.default}
vim conf/server.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://org.opencloudb/">
        <system>
        <property name="defaultSqlParser">druidparser</property>
        <property name="charset">utf8mb4</property>
        </system>

        <user name="mycat">
                <property name="password">123456</property>
                <property name="schemas">mycat_testdb</property>
        </user>
</mycat:server>

·

7 启动 Mycat

#mycat 支持的命令{ console | start | stop | restart | status | dump }
cd /usr/local/mycat
./bin/mycat start

·

测试 Mycat

·

1 连接 mycat

mysql -h 10.0.30.20 -umycat -p123456 -P 8066
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.8-mycat-1.5.1-RELEASE-20161130213509 MyCat Server (OpenCloundDB)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> show databases;
+--------------+
| DATABASE     |
+--------------+
| mycat_testdb |
+--------------+
1 row in set (0.00 sec)

·

2 创建表,并写入测试数据

MySQL [(none)]> use mycat_testdb;
Database changed

MySQL [mycat_testdb]> show tables;
Empty set (0.01 sec)

MySQL [mycat_testdb]> create table test111 (id int,name varchar(20));
Query OK, 0 rows affected (0.01 sec)

MySQL [mycat_testdb]> insert into test111 values (1,"test");
Query OK, 1 row affected (0.01 sec)

MySQL [mycat_testdb]> select * from test111;
+------+------+
| id   | name |
+------+------+
|    1 | test |
+------+------+
1 row in set (0.00 sec)

至此,可以看到 Mycat 的连接、数据写入和查看都正常。为了更能体现主从同步和读写分离(balance 负载均衡),可以更进一步的测试。

·

进一步测试读写分离(可切换)

·

1 修改 balance 策略

将 balance 策略改为 2。即:表示所有读操作都随机的在 writeHost、readhost 上分发。

vim conf/schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/" >

        <schema name="mycat_testdb" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
        </schema>

        <dataNode name="dn1" dataHost="wpf-test" database="mycat_testdb"/>

        <dataHost name="wpf-test" maxCon="1000" minCon="10" balance="2"
                writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">

                <heartbeat>select user()</heartbeat>

                <writeHost host="wpf-test-M1" url="10.0.30.21:3306" user="mycat_user" password="111111">
                        <readHost host="wpf-test-S1" url="10.0.30.22:3306" user="mycat_user" password="111111" />
                </writeHost>
        </dataHost>
</mycat:schema>

·

2 写入测试数据

PS: 前提是 binlog_format 设置的是 statement。最后有关于 binlog 日志格式的说明。

MySQL [mycat_testdb]> insert into test111 values (2,@@hostname);
Query OK, 1 row affected, 1 warning (0.01 sec)

·

3 多次查看数据

MySQL [mycat_testdb]> select * from test111;
+------+-------------+
| id   | name        |
+------+-------------+
|    1 | test        |
|    2 | wpf-test-21 |
+------+-------------+
2 rows in set (0.00 sec)

MySQL [mycat_testdb]> select * from test111;
+------+-------------+
| id   | name        |
+------+-------------+
|    1 | test        |
|    2 | wpf-test-21 |
+------+-------------+
2 rows in set (0.00 sec)

MySQL [mycat_testdb]> select * from test111;
+------+-------------+
| id   | name        |
+------+-------------+
|    1 | test        |
|    2 | wpf-test-22 |
+------+-------------+
2 rows in set (0.01 sec)

至此发现数据同步正常,并且读写分离(balance)策略也正常。

·

附加:binlog 的三种日志格式

Statement

每一条会修改数据的 SQL 都会记录在 binlog 中。
优点:不需要记录每一行的变化,减少了 binlog 日志量,节约了 IO,提高性能。
缺点:由于记录的只是执行语句,因此对一些系统函数不能准确复制或是不能复制,存在安全隐患,会导致主从不一致。如下示例:

insert into test111 values (2,@@hostname);

Row

不记录 SQL 语句上下文相关信息,仅保存哪条记录被修改。
优点:Row 的日志会非常清楚的记录下每一行数据修改的细节。而且不会出现某些特定情况下的存储过程或函数,以及 trigger 的调用和触发无法被正确复制的问题。
缺点:所有的执行语句都将以每行记录的修改来记录,会产生大量的日志内容。

Mixed

是以上两种的混合使用。一般情况下会使用 Statement 记录格式;当 SQL 语句中包含会导致主从数据不一致的函数时,则采用 Row 记录格式保存。

·

附加:一主一从架构故障时可切换为备用节点

PS: 其实就是将 slave 也配置为 writeHost,然后 balance 策略定义为 1 的配置。
注意: 有可能会导致数据不一致。

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/" >

        <schema name="mycat_testdb" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
        </schema>

        <dataNode name="dn1" dataHost="wpf-test" database="mycat_testdb"/>

        <dataHost name="wpf-test" maxCon="1000" minCon="10" balance="1"
                writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">

                <heartbeat>select user()</heartbeat>

                <writeHost host="wpf-test-M1" url="10.0.30.21:3306" user="mycat_user" password="111111" />

                <writeHost host="wpf-test-S1" url="10.0.30.22:3306" user="mycat_user" password="111111" />

        </dataHost>
</mycat:schema>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值