myslq实现读写分离(主从复制)

目录

主从配置注意事项(前提)

主库需要配置:(my.conf)

在主库创建同步用户

从库配置(my.conf)

用docker创建从库

主从复制模式

查看主从复制是否是混合模式

查看是否成功:执行命令后查看红线划定是否是yes,yes代表成功,否则失败

mycat配置:server.xml:

 schema.xml:


  • 主从配置注意事项(前提)

  1. 主DB server和从DB server数据库的版本一致
  2. 主DB server和从DB server数据库数据一致
  3. 主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 没有。

红色字体是需要改的

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章