Linux+Mysql多实例主从复制+Mycat读写分离(实战总结)

  • 内容
  • 相关

文章有点长,请耐心细心的阅读!!!!!!!


先说说环境吧:

主服务器:192.168.222.120    3306

从服务器:192.168.222.120    3307

mysql版本软件:yum安装mysql 5.1版本

java版本软件:jdk-8u161-linux-i586.rpm    相应的软件下载请点击

mycat版本软件:Mycat-server-1.5.1-RELEASE-20161130213509-linux.tar.gz    软件下载请点击,其他版本软件自行搜索

再说说想实现的功能吧:

主从服务器的数据库复制备份,通过mycat中间件实现读写分离

Image


1.在linux同一台主机下面搭建两个mysql 实例并实现主从复制 

具体的实现过程请参照之前的两篇博文,请移步:

在linux同一台主机下面搭建两个mysql 实例并实现主从复制(一)

在linux同一台主机下面搭建两个mysql 实例并实现主从复制(二)

2.java环境搭建

由于是java开发的mycat,因此先得搭建java环境,

用之前准备好的jdk-8u161-linux-i586.rpm安装包进行安装,安装好后进行检查。命令如下:

rpm  -ivh  jdk-8u161-linux-i586.rpm     #用rpm方式安装

java  -version      #检查java安装情况

如果显示如下类似信息即可:

[root@localhost ~]# java -version
java version "1.8.0_161"
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) Client VM (build 25.161-b12, mixed mode, sharing)

3.mycat的配置与启动

①把之前的Mycat-server-1.5.1-RELEASE-20161130213509-linux.tar.gz进行解包解压得到mycat目录

[root@localhost ~]# tar -xzvf Mycat-server-1.5.1-RELEASE-20161130213509-linux.tar.gz

②进入Mycat目录里的conf目录

[root@localhost ~]#cd mycat/conf

③先编辑server.xml

[root@localhost conf]# vi server.xml 
     34         <user name="test">
     35                 <property name="password">test</property>
     36                 <property name="schemas">TESTDB</property>
     37         </user>
     38 
     39         <user name="user">
     40                 <property name="password">user</property>
     41                 <property name="schemas">TESTDB</property>
     42                 <property name="readOnly">true</property>
     43         </user>
              
              <!--以上配置的是连接mycat的用户名和密码-->  

大概文档的34~43行,这儿做一个解释:

//34行配置中name是应用连接中间件逻辑库的用户名,35行配置中password是应用连接中间件逻辑库的密码。

//36行中的TESTDB是定义的MyCat的逻辑库,必须与schema.xml中的一致,逻辑库的概念与MySQL中的 database 概念相同,schemas中可以配置一个或多个。

//42行中的readOnly是应用连接中间件逻辑库所具有的权限。true为只读,false为读写都有,默认为false。

④再编辑schema.xml

[root@localhost conf]# vi schema.xml 

由于我们仅仅是做的读写分离,所以这个文件当中仅精简成如下的文字

仅仅主从读写分离的配置如下:

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">

    <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"> </schema>
        <!-- 定义MyCat的逻辑库TESTDB,逻辑库的概念与MySQL中的 database 概念相同 -->
    <dataNode name="dn1" dataHost="localhost1" database="test" />
        <!--上面的database属性设置的就是你要连接的数据库test,其他可以不用变-->
    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
                <!-- can have multi write hosts -->
                <!--设置执行写操作的数据库的IP地址、用户名以及密码,需要在相应的数据库中授权,切记!-->
         <writeHost host="hostM1" url="192.168.222.120:3306" user="root" password="123456">
            <!-- 以下是设置多个执行读操作的数据库的IP地址、用户名以及密码,需要在相应的数据库中授权,切记! -->
            <readHost host="hostS1" url="192.168.222.120:3307" user="root" password="123456"/>
        </writeHost>
    </dataHost>
</mycat:schema>

主挂掉之后自动切换到从的配置如下

(主从切换后,从写了数据,如原来的主库恢复后,在mycat上做写操作,后台mysql写库还是原来的从库,这个时候就会报错,主从连接失败,原因是从库会再重新从主库同步所有的数据,但是从库已经有了,所以就会报错,可以采取下面办法在原从库上一个个忽略过后,就正常了,没有报错:

stop slave;
set global sql_slave_skip_counter=1;
start slave;
show slave status\G;

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">

    <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"> </schema>
        <!-- 定义MyCat的逻辑库TESTDB,逻辑库的概念与MySQL中的 database 概念相同 -->
    <dataNode name="dn1" dataHost="localhost1" database="test" />
        <!--上面的database属性设置的就是你要连接的数据库test,其他可以不用变-->
    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>show slave status</heartbeat>
                 <!-- 使用Mycat托管MySQL主从服务器 -->
                <!-- can have multi write hosts -->
                <!--设置执行写操作的数据库的IP地址、用户名以及密码,需要在相应的数据库中授权,切记!-->
         <writeHost host="hostM1" url="192.168.222.120:3306" user="root" password="123456">
            <!-- 以下是设置多个执行读操作的数据库的IP地址、用户名以及密码,需要在相应的数据库中授权,切记! -->
            <readHost host="hostS1" url="192.168.222.120:3307" user="root" password="123456"/>
        </writeHost>
        <writeHost host="hostM2" url="192.168.222.120:3307" user="root"  password="123456"/>
             <!-- 以上的设置是多设置一个可以写的主机 -->
    </dataHost>
</mycat:schema>

PS:上面定义了hostM1、hostM2,放在上面的是默认起的那套系统。一定要多个writeHost,这样上面的readHost还可以用。

配置说明:

name属性唯一标识dataHost标签,供上层的标签使用。

maxCon属性指定每个读写实例连接池的最大连接。也就是说,标签内嵌套的

writeHost、readHost标签都会使用这个属性的值来实例化出连接池的最大连接数。

minCon属性指定每个读写实例连接池的最小连接,初始化连接池的大小。

balance属性负载均衡类型,目前的取值有4种:

1.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不负担读压力,注意balance=3                           只在1.4及其以后版本有,1.3没有。

writeType属性负载均衡类型,目前的取值有3种:

1.writeType="0", 所有写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后                            已切换后的为准,切换记录在配置文件中:dnindex.properties.

2.writeType="1",所有写操作都随机的发送到配置的writeHost,1.5以后废弃不推荐。

3.writeType="2",不执行写操作

switchType属性

-1 表示不自动切换

1 默认值,自动切换

2 基于MySQL主从同步的状态决定是否切换

3 基于MySQLgalarycluster的切换机制(适合集群)(1.4.1)

心跳语句为show status like‘wsrep%’

writeHost标签、readHost标签

这两个标签都指定后端数据库的相关配置给mycat,用于实例化后端连接池。唯一不同的是,writeHost指定写实例、readHost指定读实例,组着这些读写实例来满足系统的要求。
在一个dataHost内可以定义多个writeHost和readHost。但是,如果writeHost指定的后端数据库宕机,那么这个writeHost绑定的所有readHost都将不可用。另一方面,由于这个writeHost宕机系统会自动的检测到,并切换到备用的writeHost上去。

“readHost是从属于writeHost的,即意味着它从那个writeHost获取同步数据,因此,当它所属的writeHost宕机了,则它也不会再参与到读写分离中来,即“不工作了”,这是因为此时,它的数据已经“不可靠”了。基于这个考虑,目前mycat 1.3和1.4版本中,若想支持MySQL一主一从的标准配置,并且在主节点宕机的情况下,从节点还能读取数据,则需要在Mycat里配置为两个writeHost并设置banlance=1。”


⑤wrapper.xml编辑

[root@localhost conf]# vi wrapper.xml

修改当中的大概36/37号内容如下:

     36 wrapper.java.additional.10=-Xmx512M

     37 wrapper.java.additional.11=-Xms64M

主要是虚拟机安装的需要把容量调低点!

⑥启动mycat服务

切换到mycat目录下的bin目录,执行./mycat start,然后用ps -ef | grep mycat检查是否启动

[root@localhost conf]# cd ../bin
[root@localhost bin]#./mycat start 
Starting Mycat-server...
[root@localhost bin]# cat ../logs/wrapper.log

执行cat ../logs/wrapper.log 如果是下面的结果就表示成功启动。如果启动的时候就失败了,查看日志文件去解决!

MyCAT Server startup successfully. see logs in logs/mycat.lo    //有这句就成功了!!!!

4.测试

    mycat的连接方式与mysql的连接方式一样,只不过端口不同而已,mycat默认连接端口为8066,我这里使用的是Navicat连接测试,用户名和密码都是前面设置的test

Image

登陆进去开看到TESTDB数据库,其实就是对应的192.168.222.120主数据库中的TEST数据库,可以测试在主数据库建表table1,刷新TESTDB数据库,可以发现已经有了,同理做其它测试。

5.读写分离测试

①修改日志为debug 

[root@localhost bin]# vi ../conf/log4j.xml

修改里面内容为value=debug

<root> 
  <level value="debug" /> 
  <appender-ref ref="FILE" /> 
  <!--<appender-ref ref="FILE" />-->
</root>

②查看日志进行测试

[root@localhost bin]# tail ../logs/mycat.log

6.总结

其实还有很多未完善的功能,希望这是一个抛砖引玉吧!!!

综上,Linux+Mysql多实例主从复制+Mycat读写分离集群配置成功。

 您阅读这篇文章共花了:

上一篇:windows下安装多个mysql服务及主从复制——备忘录(已实际验证)

下一篇:windows下MySQL忘记密码解决方法

本文标签:    

版权声明:本文依据CC-BY-NC-SA 3.0协议发布,若无特殊注明,本文皆为《fishyoung》原创,转载请保留文章出处。

本文链接:Linux+Mysql多实例主从复制+Mycat读写分离(实战总结) - http://www.fishyoung.com/post-58.html