mysql+mycat搭建高可用集群,主从复制,读写分离

Published 07-11-2019 17:33:35

工具准备

  • mysql两台(版本推荐5.5以上):
    • A主mysql:192.168.10.1:3306, 用户root,密码123456
    • B备mysql:192.168.10.2:3306, 用户root,密码123456

AB两台服务器中的mysql都创建sync_test数据库

实现mysql主备复制

主要思路:A开启日志,B读取操作日志,同步执行。

配置A主mysql

  • 在mysql安装目录下创建目录和文件mysql/log/mysql-bin.log

  • 修改my.ini

[mysqld]
server-id=1 #主机标示,整数
port=3306    
log-bin="xxx/mysql/log/mysql-bin.log"  #确保此文件可写
read-only=0   #主机,读写都可以
binlog-do-db=sync_test   #需要备份数据库,多个写多行
binlog-ignore-db=mysql #不需要备份的数据库,多个写多行
  • 允许mysql远程访问(lnmp服务器需要去掉防火墙)
mysql -uroot -proot

mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.10.*' IDENTIFIED BY 'root' WITH GRANT OPTION;

mysql>FLUSH PRIVILEGES;
  • 重启A主mysql数据库

配置B备mysql

  • 在mysql安装目录下创建目录和文件mysql/log/mysql-bin.log

  • 修改my.ini

[mysqld]
# add for sycn test
server-id=2                       #从机标识
log-bin="xxx/mysql/log/mysql-bin.log" #确保此文件可写
#master-host="192.168.10.1" #主机Ip
#master-user=root           #数据库访问用户名
#master-pass=123456         #数据库访问密码
#master-port=3306           #主机端口
#master-connect-retry=60     #如果从服务器发现主服务器断掉,重新连接的时间差(秒)
replicate-do-db=sync_test     #只复制某个库
replicate-ignore-db=mysql     #不复制某个库
  • 允许mysql远程访问(lnmp服务器需要去掉防火墙)
mysql -uroot -proot

mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.10.*' IDENTIFIED BY 'root' WITH GRANT OPTION;

mysql>FLUSH PRIVILEGES;
  • 重启B备mysql数据库

  • 配置B备mysql的数据来源,核实高亮处的状态是否正常。

mysql -uroot -proot

mysql>change master to master_host='192.168.110.1',master_port='3306',master_user='root',master_password='root';

mysql>slave start;

mysql>show slave status;

验证同步配置结果

  • A主mysql:使用navicat工具,在sync_test库中创建sync_table表,并添加一些数据
  • B备mysql:使用navicat工具,查看sync_test库,可以看到sync_table表和数据已被同步

实现读写分离

主要思路:使用mycat中间件,转发sql指令到后端mysql节点。mycat不负责数据库同步。

安装mycat

mycat可以认为它是一个数据库访问中间件,但更像ngnix等产品,具备访问路由、多表分表分片操作等功能。总之很强大。

安装过程自己百度~~~(java环境为jdk1.7以上,否则mycat将不支持)

配置mycat

  • server.xml ,配置访问用户及权限。修改高亮处信息,其中adminuser为访问mycat的用户,TESTDB为mycat虚拟的数据库,供上层应用访问。
<user name="admin">
    <property name="password">admin</property>
    <property name="schemas">TESTDB</property>
</user>
<user name="user">
    <property name="password">user</property>
    <property name="schemas">TESTDB</property>
    <property name="readOnly">true</property>
</user>

2)schema.xml。这部分不太好理解,精简了一下,主要分schema、dataNode、dataHost三个主要配置。

<?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">
        <!-- 这里不配置,代表所有的表分片到dn1节点-->
    </schema>

    <dataNode name="dn1" dataHost="localhost1" database="sync_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 -->
        <writeHost host="hostM1" url="192.168.10.1:3306" user="root"  password="123456">
            <!-- can have multi read hosts -->
            <readHost host="hostS2" url="192.168.10.2:3306" user="root" password="123456" />
        </writeHost>
    </dataHost>

</mycat:schema>

启动mycat

cd xxx\mycat\bin
./startup_nowrap.sh
  • 成功启动信息
MyCAT Server startup successfully. see logs in logs/mycat.log   #启动成功将看到如下信息。

测试读写分离

  • 使用navicat连接mycat,操作方式和连接物理mysql库一致,用户admin,密码admin,端口8066

  • 在TESTDB虚拟库中,创建新表test2,增加一些数据

  • 查看A节点、B节点数据已同步