目录
查看是否成功:执行命令后查看红线划定是否是yes,yes代表成功,否则失败
-
主从配置注意事项(前提)
- 主DB server和从DB server数据库的版本一致
- 主DB server和从DB server数据库数据一致
- 主DB server开启二进制日志,主DB server和从DB server的server_id都必须唯一
主库需要配置:(my.conf)
在[mysqld]片段中添加
#开启主从复制,主库的配置
log-bin = mysql-bin
#指定主库serverid
server-id=1
#指定同步的数据库,如果不指定则同步全部数据库
binlog-do-db=my_test
#执行SQL语句查询状态
SHOW MASTER STATUS
#修改主库的配置主从复制为混合模式
binlog_format=MIXED
#重启
docker restart percona-master01 && docker logs -f percona-master01
在主库创建同步用户
#创建用户
create user 'slave01'@'%' identified by '123456';
#如果出现 [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and,可以在my.cnf配置文件中设置 sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO ,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
#授权用户slave01使用123456密码登录mysql
grant replication slave on *.* to 'slave01'@'127.0.0.1' identified by '123456';
如果不需要限制ip可以执行
grant replication slave on *.* to 'slave01'@'%' ;
#刷新配置
flush privileges;
从库配置(my.conf)
#指定serverid,只要不重复即可,从库也只有这一个配置,其他都在SQL语句中操作
server-id=2
#执行以下SQL:
CHANGE MASTER TO
master_host='127.0.0.1',
master_user='slave01',
master_password='123456',
master_port=3306,
#下面的信息通过在主库中执行
#SHOW MASTER STATUS命令来查看
master_log_file='mysql-bin.000006',
master_log_pos=1120;
#启动slave同步
START SLAVE;
#查看同步状态
SHOW SLAVE STATUS;
#查看二进制日志相关的配置项
show global variables like 'binlog%';
#查看server相关的配置项
show global variables like 'server%';
用docker创建从库
#创建目录
mkdir /data/mysql/slave01 cd /data/mysql/slave01 mkdir conf data
chmod 777 * -R
#创建配置文件
cd /data/mysql/slave01/conf vim my.cnf
#输入如下内容
[mysqld]
server-id=2 #服务id,不可重复
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO ,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
#创建容器
docker create --name percona-slave01 -v /data/mysql/slave01/data:/var/lib/mysql -v /data/mysql/slave01/conf:/etc/my.cnf.d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root percona:5.7.23
#启动
docker start percona-slave01 && docker logs -f percona-slave01
#设置master相关信息 CHANGE MASTER TO
master_host='192.168.1.18',
master_user='dbtest',
master_password='dbtest',
master_port=3306,
master_log_file='mysql-bin.000002',
master_log_pos=648;
#启动同步 start slave;
#查看master状态 show slave status;
主从复制模式
在查看二进制日志相关参数内容中,会发现默认的模式为ROW,其实在MySQL中提供了有3种模式,基于SQL语句的 复制(statement-based replication, SBR),基于行的复制(row-based replication, RBR),混合模式复制(mixed- based replication, MBR)。对应的,binlog的格式也有三种:STATEMENT,ROW,MIXED。
STATEMENT模式(SBR) 每一条会修改数据的sql语句会记录到binlog中。
优点是并不需要记录每一条sql语句和每一行的数据变化,减少了binlog日志量,节约IO,提高性能。 缺点是在某些情况下会导致master-slave中的数据不一致(如sleep()函数, last_insert_id(),以及user-defined functions(udf)等会出现问题)
ROW模式(RBR)
不记录每条sql语句的上下文信息,仅需记录哪条数据被修改了,修改成什么样了。而且不会出现某些特定情况下的 存储过程、或function、或trigger的调用和触发无法被正确复制的问题。缺点是会产生大量的日志,尤其是alter table的时候会让日志暴涨。
MIXED模式(MBR) 以上两种模式的混合使用,一般的复制使用STATEMENT模式保存binlog,对于STATEMENT模式无法复制的操作使用
ROW模式保存binlog,MySQL会根据执行的SQL语句选择日志保存方式。 建议使用MIXED模式。(在上面的配置中已采用此种模式)
查看主从复制是否是混合模式
#查看二进制日志相关的配置项
show global variables like 'binlog%';
查看是否成功:执行命令后查看红线划定是否是yes,yes代表成功,否则失败
mycat配置:server.xml:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mycat:server SYSTEM "server.dtd"> <mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="nonePasswordLogin">0</property>
<property name="useHandshakeV10">1</property>
<property name="useSqlStat">0</property>
<property name="useGlobleTableCheck">0</property>
<property name="sequnceHandlerType">2</property>
<property name="subqueryRelationshipCheck">false</property>
<property name="processorBufferPoolType">0</property>
<property name="handleDistributedTransactions">0</property>
<property name="useOffHeapForMerge">1</property>
<property name="memoryPageSize">64k</property>
<property name="spillsFileBufferSize">1k</property>
<property name="useStreamOutput">0</property>
<property name="systemReserveMemorySize">384m</property>
<property name="useZKSwitch">false</property>
</system>
<!--这里是设置的dbtest用户和虚拟逻辑库-->
<user name="dbtest" defaultAccount="true">
<property name="password">dbtest123</property>
<property name="schemas">dbtest</property>
</user>
</mycat:server>
schema.xml:
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/">
<!--配置数据表-->
<schema name="dbtest" checkSQLschema="false" sqlMaxLimit="100">
<table name="tb_ad" dataNode="dn1" rule="mod-long" />
</schema>
<!--配置分片关系-->
<dataNode name="dn1" dataHost="cluster1" database="dbtest" /> <!--配置连接信息-->
<dataHost name="cluster1" maxCon="1000" minCon="10" balance="3"
writeType="1" dbType="mysql" dbDriver="native" switchType="1"
slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="W1" url="192.168.1.18:3306" user="root"
password="root">
<readHost host="W1R1" url="192.168.1.18:3307" user="root"
</writeHost>
</dataHost>
</mycat:schema>
balance属性说明: 负载均衡类型,目前的取值有3 种:
1. balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的writeHost 上。
2. balance="1",全部的readHost 与stand by writeHost 参与select 语句的负载均衡,简单的说,当双 主 双从模式(M1->S1,M2->S2,并且M1 与M2 互为主备),正常情况下,M2,S1,S2 都参与select 语句的负
载均衡。
3. balance="2",所有读操作都随机的在writeHost、readhost 上分发。
4. balance="3",所有读请求随机的分发到wiriterHost 对应的readhost 执行,writerHost 不负担读压 力,
注意balance=3 只在1.4 及其以后版本有,1.3 没有。
红色字体是需要改的