当前位置: 首页 > 工具软件 > MaxScale > 使用案例 >

MysQL读写分离服务器--maxscale服务

周正真
2023-12-01

MysQL读写分离服务器–maxscale服务

构建思路:

1、部署MySQL一主一从结构一主服务器:192.168.1.11-从服务器:192.168.1.12
2、部署MysQL代理服务器192.168.1.13 -装包、修改配置文件、启动服务
3、测试配置-客户端192.168.1.14连接代理服务访问数据
[root@master ~]# mysql -uroot -p
mysql> alter user root@"localhost" identified by "qqq123...A";

192.168.1.11

[root@master ~]# vim /etc/my.cnf
[mysqld]
server-id=11
log-bin=master11
gtid_mode=ON
enforce-gtid-consistency=true
[root@master ~]# systemctl restart mysqld
[root@master ~]# mysql -uroot -pqqq123...A
mysql> grant replication slave  on *.* to repluser@"%" identified by "qqq123...A";
mysql> flush privileges;
mysql> show master status;
+-----------------+----------+--------------+------------------+--------------
| File            | Position |... | Executed_Gtid_Set                        |
+-----------------+----------+--------------+------------------+--------------
| master11.000001 |      593 | ...| 98ad3e05-971e-11ec-aa5c-000c29369f60:1-2 |
+-----------------+----------+--------------+------------------+--------------

192.168.1.12

[root@master ~]# vim /etc/my.cnf
[mysqld]
server-id=15
gtid_mode=ON
enforce-gtid-consistency=true
[root@slave ~]# systemctl restart mysqld
[root@slave ~]# mysql -uroot -pqqq123...A
mysql> change master to master_host="192.168.1.11",master_user="repluser", master_password="qqq123...A", MASTER_AUTO_POSITION=1;
mysql> start slave;
mysql> show slave status \G
*************************** 1. row ***************************
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
...
           Retrieved_Gtid_Set: ef82f680-9746-11ec-8a1d-000c296698dc:1-2
# slave  收到的信息
            Executed_Gtid_Set: ef82f680-9746-11ec-8a1d-000c296698dc:1-2
#slave  已经执行的信息
                Auto_Position: 1

配置读写分离服务器192.168.1.13,具体如下
1)安装软件部署maxscale服务

[root@max ~]# rpm  -ivh  maxscale-2.1.2-1.rhel.7.x86_64.rpm

2)修改配置文件 主从ip 监控用户路由用户

[root@max ~]# vim /etc/maxscale.cnf
[maxscale]						#定义线程个数 
threads=auto 				#改auto(线程=核数)

[server1]				#定义数据库服务器 
type=server 
address=192.168.1.11					#master主机ip地址 
port=3306 
protocol=MySQLBackend 

[server2]								#定义数据库服务器,server1-->5yy--> p 
type=server 
address=192.168.1.12					#slave主机ip地址 
port=3306 
protocol=MySQLBackend

###多从情况下可以继续定义server

[MySQL Monitor]				#定义要监视的数据库节点定义要监视的数据库节点
type=monitor
module=mysqlmon
servers=server1,server2				#主、从数据库的主机名
user=mysqla					#监控用户3306主从
passwd=qqq123...A			#密码
monitor_interval=10000
#[Read-Only Service]		#注释掉
#type=service
#router=readconnroute
#servers=server1
#user=myuser
#passwd=mypwd
#router_options=slave
[Read-Write Service]
type=service
router=readwritesplit
servers=server1,server2
user=mysqlb	#路由用户,max用mysqlb访问server1、2的mysql.user里的授权账户
passwd=qqq123...A
max_slave_connections=100%

[MaxAdmin Service]
type=service
router=cli

#[Read-Only Listener]
#type=listener
#service=Read-Only Service
#protocol=MySQLClient
#port=4008
[Read-Write Listener]
type=listener
service=Read-Write Service
protocol=MySQLClient
port=4006			#读写分离的端口		
[MaxAdmin Listener]
type=listener
service=MaxAdmin Service
protocol=maxscaled
socket=default
port=4016		#管理的端口

3)启动读写分离服务 maxscale -f /etc/maxscale.cnf

master

[root@master ~]# mysql -uroot -pqqq123...A
#创建监控主从服务器用户mysqla  获取主从角色,读取数据库状态的权限
mysql> grant replication slave, replication client on *.* to mysqla@"%" identified by "qqq123...A";
#创建路由用户mysqlb
mysql> grant select on mysql.* to mysqlb@"%" identified by "qqq123...A";

slave

mysql> select  user from mysql.user where user  in  ("mysqla","mysqlb");
+--------+
| user   |
+--------+
| mysqla |
| mysqlb |
+--------+

在max主机验证用户

[root@max ~]# which mysql
/usr/bin/which: no mysql in ...
[root@max ~]# yum -y install mariadb
[root@max ~]# mysql -umysqla -h192.168.1.11 -pqqq123...A
MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.00 sec)

[root@max ~]# mysql -umysqlb -h192.168.1.11 -pqqq123...A
MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
+--------------------+

启动服务

[root@max ~]# maxscale -f  /etc/maxscale.cnf
[root@max ~]# ss -ntulp | grep -E "4006|4016"
tcp   LISTEN   0  128 [::]:4006  [::]:*  users:(("maxscale",pid=1222,fd=11))
tcp   LISTEN   0  128 [::]:4016  [::]:*  users:(("maxscale",pid=1222,fd=12))
#排错日志
[root@max ~]# ls /var/log/maxscale/maxscale.log
[root@max ~]# pkill -9  maxscale   关掉进程
[root@max ~]# maxscale -f /etc/maxscale.cnf   启动服务

3、测试配置
1)查看监控信息(在max 本机自己访问自己)

[root@max ~]# maxadmin -uadmin -pmariadb -P 4016
#内置的用户admin与密码mariadb
MaxScale> list servers
Servers.
-------------------+-----------------+-------+-------------+--------------------
Server             | Address         | Port  | Connections | Status
-------------------+-----------------+-------+-------------+--------------------
server1            | 192.168.1.11    |  3306 |           0 | Master, Running
server2            | 192.168.1.12    |  3306 |           0 | Slave, Running
-------------------+-----------------+-------+-------------+--------------------
如果server的状态是down,那么server可能是授权有问题,监控不到,或者down,或者防护墙问题


2)客户测试配置
在主服务器添加用户,给客户连接使用(从数据库服务器会自动同步添加的用户)

master

mysql> create database testdb;
mysql> create table testdb.user(id int,name  char(10));
mysql> grant select,insert on testdb.*to testuser@"%" identified by "qqq123...A";

slave

mysql> desc testdb.user;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int(11)  | YES  |     | NULL    |       |
| name  | char(10) | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
mysql> select user from mysql.user ;
+-----------+
| user      |
+-----------+
| testuser  |

在客户端client连接读写分离服务器max访问数据

[root@client ~]# mysql -h192.168.1.13 -P4006 -utestuser   -pqqq123...A
MySQL [(none)]> show grants;
+------------------------------------------------------+
| Grants for testuser@%                                |
+------------------------------------------------------+
| GRANT USAGE ON *.* TO 'testuser'@'%'                 |
| GRANT SELECT, INSERT ON `testdb`.* TO 'testuser'@'%' |
+------------------------------------------------------+
MySQL [(none)]> insert into testdb.user values(1,"tom");
MySQL [(none)]> select * from testdb.user;
+------+------+
| id   | name |
+------+------+
|    1 | tom  |
+------+------+

3)验证读写分离操作如下:

写分离,从库跟随主库Gtid

mysql> show master status;
+-----------------+----------+--------------+------------------+---------------
| File            | Position | ...| Executed_Gtid_Set                         |
+-----------------+----------+--------------+------------------+---------------
| master11.000002 |     1661 | ...| 98ad3e05-971e-11ec-aa5c-000c29369f60:1-10 |
+-----------------+----------+--------------+------------------+---------------
mysql> show slave status\G
           Retrieved_Gtid_Set: 98ad3e05-971e-11ec-aa5c-000c29369f60:1-10
            Executed_Gtid_Set: 98ad3e05-971e-11ec-aa5c-000c29369f60:1-10

读分离,从服务器上添加数据,client 能查到,主库没有

[root@slave ~]# mysql -uroot -pqqq123...A
mysql>  insert into testdb.user values(2,"john");

[root@client ~]# mysql -h192.168.1.13 -P4006 -utestuser   -pqqq123...A
MySQL [(none)]> select * from testdb.user;
+------+-------+
| id   | name  |
+------+-------+
|    1 | tom   |
|    2 | john  |
+------+-------+
[root@master ~]# mysql -uroot -pqqq123...A
mysql> select * from testdb.user;
+------+-------+
| id   | name  |
+------+-------+
|    1 | tom   |
+------+-------+

MyCAT服务分库/分表

一、什么是分库分表 按照特定方式,分散存放到多台数据库服务器中
将存放在一台数据库服务器中的数据,按照特定方式进行拆分,分散存放到多台数据库服务器中,以达到分散单台服务器负载的效果
水平分割横向切分
按照表中指定字段的分片规则,将表记录按行切分,分散存储到多个数据库中。按照表中指定字段的分片规则,将表记录按行切分,分散存储到多个数据库中。
垂直分割纵向切分
将单个数据库的多个表按业务类型分类,分散存储到不同的数据库。
二、mycat软件的介绍
基于Java的分布式数据库系统中间件,为高并发环境的分布式存储提供解决方案
适合数据大量写入的存储需求
支持MySQL、Oracle、Sqlserver、Mongodb等
提供数据读写分离服务
提供数据分片服务
基于阿里巴巴Cobar进行研发的开源软件

1、分片规则分片规则

mycat支持提供10种分片规则
1、枚举法sharding-by-intfile
2、固定分片rule 
3、范围约定auto-sharding-long 
4、求模法mod-long 
5、日期列分区法sharding-by-date 
6、通配取模 sharding-by-pattern 
7、ASClI码求模通配 sharding-by-prefixpattern 
8、编程指定sharding-by-substring 
9、字符串拆分hash解析 sharding-by-stringhash 
10、一致性hash sharding-by-murmur

2、工作过程

当mycat收到一个SQL命令时:insert into 表(字段名)values(值);
a.解析SQL命令涉及到的表
b.然后看对表的配置,如果有分片规则,则获取SQL命令里分片字段的值,并匹配分片函数,获得分片列表
c.然后将SQL命令发往对应的数据库服务器去执行
d.最后收集和处理所有分片结果数据,并返回到客户端

二、配置mycat服务

192.168.1.14

192.168.1.11		db1
192.168.1.12		db2
192.168.1.13		db3
192.168.1.14		mycat    大于1G内存
192.168.1.15		client

1、安装软件 java Mycat

xml:扩展标记语言,配置项要放在标签里有单、双标签,注释 >

[root@mycat ~]# yum -y install  java-1.8.0-openjdk.x86_64
[root@mycat ~]#  tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
[root@mycat ~]# mv mycat/ /usr/local/
[root@mycat ~]# ls /usr/local/mycat/
bin  catlet  conf  lib  logs  version.txt
bin  					#mycat命令
catlet 				 #扩展功能
conf  		#配置文件,xml  lib					#mycat使用的jar包  	
logs  			#mycat启动日志和运行日志
wrapper.log			#记录SQL脚本执行后的报错内容
mycat.log				#mycat服务启动日志
version.txt
[root@mycat ~]# ls /usr/local/mycat/conf
server.xml		#设置连接账号及逻辑库
schema.xml			#配置数据分片存储的表
rule.xml				#分片规则,其他文件---分片规则配置文件

2、配置server.xml连接mycat服务使用的用户名、密码、逻辑库
使用默认配置,不用修改不用修改

<user name="用户名">				#连mycat服务用户名 
<property name="password">密码</property>					#用户密码 
<property name="schemas">库名</property>					#逻辑库 
</user> 
<user name="admin"> 
<property name="password">123456</property> <property name="schemas">TESTDB</property> <property name="readOnly">true</property>				#只读权限 
</user>

3、配置schema.xml 分片存储数据的表

分片储存表介绍
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema选项>					#定义数据分片存储的表名
<table选项/><table选项〉..…</table>			#定义表名
</schema>
<dataNode 选项=值,……/>				#定义数据库服务器的名称
<datahost 选项=值,….……</datahost>		#定义数据库服务器的ip地址
</mycat:schema>
[root@mycat ~]# sed -i '56,77d' /usr/local/mycat/conf/schema.xml
[root@mycat ~]# vim /usr/local/mycat/conf/schema.xml
1)定义数据分片存储的表名
5  <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">  #暂未修改
2)定义表名11,12,14,19,21  #dataNode可以多个,保持一致
11  <table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
12  <table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
14  <table name="hotnews" primaryKey="ID" autoIncrement="true" dataNode="dn1,dn2,dn3"
19  <table name="employee" primaryKey="ID" dataNode="dn1,dn2,dn3"  
21  <table name="customer" primaryKey="ID" dataNode="dn1,dn2,dn3"
3)定义数据库名
36    <dataNode name="dn1" dataHost="myslq11" database="db1" />  	#db1需建库
37    <dataNode name="dn2" dataHost="mysql12" database="db2" />
38    <dataNode name="dn3" dataHost="mysql13" database="db3" />
#38   <dataNode name="dn4" dataHost="mysql14" database="db4" />  
#如有更多的库可继续添加,需要前面dn1数量一致,mysql11,命名自定义。db1库都需建库。
4)定义数据库服务器的ip地址
43以下
43  <dataHost name="mysql11" maxCon="1000" minCon="10" balance="0"
44  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
45  <heartbeat>select user()</heartbeat>
46  <writeHost host="hostM1" url="192.168.1.11:3306" user="pljadmin"
47               password="qqq123...A">
48  </writeHost>
49  </dataHost>
###修改、删除保留如下,一个主机一个<dataHost>组##
50 <dataHost name="mysql12" maxCon="1000" minCon="10" balance="0"
51 writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
52 <heartbeat>select user()</heartbeat>
53 <writeHost host="hostM2" url="192.168.1.12:3306" user="pljadmin"
54         password="qqq123...A">
55 </writeHost>
56 </dataHost>
57 <dataHost name="mysql13" maxCon="1000" minCon="10" balance="0"
58 writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
59 <heartbeat>select user()</heartbeat>
60 <writeHost host="hostM3" url="192.168.1.13:3306" user="pljadmin"
61         password="qqq123...A">
62 </writeHost>
63 </dataHost>
64 </mycat:schema>

完整配置

     1  <?xml version="1.0"?>
     2  <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
     3  <mycat:schema xmlns:mycat="http://io.mycat/">
     4
     5          <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
     6                  <!-- auto sharding by id (long) -->
     7                  <table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
     8
     9                  <!-- global table is auto cloned to all defined data nodes ,so can join
    10                          with any table whose sharding node is in the same data node -->
    11                  <table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
    12                  <table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
    13                  <!-- random sharding using mod sharind rule -->
    14                  <table name="hotnews" primaryKey="ID" autoIncrement="true" dataNode="dn1,dn2,dn3"
    15                             rule="mod-long" />
    16                  <!-- <table name="dual" primaryKey="ID" dataNode="dnx,dnoracle2" type="global"
    17                          needAddLimit="false"/> <table name="worker" primaryKey="ID" dataNode="jdbc_dn1,jdbc_dn2,jdbc_dn3"
    18                          rule="mod-long" /> -->
    19                  <table name="employee" primaryKey="ID" dataNode="dn1,dn2,dn3"
    20                             rule="sharding-by-intfile" />
    21                  <table name="customer" primaryKey="ID" dataNode="dn1,dn2,dn3"
    22                             rule="sharding-by-intfile">
    23                          <childTable name="orders" primaryKey="ID" joinKey="customer_id"
    24                                                  parentKey="id">
    25                                  <childTable name="order_items" joinKey="order_id"
    26                                                          parentKey="id" />
    27                          </childTable>
    28                          <childTable name="customer_addr" primaryKey="ID" joinKey="customer_id"
    29                                                  parentKey="id" />
    30                  </table>
    31                  <!-- <table name="oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate"
    32                          /> -->
    33          </schema>
    34          <!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"
    35                  /> -->
    36          <dataNode name="dn1" dataHost="myslq11" database="db1" />
    37          <dataNode name="dn2" dataHost="myslq12" database="db2" />
    38          <dataNode name="dn3" dataHost="myslq13" database="db3" />
    39          <!--<dataNode name="dn4" dataHost="sequoiadb1" database="SAMPLE" />
    40           <dataNode name="jdbc_dn1" dataHost="jdbchost" database="db1" />
    41          <dataNode       name="jdbc_dn2" dataHost="jdbchost" database="db2" />
    42          <dataNode name="jdbc_dn3"       dataHost="jdbchost" database="db3" /> -->
    43          <dataHost name="myslq11" maxCon="1000" minCon="10" balance="0"
    44                            writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
    45                  <heartbeat>select user()</heartbeat>
    46                  <writeHost host="hostM1" url="192.168.1.11:3306" user="mycatadmin"
    47                                     password="qqq123...A">
    48                  </writeHost>
    49          </dataHost>
    50          <dataHost name="myslq12" maxCon="1000" minCon="10" balance="0"
    51                            writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
    52                  <heartbeat>select user()</heartbeat>
    53                  <writeHost host="hostM2" url="192.168.1.12:3306" user="mycatadmin"
    54                                     password="qqq123...A">
    55                  </writeHost>
    56          </dataHost>
    57          <dataHost name="myslq13" maxCon="1000" minCon="10" balance="0"
    58                            writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
    59                  <heartbeat>select user()</heartbeat>
    60                  <writeHost host="hostM3" url="192.168.1.13:3306" user="mycatadmin"
    61                                     password="qqq123...A">
    62                  </writeHost>
    63          </dataHost>
    64  </mycat:schema>

启动前配置

[root@db1 ~]# mysql -uroot -p123456 -e "create database  db1"
[root@db1 ~]# mysql  -uroot  -p123456  -e  'grant all on *.* to mycatadmin@"%" identified  by"qqq123...A"'
[root@db2 ~]# mysql -uroot -p123456 -e "create database  db2"
[root@db2 ~]# mysql  -uroot  -p123456  -e  'grant all on *.* to mycatadmin@"%" identified  by"qqq123...A"'
[root@db3 ~]# mysql -uroot -p123456 -e "create database  db3"
[root@db3 ~]# mysql  -uroot  -p123456  -e  'grant all on *.* to mycatadmin@"%" identified  by"qqq123...A"'
[root@mycat ~]# /usr/local/mycat/bin/mycat start
[root@mycat ~]# ls /usr/local/mycat/logs/
mycat.log  mycat.pid  wrapper.log
[root@mycat ~]# ss -utnlp | grep 8066
tcp    LISTEN     0      100    [::]:8066               [::]:*  
#这里增加了一行配置/usr/local/mycat/conf/wrapper.conf
wrapper.startup.timeout=300

三、枚举分片规则使用sharding-by-intfil
1、employee枚举分片建表配置
一字段值必须在规则文件定义的值里选择
表头的值 必须在 规则文件定义 的值里 选择
由schema看需要建立的表,由表看分片规则。
由rule里的规则查看表头规则、函数算法文件位置,修改算法文件,定义枚举的服务器

1)由schema.xml查使用枚举法sharding-by-intfile的表,建表规则

[root@mycat ~]# vim /usr/local/mycat/conf/schema.xml
 19            <table name="employee" primaryKey="ID" dataNode="dn1,dn2,dn3"
 20                    rule="sharding-by-intfile" />  #employee表,主键,枚举规则

2)由rule.xml查看所需表字段、规则文件位置

[root@mycat ~]# vim /usr/local/mycat/conf/rule.xml
...
 26         <tableRule name="sharding-by-intfile">
 27                 <rule>
 28                         <columns>sharding_id</columns>	#表头段,可自定义
 29                         <algorithm>hash-int</algorithm>		#算法名
 30                 </rule>
 31         </tableRule>
...
 97         <function name="hash-int"
 98                 class="io.mycat.route.function.PartitionByFileMap">
 99                 <property name="mapFile">partition-hash-int.txt</property>
 #####定义表头值的规则文件,表头的值必须在规则文件定义的值里选择
100         </function>

3)修改规则文件表头的枚举值

[root@mycat ~]# vim  /usr/local/mycat/conf/partition-hash-int.txt
#定义表头的值 表头的值=第几台数据库服务器0-->dn1,1-->dn2
10000=0
10010=1
10020=2

2、重启服务,插入表信息

[root@mycat ~]# /usr/local/mycat/bin/mycat stop
[root@mycat ~]# /usr/local/mycat/bin/mycat  start
[root@mycat ~]# mysql -h192.168.1.14 -P8066 -uroot -p123456
MySQL [(none)]> use TESTDB;			#区分大小写,同schema配置第五行
MySQL [TESTDB]> show tables;   #这里的表在schema配置的TESTDB库内,12行...
+------------------+
| Tables in TESTDB |
+------------------+
| company          |
| customer         |
| customer_addr    |
| employee         |
| goods            |
| hotnews          |
| orders           |
| order_items      |
| travelrecord     |
+------------------+
MySQL [TESTDB]> create table employee( ID int primary key, sharding_id int, name char(15), age int,home char(30));
#必须创建的前两个表字段ID int primary key, sharding_id 
MySQL [TESTDB]> insert into employee(ID,sharding_id,name,age,home) values(2,10000,"aaa",29,"home10000");

MySQL [TESTDB]> insert into employee(ID,sharding_id,name,age) values(3,10010,"bbb",29);

MySQL [TESTDB]> insert into employee(ID,sharding_id,name,age) values(4,10020,"ccc",29);
#插入的数据sharding_id,必须为配置里的10000,10010,10020

3、查看是否分片存储

[root@db1 ~]# mysql -uroot -p123456 -e 'select  * from  db1.employee'
+----+-------------+------+------+-----------+
| ID | sharding_id | name | age  | home      |
+----+-------------+------+------+-----------+
|  2 |       10000 | aaa  |   29 | home10000 |
+----+-------------+------+------+-----------+
[root@db2 ~]# mysql -uroot -p123456 -e 'select  * from  db2.employee'
+----+-------------+------+------+------+
| ID | sharding_id | name | age  | home |
+----+-------------+------+------+------+
|  3 |       10010 | bbb  |   29 | NULL |
+----+-------------+------+------+------+
[root@db3 ~]# mysql -uroot -p123456 -e 'select  * from  db3.employee'
+----+-------------+------+------+------+
| ID | sharding_id | name | age  | home |
+----+-------------+------+------+------+
|  4 |       10020 | ccc  |   29 | NULL |
+----+-------------+------+------+------+

四、求模分片规则mod-long

求模法-根据字段值与设定的数字求模结果存储数据
注意:根据表使用的分片规则建表,必须创建分片规则要求的表头。
根据表头值与设定的数字,取余的结果存储数据

1、hotnews求模分片建表配置
1)由schema.xml查看修改rule=“mod-long”

 14                  <table name="hotnews" dataNode="dn1,dn2,dn3"
 #修改:主键=id与rule.xml里的id冲突去掉,删除自增长,无作用
 15                             rule="mod-long" />

2)由rule.xml查看表头算法 求模值

[root@mycat ~]# vim /usr/local/mycat/conf/rule.xml
 38         <tableRule name="mod-long">
 39                 <rule>
 40                         <columns>id</columns>
 41                         <algorithm>mod-long</algorithm>
 42                 </rule>
 43         </tableRule>
...
105         <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
106                 <!-- how many data nodes -->
107                 <property name="count">3</property>
#与count后的数字3取余,等于数据库服务器的台数,0-->dn1,1-->dn2,2-->dn2
[root@mycat ~]# /usr/local/mycat/bin/mycat restart    #重启需等待
[root@mycat ~]# mysql -h192.168.1.14 -P8066 -uroot -p123456
MySQL [(none)]> use TESTDB;
MySQL [TESTDB]> create table  hotnews (id int, name char(10), home char(20));
MySQL [TESTDB]> insert into hotnews(id,name,home) values(7,"aaa","AAA"),(7,"aaa","AAA");
MySQL [TESTDB]> insert into hotnews(id,name,home)  values (8,"aaa","8AA"),(8,"8bb","BBB");
MySQL [TESTDB]> insert into hotnews(id,name,home)  values (9,"aaa","9AA"),(9,"9bb","BBB");

验证

[root@db1 ~]# mysql -uroot -p123456 -e 'select  * from  db1.hotnews'
+------+------+------+
| id   | name | home |
+------+------+------+
|    9 | aaa  | 9AA  |
|    9 | 9bb  | BBB  |
+------+------+------+
[root@db2 ~]#  mysql -uroot -p123456 -e 'select  * from  db2.hotnews'
+------+------+------+
| id   | name | home |
+------+------+------+
|    7 | aaa  | AAA  |
|    7 | aaa  | AAA  |
+------+------+------+
[root@db3 ~]#  mysql -uroot -p123456 -e 'select  * from  db3.hotnews'
+------+------+------+
| id   | name | home |
+------+------+------+
|    8 | aaa  | 8AA  |
|    8 | 8bb  | BBB  |
+------+------+------+

五、添加新库新表

1、添加新库名server.xml

此处添加多个库TESTDB,GAMEDB,多库名逗号隔开82,97
 80         <user name="root">
 81                 <property name="password">123456</property>
 82                 <property name="schemas">TESTDB,GAMEDB</property>
...
 95         <user name="user">
 96                 <property name="password">user</property>
 97                 <property name="schemas">TESTDB,GAMEDB</property>

2、添加新表名schema.xml

(不能和已有表名重名,添加一对儿<schema)配置严格区分大小写

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
  <schema name="GAMEDB" checkSQLschema="false" sqlMaxLimit="100">
                <table name="user" dataNode="dn1,dn2,dn3" rule="mod-long" />
                <table name="tea" dataNode="dn1,dn2,dn3" type="global" />
                ##type=global,全局写入,不受rule的限制,建表无要求。三台机器都会写入
  </schema>
  <schema name="TESTDB"...

3、重启mycat服务、建库建表测试

[root@mycat ~]# /usr/local/mycat/bin/mycat restart    #重启需等待
[root@mycat ~]# mysql -h192.168.1.14 -P8066 -uroot -p123456
MySQL [(none)]> show databases;
+----------+
| DATABASE |
+----------+
| GAMEDB   |
| TESTDB   |
+----------+
MySQL [(none)]> use GAMEDB;
MySQL [GAMEDB]> show tables;
+------------------+
| Tables in GAMEDB |
+------------------+
| tea              |
| user             |
+------------------+
##其他建表验证同上面实验
 类似资料: