天天看点

2.0 Mycat实现MySQL的分库分表、读写分离、主从复制

Mycat及MySQL实例部署情况:

Mycat(版本:5.6.29):

IP:192.168.227.6,Port:3310/3311

MySQL(版本:5.6.29) :注意MySQL版本最好5,6以上,刚开始yum安装默认版本5.1.73版本总报错

userHost1,IP:192.168.227.3,Port:3306

userHost2,IP:192.168.227.4,Port:3306

userHost3,IP:192.168.227.5,Port:3306

架构图:

2.0 Mycat实现MySQL的分库分表、读写分离、主从复制

1,MySQL主从复制配置

主IP:192.168.227.3

从IP:192.168.227.5

首先:修改mysql的配置文件,使其支持二进制日志功能。

打开主服务器的mysql配置文件:my.conf

vim /etc/my.cnf 加上:

server-id = 3  //为服务器设置一个独一无二的id便于区分,这里使用ip地址的最后一位充当server-id

log-bin=mysql-bin //将mysql二进制日志取名为mysql-bin

binlog_format=mixed //二进制日志的格式,有三种:statement/row/mixed,具体分别不多做解释,这里使用mixed

replicate-do-db = db_store //需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可

replicate-ignore-db = mysql //不需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可

replicate-ignore-db = information_schema

保存重启数据库

同样进入从数据库修改

server-id = 5

log-bin=mysql-bin

binlog_format=mixed

replicate-do-db = db_store

replicate-ignore-db = mysql

replicate-ignore-db = information_schema

截图:

2.0 Mycat实现MySQL的分库分表、读写分离、主从复制

其次:在主服务器上为从服务器分配一个账号,就像一把钥匙,从服务器拿着这个钥匙,才能到主服务器上来共享主服务器的日志文件。

进入主服务器的mysql界面,

命令: # mysql -u root -p password     //我这里mysql账号是root,密码是password

在mysql操作界面下,输入下面一行命令:

GRANT replication slave ON *.* TO 'slave'@'%' IDENTIFIED BY 'password'; 

2.0 Mycat实现MySQL的分库分表、读写分离、主从复制

查看主服务器BIN日志的信息(执行完之后记录下这两值,然后在配置完从服务器之前不要对主服务器进行任何操作,因为每次操作数据库时这两值会发生改变).

2.0 Mycat实现MySQL的分库分表、读写分离、主从复制

再次:设置从服务器

进入从服务器

关闭slave(如果你以前配置过主从的话,一定要先关闭)

命令:stop slave;

开始配置:

输入下面代码即可:

2.0 Mycat实现MySQL的分库分表、读写分离、主从复制

CHANGE MASTER TO

MASTER_HOST="192.168.227.3",

MASTER_USER="root",

MASTER_PASSWORD="password",

MASTER_LOG_FILE="mysql-bin.000001",

MASTER_LOG_POS=311;

注意:MASTER_LOG_FILE和MASTER_LOG_POS值看主服务器日志信息

从服务器配置完成,启动从服务器:

命令: start slave;

2.0 Mycat实现MySQL的分库分表、读写分离、主从复制

2,配置Mycat

server.xml:

<!DOCTYPE mycat:server SYSTEM "server.dtd">

<mycat:server xmlns:mycat="http://io.mycat/">

    <system>

        <property name="useSqlStat">1</property>

        <property name="useGlobleTableCheck">0</property>

        <property name="defaultSqlParser">druidparser</property>

        <property name="sequnceHandlerType">2</property>

        <property name="processorBufferPoolType">0</property>

        <property name="serverPort">3310</property>      <!-- mycat的使用端口 -->

        <property name="managerPort">3311</property>      <!-- mycat的管理端口 -->

        <property name="handleDistributedTransactions">0</property>

        <property name="useOffHeapForMerge">1</property>

        <property name="memoryPageSize">1m</property>

        <property name="spillsFileBufferSize">1k</property>

        <property name="useStreamOutput">0</property>

        <property name="systemReserveMemorySize">389m</property>

    </system>

    <user name="root"><!--登陆mycat用户名-->

        <property name="password">123456</property><!--登陆mycat密码-->

       <!--数据库名,这里会和schema.xml中的配置关联,多个用逗号分开,例如需要这个用户需要管理两个数据库db1,db2,则配置db1,dbs-->

<property name="schemas">db_store,db_user</property>

        <property name="readOnly">false</property>

    </user>

</mycat:server>

schema.xml:

<?xml version="1.0"?>

<!DOCTYPE mycat:schema SYSTEM "schema.dtd">

<mycat:schema xmlns:mycat="http://io.mycat/">

    <!-- 数据库配置,与server.xml中的数据库对应 -->

    <schema name="db_user" checkSQLschema="false" sqlMaxLimit="100"> 

        <table name="data_dictionary" type="global" dataNode="db_user_dataNode1,db_user_dataNode2" primaryKey="dataDictionaryID"/>

        <table name="users" dataNode="db_user_dataNode$1-2"  rule="mod-userID-long" primaryKey="userID">      <!-- 对2取模,详见rule.xml -->

            <childTable name="user_address"  joinKey="userID" parentKey="userID" primaryKey="addressID"/>

        </table>

    </schema>

    <schema name="db_store" checkSQLschema="false" sqlMaxLimit="100">

        <table name="store" dataNode="db_store_dataNode" primaryKey="storeID"/>

        <table name="employee" dataNode="db_store_dataNode" primaryKey="employeeID"/>

    </schema>

    <!-- 分片配置 -->

    <!-- db_user -->

    <dataNode name="db_user_dataNode1" dataHost="db_userHOST1" database="db_user" />

    <dataNode name="db_user_dataNode2" dataHost="db_userHOST2" database="db_user" />

    <!-- 节点配置 -->

     <!-- db_store -->

     <dataNode name="db_store_dataNode" dataHost="db_storeHOST" database="db_store" />

    <!-- 配置db_user的节点主机 -->

    <dataHost name="db_userHOST1" maxCon="1000" minCon="10" balance="0"

              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">

        <heartbeat>select user()</heartbeat>

        <writeHost host="userHost1" url="192.168.227.3:3306" user="root"  password="password">

        </writeHost>

    </dataHost>

    <dataHost name="db_userHOST2" maxCon="1000" minCon="10" balance="0"

              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">

        <heartbeat>select user()</heartbeat>

        <!-- can have multi write hosts -->

        <writeHost host="userHost2" url="192.168.227.4:3306" user="root"  password="password">

        </writeHost>

    </dataHost>

    <!-- 配置db_store的节点主机 -->

    <dataHost name="db_storeHOST" 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.227.3:3306" user="root"  password="password">

            <!-- can have multi read hosts -->

            <readHost host="hostS1" url="192.168.227.5:3306" user="root" password="password" />    

        </writeHost>        

    </dataHost>

</mycat:schema>

修改rule.xml中下列配置项:

<tableRule name="mod-long">

        <rule>

            <columns>id</columns>           <!-- t1的分片列 -->

            <algorithm>mod-long</algorithm>

        </rule>

</tableRule>

<function name="mod-long" class="io.mycat.route.function.PartitionByMod">

        <!-- how many data nodes -->

        <property name="count">2</property> <!-- count值与分片个数相同 -->

</function>

db_store建表语句:

DROP TABLE IF EXISTS `employee`;

CREATE TABLE `employee` (

`employeeID` int(11) NOT NULL,

`userName` varchar(16) COLLATE utf8_bin DEFAULT NULL,

`phoneNum` varchar(32) COLLATE utf8_bin DEFAULT NULL,

`age` int(11) DEFAULT NULL,

`createTime` datetime DEFAULT NULL,

`lastUpdate` datetime DEFAULT NULL,

PRIMARY KEY (`employeeID`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

-- ----------------------------

-- Table structure for store

-- ----------------------------

DROP TABLE IF EXISTS `store`;

CREATE TABLE `store` (

`storeID` int(11) NOT NULL,

`storeName` varchar(32) COLLATE utf8_bin DEFAULT NULL,

`storeAddress` varchar(256) COLLATE utf8_bin DEFAULT NULL,

`createTime` datetime DEFAULT NULL,

`lastUpdate` datetime DEFAULT NULL,

PRIMARY KEY (`storeID`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;