当前位置:天才代写 > tutorial > 数据库教程 > Mysql进阶之Mycat中间件(三) 主从复制 + Mycat读写分离

Mysql进阶之Mycat中间件(三) 主从复制 + Mycat读写分离

2021-03-04 12:50 星期四 所属: 数据库教程 浏览:100

主从复制 Mycat读写分离

Mycat不承担开展主从复制,主从复制是在MySQL上开展配备的。
以前读写分离是在Web运用,也就是TP5的database.php中配备的。如今大家立即在Mycat中配备。

每日任务标准以下:
mycat所属服务器:204.175.124.51
主连接点IP:125.22.28.4
主连接点的分块连接点:test1/test2/test3
从连接点IP:125.22.28.5 和 125.22.28.6
从连接点同歩主连接点的test1/test2/test3
test1~3的表t1是一个大表,将其数据信息按牙模型优化算法水准分割到test1~3中。
主连接点挂了时,从连接点仍然能够查数据信息。
打开主从复制廷时,当从连接点有廷时,则从主连接点获取数据。

1. 主从复制

125.22.28.4实际操作:

环境变量

server-id=4
log-bin=/var/lib/mysql/binlog
log-bin-index=/var/lib/mysql/binlog.index
binlog_format=mixed
expire_logs_days    = 10
max_binlog_size   = 100M
lower_case_table_names=1    # 忽视表名英文大小写

 

建立受权客户

grant replication slave on *.* to "repl"@"125.22.28.%" identified by "xxxxx";

 
查询master情况

show master status;
 --------------- ---------- -------------- ------------------ ------------------- 
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
 --------------- ---------- -------------- ------------------ ------------------- 
| binlog.000001 |      448 |              |                  |                   |
 --------------- ---------- -------------- ------------------ ------------------- 

 

125.22.28.5实际操作:
改动uuid
select uuid();
vi /var/lib/mysql/auto.cnf
将查看到的uuid在auto.cnf中升级。

环境变量

server-id=5
relay-log=/var/lib/mysql/slave-bin
relay-log-index=/var/lib/mysql/slave-bin.index
replicate-do-db=test1
replicate-do-db=test2
replicate-do-db=test3
replicate-do-db=mysql
slave-skip-errors=all
binlog_format=mixed
lower_case_table_names=1    # 忽视表名英文大小写

偏向主连接点:

stop slave;
reset slave;
change master to master_host="125.22.28.4",master_user="repl",master_password="xxxxx",master_log_file="binlog.000001",master_log_pos=448;
start slave;

查询slave情况:
show slave status;

125.22.28.6实际操作跟上面一样

在 125.22.28.4中受权一个mycat客户,用以给mycat联接,2个从连接点也会转化成该客户。

grant all privileges on *.* to "mycat"@"204.175.124.51" identified by "opson12356";

在 125.22.28.4中建立test1~3,在从连接点也会转化成。

 

 

2.构建Mycat的读写分离
配备schema.xml

<mycat:schema xmlns:mycat="http://io.mycat/">
    <schema name="test" checkSQLschema="true" sqlMaxLimit="100" randomDataNode="dn1,dn2,dn3">
        <table name="t1" primaryKey="ID" dataNode="dn1,dn2,dn3" rule="mod-long"></table>
    </schema>
    <dataNode name="dn1" dataHost="host1" database="test1"></dataNode>
    <dataNode name="dn2" dataHost="host1" database="test2"></dataNode>
    <dataNode name="dn3" dataHost="host1" database="test3"></dataNode>
    <dataHost name="host1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
        <heartbeat>show slave status</heartbeat>
        <writeHost host="hostM1" url="125.22.28.4:3306" user="mycat" password="opson12356">
            <readHost host="hostS1" url="125.22.28.5:3306" user="mycat" password="opson12356"></readHost>
            <readHost host="hostS2" url="125.22.28.6:3306" user="mycat" password="opson12356"></readHost>
        </writeHost>
    </dataHost> 
</mycat:schema>

必须留意的点:
<table>一定要特定primaryKey来特定分块的字段名。

rule="mod-long" 分块优化算法为牙模型

dataNode="dn1,dn2,dn3"  三个分块连接点(库),几个库就特定好多个dataNode

<dataHost>  balance="1" 应用读写分离的负载均衡,仅有备份数据写连接点和读连接点才会开展读实际操作。写连接点不容易开展读实际操作只开展写实际操作。

switchType="2" slaveThreshold="100"  从连接点同歩廷时超出100就全自动转换

<heartbeat>show slave status</heartbeat>    读写分离的heartbeat要应用show slave status句子,而不是select user()句子。

<readHost>包到了<writeHost>里边,那麼当服务器点<writeHost>奔溃的情况下,从连接点<readHost>就没法开展读实际操作。

碰到的好多个难题:
1.<readHost>只有被包在<writeHost>里边,假如<readHost>和<writeHost>放到平级,运行mycat时便会出错。
2.mysql端还记得设定忽视表名英文大小写,lower_case_table_names=1 ,要不然会碰到许多不便。字段名英文大小写是会全自动忽视的。

3.配备server.xml 
提升客户

<user name="u1">
    <property name="password">xxx</property>
    <property name="schemas">test</property>
</user>

4.运行mycat 

mycat start   # 后台程序,mycat console 是前台接待运作
mycat status  # 查询情况

5.联接检测
mysql -h204.175.124.51 -uu1 -P8066 -pxxxxx
use test 

# 插进一条句子
insert into t1 (`id`,`name`,`type_id`) values (320,'mls2ki',1);

# 查看
select * from t1;

试验纪录以下:
试着关掉主连接点服务器的MySQL服务项目再查看。发觉出错说 
backend connect: java.lang.Throwable: java.net.ConnectException: Connection refused
表明主连接点挂了,从连接点查看便会不成功,合乎环境变量的设定。

试着关掉全部从连接点的MySQL服务项目再查看。
发觉出错说
backend connect: java.lang.Throwable: java.net.ConnectException: Connection refused
表明从连接点挂了以后,mycat不容易从主连接点开展查看(balance="1"的功效)。

关掉在其中从连接点1,打开从连接点2,发觉仍然能够查看。
关掉在其中从连接点2,打开从连接点1,发觉仍然能够查看。
表明负载均衡完成了(balance="1"的功效)。

如今大家期待主连接点关掉以后,从连接点依然能够开展读实际操作,能够将schema.xml的<dataHost>一部分改动为:

<dataHost name="host1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100">
    <heartbeat>show slave status</heartbeat>
    <writeHost host="hostM1" url="125.22.28.4:3306" user="mycat" password="opson12356"></writeHost>
    <writeHost host="hostS1" url="125.22.28.5:3306" user="mycat" password="opson12356"></readHost>
    <writeHost host="hostS2" url="125.22.28.6:3306" user="mycat" password="opson12356"></readHost>
</dataHost> 

其关键是
将以前的2个<readHost>标识改成<writeHost>标识。那样主连接点hostM1挂了后,从连接点依然能够查看。
将swichType改成-1,那样主连接点挂了以后,从连接点不容易转换为主导连接点来载入数据信息,由于假如从连接点载入数据信息,会导致多节点的数据信息不统一。

这一事例也表明:
从连接点并不是一定要用<readHost>标识。用<writeHost>的连接点还可以是以连接点。为了更好地区别writeHost的连接点是主连接点還是从连接点,可以用hostM1和hostS1来区别,自然这仅仅个姓名,除开区别并沒有具体功效。

试验纪录以下:
试着关掉主连接点服务器的MySQL服务项目再在Mycat查看,仍然能够查看。可是在mycat中没法载入,表明从连接点并沒有转换为主导连接点出任写的每日任务
发觉插进以后,查看到的数据信息沒有新数据,有同歩廷时。这时能够将switchType改成2,balance改成2,当有延迟时间的情况下便会从主连接点载入而不容易从连接点载入。可是假如主连接点挂了,从连接点便会代替主连接点开展写,它是不太好的地区。

 

    关键字:

天才代写-代写联系方式