分库分表 mycat

mycat

要准备4台主机:
50 客户端
54、55 数据库服务器
56 mycat调度器

把54,55还原成独立数据库服务器,且只保留默认4个库其他都删除,停止56主机的mha管理服务,下载mycat软件到56主机

54和55
# cd /var/lib/mysql
# rm -rf master.info relay-log.info
# rm -rf mysql54-relay-bin.* 55就删除mysql54-relay-bin.*

# vim /etc/my.cnf
[mysqld]
... ...
#server_id=54 把之前主从这些设置都注释掉,主机55就注释#server_id=55
#relay_log_purge = 0
#plugin-load="rpl_semi_sync_slave=semisync_slave.so"
#rpl_semi_sync_slave_enabled = 1
#########################################################################
mycat适合并发写入数据多的公司。因为如果读取多的话,不建议使用,因为要从多个服务器来读取,会很慢。

mycat配置文件
目录结构说明:
bin mycat命令,如 启动 停止 等
catlet 扩展功能
conf 配置文件
lib mycat使用的jar
log mycat启动日志和运行日志
wrapper.log mycat服务启动日志
mycat.log 记录SQL脚本执行后的报错内容
重要配置文件说明:
server.xml 设置连mycat的账号信息
schema.xml 配置mycat的真实库表
rule.xml 定义mycat分片规则
配置标签说明
<user>.. ..</user> 定义连mycat用户信息
<datanode>.. ..</datanode> 指定数据节点
<datahost>.. ..</datahost> 指定数据库地址及用户信息
查看server.xml配置文件
#######################################################################
调度器56

# ls Mycat-server-1.4-beta-20150604171601-linux.tar.gz 这个包要从真机传到虚拟机
Mycat-server-1.4-beta-20150604171601-linux.tar.gz

# rpm -qa | grep -i jdk
java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64
java-1.8.0-openjdk-headless-1.8.0.131-11.b12.el7.x86_64
copy-jdk-configs-2.2-3.el7.noarch

# java -version
openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-b12)
OpenJDK 64-Bit Server VM (build 25.131-b12, mixed mode)

# tar -zxvf Mycat-server-1.4-beta-20150604171601-linux.tar.gz 免安装,解压即可使用
# ls mycat/ 自动生成同名文件,解压即可用
bin catlet conf lib logs version.txt
# mv mycat/ /usr/local/ 习惯把源码包放在这个目录下
# cd /usr/local/mycat/
# ls /usr/local/mycat/
bin catlet conf lib logs version.txt

# vim server.xml
代表注释的行,行的开头是<!-- 行的结尾是-->
34 <user name="admin"> 改用户名。连接mycat服务时使用的用户名。
35 <property name="password">123456</property> 改密码。用户admin连接mycat服务时的密码。
... ...


代表注释的行,行的开头是<!-- 行的结尾是-->
# vim schema.xml
7 <table name="travelrecord" dataNode="dn1,dn2" rule="auto-sharding-long" /> 改成dataNode="dn1,dn2"。表分片到数据节点dn1和dn2,随便取的名字
11 <table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" /> 改成dataNode="dn1,dn2"
15 <table name="hotnews" primaryKey="ID" dataNode="dn1,dn2,dn3" 改成dataNode="dn1,dn2"


37 <dataNode name="dn1" dataHost="mysql54" database="db1" /> 54主机要建db1库
38 <dataNode name="dn2" dataHost="mysql55" database="db2" /> 55主机要建db2库
39 <!-- <dataNode name="dn3" dataHost="localhost1" database="db3" /> --> 注释掉39行,前面加<!--句子后面加-->


接下来这一步是:指定mysql54主机对应的ip地址
43行<dataHost作为开始 到之后的几行的 </dataHost>作为结束,删掉其中注释的行。
代表注释的行,行的开头是<!-- 行的结尾是-->
43 <dataHost name="mysql54" maxCon="1000" minCon="10" balance="0" 改成name="mysql54"
44 writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
45 <heartbeat>select user()</heartbeat>
46 <writeHost host="hostM1" url="192.168.4.54:3306" user="plj" 改url这部分的ip和user部分
47 password="123qqq...A"> 改密码。 mycat56连接54数据库服务器时使用的用户名和密码
48 </writeHost>
49 </dataHost>

接下来这一步是:指定mysql55主机对应的ip地址
然后复制上面的这7行,在之后粘贴
51 <dataHost name="mysql55" maxCon="1000" minCon="10" balance="0" 改成name="mysql55"
52 writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
53 <heartbeat>select user()</heartbeat>
54 <writeHost host="hostM2" url="192.168.4.55:3306" user="plj" 改host="hostM2",还有url这部分的ip
55 password="123qqq...A"> 访问数据库时,mycat56服务连接55数据库服务器时使用的用户名和密码
56 </writeHost>
57 </dataHost>
########################################################################3
主机54

mysql> create database db1; 54建立db1库
mysql> select @@hostname;
+------------+
| @@hostname |
+------------+
| mysql54 |
+------------+

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| db1 |
| mysql |
| performance_schema |
| sys |
+--------------------+

mysql> grant all on *.* to plj@"%" identified by "123qqq...A";

# vim /etc/my.cnf
[mysqld]
lower_case_table_names = 1 表名忽略大小写。1代表不区分表名的大小写,0为区分大小写。
#server_id=54 把之前主从这些设置都注释掉
#relay_log_purge = 0
#plugin-load="rpl_semi_sync_slave=semisync_slave.so"
#rpl_semi_sync_slave_enabled = 1
#########################################################################
主机55

mysql> create database db2; 55建立db2库
mysql> select @@hostname;
+------------+
| @@hostname |
+------------+
| mysql55 |
+------------+

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| db2 |
| mysql |
| performance_schema |
| sys |
+--------------------+
mysql> grant all on *.* to plj@"%" identified by "123qqq...A";

# vim /etc/my.cnf
[mysqld]
lower_case_table_names = 1
#server_id=54
#relay_log_purge = 0
#plugin-load="rpl_semi_sync_slave=semisync_slave.so"
#rpl_semi_sync_slave_enabled = 1
##########################################################################
调度器56

# ls /usr/local/mycat/bin/
mycat rehash.sh startup_nowrap.sh wrapper-linux-ppc-64 wrapper-linux-x86-32 wrapper-linux-x86-64

# ll /usr/local/mycat/bin/mycat
-rwxr-xr-x. 1 root root 15714 6月 4 2015 mycat

# /usr/local/mycat/bin/mycat --help
Usage: ./mycat { console | start | stop | restart | status | dump }

# /usr/local/mycat/bin/mycat status
Mycat-server is not running.

# /usr/local/mycat/bin/mycat start
Starting Mycat-server...

# netstat -tunlp | grep :8066
tcp6 0 0 :::8066 :::* LISTEN 10841/java

# ls /usr/local/mycat/logs/
mycat.log mycat.pid wrapper.log # wrapper.log为错误日志


# cd /usr/local/mycat/conf
# vim rule.xml
... ...
26 <tableRule name="sharding-by-intfile">
27 <rule>
28 <columns>sharding_id</columns> 表格里必须有sharding_id这个字段
29 <algorithm>hash-int</algorithm>
30 </rule>
31 </tableRule>
... ...
86 <function name="hash-int"
87 class="org.opencloudb.route.function.PartitionByFileMap">
88 <property name="mapFile">partition-hash-int.txt</property> 这里的partition-hash-int.txt指定了hash-int这个算法的规则
89 </function>
... ...


# pwd
/usr/local/mycat/conf 当前目录

# cat partition-hash-int.txt
10000=0 这里的10000代表dn1这个主机,也就是54这台主机。sharding_id这个字段的值如果是10000,就会将记录的这行存放在dn1这台主机
10010=1 这里的10010代表dn2这个主机,也就是55这台主机。sharding_id这个字段的值如果是10010,就会将记录的这行存放在dn2这台主机
###########################################################################
客户端50

# mysql -h192.168.4.56 -P8066 -uadmin -p123456

mysql> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB | 调度器56上的给客户端看到的假库,它并不存在。
+----------+

mysql> show tables; 这些表都是调度器56上的给客户端看到的假表,它并不存在。
+------------------+
| Tables in TESTDB |
+------------------+
| company |
| customer |
| customer_addr |
| employee | 存放员工信息的表
| goods |
| hotnews |
| orders |
| order_items |
| travelrecord |
+------------------+

mysql> desc employee; 我们想看employee这个存放员工信息的表,它会报错,显示并不存在
ERROR 1146 (42S02): Table 'db2.employee' doesn't exist

sharding_id字段值是10000的行放入数据库dn1主机,即主机54的db1库。值10010的行放入数据库dn2主机,即主机55的db2库。
mysql> insert into employee(name,age,sharding_id) values("tom",19,10000),("harry",20,10010);
mysql> insert into employee(name,age,sharding_id) values("tom",19,10000),("harry",20,10010);

mysql> select * from employee;
+----+-------+------+-------------+
| id | name | age | sharding_id |
+----+-------+------+-------------+
| 3 | tom | 19 | 10000 | 这行记录,字段值是10000,放入数据库dn1主机,即主机54的db1库
| 4 | tom | 19 | 10000 | 这行记录,字段值是10000,放入数据库dn1主机,即主机54的db1库
| 3 | harry | 20 | 10010 | 这行记录,字段值是10010,放入数据库dn2主机,即主机55的db2库
| 4 | harry | 20 | 10010 | 这行记录,字段值是10010,放入数据库dn2主机,即主机55的db2库
+----+-------+------+-------------+
################################################################################################
54

# mysql -uroot -p123qqq...A

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| db1 |
| mysql |
| performance_schema |
| sys |
+--------------------+

mysql> use db1;
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| employee |
+---------------+

mysql> desc employee;
+-------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+----------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | char(10) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| sharding_id | int(11) | YES | | NULL | |
+-------------+----------+------+-----+---------+----------------+

mysql> select * from employee;
+----+------+------+-------------+
| id | name | age | sharding_id |
+----+------+------+-------------+
| 3 | tom | 19 | 10000 | 只能看到存入本机的db1库的行
| 4 | tom | 19 | 10000 |
+----+------+------+-------------+
################################################################################################
55

# mysql -uroot -p123qqq...A

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| db2 |
| mysql |
| performance_schema |
| sys |
+--------------------+

mysql> use db2;
mysql> show tables;
+---------------+
| Tables_in_db2 |
+---------------+
| employee |
+---------------+

mysql> desc employee;
+-------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+----------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | char(10) | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| sharding_id | int(11) | YES | | NULL | |
+-------------+----------+------+-----+---------+----------------+

mysql> select * from employee;
+----+-------+------+-------------+
| id | name | age | sharding_id |
+----+-------+------+-------------+
| 3 | harry | 20 | 10010 | 只能看到存入本机的db2库的行
| 4 | harry | 20 | 10010 |
+----+-------+------+-------------+

#####################################################################
# mv /etc/my.cnf /tmp/

之前做过多实例的配置,所以移动到别的地方。其实如果没有/etc/my.cnf这个配置文件,数据库服务也能起来,因为它会按默认配置来运行。不存在的时候,我们也可以自己创建并手动写的。
命令行配置是马上就生效,但是只是临时生效。
#####################################################################
举例:本步骤是另外的一个实验而已,仅仅只是演示,不要在本次这个实验里做!
虽然这个流程的确可以操作,但是还是不要尝试了。
如果没有/etc/my.cnf这个配置文件,数据库服务也能起来,因为它会按默认配置来运行,但有可能提示root无法空密码登陆。
当这个配置文件不存在的时候,我们也可以自己手动创建并编辑的!

# mv /etc/my.cnf /root/
# ls /etc/my.cnf
ls: 无法访问/etc/my.cnf: 没有那个文件或目录

# vim /etc/my.cnf 自己手动写一个新的配置文件
[mysqld]
max_connections=300

# systemctl restart mariadb

# mysql
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) 提示无法空密码登陆,权限被拒绝

# vim /etc/my.cnf
[mysqld]
max_connections=300
skip-grant-tables 跳过密码授权表,取消检测密码

# systemctl restart mariadb

# mysql 可以无密码登陆了!
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 5.5.56-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases; 能正常的看库和表,具有一切权限
+--------------------+
| Database |
+--------------------+
| information_schema |
| db1 |
| mysql |
| performance_schema |
| test |
+--------------------+

 

posted @ 2019-04-30 22:32  安于夏  阅读(141)  评论(0编辑  收藏  举报