序文
:mycat強力な、簡単な構成では、データベースミドルウェアとして、MyCatのインストールに配備非常に優れたオープンソース製品、ボーエンを参照しているMyCat配備インストールを。
この投稿は、以下の機能mycatが表示されます:
- 別々の読み取りと書き込み。
- サブライブラリーサブテーブル。
- グローバルテーブル;
環境は以下のとおりです。
システム | IP | ホスト名 | サービス |
---|---|---|---|
CentOSの7.5 | 192.168.20.2 | mysql01 | MySQLの5.7.24 |
CentOSの7.5 | 192.168.20.3 | mysql02 | MySQLの5.7.24 |
CentOSの7.5 | 192.168.20.3 | mysql03 | MySQLの5.7.24 |
CentOSの7.5 | 192.168.20.4 | 私の猫 | 私の猫 |
注:ホストmysql01とmysql02マスタースレーブレプリケーション関係、あなたがボーエン参照できるのMySQL高可用性ソリューションを-ダブルメイン(注:本体のみの影響から参照ボーエンを作成する必要があり、主を倍増する必要はありません、あなたはkeepalivedの必要はありませんビルドに高可用性)。mycatサービスは、ボーエン参照してくださいMyCatデプロイのインストールを使用すると、ボーエン参照することができ、ちょうど良いMySQLサーバを構築するために、ここで、ビルドに新しいホストmysql03をCentOSにデプロイのMySQL 5.7をビルドします。
1、mycat別々の読み取りと書き込み
そこでは、個別の読み取りと書き込みの使用なしホストmysql03は、簡単に実装することではありませんコンフィギュレーションファイルのmycatのだけ、次の2つの変更が必要です。次のとおりです。
1)server.xmlファイルを変更します
[root@mycat mycat]# pwd
/usr/local/mycat <!--此处为mycat的家目录-->
[root@mycat mycat]# vim conf/server.xml
<!--指定client连接mycat的用户名及密码,此处的账号密码与MySQL数据库无关-->
[root@mycat mycat]# vim conf/server.xml <!--定位到80行左右,修改如下-->
<user name="mycat" defaultAccount="true"> <!--mycat为用户名-->
<property name="password">pwd@123</property> <!--此处为用户mycat的登录密码-->
<property name="schemas">test_mycat</property> <!--此处为逻辑库名--
<!-- 表级 DML 权限设置 -->
<!--
<privileges check="false">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>
2)ファイルのschema.xmlを修正
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!--下面的schema必须和第一个文件中的schema name(逻辑库名)一致。-->
<schema name="test_mycat" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<dataNode name="dn1" dataHost="host1" database="test" /> <!--这里的database是指定要连接后端的哪个数据库,这里连接的是test库-->
<!--下面是指定后端真实的MySQL主机,关于下面的balance值,有三个可选值,将在下面写下来-->
<dataHost name="host1" maxCon="1000" minCon="10" balance="3"
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.20.2:3306" user="root"
password="123.com">
<!-- can have multi read hosts -->
<!--指定后端哪台主机用来读数据-->
<readHost host="hostS2" url="192.168.20.3:3306" user="root" password="123.com" />
</writeHost>
</dataHost>
</mycat:schema>
注:DataHost上記フィールドバランス負荷分散タイプ、現在、以下の4つの値があります。
- 「0」、別々の読み取りと書き込みメカニズムが有効になっていないバランス=、すべてが現在利用可能なwriteHost(デフォルト値)に送信され読み込みます。
- バランス= select文のバランスをとる「1」、およびwriteHostすべてreadHostスタンドが負荷に参加し、単に、デュアルマスタースレーブモードビス(M1-> S1、M2-> S2、およびM1とM2相互バックアップ) 、通常の状況下では、M2、S1、S2は、負荷分散にselect文に関与しています。
- バランス=「2」、全ての読み出し動作はwriteHost、配信readhostにランダムです。
- バランス=「3」、wiriterHost readhost対応するランダムな分布へのすべての読み取り要求が無いバランス= 3以降のバージョン1.4、1.3に読んで、唯一の注意を払うの負担なしに、writerHost圧を行いました。
値は以下のwriteTyepフィールド3:
1、writeType =「0」、すべての書き込み操作最初の送信writeHost構成、再起動スイッチングが構成ファイルに記録され、切り替えられた後もいずれか遅い、第writeHost存在ハングアップする最初のカットに中:dnindex.properties。
2は、writeType =「1」、すべての書き込みは推奨されない1.5を捨てた後、writeHostランダムな構成に送信されます。スイッチタイプの宿泊施設
- -1は自動切り替えを意味しません。
- デフォルト値は、自動切り替え。
- メインのMySQLに基づく2は、同期の状態から切り替えるかどうかを決定します。
改訂された完全な設定ファイルには、(冗長性を避けるために、いくつかのコメントを削除)、次のとおりです。
server.xml構成ファイルを次のように
[root@mycat mycat]# vim conf/server.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="useSqlStat">0</property> <!-- 1为开启实时统计、0为关闭 -->
<property name="useGlobleTableCheck">0</property> <!-- 1为开启全加班一致性检测、0为关闭 -->
<property name="sequnceHandlerType">2</property>
<property name="processorBufferPoolType">0</property>
<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">384m</property>
<property name="useZKSwitch">true</property>
</system>
<user name="mycat" >
<property name="password">pwd@123</property>
<property name="schemas">test_mycat</property>
</user>
</mycat:server>
schema.xmlを設定ファイルを次のように
[root@mycat mycat]# vim conf/schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="test_mycat" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<dataNode name="dn1" dataHost="host1" database="test" />
<dataHost name="host1" maxCon="1000" minCon="10" balance="3"
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.20.2:3306" user="root"
password="123.com">
<!-- can have multi read hosts -->
<readHost host="hostS2" url="192.168.20.3:3306" user="root" password="123.com" />
</writeHost>
</dataHost>
</mycat:schema>
注:この時点で、自分のユーザーに関連する権限を作成するために、バックエンドのデータベース、私はdatahostフィールドwritehostとreadhostフィールド上に指定したユーザのようなルートで、rootアカウントデータベースは、(デフォルトのルートをログオン権限を対応していますのみ)ので、自分のroot権限を変更したり、他の許可されたユーザに置き換えし、ユーザーがローカルホストにログオンすることができます。
要約:
バックエンドデータベースのログイン・ユーザーを指定して1、あなたが適切な権限を持っている必要がありますすることができます;
2.テストは、バックエンドデータベースを持っている必要がありますので、実際のテストのためのバックエンドデータベース上で指定。
3)スタートとテストライト分離mycat
[root@mycat mycat]# mycat start #启动mycat
[root@mycat mycat]# mysql -umycat -ppwd@123 -h 192.168.20.4 -P 8066 #登录到mycat
#192.168.20.4为mycat主机IP,mycat监听端口为8066,使用的登录用户为server.xml文件中创建的用户
#创建表并插入一些测试数据
mysql> use test_mycat;
mysql> create table t1 (id int,name varchar(4));
mysql> insert into t1 values(1,'张三'),(2,'李四'),(3,'王五');
#此时,去后端数据库上查看,应该是有上面这些数据的。
#现在可以暂时关闭后端数据库的主从复制,然后再mycat主机上继续插入数据,测试是否可以读到
#关闭主从复制命令:stop slave;
#以下操作还是在mycat主机进行
mysql> insert into t1 values(4,'赵六'); #插入一条数据
Query OK, 1 row affected (0.01 sec)
mysql> select * from t1; #查询不到刚插入的数据,说明读写操作没有在同一台主机上进行
+------+--------+
| id | name |
+------+--------+
| 1 | 张三 |
| 2 | 李四 |
| 3 | 王五 |
+------+--------+
#可以去后端两个数据库分别进行查看数据
#mysql01主机的数据如下(说明写操作是在mysql01):
mysql> select * from t1;
+------+--------+
| id | name |
+------+--------+
| 1 | 张三 |
| 2 | 李四 |
| 3 | 王五 |
| 4 | 赵六 |
+------+--------+
4 rows in set (0.00 sec)
#mysql02主机的数据如下:
mysql> select * from t1(说明读操作是在mysql02);
+------+--------+
| id | name |
+------+--------+
| 1 | 张三 |
| 2 | 李四 |
| 3 | 王五 |
+------+--------+
3 rows in set (0.00 sec)
この目的のために分離効果を読み書きします。(DOESは後でテスト、最高の回復とホストの複製からmysql02メインmysql01には影響を与えません)。
2、mycatサブライブラリーを実現
データベースは、多くのテーブルで構成され、さまざまなビジネスに、各テーブルの対応は、いわゆるサブライブラリーは、その共有データへのまたは別のボルト以上の圧力があり、異なるデータベース上の何かを得ることはありません、ビジネステーブルに従って分類されますサブライブラリーの原則:密接な関係があり、ライブラリ、ほとんど、あるいは全く相互関係テーブル内のテーブルが別のライブラリに割り当てることができる関連付けられている必要があります。
例えばサブライブラリー、:
顧客、注文、orders_detail、dict_order_type、各テーブルは、データの何百万人を有し、このテーブル4つのサブライブラリを達成するように、それは別々の顧客データベーステーブルに分離することができ、他の3:4つのテーブルがあると仮定別のデータベース内のテーブルを分けます。
1))ビットに論理ライブラリ名を変更する(server.xmlファイルを変更します
[root@mycat mycat]# cat conf/server.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="useSqlStat">0</property> <!-- 1为开启实时统计、0为关闭 -->
<property name="useGlobleTableCheck">0</property> <!-- 1为开启全加班一致性检测、0为关闭 -->
<property name="sequnceHandlerType">2</property>
<property name="processorBufferPoolType">0</property>
<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">384m</property>
<property name="useZKSwitch">true</property>
</system>
<user name="mycat" >
<property name="password">pwd@123</property>
<property name="schemas">test_db</property>
</user>
</mycat:server>
2)ファイルのschema.xmlを修正
[root@mycat mycat]# cat conf/schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="test_db" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
<table name="customer" dataNode="dn2"/> <!--这里指定customer在dn2节点上-->
</schema>
<dataNode name="dn1" dataHost="host1" database="test" />
<dataNode name="dn2" dataHost="host2" database="test" />
<dataHost name="host1" maxCon="1000" minCon="10" balance="3"
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.20.2:3306" user="root"
password="123.com">
<!-- can have multi read hosts -->
<readHost host="hostS2" url="192.168.20.3:3306" user="root" password="123.com" />
</writeHost>
</dataHost>
<!--下面添加host2主机字段,指定的主机就是mysql03-->
<dataHost name="host2" 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="hostM2" url="192.168.20.21:3306" user="root"
password="123.com">
</writeHost>
</dataHost>
</mycat:schema>
3)再起動mycat
[root@mycat mycat]# mycat restart
注:schema.xmlファイル上のデータノードのフィールドテストは、接続、バックエンドデータベースにある指定されているため、バックエンドのデータベースは、実際のテスト・データベースを指定する必要があります。
4)サブライブラリーの効果を試験します
#登录到mycat
[root@mycat mycat]# mysql -umycat -ppwd@123 -h 192.168.20.4 -P 8066
#创建相应的表
mysql> use test_db;
mysql> CREATE TABLE customer(
-> id_a INT AUTO_INCREMENT,
-> NAME VARCHAR(200),
-> PRIMARY KEY(id_a)
-> );
Query OK, 0 rows affected (0.02 sec)
mysql> CREATE TABLE orders(
-> id_b INT AUTO_INCREMENT,
-> order_type INT,
-> customer_id INT,
-> amount DECIMAL(10,2),
-> PRIMARY KEY(id_b)
-> );
Query OK, 0 rows affected (0.01 sec)
mysql> CREATE TABLE orders_detail(
-> id_c INT AUTO_INCREMENT,
-> detail VARCHAR(2000),
-> order_id INT,
-> PRIMARY KEY(id_c)
-> );
Query OK, 0 rows affected (0.02 sec)
mysql> CREATE TABLE dict_order_type(
-> id_d INT AUTO_INCREMENT,
-> order_type VARCHAR(200),
-> PRIMARY KEY(id_d)
-> );
Query OK, 0 rows affected (0.01 sec)
#登录到后端数据库上,查看表是否按照预计的效果拆分
[root@mycat mycat]# mysql -uroot -p123.com -h 192.168.20.2
mysql> use test;
mysql> show tables; #可以看到主机mysql01这里有三个表
+-----------------+
| Tables_in_test |
+-----------------+
| dict_order_type |
| orders |
| orders_detail |
+-----------------+
3 rows in set (0.00 sec)
#登录到mysql03上查看
[root@mycat mycat]# mysql -uroot -p123.com -h 192.168.20.21
mysql> use test;
mysql> show tables; #可以看到这里只有customer表
+----------------+
| Tables_in_test |
+----------------+
| customer |
+----------------+
1 row in set (0.00 sec)
これまでのところ、ライブラリーは(、栗の上に複数のテーブルが別のホスト上に配置することを実現する)異なるライブラリー内のポイント、複数のテーブルを達成しているが、mycat経由でログインし、お客様のために、またはライブラリは、ライブラリーは、4つのテーブルがあります。
図3に示すように、サブテーブルを達成mycat
ここでは、新しい表empに分割されています。
(完全プロフィール)以下のように1)schema.xmlファイルが変更され
[root@mycat mycat]# cat conf/schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="test_db" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
<table name="customer" dataNode="dn2"/>
<!--只需要在原来的配置文件中增加下面一行即可,表示将emp表分在了dn1和dn2这两个节点上-->
<table name="emp" dataNode="dn1,dn2" rule="mod_rule"/>
</schema>
<dataNode name="dn1" dataHost="host1" database="test" />
<dataNode name="dn2" dataHost="host2" database="test" />
<dataHost name="host1" maxCon="1000" minCon="10" balance="3"
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.20.2:3306" user="root"
password="123.com">
<!-- can have multi read hosts -->
<readHost host="hostS2" url="192.168.20.3:3306" user="root" password="123.com" />
</writeHost>
</dataHost>
<dataHost name="host2" 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="hostM2" url="192.168.20.21:3306" user="root"
password="123.com">
</writeHost>
</dataHost>
</mycat:schema>
2)rule.xmlファイルには、以下のものを追加します
[root@mycat mycat]# vim conf/rule.xml #修改rule.xml文件
<tableRule name="mod_rule"> <!--这里指定的name必须和schema.xml中指定的name一致-->
<rule>
<columns>id</columns> <!--这里指定的是以哪里列进行分表的-->
<algorithm>mod_long</algorithm> <!--这里指定的是分片方法-->
</rule>
</tableRule>
...................
<!--下面的name必须和上面的分片方法一致-->
<function name="mod_long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">2</property> <!--这里指定的是node节点数量-->
</function>
mycatへの3)再起動mycatとログ
[root@mycat mycat]# mycat restart
4)試験データ挿入mycat効果サブテーブルにログインを
[root@mycat mycat]# mysql -umycat -ppwd@123 -h 192.168.20.4 -P 8066
mysql> use test_db;
#创建emp表(后端两个数据库节点上都会有这张表)
mysql> create table emp (
-> id int,
-> name varchar(10)
-> );
Query OK, 0 rows affected (0.41 sec)
#插入多条数据(对于这种分表,插入数据需要指定列名,否则会报错)
mysql> insert into emp(id,name) values(1,'张三'),(2,'李四'),(3,'王五'),(4,'赵六');
#查询新插入的数据
mysql> select * from emp;
+------+--------+
| id | name |
+------+--------+
| 2 | 李四 |
| 4 | 赵六 |
| 1 | 张三 |
| 3 | 王五 |
+------+--------+
4 rows in set (0.04 sec)
mysql> select * from emp order by id; #对结果进行排序
+------+--------+
| id | name |
+------+--------+
| 1 | 张三 |
| 2 | 李四 |
| 3 | 王五 |
| 4 | 赵六 |
+------+--------+
4 rows in set (0.01 sec)
#后端mysql01主机查询到该表的数据如下:
mysql> select * from emp;
+------+--------+
| id | name |
+------+--------+
| 2 | 李四 |
| 4 | 赵六 |
+------+--------+
2 rows in set (0.00 sec)
#mysql03主机查询到的数据如下:
mysql> select * from emp;
+------+--------+
| id | name |
+------+--------+
| 1 | 张三 |
| 3 | 王五 |
+------+--------+
2 rows in set (0.00 sec)
あなたは、データを保存するための異なるノードでの平均スプレッドで見ることができます。
しかし、通常のテーブルの断片化した後、直接他のテーブルを結合することはできません。
マルチテーブル結合の問題を解決するために、のschema.xmlもまだそれを勉強し、特定を達成するためにどのように、テーブルのフィールドポイントテーブルにchildTableフィールドを追加し、設定ファイルを変更する必要があります。しかし、一部のテーブルのタイプは、グローバルテーブルに設定することができる、比較的単純な実装です。
3、グローバルテーブル
ポイントテーブルの後、他のテーブルと結合する方法は、より困難な問題になった、私たちはテーブル結合解決する方法(ただし、唯一の方法)であるグローバルテーブルを、設定分割するように選択することができますが、一定の制限が、グローバルテーブルがありますセックスは、次の通り:
- グローバルテーブルには、頻繁に変更されます。
- データの全体的な量はほとんど変化。
- データは、何千ものレコードの小さな、いくつかの超何百ものです。
グローバルテーブルには、次の機能があります。
- グローバルテーブルを挿入、更新操作は、すべてのノード、各フラグメントのデータの一貫性にリアルタイムで実行されます。
- グローバルテーブル、クエリ、唯一のノードから取得します。
- グローバルテーブル操作はいずれのテーブルを用いて行うことができるJOIN。
あなたがグローバルテーブルを作成したい場合は、テーブルのフィールドがちょうど種類を増やす=「グローバル」することができます。次のとおりです。
1)グローバルテーブルを定義します。
[root@mycat conf]# cat schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="test_db" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
<table name="customer" dataNode="dn2"/>
<!--在下面的table字段增加global属性即可-->
<table name="emp" dataNode="dn1,dn2" type="global">
</table>
</schema>
<dataNode name="dn1" dataHost="host1" database="test" />
<dataNode name="dn2" dataHost="host2" database="test" />
<dataHost name="host1" maxCon="1000" minCon="10" balance="3"
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.20.2:3306" user="root"
password="123.com">
<!-- can have multi read hosts -->
<readHost host="hostS2" url="192.168.20.3:3306" user="root" password="123.com" />
</writeHost>
</dataHost>
<dataHost name="host2" 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="hostM2" url="192.168.20.21:3306" user="root"
password="123.com">
</writeHost>
</dataHost>
</mycat:schema>
2)グローバルテーブルことを確認し
mysql> drop table emp; #需要删除之前创建的emp表
Query OK, 0 rows affected (0.03 sec)
#重新创建emp表
mysql> create table emp(
-> id int,
-> name varchar(10)
-> );
Query OK, 0 rows affected (0.38 sec)
#插入数据测试
mysql> insert into emp(id,name) values(1,'张三'),(2,'李四'),(3,'王五'),(4,'赵六');
#在mycat上查询插入的数据如下:
mysql> select * from emp;
+------+--------+
| id | name |
+------+--------+
| 1 | 张三 |
| 2 | 李四 |
| 3 | 王五 |
| 4 | 赵六 |
+------+--------+
4 rows in set (0.02 sec)
#在后端主机上分别查看emp表中的数据:
#mysql01主机上数据如下:
mysql> select * from emp;
+------+--------+
| id | name |
+------+--------+
| 1 | 张三 |
| 2 | 李四 |
| 3 | 王五 |
| 4 | 赵六 |
+------+--------+
4 rows in set (0.00 sec)
#mysql03主机上数据如下:
mysql> select * from emp;
+------+--------+
| id | name |
+------+--------+
| 1 | 张三 |
| 2 | 李四 |
| 3 | 王五 |
| 4 | 赵六 |
+------+--------+
4 rows in set (0.00 sec)