2、MySQL主从

主从

该架构只能主机写入和读取,从机只能读取

主:192.168.0.1;从:192.168.0.2

保证两台服务器可以互相访问,且端口打开

主机配置

[mysqld]
# 主服务器唯一ID,一般为ip第四位
server-id=1
# 启用二进制日志
log-bin=mysql-bin
# 设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
# binlog-ignore-db=information_schema
# 设置需要复制的数据库,不配置代表所有,但切记配置不要复制的库,建议基础库都不排除掉
# binlog-do-db=test1
# 设置binlog格式
binlog_format=STATEMENT

binlog 日志有三种格式

从机配置

[mysqld]
server-id=2
# 启用中继日志
relay-log=mysql-relay

重启主从数据库

登录主机

# 创建用户
CREATE USER 'myslave'@'%' IDENTIFIED BY '123456';
# 授权
GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'%';
# 查看主机的状态
mysql> show master status;
+---------------+-----------+--------------+------------------+-----------------------------------------------+
| File          | Position  | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                             |
+---------------+-----------+--------------+------------------+-----------------------------------------------+
| binlog.000001 |    587    |    test1     |       mysql      |                                               |
+---------------+-----------+--------------+------------------+-----------------------------------------------+

登录从机

# 停止复制
stop slave;
# 重置复制信息
reset master;
reset slave;

配置主机信息

# 配置复制信息
CHANGE MASTER TO
    MASTER_HOST = '192.168.0.1',
    MASTER_PORT = 3306,
    MASTER_USER = 'myslave',
    MASTER_PASSWORD = '123456',
    MASTER_LOG_FILE='binlog.000001',
    MASTER_LOG_POS=587;
# 开始复制
start slave;
# 查看从机状态,出现双yes即为正常
show slave status\G;

主主

该架构两个主机都可以读取

主1:192.168.0.1;主2:192.168.0.2

主1配置

[mysqld]
# 主服务器唯一ID,一般为ip第四位
server-id=1
# 启用二进制日志
log-bin=mysql-bin
# 设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
# binlog-ignore-db=information_schema
# 设置需要复制的数据库,不配置代表所有,但切记配置不要复制的库,建议基础库都不排除掉
# binlog-do-db=test1
# 设置binlog格式
binlog_format=STATEMENT

# 在作为从数据库的时候,有写入操作也要更新二进制日志文件
log-slave-updates
# 表示自增长字段每次递增的量,指自己字段的起始值,其默认值是1,取值范围是1~65535(主要是区分M1,M2的自增)
auto-increment-increment=2
# 表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1~65535
auto-increment-offset=1

主2配置

[mysqld]
# 主服务器唯一ID,一般为ip第四位
server-id=2
# 启用二进制日志
log-bin=mysql-bin
# 设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
# binlog-ignore-db=information_schema
# 设置需要复制的数据库,不配置代表所有,但切记配置不要复制的库,建议基础库都不排除掉
# binlog-do-db=test1
# 设置binlog格式
binlog_format=STATEMENT

# 在作为从数据库的时候,有写入操作也要更新二进制日志文件
log-slave-updates
# 表示自增长字段每次递增的量,指自己字段的起始值,其默认值是1,取值范围是1~65535(主要是区分M1,M2的自增)
auto-increment-increment=2
# 表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1~65535
auto-increment-offset=2

重启主从数据库

双主都创建同步账号

# 创建用户
CREATE USER 'myslave'@'%' IDENTIFIED BY '123456';
# 授权
GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'%';
# 停止复制
stop slave;
# 重置复制信息
reset master;
reset slave;
# 查看主机的状态、记录下来
mysql> show master status;
+---------------+-----------+--------------+------------------+-----------------------------------------------+
| File          | Position  | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                             |
+---------------+-----------+--------------+------------------+-----------------------------------------------+
| binlog.000001 |    587    |    test1     |       mysql      |                                               |
+---------------+-----------+--------------+------------------+-----------------------------------------------+

登录主1

# 配置复制信息
CHANGE MASTER TO
    MASTER_HOST = '192.168.0.2',
    MASTER_PORT = 3306,
    MASTER_USER = 'myslave',
    MASTER_PASSWORD = '123456',
    MASTER_LOG_FILE='binlog.000001',
    MASTER_LOG_POS=587;
# 开始复制
start slave;
# 查看从机状态,出现双yes即为正常
show slave status\G;

登录主2

# 配置复制信息
CHANGE MASTER TO
    MASTER_HOST = '192.168.0.1',
    MASTER_PORT = 3306,
    MASTER_USER = 'myslave',
    MASTER_PASSWORD = '123456',
    MASTER_LOG_FILE='binlog.000001',
    MASTER_LOG_POS=587;
# 开始复制
start slave;
# 查看从机状态,出现双yes即为正常
show slave status\G;

MyCat

MyCat 是目前最流行的基于 java 语言编写的数据库中间件,是一个实现了 MySQL 协议的服务器,前端用户可以把它看作是一个数据库代理,用 MySQL 客户端工具和命令行访问,而其后端可以用 MySQL 原生协议与多个 MySQL 服务器通信,也可以用 JDBC 协议与大多数主流数据库服务器通信,其核心功能是分库分表。配合数据库的主从模式还可实现读写分离。

下载地址:https://github.com/MyCATApache/Mycat-Server/releases

安装配置

# 下载
wget http://dl.mycat.org.cn/1.6.7.6/20210730131311/Mycat-server-1.6.7.6-release-20210730131311-linux.tar.gz
#解压
tar -xvf Mycat-server-1.6.7.6-release-20210730131311-linux.tar.gz

由于mycat1.6仅支持mysql5,不支持mysql8, 首先需要替换bin目录下面的mysq驱动文件为对应版本的。

将mysql驱动上传到mycat的lib目录下,替换之前的驱动

修改配置文件schema.xml

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
    <!-- 在server.xml中被指定的逻辑库 -->
    <schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" randomDataNode="dn1" dataNode="dn1">
    </schema>
    <!-- 对应schema中的 DataNode,database 是真正物理上的数据库  -->
    <dataNode name="dn1" dataHost="host1" database="my_sql_test" />
    <!-- name对应 dataNode 的 datatHost  -->
    <dataHost name="host1" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1"  slaveThreshold="100">
        <!-- 心跳检测  -->
        <heartbeat>select user()</heartbeat>
        <!-- 定义写主机 -->
        <writeHost host="hostM1" url="jdbc:mysql://192.168.0.1:3306" user="myslave" password="123456">
            <redaHost host="hostS1" url="jdbc:mysql://192.168.0.2:3306" user="myslave" password="123456"></redaHost>
       	</writeHost>
    </dataHost>
</mycat:schema>

dataNode 的 database 属性,为MySQL 真实的数据库名称。

dataHost 的 balance 属性,通过此属性配置读写分离的类型

dataHost 的 writeType 属性:

dataHost 的 switchType 属性:

修改配置文件server.xml

<!-- 连接mycat的用户信息 -->
<user name="mycat" defaultAccount="true">
    <!-- 密码 -->
    <property name="password">123456</property>
    <!-- 逻辑库名称 -->
    <property name="schemas">TESTDB</property>
    <!-- 默认逻辑库  -->
    <property name="defaultSchema">TESTDB</property>
</user>

常用命令

# 启动 
./mycat start
# 停止 
./mycat stop
# 前台运行 
./mycat console
# 重启服务 
./mycat restart
# 暂停 
./mycat pause
# 查看启动状态 
./mycat status