linux配置mysql主从配置并搭建mycat
文章目录
一、搭建mysql主从配置(一主一从)
1.前期准备
- 准备两个虚拟机
- 安装mysql数据库,安装教程看我csdn就行
2.现在设置主库
- 修改mysql配置文件
vim /etc/my.cnf
[mysqld]
bind-address=0.0.0.0
port=3306
user=mysql
basedir=/usr/local/mysql
tmpdir=/data/mysql
datadir=/data/mysql
socket=/tmp/mysql.sock
log-error=/data/mysql/mysql.err
pid-file=/data/mysql/mysql.pid
#character config
character_set_server=utf8mb4
symbolic-links=0
explicit_defaults_for_timestamp=true
# 这个是主从库数据同步的数据库(不写这个就是主从全部同步)
# binlog-do-db=wqytest
# binlog-ignore-db=mysql 设置不同步的数据库
log-bin=mysql-bin
#Esc :wq 保存并退出
- 创建从库访问主库的用户
mysql -uroot -p123456
#给从库放权限
mysql> use mysql
mysql>GRANT FILE ON *.* TO 'root'@'49.232.134.35' IDENTIFIED BY 'root password'; #创建用户
mysql>GRANT REPLICATION SLAVE ON *.* TO 'root'@'49.232.134.35' IDENTIFIED BY 'root password'; #修改用户权限
mysql>select host ,user ,password from user; #查看是否修改成功
mysql>FLUSH PRIVILEGES; #刷新
- 查看刚刚创建的用户名密码
mysql> select Host,User from user;
4. 创建同步数据库
#创建数据库: 在从库中创建一个和主库相同的数据库,不然两个数据库不能同步(进行过数据迁移就跳过)
mysql> CREATE DATABASE wqytest CHARACTER SET utf8 COLLATE utf8_general_ci;
#查看日志文件名称
mysql> show master status;
#退出
mysql> exit
注:如果执行这个步骤始终为Empty set(0.00 sec),那说明前面的my.cnf没配置对
5. 查看日志文件(从库要用到的)
3.现在设置从库
vim /etc/my.cnf
[mysqld]
bind-address=0.0.0.0
port=3306
user=mysql
#添加server_id(比主库大就行)
server_id=5
basedir=/usr/local/mysql
datadir=/data/mysql
socket=/tmp/mysql.sock
log-error=/data/mysql/mysql.err
pid-file=/data/mysql/mysql.pid
#character config
character_set_server=utf8mb4
symbolic-links=0
explicit_defaults_for_timestamp=true
#配置同步数据库
replicate-do-db=wqytest
log-slave-updates
#按Esc :wq 保存并退出
#重启mysql
service mysql restart
chkconfig --list 查询服务列表
#登录
mysql -uroot -p123456
#停止
mysql> stop slave;
#设置主库相关信息
mysql> change master to master_host='81.70.170.21',master_user='root',master_password='123456',master_log_file='mqsql-bin.000001';
#重启slave
mysql> start slave;
#复位为了防止出现错误
mysql>stop slave; //停止
mysql>reset slave; //清空
mysql>start slave; //开启
#查看配置信息
mysql> show slave status \G;
二、安装mycat
mycat逻辑图
1.准备环境
刚刚安装mysql 主节点的服务器安装 jdk8
github安装地址
https://github.com/MyCATApache/Mycat-download
官网
http://www.mycat.org.cn/mycat.io
我的是1.6的 https://pan.baidu.com/s/1FBHU-hH6fO1xDkNxSykheQ
提取码是:ko98
2. 安装
下载的mycat上传到服务器 解压
Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
mkdir -p /usr/local/mycat
tar zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/mycat
cd /usr/local/mycat/mycat
目录 | 说明 |
---|---|
bin | mycat命令,启动、重启、停止等 |
catlet | catlet为Mycat的一个扩展功能 |
conf | Mycat 配置信息,重点关注 |
lib | Mycat引用的jar包,Mycat是java开发的 |
logs | 日志文件,包括Mycat启动的日志和运行的日志。 |
3.了解配置schema.xml server.xml rule.xml
mycat 主要配置这三个
1.了解schema.xml
配置参考:https://blog.csdn.net/lch520baby/article/details/89100176
配置参考解读链接:https://blog.csdn.net/lch520baby/article/details/89096327
2.了解server.xml
主要是找user标签
# name 登录的用户名(连接mycat的用户名)
<user name="root">
<property name="password">123456</property>
# 逻辑库名 和schemas.xml 里面的关联,多个用,分割
<property name="schemas">TESTDB</property>
<property name="schemas">TESTDB</property>
<!-- 表级 DML 权限设置 check sql表示不检测 -->
<!--
<privileges check="false">
# dml 就是规则配置 0110 第一个insert插入 第二个1 表示update 第三个表示select查询 第四了表示delete 0表示禁止
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
</user>
3.了解rule.xml
主要是tableRule 和function 对应
tableRule :指定分片规则的(读写分离用不到的,只有在分库的时候能用到)
<function name="murmur"
class="io.mycat.route.function.PartitionByMurmurHash">
<property name="seed">0</property><!-- 默认是0 -->
<property name="count">2</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片 -->
<property name="virtualBucketTimes">160</property><!-- 一个实际的数据库节点被映射为这么多虚拟节点,默认是160倍,也就是虚拟节点数是物理节点数的160倍 -->
<!-- <property name="weightMapFile">weightMapFile</property> 节点的权重,没有指定权重的节点默认是1。以properties文件的格式填写,以从0开始到count-1的整数值也就是节点索引为key,以节点权重值为值。所有权重值必须是正整数,否则以1代替 -->
<!-- <property name="bucketMapPath">/etc/mycat/bucketMapPath</property>
用于测试时观察各物理节点与虚拟节点的分布情况,如果指定了这个属性,会把虚拟节点的murmur hash值与物理节点的映射按行输出到这个文件,没有默认值,如果不指定,就不会输出任何东西 -->
</function>
三. 配置读写分离
我的表信息
1.配置schema.xml
配置一个主从数据库的读写分离就改4个地方
第一个:<schema name="
第二个:<table name=“user” dataNode=“dn1”
第三个:<dataNode name=“dn1” dataHost=“localhost1” database=“wqytest”
第四个:<dataHost name=“localhost1” maxCon="1000 里面的内容
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- 逻辑库的一个名字 随便取 checkSQLschema属性:当前端执行【select *from USERDB.tf_user;】时(表名前指定了mycat逻辑库名),两种取值:true:mycat会把语句转换为【select * from tf_user;】
false:会报错 -->
<schema name="suibian" checkSQLschema="true" sqlMaxLimit="100">
<!-- auto sharding by id (long) -->
<!-- 逻辑表(配置主从mysql真实的表名对应) dataNode和dataNode标签对应 -->
<table name="user" dataNode="dn1" />
</schema>
<!--dataHost和dataHost标签对应 database对应真实的数据库名 -->
<dataNode name="dn1" dataHost="localhost1" database="wqytest" />
<!-- 对应dataNode标签 -->
<dataHost name="localhost1" 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="hostM1" url="81.70.170.21:3306" user="root"
password="123456">
<!-- can have multi read hosts 对应从库地址 -->
<readHost host="hostS2" url="49.232.134.35:3306" user="root" password="123456" />
</writeHost>
<writeHost host="hostS1" url="localhost:3316" user="root"
password="123456" />
<!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
</dataHost>
</mycat:schema>
2.配置server.xml
这里修改一下配置<property name="schemas 这里面是schema.xml 中的逻辑库名称一定到对应
<user name="root">
<property name="password">123456</property>
<property name="schemas">suibian</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>
<user name="user">
<property name="password">user</property>
<property name="schemas">suibian</property>
<property name="readOnly">true</property>
</user>
3.启动mycat
cd /usr/local/mycat/mycat/bin
./mycat start
#看状态
./mycat status
#如果没启动看看日志
./mycat console
#停止
./mycat stop
#重启
./mycat restart
#看具体日志
cd ../logs/
4.测试mycat
我是用的navicat测试的,如果没有我这有安装包
链接:https://pan.baidu.com/s/1kTAQD3wUISo7Z2H4d3xKNw
提取码:eky0
这个用户名密码就是server.xml 里面的
<user name="root">
<property name="password">123456</property>
打开以后有一个之前schem.xml逻辑库名称 还有一个表
四、配置分库
1.前期准备
- 先在主从库分别配置3个数据库 6个数据库建表
create database demo1 default character set utf8;
create database demo2 default character set utf8;
create database demo3 default character set utf8;
create table `t_users`(
`id` int(11) not null auto_increment,
`name` varchar(255) default null,
primary key (`id`)
) engine=innodb default charset=utf8mb4
2.配置schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- 逻辑库的一个名字 随便取 -->
<schema name="suibian" checkSQLschema="true" sqlMaxLimit="100">
<!-- auto sharding by id (long) -->
<!-- 逻辑表(配置主从mysql真实的表名对应) dataNode和dataNode标签对应 rule 对应rule.xml表中的 tableRule name="crc32slot" 名称-->
<table name="t_users" dataNode="dn1,dn2,dn3" rule="crc32slot"/>
</schema>
<!--dataHost和dataHost标签对应 database对应真实的数据库名 -->
<dataNode name="dn1" dataHost="localhost1" database="demo1" />
<dataNode name="dn2" dataHost="localhost1" database="demo2" />
<dataNode name="dn3" dataHost="localhost1" database="demo3" />
<!-- 对应dataNode标签 -->
<dataHost name="localhost1" 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="hostM1" url="81.70.170.21:3306" user="root"
password="123456">
<!-- can have multi read hosts 对应从库地址 -->
<readHost host="hostS2" url="49.232.134.35:3306" user="root" password="123456" />
</writeHost>
</dataHost>
</mycat:schema>
修改rule.xml
<function name="crc32slot"
class="io.mycat.route.function.PartitionByCRC32PreSlot">
<property name="count">3</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片 -->
</function>
3. 重启mycat
重启 mycat bin目录下
./mycat restart
1.重启之后会在conf目录下生成ruledata
2.如果要在schema.xml中改变分片规则,就要把这个目录删了重启mycat
4.测试mycat
在navicat 中连接mycat
- 删除主库表
- 在mycat中创建表
- 在mycat中插入一条数据
insert into t_users(id,name) VALUES(1,"zhangsan")
发现在主库的demo2的表中有刚刚插入的数据
里面的_slot是根据rule.xml算法crc32算出来的,在conf目录ruledata下的文件夹中的文件写明这个值在什么范围内会加到哪个表中
咱们现在是44983所以在demo1的数据库中