一、 准备工作
下载Mysql镜像,使用docker安装mysql的原因:
docker pull mysql:5.7.31
二、Mysql配置文件
创建一个master_slave文件夹建立目录结构如下:
在master和slave的文件夹conf文件中各创建一个my.cnf文件配置内容如下:
master:
[mysqld]
#启用二级制日志
log-bin=mysql-bin
#服务id必须唯一
server-id=1
slave:
[mysqld]
log-bin=slave-bin
server-id=2
三、启动主从数据库
master:
#启动主数据库
docker run -p 13306:3306 -d --name mysql-master -e MYSQL_ROOT_PASSWORD=mysql -v /Users/amxliuli/amx/learn/mysql/master_slave/master/conf/my.cnf:/etc/my.cnf mysql:5.7.31
#进入容器
docker exec -it mysql-master bash
#登录mysql
mysql -uroot -p
#输入密码
mysql
slave:
#启动
docker run -p 13307:3306 -d --name mysql-slave -e MYSQL_ROOT_PASSWORD=mysql -v /Users/amxliuli/amx/learn/mysql/master_slave/slave/conf/my.cnf:/etc/my.cnf mysql:5.7.31
#进入容器
docker exec -it mysql-slave bash
#登录mysql
mysql -uroot -p
#输入密码
mysql
四、Mysql主从配置
在主容器的mysql中输入以下命令:
# 授权所有ip可以作为主mysql的从库
mysql>GRANT REPLICATION SLAVE ON *.* to 'root'@'%' identified by 'mysql';(所有ip)
# 查看主库的数据库状态
show master status;
记录File和Position的内容,后续配置从库需要;
注意事项:
此时不要在主库做任何操作,否则会导致状态变化
1. 配置从库的master
# 配置从库的master
change master to
# 主库ip
master_host='x.x.x.x',
# 主库用户名
master_user='root',
# 主库的log名,即刚才主库状态记录的File
master_log_file='mysql-bin.000003',
# 主库log的位置,即刚才主库状态记录的Position
master_log_pos=1201,
# 主库端口,容器映射的端口即1
master_port=32768,
master_password='mysql';
2. 启动slave
start slave;
3. 检查从库的状态
show slave status;
其中如果
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
这两项如果都为Yes说明配置成功,如果其他可以stop slave;重新配置。
五、测试主从复制
# 创建数据库
create database amx;
# 使用数据库amx
use amx;
# 创建表user
create table user(id int(3),name char(4));
# 插入一条数据
insert into user values(1,'amx');
# 查询数据
select * from user;
# 查看所有数据库
show databases;
# 使用数据库amx
use amx;
# 查看数据
select * from user;
至此,MySQL的主从配置已经配置成功;
需要注意的是,主从复制是读写分离的基础,所以必须保证主从复制配置没有问题。
由于网上大多数是关于mycat1 的例子,所以想尝试一下mycat2
一、安装mycat2
# 下载安装包
wget http://dl.mycat.org.cn/2.0/install-template/mycat2-install-template-1.21.zip
# 下载 Mycat 2 所需依赖 jar
wget http://dl.mycat.org.cn/2.0/1.21-release/mycat2-1.21-release-jar-with-dependencies.jar
# 解压安装包
unzip mycat2-install-template-1.21.zip
# 将依赖包复制到lib下
cp mycat2-1.20-jar-with-dependencies.jar mycat/bin/
# 授予 bin 目录下所有命令可执行权限
chmod +x mycat/bin/*
二、配置
这里主要是配置mycat连接真正数据库的信息目录在/mycat/conf/datasources
1). 配置原型库的数据源信息prototypeDs.datasource.json
{
"dbType":"mysql",
"idleTimeout":60000,
"initSqls":[],
"initSqlsGetConnection":true,
"instanceType":"READ_WRITE",
"maxCon":1000,
"maxConnectTimeout":3000,
"maxRetryCount":5,
"minCon":1,
"name":"prototypeDs",
"password":"mysql",
"type":"JDBC",
"url":"jdbc:mysql://192.168.100.18:13306/mycat?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
"user":"root",
"weight":0
}
主要是 url、user、password三个参数,需要提前在数据库中创建这样一个数据库,需要可连接。
2). 配置主库和从库的数据源信息
首先将原型库配置文件拷贝两份,并修改名称
cp prototypeDs.datasource.json master.datasource.json
cp prototypeDs.datasource.json slave-01.datasource.json
配置主库
"dbType":"mysql",
"idleTimeout":60000,
"initSqls":[],
"initSqlsGetConnection":true,
"instanceType":"READ_WRITE",
"maxCon":1000,
"maxConnectTimeout":3000,
"maxRetryCount":5,
"minCon":1,
#数据源名称,配置集群使用
"name":"master",
"password":"mysql",
"type":"JDBC",
"url":"jdbc:mysql://192.168.100.18:13306/master_slave?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
"user":"root",
"weight":0
}
配置从库
{
"dbType":"mysql",
"idleTimeout":60000,
"initSqls":[],
"initSqlsGetConnection":true,
"instanceType":"READ",
"maxCon":1000,
"maxConnectTimeout":3000,
"maxRetryCount":5,
"minCon":1,
#数据源名称,配置集群使用
"name":"slave-01",
"password":"mysql",
"type":"JDBC",
"url":"jdbc:mysql://192.168.100.18:13307/master_slave?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
"user":"root",
"weight":0
}
在目录/mycat/conf/clusters
1). 复制文件
将原来的集群配置文件拷贝一份并修改文件名
cp prototype.cluster.json master-slave.cluster.json
2). 修改配置
{
"clusterType":"MASTER_SLAVE",
"heartbeat":{
"heartbeatTimeout":1000,
"maxRetry":3,
"minSwitchTimeInterval":300,
"slaveThreshold":0
},
"masters":[
#主节点数据源名称
"master"
],
"replicas":[
#从节点数据源名称
"slave-01"
],
"maxCon":200,
#集群名称,配置schema中会使用到
"name":"master-slave",
"readBalanceType":"BALANCE_ALL",
# NOT_SWITCH(不进行主从切换)、SWITCH(进行主从切换)
"switchType":"SWITCH"
}
目录/mycat/conf/schemas
1). 创建配置文件
vim master_slave.schema.json
2). 修改内容
{
#物理库,mycat连接中的表明
"schemaName": "master_slave",
#集群 刚才配置的集群配置文件的前缀
"targetName": "master-slave",
"normalTables": {}
}
文件目录及配置文件
cd /path/to/mycat2/mycat/conf/users
vim root.user.json
只需要配置用户名和密码
{
"dialect":"mysql",
"ip":null,
#密码
"password":"123456",
"transactionType":"xa",
#用户名
"username":"root"
}
文件目录及文件
cd /path/to/mycat2/mycat/conf
vim server.json
配置内容如下:
暂时只需要配置ip和端口
"loadBalance":{
"defaultLoadBalance":"BalanceRandom",
"loadBalances":[]
},
"mode":"local",
"properties":{},
"server":{
"bufferPool":{
},
"idleTimer":{
"initialDelay":3,
"period":60000,
"timeUnit":"SECONDS"
},
# 所有ip可以访问
"ip":"0.0.0.0",
"mycatId":1,
# 端口
"port":8066,
"reactorNumber":8,
"tempDirectory":null,
"timeWorkerPool":{
"corePoolSize":0,
"keepAliveTime":1,
"maxPendingLimit":65535,
"maxPoolSize":2,
"taskTimeout":5,
"timeUnit":"MINUTES"
},
"workerPool":{
"corePoolSize":1,
"keepAliveTime":1,
"maxPendingLimit":65535,
"maxPoolSize":1024,
"taskTimeout":5,
"timeUnit":"MINUTES"
}
}
}
./bin/mycat start
# 查看状态
./bin/mycat status
# 停止
./bin/mycat stop
# 暂停
./bin/mycat pause
# 重启
./bin/mycat restart
# 前台运行
./bin/mycat console
# 日志文件
tail -f logs/wrapper.log
1). 连接登录mycat
首先使用mysql 命令登录mycat,或者使用Navcat工具链接
mysql -uroot -p123456 -P8066 -h127.0.0.1
2). 开启主从的日志
#日志输出到表mysql.general_log
SET GLOBAL log_output = 'TABLE';
#打开general_log
SET GLOBAL general_log = 'ON';
3). 在mycat中执行插入和查询操作
SELECT * from user;
INSERT INTO `user` VALUES(2,'amx','123')
4). 查看日志
SELECT event_time,
user_host,
thread_id,
server_id,
command_type,
CAST(argument AS CHAR(500) CHARACTER SET utf8mb4) argument
FROM mysql.general_log
ORDER BY event_time DESC;
通过查看日志可以看出,主库中执行insert操作,从库执行了select 操作,说明配置成功。
这里只是配置了一个最简单的基于mysql的主从复制和读写分离的例子,里面有些配置的具体深入的用法暂时还没有过多的研究,后续在实际中使用后,再来补充。