MySQL 作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过。但在实际的生产环境中,由单台 MySQL 作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面。
因此,一般来说都是通过主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy/Amoeba)来提升数据库的并发负载能力,这样的方案来进行部署与实施的。
基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理 SELECT 查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。 在这里插入图片描述 数据内部交换过程:

有两种方式实现:
(1)应用程序层实现:网站的程序实现 应用程序层实现指的是在应用程序内部及连接器中实现读写分离 。

优点: 应用程序内部实现读写分离,安装既可以使用; 减少一定部署难度; 访问压力在一定级别以下,性能很好。
缺点: 架构一旦调整,代码要跟着变; 难以实现高级应用,如自动分库,分表; 无法适用大型应用场景。
(2)中间件层实现: 中间件层实现是指在外部中间件程序实现读写分离

(1)Cobar: 阿里巴巴 B2B 开发的关系型分布式系统,管理将近 3000 个 MySQL 实例。 在阿里经受住了考验,后面由于作者的走开的原因 cobar 没有人维护 了,阿里也开发了 tddl 替代 cobar。
(2)MyCAT: 社区爱好者在阿里 cobar 基础上进行二次开发,解决了 cobar 当时存在的一些问题,并且加入了许多新的功能在其中。目前 MyCAT 社区活跃度很高,已经有一些公司在使用 MyCAT。总体来说支持度比 较高,也会一直维护下去。
(3)OneProxy: 数据库界大牛,前支付宝数据库团队领导楼总开发,基于 mysql 官方 的 proxy 思想利用 c 进行开发的,OneProxy 是一款商业收费的中间件,楼总舍去了一些功能点,专注在性能和稳定性上。有人测试过说在高并发下很稳定。
(4)Vitess: 这个中间件是 Youtube 生产在使用的,但是架构很复杂。 与以往中间件不同,使用 Vitess 应用改动比较大,要使用他提供语言的 API 接口,我们可以借鉴他其中的一些设计思想。
(5)Kingshard: Kingshard 是前 360Atlas 中间件开发团队的陈菲利用业余时间 用 go 语言开发的,目前参与开发的人员有 3 个左右, 目前来看还不是成熟可以使用的产品,需要在不断完善。
(7)Atlas: 360 团队基于 mysql proxy 把 lua 用 C 改写。原有版本是支持分表, 目前已经放出了分库分表版本。在网上看到一些朋友经常说在高并发下会经常挂掉,如果大家要使用需要提前做好测试。
MaxScale 与 MySQL Route: 这两个中间件都算是官方的,MaxScale 是 mariadb (MySQL 原作者维护的一个版本)研发的,目前版本不支持分库分表。MySQL Route 是现在 MySQL 官方 Oracle 公司发布出来的一个中间件。
优点: 架构设计更灵活 可以在程序上实现一些高级控制,如:透明化水平拆分,failover,监控 可以依靠技术手段提高 mysql 性能 对业务代码的影响小,同时也安全
缺点: 需要一定的开发运维团队的支持。
一个彻底开源的,面向企业应用开发的大数据库集群; 支持事务、ACID、可以替代 MySQL 的加强版数据库; 一个可以视为 MySQL 集群的企业级数据库,用来替代昂贵的 Oracle 集群; 一个融合内存缓存技术、NoSQL 技术、HDFS 大数据的新型 SQL Server; 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品; 一个新颖的数据库中间件产品。

MyCat 有提供编译好的安装包,支持 Windows、Linux、Mac、Solaris 等系统上安装与运行。官方下载主页 http://www.mycat.org.cn/
架构:
下面修改 MyCAT 用户密码(仅供参考):
[root@xuegod63 ~]# chown -R mycat.mycat /usr/local/mycat #修改权限
目录解释如下:

bin 程序目录,存放了 window 版本和 linux 版本,除了提供封装成服务的版本之外,也提供了nowrap 的 shell 脚本命令,方便大家选择和修改,进入到 bin 目录:
Linux 下运行:./mycat console,首先要 chmod +x *
注:mycat 支持的命令{ console | start | stop | restart | status | dump }
conf 目录下存放配置文件,server.xml 是 Mycat 服务器参数调整和用户授权的配置文件,schema.xml 是逻辑库定义和表以及分片定义的配置文件,rule.xml 是分片规则的配置文件,分片规则的具体一些参数信息单独存放为文件,也在这个目录下,配置文件修改,需要重启 Mycat 生效。
lib 目录下主要存放 mycat 依赖的一些 jar 文件。
日志存放在 logs/mycat.log 中,每天一个文件,日志的配置是在 conf/log4j.xml 中,根据自己的需要,可以调整输出级别为 debug,在 debug 级别下,会输出更多的信息,方便排查问题。
MyCAT 在 Linux 中部署启动时,首先需要在 Linux 系统的环境变量中配置 MYCAT_HOME,操作方式如下:
mycat:schema xmlns:mycat=”http://org.opencloudb/”>绿色 为物理存在的数据库名 注解: schema 标签用于定义 MyCat 实例中的逻辑库,name:后面就是逻辑库名 MyCat 可以有多个逻辑库,每个逻辑库都有自己的相关配置。可以使用 schema 标签来划分这些不同的逻辑库。
checkSQLschema 这个属性默认就是 false,官方文档的意思就是是否去掉表前面的数据库的名称,”select * from db1.testtable” ,设置为 true 就会去掉 db1。但是如果 db1 的名称不是schema 的名称,那么也不会被去掉,因此官方建议不要使用这种语法。同时默认设置为 false。
sqlMaxLimit 当该值设置为某个数值时。每条执行的 SQL 语句,如果没有加上 limit 语句,MyCat 也会自动的加上所对应的值。例如设置值为 100,执行”select * from test_table”,则效果为 “selelct * from test_table limit 100”.
dataNode 标签定义了 MyCat 中的数据节点,也就是我们通常说所的数据分片。一个dataNode 标签就是一个独立的数据分片
.
writeHost /readHost 这两个标签都指定后端数据库的相关配置,用于实例化后端连接池。唯一不同的是,writeHost 指定写实例、readHost 指定读实例。 在一个 dataHost 内可以定义多个writeHost 和 readHost。但是,如果 writeHost 指定的后端数据库宕机,那么这个 writeHost 绑定的所有 readHost 都将不可用。另一方面,由于这个 writeHost 宕机,系统会自动的检测到,并切换到备用的 writeHost 上去。这两个标签的属性相同

有两个参数需要注意,balance 和 switchType。其中,balance 指的负载均衡类型,目前的取值 有 4 种:
(2)balance=”0″, 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上;
(2)balance=”1″,全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的 说,当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2、S1、S2 都 参与 select 语句的负载均衡;
(3)balance=”2″,所有读操作都随机的在 writeHost、readhost 上分发;
(4)balance=”3″,所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不 负担读压力。
switchType 指的是切换的模式,目前的取值也有 4 种:
(1)switchType=’-1′ 表示不自动切换;
(2)switchType=’1′ 默认值,表示自动切换;
(3)switchType=’2′ 基于 MySQL 主从同步的状态决定是否切换,心跳语句为 show slave status;
(4)switchType=’3’基于 MySQL galary cluster 的切换机制(适合集群)(1.4.1),心跳语句为show status like ‘wsrep%’。
经过以上两个步骤的配置,就可以到/usr/local/mycat/bin 目录下执行 ./mycat start,即可启动mycat 服务!

安装 mysql 上传 mysql-5.7.tar.gz 到 xuegod64

说明读操作的路由切换到 master 上了,对外没有任何影响!

MySQL 作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过。但在实际的生产环境中,由单台 MySQL 作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面。
因此,一般来说都是通过主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy/Amoeba)来提升数据库的并发负载能力,这样的方案来进行部署与实施的。
基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理 SELECT 查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。 在这里插入图片描述 数据内部交换过程:

有两种方式实现:
(1)应用程序层实现:网站的程序实现 应用程序层实现指的是在应用程序内部及连接器中实现读写分离 。

优点: 应用程序内部实现读写分离,安装既可以使用; 减少一定部署难度; 访问压力在一定级别以下,性能很好。
缺点: 架构一旦调整,代码要跟着变; 难以实现高级应用,如自动分库,分表; 无法适用大型应用场景。
(2)中间件层实现: 中间件层实现是指在外部中间件程序实现读写分离

(1)Cobar: 阿里巴巴 B2B 开发的关系型分布式系统,管理将近 3000 个 MySQL 实例。 在阿里经受住了考验,后面由于作者的走开的原因 cobar 没有人维护 了,阿里也开发了 tddl 替代 cobar。
(2)MyCAT: 社区爱好者在阿里 cobar 基础上进行二次开发,解决了 cobar 当时存在的一些问题,并且加入了许多新的功能在其中。目前 MyCAT 社区活跃度很高,已经有一些公司在使用 MyCAT。总体来说支持度比 较高,也会一直维护下去。
(3)OneProxy: 数据库界大牛,前支付宝数据库团队领导楼总开发,基于 mysql 官方 的 proxy 思想利用 c 进行开发的,OneProxy 是一款商业收费的中间件,楼总舍去了一些功能点,专注在性能和稳定性上。有人测试过说在高并发下很稳定。
(4)Vitess: 这个中间件是 Youtube 生产在使用的,但是架构很复杂。 与以往中间件不同,使用 Vitess 应用改动比较大,要使用他提供语言的 API 接口,我们可以借鉴他其中的一些设计思想。
(5)Kingshard: Kingshard 是前 360Atlas 中间件开发团队的陈菲利用业余时间 用 go 语言开发的,目前参与开发的人员有 3 个左右, 目前来看还不是成熟可以使用的产品,需要在不断完善。
(7)Atlas: 360 团队基于 mysql proxy 把 lua 用 C 改写。原有版本是支持分表, 目前已经放出了分库分表版本。在网上看到一些朋友经常说在高并发下会经常挂掉,如果大家要使用需要提前做好测试。
MaxScale 与 MySQL Route: 这两个中间件都算是官方的,MaxScale 是 mariadb (MySQL 原作者维护的一个版本)研发的,目前版本不支持分库分表。MySQL Route 是现在 MySQL 官方 Oracle 公司发布出来的一个中间件。
优点: 架构设计更灵活 可以在程序上实现一些高级控制,如:透明化水平拆分,failover,监控 可以依靠技术手段提高 mysql 性能 对业务代码的影响小,同时也安全
缺点: 需要一定的开发运维团队的支持。
一个彻底开源的,面向企业应用开发的大数据库集群; 支持事务、ACID、可以替代 MySQL 的加强版数据库; 一个可以视为 MySQL 集群的企业级数据库,用来替代昂贵的 Oracle 集群; 一个融合内存缓存技术、NoSQL 技术、HDFS 大数据的新型 SQL Server; 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品; 一个新颖的数据库中间件产品。

MyCat 有提供编译好的安装包,支持 Windows、Linux、Mac、Solaris 等系统上安装与运行。官方下载主页 http://www.mycat.org.cn/
架构:
下面修改 MyCAT 用户密码(仅供参考):
[root@xuegod63 ~]# chown -R mycat.mycat /usr/local/mycat #修改权限
目录解释如下:

bin 程序目录,存放了 window 版本和 linux 版本,除了提供封装成服务的版本之外,也提供了nowrap 的 shell 脚本命令,方便大家选择和修改,进入到 bin 目录:
Linux 下运行:./mycat console,首先要 chmod +x *
注:mycat 支持的命令{ console | start | stop | restart | status | dump }
conf 目录下存放配置文件,server.xml 是 Mycat 服务器参数调整和用户授权的配置文件,schema.xml 是逻辑库定义和表以及分片定义的配置文件,rule.xml 是分片规则的配置文件,分片规则的具体一些参数信息单独存放为文件,也在这个目录下,配置文件修改,需要重启 Mycat 生效。
lib 目录下主要存放 mycat 依赖的一些 jar 文件。
日志存放在 logs/mycat.log 中,每天一个文件,日志的配置是在 conf/log4j.xml 中,根据自己的需要,可以调整输出级别为 debug,在 debug 级别下,会输出更多的信息,方便排查问题。
MyCAT 在 Linux 中部署启动时,首先需要在 Linux 系统的环境变量中配置 MYCAT_HOME,操作方式如下:
mycat:schema xmlns:mycat=”http://org.opencloudb/”>绿色 为物理存在的数据库名 注解: schema 标签用于定义 MyCat 实例中的逻辑库,name:后面就是逻辑库名 MyCat 可以有多个逻辑库,每个逻辑库都有自己的相关配置。可以使用 schema 标签来划分这些不同的逻辑库。
checkSQLschema 这个属性默认就是 false,官方文档的意思就是是否去掉表前面的数据库的名称,”select * from db1.testtable” ,设置为 true 就会去掉 db1。但是如果 db1 的名称不是schema 的名称,那么也不会被去掉,因此官方建议不要使用这种语法。同时默认设置为 false。
sqlMaxLimit 当该值设置为某个数值时。每条执行的 SQL 语句,如果没有加上 limit 语句,MyCat 也会自动的加上所对应的值。例如设置值为 100,执行”select * from test_table”,则效果为 “selelct * from test_table limit 100”.
dataNode 标签定义了 MyCat 中的数据节点,也就是我们通常说所的数据分片。一个dataNode 标签就是一个独立的数据分片
.
writeHost /readHost 这两个标签都指定后端数据库的相关配置,用于实例化后端连接池。唯一不同的是,writeHost 指定写实例、readHost 指定读实例。 在一个 dataHost 内可以定义多个writeHost 和 readHost。但是,如果 writeHost 指定的后端数据库宕机,那么这个 writeHost 绑定的所有 readHost 都将不可用。另一方面,由于这个 writeHost 宕机,系统会自动的检测到,并切换到备用的 writeHost 上去。这两个标签的属性相同

有两个参数需要注意,balance 和 switchType。其中,balance 指的负载均衡类型,目前的取值 有 4 种:
(2)balance=”0″, 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上;
(2)balance=”1″,全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的 说,当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2、S1、S2 都 参与 select 语句的负载均衡;
(3)balance=”2″,所有读操作都随机的在 writeHost、readhost 上分发;
(4)balance=”3″,所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不 负担读压力。
switchType 指的是切换的模式,目前的取值也有 4 种:
(1)switchType=’-1′ 表示不自动切换;
(2)switchType=’1′ 默认值,表示自动切换;
(3)switchType=’2′ 基于 MySQL 主从同步的状态决定是否切换,心跳语句为 show slave status;
(4)switchType=’3’基于 MySQL galary cluster 的切换机制(适合集群)(1.4.1),心跳语句为show status like ‘wsrep%’。
经过以上两个步骤的配置,就可以到/usr/local/mycat/bin 目录下执行 ./mycat start,即可启动mycat 服务!

安装 mysql 上传 mysql-5.7.tar.gz 到 xuegod64

说明读操作的路由切换到 master 上了,对外没有任何影响!

[root@xuegod64 ~]# systemctl start mysqld
只读用户登录测试
mysql -u user -puser -h 192.168.1.201 -P8066
mysql> insert into test values(5,’feng’);
ERROR 1495 (HY000): User readonly
mysql> select * from ha.test;
+——+——–+
| id | name |
+——+——–+
| 1 | cd |
配置 MM 模式主从复制环境 启用 65 为 64 的主
[root@xuegod64 ~]# mysql -uroot -p’123456′
mysql> change master to
master_host=’192.168.1.65′,master_user=’slave’,master_password=’123456′;
mysql> start slave; #启动 slave
mysql> show slave status\G #查看状态 ,有两个 yes 主从同步成功!
mysql> exit
[root@xuegod63 ~]# vim /usr/local/mycat/conf/schema.xml
<?xml version=”1.0″?>
<!DOCTYPE mycat:schema SYSTEM “schema.dtd”>
<mycat:schema xmlns:mycat=”http://org.opencloudb/”>
<schema name=”ha” checkSQLschema=”false” sqlMaxLimit=”100″
dataNode=’dn1′>
</schema>
<dataNode name=”dn1″ dataHost=”dthost” database=”ha”/>
<dataHost name=”dthost” maxCon=”500″ minCon=”10″ balance=”1″
writeType=”0″ dbType=”mysql” dbDriver=”native” switchType=”1″
slaveThreshold=”100″>
<heartbeat>select user()</heartbeat>
<writeHost host=”xuegod64.cn” url=”192.168.1.64:3306″ user=”mycat”
password=”123456″>
</writeHost>
<writeHost host=”xuegod65.cn” url=”192.168.1.65:3306″ user=”mycat”
password=”123456″>
</writeHost>
</dataHost>
</mycat:schema>
我们前面配置 switchType=”-1″关闭了自动切换,但是我们在主从环境下应该避免在从节点写入数据,否则会造成主从数据库数据不一致, 如果我们使用的是 MM 模式则主节点发生故障后会自动切换至备用节点,此时不影响数据写入。
[root@xuegod63 ~]# /usr/local/mycat/bin/mycat restart
[root@xuegod64 ~]# systemctl stop mysqld
[root@xuegod63 ~]# mysql -uroot -p123456 -h 192.168.1.63 -P8066
MySQL [(none)]> insert into ha.test values(666,’mk’);
MySQL [(none)]> select * from ha.test;
+——+———+
| id | name |
+——+———+
| 1 | man |
| 666 | mk |
[root@xuegod64 ~]# systemctl stop mysqld
Mycat 端继续插入
mysql> insert into test values(5,’feng’);
[root@xuegod64 ~]# systemctl start mysqld
mysql -uroot -p123456
select * from ha.test;
关于使用方面的建议,在一些 CMS(内容管理系统)系统中底层的数据库代码已经经过封装,此时使用 mycat 是不可取的,因为封装后的 sql 语句会和 mycat 不兼容,建议是程序开发时应考虑连接mysql 的方式和 mycat 是相互兼容的。或者选择其他中间件比如 mysql-proxy。
以上就是SQL开发知识:Linux 使用 MyCat 实现 MySQL 主从读写分离的详细内容,更多关于Linux MySQL的资料请关注其它相关文章!