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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011418530/article/details/88283945

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

架构图:

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

截图:

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

进入主服务器的mysql界面,

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

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

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

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

再次:设置从服务器

进入从服务器

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

命令:stop slave;

开始配置:

输入下面代码即可:

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,配置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;

猜你喜欢

转载自blog.csdn.net/u011418530/article/details/88283945