MyCat(1.3)Mycat读写分离简单实践(含高可用及HA参考文档)
【1】关键配置文件
(1)schema.xml 用于配置逻辑库表及数据节点
(2)rule.xml 用于配置表的分片规则
(3)server.xml 用于配置服务器权限
【2】schema.xml 用于配置逻辑库表及数据节点
(1)<schema><table></table></schema>
<schema>:定义逻辑库
<table>:定义逻辑表
要是不需要分库分表,只需要读写分离,那么只配置<schema>即可
(2)<dataNode></dataNode>定义分片数据节点(一个节点代表一个数据分片)
在这个标签中定义内容包括了:节点的名字、数据源的真实的物理库的名字
(3)<dataHost></dataHost>定义数据节点的物理数据源
定义一组主机几点,真实的物理数据库实例,一个dataHost指定的数据源就是一组真实的mysql集群。
除此之外好包括定义,读写分离配置、心跳语句配置等等
【3】rule.xml 用于配置表的分片规则
(1)<tableRule name=""></tableRule>
定义表所使用的分片规则
(2)<function name=""></function>
定义分片算法
【4】server.xml文件
(1)<system><proerty name=""></property></system>
定义系统配置:比如 端口号、内存大小、timeout时间等等
(2)<user></user>
用于定义连接 Mycat 的用户,与 mysql中的用户是不一样的,可以相同也可以不同。
只有在本文件中定义的用户才可以连接到mycat
【5】基本实践之读写分离配置
【5.1】环境准备
3台机器:其中1台Mycat,2台mysql
Mycat:192.168.135.173
Mysql Master:192.168.135.174
Mysql Slave :192.168.135.175
实现功能:读写分离
【5.2】修改配置文件 schema.xml
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode='dn1'></schema> <dataNode name="dn1" dataHost="node1" database="test" /> <dataHost name="node1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="192.168.135.174" url="192.168.135.174:3306" user="root" password="123456" > <readHost host="192.168.135.175" url="192.168.135.175:3306" user="root" password="123456"/> <!-- 读写分离; 写走174 ,读走 175; 174 宕机了, 175 也不可用 -->
</writeHost>
<writeHost host="192.168.135.175" url="192.168.135.175:3306" user="root" password="123456" /> <!-- 高可用,如果当192.168.135.174写库挂了,那么会自动把这台机器切换成写库顶上,最终变成读写都是它 -->
</dataHost>
</mycat:schema>
如果是多个库,参考:
记得:server.xml文件也要改鸭
解析:
(1)<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode='dn1'></schema>
name:逻辑库名 sqlMaxLimit:返回的最大结果集 dataNode:包含的数据集群节点,多个可以"dn1,dn2,dn3"
(2)<dataNode name="dn1" dataHost="node1" database="test" />
name:集群逻辑名称 dataHost:包含的主机节点,多个可以"node1,node2" daabase:实际操作主机节点的实例下的具体数据库名
(3)<dataHost name="node1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
name:主机节点逻辑名称 maxCon:最大连接数 minCon:最小连接数 dbType:主机节点对应的数据库类型 dbDriver:驱动方式
(3.1)<heartbeat>select user()</heartbeat>
心跳监控方式,运行 select user(),无响应超过阀值则认为已经宕机
(3.2)<writeHost host="192.168.135.174" url="192.168.135.174:3306" user="root" password="123456" >
<readHost host="192.168.135.175" url="192.168.135.175:3306" user="root" password="123456"/>
</writeHost>
<writeHost host="192.168.135.175" url="192.168.135.175:3306" user="root" password="123456" />
<writeHost>:写入主机为 host url:url访问地址 user:数据库账户 password:数据库密码
<readHost>:只读主机 url:url访问地址 user:数据库账户 password:数据库密码
第4行的<writeHost>:在第1行的<writeHost>失效后,才会使用这个备用的<writehost>,也就是前面所说的所谓的高可用,预定一个从作为预备写库。
datahost重要参数
balance指的负载均衡类型,目前的取值有4种: 1. balance=”0”, 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上。 2. balance=”1”,全部的readHost与stand bywriteHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且M1与 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡。 3. balance=”2”,所有读操作都随机的在writeHost、readhost上分发。 4. balance=”3”,所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力 注意:balance=3只在1.4及其以后版本有,1.3没有。 writeType属性: 1.writeType=”0”,所有写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后以切换后的为准,切换记录在配置文件中:dnindex.properties. 2.writeType=”1”,所有写操作都随机地发送到配置的writeHost,1.5以后废弃不推荐。 switchType指的是切换的模式,目前的取值也有4种: 1. switchType=’-1’ 表示不自动切换 2. switchType=’1’ 默认值,表示自动切换 3. switchType=’2’ 基于MySQL主从同步的状态决定是否切换,心跳语句为 show slave status 4. switchType=’3’基于MySQLgalary cluster的切换机制(适合集群)(1.4.1),心跳语句为 show status like ‘wsrep%’。 注意:估计Mycat1.4才开始支持switchType。1.3版本配置该属性的话
日志里会报错:org.xml.sax.SAXParseException;lineNumber: 61; columnNumber: 86; Attribute “switchType” must bedeclared for element type “dataHost”。 MyCAT心跳检查询句配置为 show slave status ,dataHost 上定义两个新属性: switchType=”2” 与slaveThreshold=”100”,此时意味着开启MySQL主从复制状态绑定的读写分离与切换机制
Mycat心跳机制通过检测 show slave status 中的 “Seconds_Behind_Master”,”Slave_IO_Running”,”Slave_SQL_Running”三个字段来确定当前主从同步的状态及Seconds_Behind_Master主从复制时延
当Seconds_Behind_Master>slaveThreshold时,读写分离筛选器会过滤掉此Slave机器,防止读到很久以前的旧数据,当主节点宕机后,切换逻辑会检查Slave上的Seconds_Behind_Master是否为0,为0时则表示主仅同步,可安全切换,否则不会切换。
【5.3】修改配置文件 server.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mycat:server SYSTEM "server.dtd"> <mycat:server xmlns:mycat="http://io.mycat/"> <system> <property name="nonePasswordLogin">0</property> <property name="useHandshakeV10">1</property> <property name="useSqlStat">0</property> <!-- 1为开启实时统计、0为关闭 --> <property name="useGlobleTableCheck">0</property>> <property name="sequnceHandlerType">2</property> <property name="subqueryRelationshipCheck">false</property> <property name="useOffHeapForMerge">1</property> <property name="memoryPageSize">64k</property> <property name="spillsFileBufferSize">1k</property> <property name="useStreamOutput">0</property> <property name="systemReserveMemorySize">384m</property> <property name="useZKSwitch">false</property> <property name="serverPort">3306</property> <property name="managerPort">9066</property> <user name="root" defaultAccount="true"> <property name="password">123456</property> <property name="schemas">TESTDB</property> </user> <user name="my_user"> <property name="password">123456</property> <property name="schemas">TESTDB</property> <property name="readOnly">true</property> </user> </mycat:server>
我把serverPort从8066改成了3306,当mysql端口来访问。
建立了2个Mycat用户,这个只是用来连接Mycat的,真正连接数据库的是我们5.2中配置的。
【5.4】测试读写分离
【5.4.0】修改日志配置文件
vim /usr/local/mycat/conf/log4j2.xml
info =>改为 debug ,这样日志级别就比较详细
【5.4.1】重启mycat
(1)经过上述步骤配置好之后,这个时候,需要重启生效;
/usr/local/mycat/bin/mycat stop
/usr/local/mycat/bin/mycat start
(2)查看日志是否成功启动
tail -f -n 100 /usr/local/mycat/logs/wrapper.log
【5.4.2】连接 Mycat
(1)登录Mycat
mysql -uroot -p123456 -h192.168.135.173 -P3306
为什么是这么登,为什么端口是3306?见【5.3】中的server.xml修改。
注意,如果该机器上有其他程序占用3306端口,则需要手动处理空闲出来(比如mysql),所以一般还是不要乱改端口为佳。
登录进来后,发现确实只有一个逻辑库
(2)查询
我们可以发现,db5正是我们的从库机器。
(3)读测试
在登录上 mycat (192.168.135.173)机器上,执行 select * from score,果然捕获,且发现它运行host 为从库(192.168.135.175)
核验成功
(4)写测试
在登录上 mycat (192.168.135.173)机器上,执行insert into score values(333,'aaa','100','6');
如下图:
查看日志:
果然,是插入在主库(192.168.135.174)上面了。
(5)去mysql上查看写操作是否主从同步
左边主库,右边从库,可见已经同步好了。至此,读写分离已经实现
参考文档
Mycat - 实现数据库的读写分离与高可用:https://www.cnblogs.com/youzhibing/p/9553766.html
Mycat - 高可用与负载均衡实现,满满的干货!:https://www.cnblogs.com/youzhibing/p/10263557.html