上篇文章写了写主从复制的操作流程,这篇文章写读写分离.上文结尾已经说了,读写分离是一定基于主从复制的.
思考:1,上文实现了高可用,但主服务器宕机怎么实现从服务器的切换.
2,从服务器目前只有备份的功能,没有分担任何请求压力
一:前期准备
1,了解mycat中间件
2,前文的主从服务器,加一台新的服务器安装mycat(我的是:68.30)
3,mycat 下载地址:http://www.mycat.org.cn/ 我下载的mycat1.6版本的
4,jdk下载,(mycat是基于java语言编写的,一会儿要配置java的运行环境 )
二:安装
1,安装mycat
打开mycat服务器,查询有没有安装mycat: find /-name mycat,我这里准备的是新服务器肯定是没有的.大家根据自己服务器的情况进行处理.有的话就删除.没有的话就上传至服务器:
2,将下载好的jdk安装包上传至mycat服务器并解压:tar -zxvf jdk-8u251-linux-x64.tar.gz
解压完成以后将解压好的文件夹命名为jdk8 并移动到/usr下
重命名: mv jdk1.8.0_251/ jdk8
移动至/usr下:mv jdk8 /usr/
3,进行环境变量的配置
编辑vi /etc/profile进行配置在结尾处添加如下配置信息:
export JAVA_HOME=/usr/jdk8 #此处写自己的jdk路径
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export PATH=$PATH:${JAVA_PATH}
4,生效环境变量
对于/etc/profile编写完成之后是不够的,还需要最后一个步骤,就是让刚刚我们修改的文件变成有效起来,所以我们再输入一个命令,让修改生效。并验证是否安装成功
生效命令:source /etc/profile
验证是否安装成功:java -version
5,解压mycat: tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz 解压后会在当前文件夹下生成一个mycat的解压文件夹
6,配置mycat
进入到conf文件夹下配置server.xml,为了看着舒服些,将此文件拉出到本地用编辑器进行编辑:
修改处表示mycat的登录密码,根据自己情况自行填写,然后上传至服务器进行覆盖原文件
编辑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="localhost1" database="demo" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<!-- 心跳检测,检测主机从机是否正常 -->
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.68.127:3306" user="root" password="root">
<readHost host="hostS2" url="192.168.68.128:3306" user="root" password="root" />
</writeHost>
</dataHost>
</mycat:schema>
writeHost和readHost中的url根据自己的主从服务器进行实际配置,配置复制我上文的就行,唉我就打错了一个字母mycat咋都起不来,排查了一两个小时才发现字母拼错了,尴尬,还有相关的数据库名称,我的数据库名称是demo,根据上文建立的数据库添加
上传服务器进行覆盖.
7,启动mycat
接下来切换到bin目录 启动mycat: ./mycat start console在查看服务器运行的程序的情况:./mycat status console,此时已经启动
查看mycat的端口
9066管理台端口
8,登陆mycat
mysql -uroot -proot -h 192.168.68.130(此处为当前mycat安装服务器的ip) -P 9066
查看帮助命令:show @@help;有很多大家可以自行百度用处.
查看读写分离情况:show @@datasource;
查看心跳检测:show @@heartbeat;只要RS_CODE都为1的话正常状态.搭建是成功的,.说一下我在这里遇到的问题,刚开始我查看心跳的时候hostM1主服务器RS_CODE为-1,我尝试排查是否是防火墙的问题,授权的问题.防火墙已关闭,接下来我用数据库连接工具去进行连接,发现也是连接成功的,返回查看心跳还是-1,就继续怀疑是授权的问题.就重新走一遍授权流程,并且修改密码为123456,这个时候奇怪的问题就出现了 ,数据库连接工具只能用之前的密码root才能连接成功,用新改的密码123456会报错:unknown error 1045;但是在终端连接的话需要用新修改的密码123456才能连接成功.这很是让我苦恼额.
接下来我就开始一步步排查问题参考此文:https://blog.csdn.net/ActionTech/article/details/95967251
此文第三种情况 用户存在但客户端主机无权连接 进行排查.发现root账户已经有%授权,192.168.68.%授权就显得多余了,而且我怀疑客户端连接授权就一直走的是192.168.68.%授权,只能允许68段的进行连接.在查看对比一下从服务器的user表,删除此授权.还真是这得问题.刷新权限后,客户端连接就可以了.心跳检测也全部状态为成功了
9,测试读写分离
退出mycat数据库,修改一下日志打印输出情况,cd ../conf/ 中 vi log4j2.xml ,拉到最下面 编辑如下
<asyncRoot level="debug" includeLocation="true">
<AppenderRef ref="Console" />
<AppenderRef ref="RollingFile"/>
</asyncRoot>
修改完以后切换至bin目录重启mycat: ./mycat restart;然后切换至log文件夹下 监听 tail -f wrapper.log 文件,此文件就是读写分离的log文件. 在打开一个终端进行读写分离操作.原终端进行日志查看.我这里增删改走的是主机,查询走的是从机.
插入两条数据和查看两次数据进行测试
通过日志可以查看走的是主从那一台服务器:如下
INFO | jvm 1 | 2020/06/03 09:52:39 | 2020-06-03 09:52:39,086 [DEBUG][$_NIOREACTOR-0-RW] release channel MySQLConnection [id=7, lastTime=1591149159084, user=root, schema=demo, old shema=demo, borrowed=true, fromSlaveDB=false, threadId=1673, charset=latin1, txIsolation=3, autocommit=true, attachment=null, respHandler=null, host=192.168.68.127, port=3306, statusSync=null, writeQueue=0, modifiedSQLExecuted=false] (io.mycat.backend.datasource.PhysicalDatasource:PhysicalDatasource.java:442)
INFO | jvm 1 | 2020/06/03 09:54:39 | 2020-06-03 09:54:39,086 [DEBUG][$_NIOREACTOR-0-RW] release channel MySQLConnection [id=11, lastTime=1591149279084, user=root, schema=demo, old shema=demo, borrowed=true, fromSlaveDB=true, threadId=21, charset=latin1, txIsolation=3, autocommit=true, attachment=null, respHandler=null, host=192.168.68.128, port=3306, statusSync=null, writeQueue=0, modifiedSQLExecuted=false] (io.mycat.backend.datasource.PhysicalDatasource:PhysicalDatasource.java:442)
读写分离已经完成了,以后客户端就不会访问我们的mysql数据库了,而是连接我们的mycat数据库服务器.当然这种架构不是很理想,mycat挂掉,整个数据库都会挂掉,当然mycat是可以做到集群的.以后在总结.