docker容器下mysql主从配置
mycat配置双主双从实现mysql读写分离
拉取mysql5.7
docker pull mysql:5.7
运行mysql镜像
mysql M1 主容器:
docker run -p 3301:3306 --name mysql-master1 -v /usr/local/mysql-master1/conf:/etc/mysql/conf.d -v /usr/local/mysql-master1/logs:/logs -v /usr/local/mysql-master1/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
mysql S1 从容器:
docker run -p 3302:3306 --name mysql-slave1 -v /usr/local/mysql-slave1/conf:/etc/mysql/conf.d -v /usr/local/mysql-slave1/logs:/logs -v /usr/local/mysql-slave1/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
mysql M2 主容器:
docker run -p 3303:3306 --name mysql-master2 -v /usr/local/mysql-master2/conf:/etc/mysql/conf.d -v /usr/local/mysql-master2/logs:/logs -v /usr/local/mysql-master2/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
mysql S2 从容器:
docker run -p 3304:3306 --name mysql-slave2 -v /usr/local/mysql-slave2/conf:/etc/mysql/conf.d -v /usr/local/mysql-slave2/logs:/logs -v /usr/local/mysql-slave2/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
配置my.cnf文件
mysql-master1 配置my.cnf文件
在/usr/local/mysql-master1/conf下创建my.cnf文件:
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=1
## binlog-ignore-db,指定不需要同步的数据库名称,设置不要复制的数据库(可设置多个)
binlog-ignore-db=sys
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
## binlog-do-db= 指定需要同步的数据库名称
# binlog-do-db= (这个配置也可以不加,则除了 上面排除 binlog-ignore-db 外的库,都备份)
#重点 在作为从数据库时候,有写入操作也要更新二进制文件
log_slave_updates=1
## 开启二进制日志功能
#记录所有更改数据的语句,可以用于主从服务器之间的数据同步,以及服务器遇到故 障时数据的无损失恢复。
log-bin=mysql-master1-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
#statement 记录所有的写操作到bin-log文件 缺点:sql语句执行set time=now() 会出现主从不一致
#row 记录每行的变换 缺点:数据量大的时候,记录数据多
#mixed是statement和row的混合
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
#通用查询日志
#记录所有连接的起始时间和终止时间,以及连接发送给数据库服务器的所有指令, 对我们复原操作的实际场
#景、发现问题,甚至是对数据库操作的审计都有很大的帮助。
general_log=ON
general_log_file=/var/lib/mysql/mysql-general.log
#慢查询日志
#记录所有执行时间超过long_query_time的所有查询,方便我们对查询进行优化。
slow_query_log=ON
slow_query_log_file=/var/lib/mysql/mysql-slow.log
long_query_time=3
#设置慢查询的阈值为3秒,超出此设定值的SQL即被记录到慢查询日志
log_output=FILE
max_allowed_packet=200M
#错误日志
#记录MySQL服务的启动、运行或停止MySQL服务时出现的问题,方便我们了解服务器的 状态,从而对服务器进行维护。
log-error=/var/lib/mysql/mysql-error.log
mysql-slave1 配置my.cnf文件
在/usr/local/mysql-slave1/conf下创建my.cnf文件:
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=2
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mysql-slave1-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=all
# relay_log配置中继日志
#用于主从服务器架构中,从服务器用来存放主服务器二进制日志内容的一个中间文件。 从服务器通过读取中继#日志的内容,来同步主服务器上的操作。
relay_log=mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置为只读(具有super权限的用户除外)
read_only=1
mysql-master2 配置my.cnf文件
在/usr/local/mysql-master2/conf下创建my.cnf文件:
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=3
## binlog-ignore-db,指定不需要同步的数据库名称,设置不要复制的数据库(可设置多个)
binlog-ignore-db=sys
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
## binlog-do-db= 指定需要同步的数据库名称
# binlog-do-db= (这个配置也可以不加,则除了 上面排除 binlog-ignore-db 外的库,都备份)
#重点 在作为从数据库时候,有写入操作也要更新二进制文件
log_slave_updates=1
## 开启二进制日志功能
#记录所有更改数据的语句,可以用于主从服务器之间的数据同步,以及服务器遇到故 障时数据的无损失恢复。
log-bin=mysql-master2-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
#statement 记录所有的写操作到bin-log文件 缺点:sql语句执行set time=now() 会出现主从不一致
#row 记录每行的变换 缺点:数据量大的时候,记录数据多
#mixed是statement和row的混合
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
#通用查询日志
#记录所有连接的起始时间和终止时间,以及连接发送给数据库服务器的所有指令, 对我们复原操作的实际场
#景、发现问题,甚至是对数据库操作的审计都有很大的帮助。
general_log=ON
general_log_file=/var/lib/mysql/mysql-general.log
#慢查询日志
#记录所有执行时间超过long_query_time的所有查询,方便我们对查询进行优化。
slow_query_log=ON
slow_query_log_file=/var/lib/mysql/mysql-slow.log
long_query_time=3
#设置慢查询的阈值为3秒,超出此设定值的SQL即被记录到慢查询日志
log_output=FILE
max_allowed_packet=200M
#错误日志
#记录MySQL服务的启动、运行或停止MySQL服务时出现的问题,方便我们了解服务器的 状态,从而对服务器进行维护。
log-error=/var/lib/mysql/mysql-error.log
mysql-slave2 配置my.cnf文件
在/usr/local/mysql-slave2/conf下创建my.cnf文件:
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=4
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mysql-slave2-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=all
# relay_log配置中继日志
#用于主从服务器架构中,从服务器用来存放主服务器二进制日志内容的一个中间文件。 从服务器通过读取中继#日志的内容,来同步主服务器上的操作。
relay_log=mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置为只读(具有super权限的用户除外)
read_only=1
重启mysql主从数据库
[root@Zwen conf]# docker restart mysql-master1
mysql-master1
[root@Zwen conf]# docker restart mysql-master2
mysql-master2
[root@Zwen conf]# docker restart mysql-slave1
mysql-slave1
[root@Zwen conf]# docker restart mysql-slave2
mysql-slave2
[root@Zwen conf]#
进入docker mysql-master1创建同步用户
#进入容器
[root@Zwen /]# docker exec -it mysql-master1 /bin/bash
#连接mysql
root@013075cb9308:/# mysql -uroot -p123456
#查看主从状态
mysql> show master status;
+--------------------------+----------+--------------+-------------------------------------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+--------------------------+----------+--------------+-------------------------------------------------+-------------------+
| mysql-master1-bin.000001 | 154 | | sys,mysql,information_schema,performance_schema | |
+--------------------------+----------+--------------+-------------------------------------------------+-------------------+
1 row in set (0.00 sec)
#master容器实例内创建数据同步用户
CREATE USER 'slave'@'%' IDENTIFIED BY '123456'
> OK
> 时间: 0.031s
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%'
> OK
> 时间: 0.018s
进入docker mysql-master2创建同步用户
#进入容器
[root@Zwen /]# docker exec -it mysql-master2 /bin/bash
#连接mysql
root@013075cb9308:/# mysql -uroot -p123456
#查看主从状态
mysql> show master status;
+--------------------------+----------+--------------+-------------------------------------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+--------------------------+----------+--------------+-------------------------------------------------+-------------------+
| mysql-master2-bin.000001 | 154 | | sys,mysql,information_schema,performance_schema | |
+--------------------------+----------+--------------+-------------------------------------------------+-------------------+
1 row in set (0.00 sec)
#master容器实例内创建数据同步用户
CREATE USER 'slave'@'%' IDENTIFIED BY '123456'
> OK
> 时间: 0.031s
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%'
> OK
> 时间: 0.018s
重置《从机》mysql主从关系详解
mysql删除主从的方法:
1、利用“stop slave;”语句停止slave服务器的主从同步;
2、利用“RESET MASTER;”语句重置master服务;
3、利用“reset slave;”语句重置slave服务;
4、重启数据库即可。
重置《从机》mysql主从关系实施
#进入容器
[root@Zwen conf]# docker exec -it mysql-slave1 /bin/bash
#连接mysql
root@3f729a7f87cf:/# mysql -uroot -p123456
#停止slave服务器的主从同步
mysql> STOP SLAVE;
Query OK, 0 rows affected (0.01 sec)
#重置master服务
mysql> RESET MASTER;
Query OK, 0 rows affected (0.01 sec)
进入docker mysql-slave1开启同步
#进入容器
[root@Zwen /]# docker exec -it mysql-slave1 /bin/bash
#连接mysql
root@ea13a82226bf:/# mysql -uroot -p123456
#进行关联主数据库
mysql> change master to master_host='8.131.80.107', master_user='slave', master_password='123456', master_port=3301, master_log_file='mysql-master1-bin.000001', master_log_pos=154, master_connect_retry=30;
Query OK, 0 rows affected, 2 warnings (0.02 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 8.131.80.107
Master_User: slave
Master_Port: 3301
Connect_Retry: 30
Master_Log_File: mysql-master1-bin.000001
Read_Master_Log_Pos: 154
Relay_Log_File: mysql-relay-bin.000002
Relay_Log_Pos: 328
Relay_Master_Log_File: mysql-master1-bin.000001
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: 154
Relay_Log_Space: 535
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: 1
Master_UUID: 7eb61420-ce0f-11ed-aeb7-0242ac110004
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
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
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
进入docker mysql-slave2开启同步
#进入容器
[root@Zwen /]# docker exec -it mysql-slave2 /bin/bash
#连接mysql
root@ea13a82226bf:/# mysql -uroot -p123456
#进行关联主数据库
mysql> change master to master_host='8.131.80.107', master_user='slave', master_password='123456', master_port=3303, master_log_file='mysql-master2-bin.000001', master_log_pos=154, master_connect_retry=30;
Query OK, 0 rows affected, 2 warnings (0.02 sec)
#开启同步
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 8.131.80.107
Master_User: slave
Master_Port: 3303
Connect_Retry: 30
Master_Log_File: mysql-master2-bin.000001
Read_Master_Log_Pos: 617
Relay_Log_File: mysql-relay-bin.000002
Relay_Log_Pos: 791
Relay_Master_Log_File: mysql-master2-bin.000001
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: 617
Relay_Log_Space: 998
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: 3
Master_UUID: 97ada26f-cebc-11ed-a1ff-0242ac110006
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
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
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
进入docker mysql-master1开启双主同步
[root@Zwen conf]# docker exec -it mysql-master1 /bin/bash
root@ba51774f65fe:/# mysql -uroot -p123456
mysql> change master to master_host='8.131.80.107', master_user='slave', master_password='123456', master_port=3303, master_log_file='mysql-master2-bin.000001', master_log_pos=617, master_connect_retry=30;
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 8.131.80.107
Master_User: slave
Master_Port: 3303
Connect_Retry: 30
Master_Log_File: mysql-master2-bin.000001
Read_Master_Log_Pos: 617
Relay_Log_File: ba51774f65fe-relay-bin.000002
Relay_Log_Pos: 328
Relay_Master_Log_File: mysql-master2-bin.000001
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: 617
Relay_Log_Space: 542
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: 3
Master_UUID: 97ada26f-cebc-11ed-a1ff-0242ac110006
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
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
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
mysql> show master status;
+--------------------------+----------+--------------+-------------------------------------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+--------------------------+----------+--------------+-------------------------------------------------+-------------------+
| mysql-master1-bin.000001 | 154 | | sys,mysql,information_schema,performance_schema | |
+--------------------------+----------+--------------+-------------------------------------------------+-------------------+
1 row in set (0.00 sec)
进入docker mysql-master2开启双主同步
[root@Zwen conf]# docker exec -it mysql-master2 /bin/bash
root@ba51774f65fe:/# mysql -uroot -p123456
mysql> change master to master_host='8.131.80.107', master_user='slave', master_password='123456', master_port=3301, master_log_file='mysql-master1-bin.000001', master_log_pos=154, master_connect_retry=30;
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 8.131.80.107
Master_User: slave
Master_Port: 3301
Connect_Retry: 30
Master_Log_File: mysql-master1-bin.000001
Read_Master_Log_Pos: 154
Relay_Log_File: 5ff9217012df-relay-bin.000002
Relay_Log_Pos: 328
Relay_Master_Log_File: mysql-master1-bin.000001
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: 154
Relay_Log_Space: 542
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: 1
Master_UUID: 7eb61420-ce0f-11ed-aeb7-0242ac110004
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
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
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
总结
是否配置成功
1、Slave_IO_Running、Slave_SQL_Running 均为yes即可
主从复制不生效情况
2、mysql的主从复制为接入点复制,即配置完成后整体生效
主从复制搭建未完成,主库先创建表,在主库进行数据修改,则不可同步
### 应注意在配置从机时,需要指定主机Position值(操作数据库Position会发生改变)主从复制搭建完成后,主库创建表,从库可创建
mysql> show master status;
±-------------------------±---------±-------------±------------------------------------------------±------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
±-------------------------±---------±-------------±------------------------------------------------±------------------+
| mysql-master1-bin.000001 | 154 | | sys,mysql,information_schema,performance_schema | |
±-------------------------±---------±-------------±------------------------------------------------±------------------+
1 row in set (0.00 sec)
mycat安装
下载压缩包并解压
//解压
tar -zxvf Mycat-server-1.6.7.6-release-20220524173810-linux.tar.gz
//移动mycat位置
cp mycat -r /usr/local
server.xml修改
<user name="mycat" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">mybatis_plus_mycat</property>
<property name="defaultSchema">mybatis_plus_mycat</property>
<!--No MyCAT Database selected 错误前会尝试使用该schema作为schema,不设置则为null,报错 -->
<!-- 表级 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="readonly">
<property name="password">123456</property>
<property name="schemas">mybatis_plus_mycat</property>
<property name="readOnly">true</property>
<property name="defaultSchema">mybatis_plus_mycat</property>
</user>
schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!--
name:自定义名字,对应server.xml中的schemas
checkSQLschema:查询时是否增加库名称。如db1.table。false不加
sqlMaxLimit :一次最大读取行数
-->
<schema name="mybatis_plus_mycat" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
<!-- 这里不配置,代表所有的表分片到dn1节点-->
</schema>
<!-- mysql的database数据库-->
<dataNode name="dn1" dataHost="localhost1" database="mybatis_plus" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- 写的数据库地址和管理方式 -->
<writeHost host="hostM1" url="8.131.80.107:3301" user="root" password="123456">
<!-- 读的数据库地址和管理方式 -->
<readHost host="hostS1" url="8.131.80.107:3302" user="root" password="123456" />
</writeHost>
<writeHost host="hostM2" url="8.131.80.107:3303" user="root" password="123456">
<!-- 读的数据库地址和管理方式 -->
<readHost host="hostS2" url="8.131.80.107:3304" user="root" password="123456" />
</writeHost>
</dataHost>
</mycat:schema>
参数详解
balance 属性
负载均衡类型,目前的取值有 3 种:
balance=“0”, 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
balance=“1”,全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双
主双从模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载
均衡。
balance=“2”,所有读操作都随机的在 writeHost、readhost 上分发。
balance=“3”,所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力,
注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。
writeType 属性
负载均衡类型,目前的取值有 3 种:
writeType=“0”, 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个 writeHost,
重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .
writeType=“1”,所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐。switchType 属
性
-1 表示不自动切换。
1 默认值,自动切换。
2 基于 MySQL 主从同步的状态决定是否切换。
switchType 属性
-1 表示不自动切换
1 默认值,自动切换
2 基于 MySQL 主从同步的状态决定是否切换
心跳语句为 show slave status
3 基于 MySQL galary cluster 的切换机制(适合集群)(1.4.1)
心跳语句为 show status like ‘wsrep%’修改dataHost的 balance=“1”
mycat启动、关闭
启动程序
控制台启动 在目录mycat/bin 执行 ./mycat console
后台启动 在目录mycat/bin 执行 ./mycat start
后台关闭:./mycat stop
后台重启:./mycat restart
状态: ./mycat status
日志文件:mycat/logs/wrapper.log