天天看點

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;