开发者学堂课程【全面讲解开源数据库中间件MyCat使用及原理(二):MyCat - 高级 - 读写分离 - MyCat 实现 MySQL 双主双从读写分离】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/756/detail/13283
MyCat - 高级 - 读写分离 - MyCat 实现 MySQL 双主双从读写分离
内容介绍:
一、配置
二、读写分离验证
一、配置
<?xm1 version="1.0"7>
<100CTYPE mycat:schema SYSTEM"schema. dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="ITCAST"checks QLschema
="true"sqIMaxLimit="100">
<table name="user"data Rode="dn1"primaryKey="id"/>
</schema>
<dataNode name="dn1"dataHost=
"localhostl"database="db03"/>
<dataHost name="localhost 1"maxCon="1000"minCon
="10"ba1ance="1"writeType="0 dbType="mysql"
dbDriver="native"switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host='hostM1"url="192,168,192,147:3306
"user="root"password="itcast'>
<readHost host="hostS1"ur1="192.168.192.149:3306
"user="root"password="itcast"/>
</writethost>
</dataHost>
</mycat:schema>
接下来通过 MyCat 完成 MySQL 双主双从的读写分离。对于这一块的配置,我们主要还是操作核心配置文件 scheme.xml,通过 schema.xml 当中的 balance 属性来控制读写分离的类型。首先需要到 157 服务器克隆一个窗口,在这个窗口当中,需要切换到 mycat 的目录下,在 mycat 目录当中有一个 conf 目录,这里面有一个 schema.xml。先把 steamer.xml 进行备份,把它改一个名字改为scheme_ms.xml。
修改完成之后,还需要复制一份配置文件,因为需要一份新的配置文件,叫 scheme_ms.xml 修改为 schema.xml。做这个操作就是将原有的配置文件进行一个备份,然后生成一个新的配置文件,在新的配置文件上进行改造,就可以了。
接下来通过 NotePad++ 里面的插件进行修改。选择 MyCat1,找到 usr 目录,以及 usr 下面的 local,下面的 mycat 当中的 conf,找到刚才的 schema.xml。我们要修改 schema.xml,把里面的配置全部删掉。在这里面需要把上面的配置复制过来。
第一个逻辑库是 ITCAST,第二个逻辑表 user,刚才创建的表就是 user 表,他的数据节点 dn1,这个 dn1 指向的是 localhost1。数据库是 db03,他指的是 local host1 这个 dataHost 里面的 db03,而下面那个dataHost 里面的配置,最大连接,最小连接以及 balance 是负载均衡的策略机制。balance 为 1,还有 writeHost 为 0,数据库的类型 mysql,数据库的驱动采用的是百内驱动,切换类型 switchType 选择的是 1。下面是心跳,还有就是 writeHost,需要配置两个 writeHost,因为现在是双主双从。两个 writeHost 需要对应两台主机,一个是157,一个是 159。157 这台主机对应的从是 158,所以需要把 149 改为 158,151 改为 160。用户名 root,密码 ITCAST。就相当于第一个主 hostM1 对应第一个从 hostS1,第二个主 hostM2 对应第二个从 hosts2,这一块的配置就配置完了。
<schema name="ITCAST"checks QLschema
="true"sqIMaxLimit="100">
<table name="user"data Rode="dn1"primaryKey="id"/>
</schema>
<dataNode name="dn1"dataHost=
"localhostl"database="db03"/>
<dataHost name="localhost 1"maxCon="1000"minCon
="10"ba1ance="1"writeType="0 dbType="mysql"
dbDriver="native"switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host='hostM1"url="192,168,192,157:3306
"user="root"password="itcast'>
<readHost host="hostS1"ur1="192.168.192.158:3306
"user="root"password="itcast"/>
</writethost>
<writeHost host='hostM1"url="192,168,192,159:3306
"user="root"password="itcast'>
<readHost host="hostS1"ur1="192.168.192.160:3306
"user="root"password="itcast"/>
</writethost>
</dataHost>
</mycat:schema>
配置完成之后,需要检查 server.xml,里面的执行权限信息逻辑库 itcast 不用改动。
二、读写分离验证
1、接下来需要重启 my cat 进行测试。到 157 执行 bin/mycat restart,重启完成之后需要连接 mycat。连接 mycat 需要执行 mysql -h 192.168.192.157 -p 8066 -u root -p,这样就连接上了 mycat。执行 show databases,可以看到逻辑库 ITCAST 已经有了,执行 use ITCAST、show tables 在查看里面的逻辑表 user 也已经有了。接下来执行 select * from user,会发现数据可以查询出来,关键点就是所查询出来的 user 表当中的数据,是从四个节点中哪个节点中查询出来的呢?
2、这个时候需要再打开一个窗口,去看 mycat 的日志,切换到 local 下面的 mycat,在 logs 目录下,在 logs 目录下有一个 mycat.log 查看一下。找到 select * from user,
可以看到是从 160 这个节点查的。在 157 上再查一次,可以看到是从 158 节点查的。接下来再查询一次,还是 160。再查一次,是 158。一会儿 158,一会儿160,再来查询一次,现在是 159,再查询一次,是 160。也就是说 158、159、160 都查询过,但是 157 没有执行过查询,因为他是查询操作。为什么没有让 157来执行呢?原因就在于我们刚才配置的一个属性 balance,balance属性我们配置的是 1,balance 为 1 代表的是所有的 readHost,代表的是从节点,以及 stand by writeHost 代表的是备用的写节点,备用的写节点实际上就是第二个写节点,这三个节点会参与 select 语句的负载均衡。也就是说,当我们发送一条 select 语句的时候,如果 balance 为 1,备用的主节点以及两个从节点都会参与负载均衡。所以 158、159、160 都可能会执行这条语句,但是 157 不会。
3、还需要做一个测试,当执行的不是 select 语句,而是一条 insert 语句,要来看它插入到哪了。一定要在 mycat 当中来执行,去找一个 insert 语句,在 157 上执行。当再插入一次,insert 语句在 157 插入。实际上不管执行多少次 insert,写入的操作永远操作的是 157。当我们执行的是查询的操作,那么她所操作的这个节点可能是备用的主节点以及两个从节点,这是由 balance 为 1 来决定的。这里主要是验证一下 balance 为 1 的情况。
4、接下来还要进行一个操作,还需要挂掉一个节点。要让主节点挂掉,因为现在写入的操作都是经过 157 来执行的,都是转发到 157 这台节点上,当 157 节点挂掉之后,又是怎样的现象呢?我们可以试一下。现在执行插入操作都是没有问题的,还是在 157 上进行。接下来将 157 挂掉,执行 service mysql stop,现在 157这个节点正在进行关闭,正在进行停止,已经停止完毕了。停止完毕之后,MyCat 的心跳检测在连接 157 的时候没有连接上,连接被拒绝了。
接下来,在往 mycat 当中来执行写入操作。大家会发现,他尝试了一次写入,但是这次写入被拒绝了,当我们再次执行的时候,发现成功了。这次执行 insert 语句走的是 159 节点。再插入一个数据,插入数据的时候走的是 159 节点,而 159 是157 的备用节点,这就验证了双主双从从的情况下,如果主节点挂掉,那么备用节点会启动。这是我们验证 mycat 双主双从读写分离的一个配置。
5、这里面还有两个配置,一个就是 writeType,write Type 取决于两个,一个是0,一个是 1,0 代表的是写操作都转发到第一台 writeHost,writeHost 挂了,会切换到 writeHost2 上;1 代表的是写操作都随机的发送到配置的 writeHost 上。如果为 0,写操作只会转发到第一个 writeHost,如果为 1,写操作会随机的在两个 writeHost 转发,会转发到两个 writeHost 上。还有一个属性是 switchType,switch 是切换,Type 是类型,SwitchType 指的是主从切换的类型,如果为负一代表的是不自动切换,如果是一代表的是自动切换。