zoukankan      html  css  js  c++  java
  • MYCAT实战之分片迁移

    实践扩容

    1.要求:

    travelrecord 表定义为10个分片,尝试将10个分片中的 2 个分片转移到第二台MySQL上,
    并完成记录要求,最快的数据迁移做法,中断业务时间最短
    

    2.针对分片以及迁移方式

    mycat中分片可以理解为dbn 
    而dbn可以是单独datahost中的某个database,
    也可以是一个datahost上的mysql实例中多个database.
    

    迁移方式:

    1、如果dbn是对应mysql实例中唯一database,迁移可以采用 mha+vip 方式快速迁移,
      这种方式很快,线上实际生产环境几秒可以实现切换
    
    2、如果dbn是对应mysql中多个 database 中一个,这个时候采用 mha+vip 方式不太合适,
      这个时候可以采用手动启动 slave(保证数据一致性的话,需要手动对 master加上 read lock(5.6 使用 lock),
      5.7 可以设置 super_read_only and read_ony=on,这个会影响所有表)
    

    由于测试环境问题,采用第二种方式,第一种方式相对简单.

    3. 环境说明

    192.168.2.136   mycat1
    192.168.2.134   mydb1
    192.168.2.135   mydb2
    

    4. mysql主从搭建(略)

    mysql> show slave status  G;
    *************************** 1. row ***************************
    			   Slave_IO_State: Waiting for master to send event
    				  Master_Host: 192.168.2.134
    				  Master_User: repl
    				  Master_Port: 3306
    				Connect_Retry: 60
    			  Master_Log_File: binlog.000010
    		  Read_Master_Log_Pos: 120
    			   Relay_Log_File: relaylog.000002
    				Relay_Log_Pos: 280
    		Relay_Master_Log_File: binlog.000010
    			 Slave_IO_Running: Yes
    			Slave_SQL_Running: Yes
    			  Replicate_Do_DB: 
    		  Replicate_Ignore_DB: 
    		   Replicate_Do_Table: 
    	   Replicate_Ignore_Table: 
    	  Replicate_Wild_Do_Table: 
      Replicate_Wild_Ignore_Table: 
    				   Last_Errno: 0
    				   Last_Error: 
    				 Skip_Counter: 0
    		  Exec_Master_Log_Pos: 120
    			  Relay_Log_Space: 446
    			  Until_Condition: None
    			   Until_Log_File: 
    				Until_Log_Pos: 0
    		   Master_SSL_Allowed: No
    		   Master_SSL_CA_File: 
    		   Master_SSL_CA_Path: 
    			  Master_SSL_Cert: 
    			Master_SSL_Cipher: 
    			   Master_SSL_Key: 
    		Seconds_Behind_Master: 0
    Master_SSL_Verify_Server_Cert: No
    				Last_IO_Errno: 0
    				Last_IO_Error: 
    			   Last_SQL_Errno: 0
    			   Last_SQL_Error: 
      Replicate_Ignore_Server_Ids: 
    			 Master_Server_Id: 101
    				  Master_UUID: 11764feb-b3df-11e7-ad1a-000c29962dd5
    			 Master_Info_File: /MySQL/my3306/data/master.info
    					SQL_Delay: 0
    		  SQL_Remaining_Delay: NULL
    	  Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
    		   Master_Retry_Count: 86400
    				  Master_Bind: 
    	  Last_IO_Error_Timestamp: 
    	 Last_SQL_Error_Timestamp: 
    			   Master_SSL_Crl: 
    		   Master_SSL_Crlpath: 
    		   Retrieved_Gtid_Set: 
    			Executed_Gtid_Set: 
    				Auto_Position: 0
    1 row in set (0.00 sec)
    

    5.配置mycat

    5.1 配置 schema.xml--10 个分片
    [root@mycat conf]# vi schema.xml
    
    <?xml version="1.0"?>
    <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
    <mycat:schema xmlns:mycat="http://org.opencloudb/">
    	<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
    			<table name="mycatbymonth" primaryKey="id" 
    				   dataNode="dn1,dn2,dn3,dn4,dn5,dn6,dn7,dn8,dn9,dn10" rule="sharding-by-month" />
    	</schema>
    	<dataNode name="dn1" dataHost="mysqlserver" database="db1" />
    	<dataNode name="dn2" dataHost="mysqlserver" database="db2" />
    	<dataNode name="dn3" dataHost="mysqlserver" database="db3" />
    	<dataNode name="dn4" dataHost="mysqlserver" database="db4" />
    	<dataNode name="dn5" dataHost="mysqlserver" database="db5" />
    	<dataNode name="dn6" dataHost="mysqlserver" database="db6" />
    	<dataNode name="dn7" dataHost="mysqlserver" database="db7" />
    	<dataNode name="dn8" dataHost="mysqlserver" database="db8" />
    	<dataNode name="dn9" dataHost="mysqlserver" database="db9" />
    	<dataNode name="dn10" dataHost="mysqlserver" database="db10" />
    
    	<!--######### TESTDB  ########-->
    	<dataHost name="mysqlserver" maxCon="1000" minCon="10" balance="0"
    			writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
    			<heartbeat>select user()</heartbeat>
    			<writeHost host="hostM1" url="192.168.2.134:3306" user="root" password="root123">
    			</writeHost>
    	</dataHost>
    </mycat:schema>
    
    5.2 配置 rule.xml
     <tableRule name="sharding-by-month">
    				<rule>
    						<columns>create_time</columns>
    						<algorithm>partbymonth</algorithm>
    				</rule>
    		</tableRule>
    
    <function name="partbymonth"
    				class="org.opencloudb.route.function.PartitionByMonth">
    				<property name="dateFormat">yyyy-MM-dd</property>
    				<property name="sBeginDate">2017-12-01</property>
    				<property name="sEndDate">2018-12-01</property>
    </function>
    
    5.3 重新加载配置文件
    [mysql@localhost ~]$  mysql -utest -ptest  -h192.168.2.136 -P9066
    Warning: Using a password on the command line interface can be insecure.
    Welcome to the MySQL monitor.  Commands end with ; or g.
    Your MySQL connection id is 7
    Server version: 5.5.8-mycat-1.5.1-RELEASE-20161130213509 MyCat Server (monitor)
    
    Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
    
    mysql> 
    mysql> 
    mysql> 
    mysql> reload @@config;
    Reload config success
    
    5.4 验证一下
    [mysql@localhost ~]$  mysql -utest -ptest  -h192.168.2.136 -P8066
    Warning: Using a password on the command line interface can be insecure.
    Welcome to the MySQL monitor.  Commands end with ; or g.
    Your MySQL connection id is 2
    Server version: 5.5.8-mycat-1.5.1-RELEASE-20161130213509 MyCat Server (OpenCloundDB)
    
    Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
    
    mysql> 
    mysql> 
    mysql> show databases;
    +----------+
    | DATABASE |
    +----------+
    | TESTDB   |
    +----------+
    1 row in set (0.00 sec)
    
    mysql> use TESTDB;
    Database changed
    mysql> show tables;
    
    +------------------+
    | Tables in TESTDB |
    +------------------+
    | mycatbymonth     |
    +------------------+
    

    6 在逻辑库创建表插入数据

    CREATE TABLE `mycatbymonth` (
    `id` int(11) NOT NULL  ,
    `create_time` datetime DEFAULT NULL,
    `datanode` varchar(10) DEFAULT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB   DEFAULT CHARSET=utf8
    
    
    mysql> explain select * from mycatbymonth;
    +-----------+--------------------------------------+
    | DATA_NODE | SQL                                  |
    +-----------+--------------------------------------+
    | dn1       | SELECT * FROM mycatbymonth LIMIT 100 |
    | dn10      | SELECT * FROM mycatbymonth LIMIT 100 |
    | dn2       | SELECT * FROM mycatbymonth LIMIT 100 |
    | dn3       | SELECT * FROM mycatbymonth LIMIT 100 |
    | dn4       | SELECT * FROM mycatbymonth LIMIT 100 |
    | dn5       | SELECT * FROM mycatbymonth LIMIT 100 |
    | dn6       | SELECT * FROM mycatbymonth LIMIT 100 |
    | dn7       | SELECT * FROM mycatbymonth LIMIT 100 |
    | dn8       | SELECT * FROM mycatbymonth LIMIT 100 |
    | dn9       | SELECT * FROM mycatbymonth LIMIT 100 |
    +-----------+--------------------------------------+
    10 rows in set (0.23 sec)
    
     #插入数据
     insert into mycatbymonth (id,create_time,datanode) values(1,'2017-12-12',@database);
     insert into mycatbymonth (id,create_time,datanode) values(2,'2018-01-12',@database);
     insert into mycatbymonth (id,create_time,datanode) values(3,'2018-02-12',@database);
     insert into mycatbymonth (id,create_time,datanode) values(4,'2018-03-12',@database);
     insert into mycatbymonth (id,create_time,datanode) values(5,'2018-04-12',@database);
     insert into mycatbymonth (id,create_time,datanode) values(6,'2018-05-12',@database);
     insert into mycatbymonth (id,create_time,datanode) values(7,'2018-06-12',@database);
     insert into mycatbymonth (id,create_time,datanode) values(8,'2018-07-12',@database);
     insert into mycatbymonth (id,create_time,datanode) values(9,'2017-08-12',@database);
     insert into mycatbymonth (id,create_time,datanode) values(10,'2018-09-12',@database);
    

    7 修改 9,10 分片到 mydb2 修改 schema.xml 配置

    [root@mycat conf]# vi schema.xml
    
    <?xml version="1.0"?>
    <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
    <mycat:schema xmlns:mycat="http://org.opencloudb/">
    	<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
    				<table name="mycatbymonth" primaryKey="id"
    						dataNode="dn1,dn2,dn3,dn4,dn5,dn6,dn7,dn8,dn9,dn10" rule="sharding-by-month" />
    	</schema>
    	<dataNode name="dn1" dataHost="mysqlserver" database="db1" />
    	<dataNode name="dn2" dataHost="mysqlserver" database="db2" />
    	<dataNode name="dn3" dataHost="mysqlserver" database="db3" />
    	<dataNode name="dn4" dataHost="mysqlserver" database="db4" />
    	<dataNode name="dn5" dataHost="mysqlserver" database="db5" />
    	<dataNode name="dn6" dataHost="mysqlserver" database="db6" />
    	<dataNode name="dn7" dataHost="mysqlserver" database="db7" />
    	<dataNode name="dn8" dataHost="mysqlserver" database="db8" />
    	<dataNode name="dn9" dataHost="mysqlserver2" database="db9" />
    	<dataNode name="dn10" dataHost="mysqlserver2" database="db10" />
    
    	<!--######### TESTDB  ########-->
    	<dataHost name="mysqlserver" maxCon="1000" minCon="10" balance="0"
    			writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
    			<heartbeat>select user()</heartbeat>
    			<writeHost host="hostM1" url="192.168.2.134:3306" user="root" password="root123">
    			</writeHost>
    	</dataHost>
    
    	<dataHost name="mysqlserver2" maxCon="1000" minCon="10" balance="0"
    			writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
    			<heartbeat>select user()</heartbeat>
    			<writeHost host="hostM1" url="192.168.2.135:3306" user="root" password="root123">
    			</writeHost>
    	</dataHost>
    
    
    
    </mycat:schema>
    

    8 业务切换

    8.1 对 db9 和 db10 上表进行加锁
    mysql> select * from db9.mycatbymonth;
    	+----+---------------------+----------+
    	| id | create_time         | datanode |
    	+----+---------------------+----------+
    	|  9 | 2018-08-12 00:00:00 | NULL     |
    	+----+---------------------+----------+
    	1 row in set (0.00 sec)
    
    mysql> select * from db10.mycatbymonth;
    +----+---------------------+----------+
    | id | create_time         | datanode |
    +----+---------------------+----------+
    | 10 | 2018-09-12 00:00:00 | NULL     |
    +----+---------------------+----------+
    1 row in set (0.00 sec)
    
    mysql> flush table db9.mycatbymonth,db10.mycatbymonth with read lock
    
    8.2 重新加载 mycat

    ** 注释涉及 dbn 修改需要重新加载所有**

    [mysql@localhost ~]$  mysql -utest -ptest  -h192.168.2.136 -P9066
    Warning: Using a password on the command line interface can be insecure.
    Welcome to the MySQL monitor.  Commands end with ; or g.
    Your MySQL connection id is 6
    Server version: 5.5.8-mycat-1.5.1-RELEASE-20161130213509 MyCat Server (monitor)
    
    Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
    
    mysql> 
    mysql> 
    mysql> reload @@config_all;
    Query OK, 1 row affected (0.37 sec)
    Reload config success
    
    8.3 mydb2 reset slave
    mysql> stop slave;
    Query OK, 0 rows affected (0.00 sec)
    mysql> reset slave all;
    Query OK, 0 rows affected (0.01 sec)
    
    8.4 通过日志验证新路由是否生效

    8.5 插入新数据是否在新库mydb2上
    mysql> select * from db10.mycatbymonth;
    +----+---------------------+----------+
    | id | create_time         | datanode |
    +----+---------------------+----------+
    | 10 | 2018-09-12 00:00:00 | NULL     |
    +----+---------------------+----------+
    1 row in set (0.01 sec)
    
    mysql> select * from db9.mycatbymonth;
    +----+---------------------+----------+
    | id | create_time         | datanode |
    +----+---------------------+----------+
    |  9 | 2018-08-12 00:00:00 | NULL     |
    +----+---------------------+----------+
    1 row in set (0.00 sec)
    

    插入数据后验证:
    #mycat上执行插入
    mysql> insert into mycatbymonth (id,create_time,datanode) values(11,'2018-09-14',@database);
    Query OK, 1 row affected (0.02 sec)

    mydb2上查询对应分片

    mysql> select * from db10.mycatbymonth;
    +----+---------------------+----------+
    | id | create_time         | datanode |
    +----+---------------------+----------+
    | 10 | 2018-09-12 00:00:00 | NULL     |
    | 11 | 2018-09-14 00:00:00 | NULL     |
    +----+---------------------+----------+
    2 rows in set (0.00 sec)
    

    可以看到数据已经插入到mydb2上了

    9、删除mydb1上的库表

    至此迁移完成

  • 相关阅读:
    UVA 129 Krypton Factor (困难的串)(回溯法)
    UVA 524 Prime Ring Problem(素数环)(回溯法)
    【POJ 2559】Largest Rectangle in a Histogram【栈】
    【POJ 2559】Largest Rectangle in a Histogram【栈】
    向右看齐【栈】
    向右看齐【栈】
    向右看齐【栈】
    【模板】最近公共祖先【LCA】
    【模板】最近公共祖先【LCA】
    【模板】最近公共祖先【LCA】
  • 原文地址:https://www.cnblogs.com/chinesern/p/8012260.html
Copyright © 2011-2022 走看看