Fork me on GitHub

mycat实现mariadb读写分离、分库

部署信息

节点名称 节点IP 端口
master 127.0.0.1 3306
slave 127.0.0.1 3305
mycat 127.0.0.1 8066/9066

一、mariadb主从配置

1、mariadb安装

  1. 新建主节点配置文件(docker启动时会把此文件挂载到容器中)

    mkdir /opt/software/mariadb_master/
    cd /opt/software/mariadb_master/
    mkdir conf data
    cd conf
    #创建主节点配置文件docker.cnf
    vim docker.cnf
    

    配置文件内容

    [mysqld]
    server-id=1
    log-bin=master-bin 
    skip-host-cache
    skip-name-resolve
    collation-server = utf8mb4_general_ci
    init-connect='SET NAMES utf8mb4'
    character-set-server = utf8mb4
    [mysql] 
    default-character-set=utf8mb4
    [client] 
    default-character-set=utf8mb4
    
  2. 启动mariadb

    docker run --name mariadb-master -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mypass -v /opt/software/mariadb_master/conf:/etc/mysql/conf.d -v /opt/software/mariadb_master/data:/var/lib/mysql -d mariadb:10.5.6 --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci
    

    进入容器中修改配置文件/etc/mysql/my.cnf区分大小写

    lower_case_table_name=1
    
  3. 重新启动 mariadb

  4. 同样的步骤安装mariadb从节点

    配置文件内容

    [mysqld]
    server-id=2
    log-bin=master-bin
    skip-host-cache
    skip-name-resolve
    collation-server = utf8mb4_general_ci
    init-connect='SET NAMES utf8mb4'
    character-set-server = utf8mb4
    [mysql]
    default-character-set=utf8mb4
    [client]
    default-character-set=utf8mb4
    

    启动命令

    docker run --name mariadb-slave -p 3305:3306 -e MYSQL_ROOT_PASSWORD=mypass -v /opt/software/mariadb_slave/conf:/etc/mysql/conf.d -v /opt/software/mariadb_slave/data:/var/lib/mysql -d mariadb:10.5.6 --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci
    

2、开启主从复制

  1. 进入主节点,可以通过控制台或者Navicat这样的客户端管理软件

    docker exec -it mariadb-master /bin/bash
    mysql -uroot -p
    
  2. 创建用户

    create user 'user001'@'%' identified by 'mypass';
    grant replication slave on *.* to 'user001'@'%';
    flush privileges;
    ##查看主节点状态
    show master status;
    

  3. 进入从节点创建用户开启同步

    docker exec -it slave /bin/bash
    mysql -uroot -proot
    change master to master_host='127.0.0.1',master_port=3306,master_user='user001',master_password='mypass',master_log_file='master-bin.000005',master_log_pos=28102042;
    

    开启主从复制

    start slave;
    show slave status
    

    出现2个YES,代表主从复制设置成功。

3、注意

  1. 在更改配置文件后一定要重启mariadb。我执行show master status时显示为空,就是忘记重启、配置log-bin没起作用
  2. master_password、master_log_file的设置要与master status的内容匹配
  3. 如果slave status为非yes状态,则一定要确定防火墙、网络是否通、用户名、密码是否正确。

二、mycat配置、安装

mycat下载地址:http://www.mycat.org.cn/ http://dl.mycat.org.cn/1.6.7.4/

我这里选用的是Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz

cd /opt/software/mycat/
tar -zxvf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz 
  1. 配置文件修改

    server.xml主要更改部分如下:

    <user name="root" defaultAccount="true">
    		<property name="password">mypass</property>
    		<property name="schemas">mydb</property>
    		<property name="defaultSchema">mydb</property>
    </user>
    

    schema.xml主要更改部分如下:

    <?xml version="1.0"?>
    <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
    <mycat:schema xmlns:mycat="http://io.mycat/">
    
    	<schema name="mydb" checkSQLschema="true" sqlMaxLimit="100" randomDataNode="dn1">
    		<!--splitTableNames 启用<table name 属性使用逗号分割配置多个表,即多个表使用这个配置-->
    		<table name="data_detail_a,data_detail_b" dataNode="dn1,dn2" rule="sharding-by-month" splitTableNames ="true"/>
    		<table name="dual" dataNode="dn1" splitTableNames ="true"/>
    		<table name="data_param" dataNode="dn1" splitTableNames ="true"/>
    	</schema>
    	<!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"
    		/> -->
    	<dataNode name="dn1" dataHost="localhost1" database="mydb_1" />
    	<dataNode name="dn2" dataHost="localhost1" database="mydb_2" />
    
    	<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="localhost:3306" user="root"
    				   password="mypass">
    				   <readHost host="hostS2" url="localhost:3305" user="root" password="mypass" />
    		</writeHost>
    </mycat:schema>
    

    大致内容为将mydb_1、mydb_2组合为逻辑库mydb(server.xml与schema.xml的要对应);向hostM1写,从hostS2读。

  2. 启动命令为./bin目录下

    ./mycat start 启动
    ./mycat stop 停止 
    ./mycat console 前台运行 
    ./mycat restart 重启服务
    ./mycat pause 暂停 
    ./mycat status 查看启动状态
    

    如果启动失败,可以查看 ./logs下wrapper.log中的信息。

  3. 注意:

    • 开放端口。使用navicate连接mycat,端口8066(9066为管理端口)

      firewall-cmd --zone=public --add-port=8066/tcp --permanent
      firewall-cmd --zone=public --add-port=9066/tcp --permanent
      firewall-cmd --reload
      
    • java代码连接时采用8066端口

三、报错记录

  1. 启动时报错can't find table define in schema DUAL schema:mydb

    原因:mycat 有些版本没有dual 这个表,需要在你的逻辑库里面手动创建一个dual中间表。且设置不区分大小写。

    <table name="dual" dataNode="dn1" splitTableNames ="true"/>
    
  2. 插入数据时报错Can't find a valid data node for specified node index

    原因:插入数据时选用了规则rule="sharding-by-month",而其底层的partbymonth如下:

    <function name="partbymonth"
    			  class="io.mycat.route.function.PartitionByMonth">
    		<property name="dateFormat">yyyy-MM-dd</property>
    		<property name="sBeginDate">2015-01-01</property>
    	</function>
    

    sBeginDate 表示开始的月份,只能搞2015年的月分片,如果是16年的就会报错。改成2021-01-01即可。

参考文章:

https://www.jb51.net/article/160908.htm

https://www.cnblogs.com/niunafei/p/12823753.html

posted @ 2021-03-30 10:24  ayueC  阅读(253)  评论(0)    收藏  举报