我这里使用到了3台虚拟机,一台用于mycat,一台用于master主节点机器,一台用于slave从节点机器,下列的命令记得到对应的虚拟机上面使用
1.首先到官网下载http://www.mycat.org.cn/,右上角选择下载-.>文件下载服务
2.这个需要选择两个文件,其中一个是jar包,一个是安装模板,我安装的时候安装模板没有1.22版本,所以两个我都选择的1.21版本,下载之后把jar包放在安装模板的bin目录下面,然后再通过mobax放到linux服务器上面,我自己上传到/usr/local下面的
3.运行mycat需要依赖于mysql,jdk(这个是运行mycat环境需要的,与我们的mysql服务器不是同一个,mycat和mysql服务器不在同一个虚拟机上面,不然太麻烦了)这个自己去找文章进行安装就可以了
4.到这里我们需要搭建一个主从服务器,然后进行下一步的操作,我这里是在另外两台虚拟机上面安装的mysql8,使用docker进行安装的,比较方便,mycat也可以使用docker安装,这里需要自己去安装docker,也可以就在虚拟机上面进行安装
5.docker运行容器-d:后台运行,-p:绑定端口,-v:数据绑定,就是linux虚拟机和容器内的东西公用同一个文件,MYSQL_ROOT_PASSWORD这个就是设置容器内部mysql的密码,--name:给容器命名,mysql:8:是使用那个镜像来进行容器实例化,没有这个镜像它会自动下载
docker run -d -p 3306:3306 -v /etc/mysql/conf:/etc/mysql/conf.d -v /etc/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql8 mysql:8
6.开始设置主机配置,使用docker exec -it mysql8 /bin/bash 进入容器,然后配置文件设置成如下图就行,这里可能我们不知道如何编辑文件,可以先使用exit退出容器,然后使用 docker cp mysql8:/etc/mysql/my.cnf /etc/mysql/复制出来,修改完成之后再复制回去 docker cp /etc/mysql/my.cnf mysql8:/etc/mysql/ ,这个时候就开始为从服务器创建用户了
server-id=1 #mysql节点id
log-bin=atguigu-bin #二进制文件名称前缀
binlog-do-db=mydb1 #需要进行记录的数据库
binlog-format=STATEMENT #以什么样的方式进行记录,STATEMENT:使用sql语句进行记录,RAW:使用更新之后的数据进行记录MIXED:使用混合模式,其中的优缺点自己进行百度
7.在容器内使用mysql登录命令mysql -uroot -p123456 登录mysql,然后创建用户
create user 'slave1'@'%' identified by '123456';
alter user 'slave1'@'%' identified with mysql_native_password by '123456';
flush privileges;
然后使用show master status;需要将这里进行截图,等一下进行使用
8.然后到从节点服务器以上面的方式创建mysql从节点,以及将配置文件配置为如下
server-id=2
relay-log=mysql-relay #中继文件,从服务器需要先将binlog读入服务器,然后放在中继文件里面,最后mysql执行器去读取中继文件去进行同步
然后在从节点登录容器之后使用如下命令,下面的修改成自己对应的就可以了
change master to master_host='192.168.220.129', -- 主节点ip
master_user='slave1', -- 在主节点为从节点创建的用户
master_password='123456', --密码
master_log_file='atguigu-bin.000004', --上面截图的bin-log文件名称
master_log_pos=2670; --开始binlog文件进行同步的位置
到这里就可以执行start slave;启动从节点了,然后使用show slave status\G; 查看从节点状态就可以了,如下两行为yes就可以了如果遇到其他问题可能需要自己去处理了,一般可能是主节点的端口没有开放,或则是配置文件配置错误的问题
9.到这一步前面的基本信息也差不多处理完成了,这个时候到master上面创建数据库,根据binlog-do-db=mydb1我们来创建mydb1数据库,create database mydb1;然后show databases;查看效果,然后再到从服务器上面查看效果,然后我们再创建下面的数据
create table mytb1(id int,name varchar(50));
insert into mytb1 values(1,'zhangsan2');
来从机上面查看效果
10.跳转到mycat机器上面,跳转到/usr/local/mycat/conf/datasources 下面来将prototypeDs.datasource.json文件修改成如下
password:自己设置的master mysql的密码
user:使用的用户
url:将192.168.220.129修改成自己的master MySQL 的IP,mydb1修改称自己的数据库
然后跳转到mycat的bin目录下面执行如下命令,给这几个文件赋予可执行权限
chmod 777 mycat
chmod 777 wrapper-linux*
11.到这里可以使用如下命令./mycat console(也可以使用./mycat start这个命令对于新手不好查看mycat是否正常执行)启动mycat,出现如下图一般为执行成功了,表示mycat连接到master主机了
12.我们可以再windows机器上面使用数据库连接工具连接mycat,用户名密码在mycat的conf/users里卖弄有一个root用户,我们就是用这个账户密码进行登录
13.这个连接成功了之后打开数据库来查看一下情况,我们使用命令查看没有我们自己的数据库,这里只是一个逻辑库,可以使用create database mydb1;创建数据库,
到这里在mycat得配置文件conf/schem/目录下面多了一个以mydb1开头得配置文件,使用vim编辑添加这下面这一行,,网上说是指向数据源或则集群,不过在这之前我执行过mycat的数据库删除,然后master的数据库也被删除了
"tagerName":"prototype", //指向搭建集群的名称
14.这一步配置数据源,一个写数据源,一个读数据源
/*+ mycat:createDatasource{ "name":"rwSepw", "url":"jdbc:mysql://192.168.220.129:3306/mydb1?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true", "user":"root", "password":"123456"} */;
/*+ mycat:createDatasource{ "name":"rwSepr", "url":"jdbc:mysql://192.168.220.130:3306/mydb1?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true", "user":"root", "password":"123456"} */;
然后查询配置数据源结果
/*+ mycat:showDataSources{} */;
更新集群信息,添加dr0从节点,实现读写分离
//添加dr0从节点name:指定逻辑库,之前配置的数据源名称,masters:指定主节点(可以指定多个),replicas:指定从节点
/*! mycat:createCluster{"name":"prototype","masters":["rwSepw"],"replicas":["rwSepr"]} */;
查看集群信息
/*+ mycat:showClusters{} */;
进入集群配置文件里卖弄查看集群的配置信息
"readBalanceType":"BALANCE_ALL" //读负载均衡策略,默认是在所有节点进行轮询读请求,BALANCE_ALL_READ:获取集群中允许读的数据源,BALANCE_READ_WRITE:可以理解为读数据源优先,BALANCE_NONE:获取集群中允许写的数据源,即主节点
switchType:NOT_SWITCH // 不进行主从切换,SWITCH:可以进行主从切换
配置完成之后重启mycat
15.到这里读写分离就执行完毕了
然后打开数据库连接工具,之前创建了mydb1数据库,mytb1表,现在来查看结果,现网数据库里面写入一条数据然后查询(下面的sql),应该可以查询到数据,这里的hostname主要是为了区别是查询到的按个数据库的数据,因为我们的负载均衡策略是轮询,所以name多查询几次的结果应该是不一样的
insert into mytb1 values(2,@@hostname);
在这里可能会遇到几个情况说一下:
1.可能首先应该确定你的从节点是否同步主节点了,每次重启服务器都需要同步一下
2.mycat连接提示连接数量过大的时候去修改一下从服务器的配置,修改之后重启以下,然后在同步一下主从配置,这个时候再把mycat重启一下同步一下,不然可能也是查询的主节点的数据
max_connections=320 #数字稍微大一点就行
双主双从搭建
1.对于双主双从的架构,当master2作为从机的时候也是需要执行master1的binlog日志去进行数据更新的,自增字段所增加的间隔也应该为2,这需要在这主机配置文件里面添加如下几条命令
log-slave-updates
auto-increment-increment=2
auto-increment-offset=1 #对于master2的应该为2
对于master2的配置文件应该有如下变化
server-id=3
对于slave2的配置文件应该有如下变化
server-id=4
2.需要在第二个主从服务器上面实现主从的复制(开启对应的容器,创建相应的从机复制用户,在从机2里面开启主从复制的语句)
3.master1,master2互为主备的配置(在这个过程中slave1,slave2可能会断掉,这个只需要我们重新搭建一下就行),到这里应该就ok了,可以插入数据测试一下双主双从
4.添加第二个主从机的数据源
/*+ mycat:createDatasource{ "name":"rwSepw2", "url":"jdbc:mysql://192.168.220.132:3306/mydb1?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true", "user":"root", "password":"123456"} */;
/*+ mycat:createDatasource{ "name":"rwSepr2", "url":"jdbc:mysql://192.168.220.133:3306/mydb1?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true", "user":"root", "password":"123456"} */;
然后对集群信息进行修改,到clusters配置文件下面的配置文件里面的masters,replicas的配置
数据库分库分表
1.在开始打击那分库分表之前,先把clusters集群信息的主从都设置为一个,然后进入数据源,把不需要用的数据源给注释掉(加个后缀名就行),然后启动mycat,最后添加数据库,存储数据源(如下代码所示),拆功能键之后到数据源目录下面去查看对应的数据源文件有没有生成
/*+ mycat:createDataSource{
"name":"dw0",
"url":"jdbc:mysql://192.168.220.129:3306",
"user":"root",
"password":"123456"
} */;
/*+ mycat:createDataSource{
"name":"dr0",
"url":"jdbc:mysql://192.168.220.129:3306",
"user":"root",
"password":"123456"
} */;
/*+ mycat:createDataSource{
"name":"dw1",
"url":"jdbc:mysql://192.168.220.130:3306",
"user":"root",
"password":"123456"
} */;
/*+ mycat:createDataSource{
"name":"dr1",
"url":"jdbc:mysql://192.168.220.130:3306",
"user":"root",
"password":"123456"
} */;
2.添加集群配置,把新添加的数据源配置成集群
//在mycat终端输入,添加之后到集群文件里面查看集群添加结果信息,在真实的生产中,dw0和dr0应该也是在不同的主机上面
/*! mycat:createCluster{
"name":"c0",
"masters":["dw0"],
"replicas":["dr0"]
} */;
/*! mycat:createCluster{
"name":"c1",
"masters":["dw1"],
"replicas":["dr1"]
} */;
3.开始数据库的创建
创建全局表(广播表)
create database db1; #添加逻辑库之后到schem下面查看,targetName并没有指定物理节点
create table db1.travelrecord(
id bigint not null auto_increment,
user_id varchar(100) default null,
traveldate date default null,
fee decimal(10,0) default null,
blob int default null,
blob longblob,
primary key(id),
key id (id)
) engine=InnoDB DEFAULT CHARSET=utf8 BROADCAST;
创建分片表(分库分表)
#在mycat终端直接运行见表语句,往两个数据库各分一个表,分库分表都是以customer_id进行划分的
create table db1.orders(
id bigint not null auto_increment,
order_type int,
customer_id int,
amount decimal(10,2),
primary key(id),
key id (id)
)engine=INNODB DEFAUL CHARSET=utf8
dbpartition by mod hash(customer_id) tbpartition by mod_hash(customer_id) tbpartitions 1 dbpartitions 2;
#然后自己插入几条数据,并对数据进行查询,自己可以查看一下结果集的规律,然后再去几个数据库里面查看一下数据的分布情况
创建ER(entity relation)表,创建之后插入几条测试数据,然后进行关联查询,可以看到关联查询结果,然后去数据库去进行查看,并没有进行关联分库(hash字段不一样),这个时候需要思考为什么可以进行关联查询(到这里就没了)
create table orders_detail(
id bigint not null auto_increment,
detail varchar(200),
order_id int,
primary key(id)
)engine=innodb default charset=utf8
dbpartition by mod_hash(order_id) tbpartition by mod_hash(ordre_id) tbpartitions 1 dbpartitions 2;
#使用如下语句查看ER关系表
/*+ mycat:showErFroup{} */