Mycat读写分离实战
一、主从复制搭建
1.实验环境
- 搭建一主一从的部署架构,master(主库)运行在阿里云服务器 47.108.136.201,slave(从库)运行在 IP 地址为 12.168.149.128 的Ubuntu虚拟机中
- 两台机器均安装了 MySQL 5.7(MySQL 5.7 版本复制性能比较强,且不同版本的数据库搭建主从复制,需要一些额外的复杂配置)
- 两台机器能够Ping通
2.主库配置
(1)修改数据库配置参数
<code style="margin-left:0">#vi /etc/<a href="https://www.mhzhuji.com/kwck/57" class="lar_link lar_link_outgoing" data-linkid="219" data-postid="989" title="数据库MySQL" rel="nofollow" target="_blank" >mysql</a>/my.cnf 或 vim /etc/mysql/mysql.conf.d/mysqld.cnf [mysqld] log-bin=mysql-bin #[必须]启用二进制日志 server-id=100 #[必须]服务器唯一ID,默认是1,一般取IP最后一段 binlog_format=row</code>
重启 MySQL 服务,查看服务号,已经更改为 100
<code style="margin-left:0">root@Ubuntu2004:~# systemctl restart mysql root@Ubuntu2004:~# mysql -u root -p mysql> show global variables like 'server\_id'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | server_id | 100 | +---------------+-------+ 1 row in set (0.00 sec)</code>
(2)进入主库,建立复制账号并授权
不同 MySQL 版本,需要执行不同的授权操作
<code style="margin-left:0">mysql> grant replication client on *.* to 'xiaogesync'@'%' identified by 'Chen_2877'; mysql> flush privileges;</code>
MySQL 8 执行以下操作
<code style="margin-left:0">mysql> create user xiaogesync identified by 'Chen_2877'; mysql> grant replication client on *.* to 'xiaogesync'@'%'; mysql> flush privileges;</code>
重启
<code style="margin-left:0">root@Ubuntu2004:~# systemctl restart mysql</code>
在虚拟机终端执行 MySQL 远程连接,输入授权账户和密码,即可远程访问主库了
<code style="margin-left:0">root@ubuntu:/home/chen# mysql -h 47.108.136.201 -uxiaogesync -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 22 Server version: 5.7.36-log MySQL Community Server (GPL)</code>
2.从库配置
(1)修改数据库配置参数
跟主库同样的操作,但 server-id 必须唯一,用于标识语句最初是由哪个 server 写入,server-id 设为相同的话,同步可能会陷入死循环
<code style="margin-left:0">#vi /etc/mysql/my.cnf 或 vim /etc/mysql/mysql.conf.d/mysqld.cnf [mysqld] log-bin=mysql-bin #[必须]启用二进制日志 server-id=101 #[必须]服务器唯一ID,默认是1,一般取IP最后一段 binlog_format=row</code>
(2)在服务器终端查看主库master状态
需要注意 File: mysql-bin.000005 和 Position: 1224 这两个值,待会配置从服务器会用得到。这个时候不要去动主数据库,会影响 Position 的值
<code style="margin-left:0">mysql> show master status\G; *************************** 1. row *************************** File: mysql-bin.000005 Position: 1224 Binlog_Do_DB: Binlog_Ignore_DB: Executed_Gtid_Set: 1 row in set (0.00 sec)</code>
(3)启动服务器复制功能
<code style="margin-left:0">mysql> start slave;</code>
(4)从库查看主从复制状态
根据 File 和 Position 的值,在从库上执行 MySQL 配置主从命令。Slave_IO_Running和
Slave_SQL_Running 状态均为 YES,说明主从复制成功。
<code style="margin-left:0">mysql> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 47.108.136.201 Master_User: xiaogesync Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000005 Read_Master_Log_Pos: 1224 Relay_Log_File: ubuntu-relay-bin.000004 Relay_Log_Pos: 320 Relay_Master_Log_File: mysql-bin.000004 Slave_IO_Running: Yes Slave_SQL_Running: Yes</code>
(5)测试主从复制功能
主库上创建数据库,如果从库也查询得到,说明同步成功,主库:
<code style="margin-left:0">mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ mysql> create database test_sync;</code>
从库:能够查询 test_sync 数据库(从库中原本数据库不受影响)
<code style="margin-left:0">mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | ssmiot | | sys | | test_sync | | wsn | +--------------------+</code>
至此, MySQL 主从复制搭建完成,采用的是默认的异步复制
过程,也就是说master上的 I/O Thread 线程将二进制日志写入 binlog 文件之后就返回客户端结果,不会考虑二进制日志是否完整传输到 slave 以及是否完整存放到从 slave 的relay-log 日志中。相应的,还有全同步复制
和半同步复制
。
如果要禁用主从复制的话,只需要在从库上执行 stop slave 命令就可以,执行reset slave all 可以清空从库所有配置信息。
二、Mycat 读写分离
Mycat 读写分离是建立在主从复制配置好的MySQL集群基础上(当然,也支持 Oracle、PostgreSQL,从 1.3 版本开始支持 SequoiaDB 及 MongoDB等NoSQL)。
(一)Mycat 安装部署
我是在自己 Win11 笔记本上安装的 Mycat,用的 1.6.7.4 版本。因为 Mycat 是用 Java 开发的,所以事先需要安装 Java,官网建议 jdk 1.7 及以上版本。然后还需要关闭主库 Linux 防火墙。
1.下载
Mycat下载地址:http://dl.mycat.org.cn/1.6.7.4/Mycat-server-1.6.7.4-release/Mycat-server-1.6.7.4-release-20200105164103-win.tar.gz
2.解压
3.配置环境变量
(二)Mycat 配置和启动
Mycat 采用本地 xml 的方式实现配置,最重要的配置文件有 server.xml、schema.xml 和 rue.xml,配置文件均保存在安装目录的 /conf 文件夹下
1.server.xml 配置
server.xml 管理着 Mycat 的系统配置信息,如用户、密码及权限等,这里配置登录 Mycat 的用户名为 root,密码为 123456,可以访问的 schema(逻辑库) 只有 TESTDB
<code style="margin-left:0"> <user name="root" defaultAccount="true"> <property name="password">123456</property> <property name="schemas">TESTDB</property> <property name="defaultSchema">TESTDB</property> </user></code>
2.schema.xml 配置
schema.xml 管理着 Mycat 的逻辑库、表、分片规则、dataNode 等。
(1)分片配置
dataNode 标签定义了 Mycat 中的数据节点,也就是数据分片, 意思就是说使用名字为 localhost1 数据库实例上的 db1 物理数据库,组成一个数据分片,用 dn1 来标识这一分片
<code style="margin-left:0"><schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" randomDataNode="dn1"> <!-- auto sharding by id (long) --> <!--splitTableNames 启用<table name 属性使用逗号分割配置多个表,即多个表使用这个配置--> <table name="travelrecord,address" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" splitTableNames ="true"/> <!-- <table name="oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate" /> --> </schema> <!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743" /> --> <dataNode name="dn1" dataHost="localhost1" database="db1" /> <dataNode name="dn2" dataHost="localhost1" database="db2" /> <dataNode name="dn3" dataHost="localhost1" database="db3" /></code>
(2)连接配置
dataHost 是 Mycat 最底层的标签,直接定义分片所属的数据库实例,其中子标签 writeHost 指定了 MySQL 后端写数据库(主库)。接下来需要对上一步的 localhost1 进行连接配置,首先将 url 设为主库所在地址,在这里就是阿里云服务器的 ip。账号密码及相应权限需要主库为其授权,为避免麻烦,我为主机和从机的 root 账户均分配了所有远程访问权限
<code style="margin-left:0">mysql> grant replication client on *.* to 'root'@'%' identified by 'Chen_2877'; mysql> flush privileges;</code>
<code style="margin-left:0"> <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <!-- can have multi write hosts --> <writeHost host="hostM1" url="47.108.136.201:3306" user="root" password="Chen_2877"> <readHost host="hostS1" url="192.168.149.128:3306" user="root" password="Chen_2877"> </readHost> </writeHost> </dataHost></code>
3.启动
(1)创建实体数据库
在主库中分别创建 db1、db2和db3 三个数据库
<code style="margin-left:0">mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | db1 | | db2 | | db3 | | mysql | | performance_schema | | sys | | test_cgx | | test_sync | +--------------------+ 9 rows in set (0.00 sec)</code>
(2)安装 Mycat
以管理员身份启动 cmd,运行 mycat install
<code style="margin-left:0">C:\WINDOWS\system32>mycat install wrapper | CreateService failed - 指定的服务已存在。 (0x431)</code>
(3)启动 Mycat
继续执行 mycat start
<code style="margin-left:0">C:\WINDOWS\system32>mycat start wrapper | Starting the Mycat-server service... wrapper | Mycat-server started.</code>
运行命令 mycat status,查看 mycat状态,Running 状态为 YES,则启动成功
<code style="margin-left:0">C:\WINDOWS\system32>mycat status wrapper | The Mycat-server Service is installed. wrapper | Start Type: Automatic wrapper | Interactive: No wrapper | Running: Yes</code>
4.测试
(1)在主库创建相应数据表
在主库 db1、db2、db3、创建表 travelrecord
<code style="margin-left:0">CREATE TABLE `travelrecord` ( `id` int(11) NOT NULL AUTO_INCREMENT , `uid` int(11) NULL , PRIMARY KEY (`id`) );</code>
(2)连接 mycat,插入数据
在 cmd 中连接 mycat,其实跟使用 MySQL 一样的操作
<code style="margin-left:0">C:\WINDOWS\system32>mysql -uroot -P8066 -p --default_auth=mysql_native_password Enter password: ******** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 18 Server version: 5.6.29-mycat-1.6.7.4-release-20200105164103 MyCat Server (OpenCloudDB) Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql></code>
查看当前数据库实例
<code style="margin-left:0">mysql> show databases; +----------+ | DATABASE | +----------+ | TESTDB | +----------+ 1 row in set (0.00 sec) mysql> use TESTDB; Database changed mysql> show tables; +------------------+ | Tables in TESTDB | +------------------+ | address | | travelrecord | +------------------+</code>
<code style="margin-left:0">mysql> desc travelrecord; +-------+---------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | uid | int(11) | YES | | NULL | | +-------+---------+------+-----+---------+----------------+ 2 rows in set (0.03 sec)</code>
插入数据
<code style="margin-left:0">mysql> INSERT INTO `travelrecord` (`id`, `uid`) VALUES(1, 1); Query OK, 1 row affected (0.03 sec) mysql> INSERT INTO `travelrecord` (`id`, `uid`) VALUES(501, 501); Query OK, 1 row affected (0.03 sec) mysql> INSERT INTO `travelrecord` (`id`, `uid`) VALUES(5000001, 5000001); Query OK, 1 row affected (0.03 sec) mysql> INSERT INTO `travelrecord` (`id`, `uid`) VALUES(10000001, 100000001); Query OK, 1 row affected (0.03 sec)</code>
(3)读取数据
在从库中,分别查询数据库 db1、db2、db3 中的数据表 travelrecord,可以看到刚插入的数据存储在了不同的数据库里面,说明Mycat 自动对其实现了分片,并实现了主从同步,而这一切对前端应用都是透明的
当然也可以通过数据库管理工具进行相关操作,默认端口 8066。使用方式与 MySQL 一样
参考
分布式数据库中间件 MyCat 搞起来!
Windows下安装Mycat
面试官你好,我已经掌握了MySQL主从配置和读写分离,你看我还有机会吗?
MySQL 主从复制简单搭建配置(简单,绝对能用)
《MySQL性能优化和高可用架构实战》——宋立桓
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/182314.html原文链接:https://javaforall.cn
未经允许不得转载:木盒主机 » mycat实现读写分离_mycat分表规则