MyCAT常用スライス規則のスライス列挙
MyCATは複数のスライス規則をサポートしており、以下でテストするのはスライス列挙である.適用シーンでは、カラム値の個数は固定されています.例えば、省、月などです.
ここでは、ルールがruleである3つの値を定義する必要があります.xmlで定義します.
1. tableRule
2. function
3. mapFile
まずtableRuleを定義し、
ここでsharding-by-intfile-testはルール名でschemaになります.xmlで使用します.
columnsとは省を分割することを指す.
Algorithmはアルゴリズム名であり、functionで定義する必要があります.
次にfunctionを定義し、
ここで、mapFileとはプロファイル名を指します
typeのデフォルト値は0、0はInteger、非ゼロはStringです.私の次のテストは省スライスに基づいているので、typeを1に指定する必要があります.
defaultNodeデフォルトノード:0未満はデフォルトノードを設定しないことを示し、0以上はデフォルトノードのデフォルトノードを設定する役割を示します:スライスを列挙する場合、認識されていない列挙値に遭遇した場合は、デフォルトノードにルーティングします.デフォルトノードを構成しない場合(defaultNode値が0未満はデフォルトノードを構成しないことを示す)、認識されていない列挙値に遭遇するとエラーが表示されます.like this:can't find datanode for sharding column:column_name val:ffffffff
第三に、rule.xml現在のディレクトリの下にpartition-hash-int-testを作成します.txtファイル、列挙ルールの定義
ここでhubeiは1番目のノードに配布され、tianjinは2番目のノード、guangdongは3番目のノードに配布されます.
テストを開始します
まず、shema.xml定義テーブルのスライス規則
MyCAT作成テーブルへのログイン
# mysql -utest -ptest -h127.0.0.1 -P8066 -DTEstdB
hubeiがdb 2であるのは、schemaでは最初のノードに対応するためである.xml定義t_voteテーブルの場合、最初のノードはdn 2です.
shandongがdb 2にあるのは、スライスルールで定義されていないため、デフォルトノードに分割され、デフォルトノードdefaultNodeは0、すなわち最初のノードです.
まとめ:
1.最初はfunctionのtypeの値、すなわち1が指定されていませんでした.デフォルトのスライスタイプはstringではなくintegerであるため、insertタイムズのエラーが発生しました.
2.functionのdefaultNode値が指定されていない場合、認識されない列挙値を挿入すると、次のエラーが発生します.
3.MyCATは実際に動的ロード機能もサポートしている
例えば、defaultNodeの値をpartition-hash-int-testに定義します.txtでは、ははは、この点もサポートされています.もちろん、functionのdefaultNode値を注釈することを前提とし、そうでないとfunctionのdefaultNode値はpartition-hash-int-testを上書きする.txtでのDEFAULT_NODE値.
MyCAT 9066管理ポートへのログイン
# mysql -utest -ptest -h127.0.0.1 -P9066
MyCAT 8066ポートへのログイン
4.このルールに問題があります.途中でdefaultNodeの値を変更した場合、例えば、私が最初に設定したのは0で、shandongという値を挿入しましたが、今は2に変更します.
where条件では元の挿入値を取得できません.
ログに表示される情報は次のとおりです.
dn 3は現在のdefaultNode=2に対応するノードである.
--この記事は次のとおりです.http://www.tuicool.com/articles/aUZVF3Q
ここでは、ルールがruleである3つの値を定義する必要があります.xmlで定義します.
1. tableRule
2. function
3. mapFile
まずtableRuleを定義し、
<tableRule name="sharding-by-intfile-test">
<rule>
<columns>provincecolumns>
<algorithm>hash-int-testalgorithm>
rule>
tableRule>
ここでsharding-by-intfile-testはルール名でschemaになります.xmlで使用します.
columnsとは省を分割することを指す.
Algorithmはアルゴリズム名であり、functionで定義する必要があります.
次にfunctionを定義し、
<function name="hash-int-test"
class="org.opencloudb.route.function.PartitionByFileMap">
<property name="mapFile">partition-hash-int-test.txtproperty>
<property name="type">1property>
<property name="defaultNode">0property>
function>
ここで、mapFileとはプロファイル名を指します
typeのデフォルト値は0、0はInteger、非ゼロはStringです.私の次のテストは省スライスに基づいているので、typeを1に指定する必要があります.
defaultNodeデフォルトノード:0未満はデフォルトノードを設定しないことを示し、0以上はデフォルトノードのデフォルトノードを設定する役割を示します:スライスを列挙する場合、認識されていない列挙値に遭遇した場合は、デフォルトノードにルーティングします.デフォルトノードを構成しない場合(defaultNode値が0未満はデフォルトノードを構成しないことを示す)、認識されていない列挙値に遭遇するとエラーが表示されます.like this:can't find datanode for sharding column:column_name val:ffffffff
第三に、rule.xml現在のディレクトリの下にpartition-hash-int-testを作成します.txtファイル、列挙ルールの定義
hubei=0
tianjin=1
guangdong=2
ここでhubeiは1番目のノードに配布され、tianjinは2番目のノード、guangdongは3番目のノードに配布されます.
テストを開始します
まず、shema.xml定義テーブルのスライス規則
<table name="t_vote" dataNode="dn2,dn1,dn3" rule="sharding-by-intfile-test" />
MyCAT作成テーブルへのログイン
# mysql -utest -ptest -h127.0.0.1 -P8066 -DTEstdB
mysql> create table t_vote(id varchar(10),province varchar(10));
Query OK, 0 rows affected (0.04 sec)
mysql> insert into t_vote(id,province) values(database(),'hubei');
Query OK, 1 row affected (0.01 sec)
mysql> insert into t_vote(id,province) values(database(),'tianjin');
Query OK, 1 row affected (0.01 sec)
mysql> insert into t_vote(id,province) values(database(),'guangdong');
Query OK, 1 row affected (0.01 sec)
mysql> insert into t_vote(id,province) values(database(),'shandong');
Query OK, 1 row affected (0.01 sec)
mysql> select * from t_vote;
+------+-----------+
| id | province |
+------+-----------+
| db1 | tianjin |
| db2 | hubei |
| db2 | shandong |
| db3 | guangdong |
+------+-----------+
4 rows in set (0.03 sec)
hubeiがdb 2であるのは、schemaでは最初のノードに対応するためである.xml定義t_voteテーブルの場合、最初のノードはdn 2です.
shandongがdb 2にあるのは、スライスルールで定義されていないため、デフォルトノードに分割され、デフォルトノードdefaultNodeは0、すなわち最初のノードです.
まとめ:
1.最初はfunctionのtypeの値、すなわち1が指定されていませんでした.デフォルトのスライスタイプはstringではなくintegerであるため、insertタイムズのエラーが発生しました.
mysql> insert into t_vote(id,province) values(database(),'hubei');
ERROR 1064 (HY000): For input string: "hubei"
2.functionのdefaultNode値が指定されていない場合、認識されない列挙値を挿入すると、次のエラーが発生します.
mysql> insert into t_vote(id,province) values(database(),'shandong');
ERROR 1064 (HY000): can't find any valid datanode :T_VOTE -> PROVINCE -> shandong
3.MyCATは実際に動的ロード機能もサポートしている
例えば、defaultNodeの値をpartition-hash-int-testに定義します.txtでは、ははは、この点もサポートされています.もちろん、functionのdefaultNode値を注釈することを前提とし、そうでないとfunctionのdefaultNode値はpartition-hash-int-testを上書きする.txtでのDEFAULT_NODE値.
hubei=0
tianjin=1
guangdong=2
DEFAULT_NODE=2
MyCAT 9066管理ポートへのログイン
# mysql -utest -ptest -h127.0.0.1 -P9066
mysql> reload @@config;
Query OK, 1 row affected (0.03 sec)
Reload config success
MyCAT 8066ポートへのログイン
mysql> insert into t_vote(id,province) values(database(),'shanxi');
Query OK, 1 row affected (0.00 sec)
mysql> select * from t_vote;
+------+-----------+
| id | province |
+------+-----------+
| db1 | tianjin |
| db2 | hubei |
| db2 | shandong |
| db3 | guangdong |
| db3 | shanxi |
+------+-----------+
5 rows in set (0.01 sec)
4.このルールに問題があります.途中でdefaultNodeの値を変更した場合、例えば、私が最初に設定したのは0で、shandongという値を挿入しましたが、今は2に変更します.
mysql> select * from t_vote;
+------+-----------+
| id | province |
+------+-----------+
| db1 | tianjin |
| db3 | guangdong |
| db2 | shanxi |
| db2 | hubei |
| db2 | shandong |
+------+-----------+
5 rows in set (0.01 sec)
mysql> select * from t_vote where province='shandong';
Empty set (0.00 sec)
where条件では元の挿入値を取得できません.
ログに表示される情報は次のとおりです.
01/24 15:17:50.028 DEBUG [$_NIOREACTOR-0-RW] (EnchachePool.java:76) -SQLRouteCache miss cache ,key:TESTDBselect * from t_vote where province='shandong'
01/24 15:17:50.029 DEBUG [$_NIOREACTOR-0-RW] (EnchachePool.java:59) -SQLRouteCache add cache ,key:TESTDBselect * from t_vote where province='shandong' value:select * from t_vote where province='shandong', route={
1 -> dn3{SELECT *
FROM t_vote
WHERE province = 'shandong'
LIMIT 100}
}
dn 3は現在のdefaultNode=2に対応するノードである.
--この記事は次のとおりです.http://www.tuicool.com/articles/aUZVF3Q