MySQL主从复制和读写分离实现(下)

1 篇文章 0 订阅
1 篇文章 0 订阅

上篇文章写了写主从复制的操作流程,这篇文章写读写分离.上文结尾已经说了,读写分离是一定基于主从复制的.

思考: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是可以做到集群的.以后在总结.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值