Linux 中Mysql 主从复制(一主一从)

注:mysql主从复制只执行接入后的内容。即主数据库和表要在接入后创建。

一、主机配置(master131)

配置文件:vim /etc/my.cnf
#主服务器唯一ID
server-id=1
#启用二进制日志
log-bin=mysql-bin
#设置不要复制的数据库(可设置多个,设置了需要复制的数据库就可以不设置此项)
binlog-ignore-db=mysql
#设置需要复制的数据库
binlog-do-db=需要复制的主数据库名字
#设置logbin格式
binlog_format=STATEMENT

扩展:

binlog日志三种格式

1、Statement:每一条会修改数据的sql都会记录在binlog中

2、Row:不记录sql语句上下文相关信息,仅保存哪条记录被修改

3、Mixedlevel:以上两种的混合使用。一般的语句修改使用statment格式保存binlog,如一些函数,statement无法完成主从复制的操作,则采用row格式保存binlog

二、从机配置(master135)

配置文件: vim /etc/my.cnf
#从服务器唯一ID
server-id=2
#启用中继日志
relay-log=mysql-relay

三、主机、从机重启mysql服务

systemctl restart mysqld

四、主机、从机都关闭防火墙

systemctl stop firewalld

五、在主机上建立账户并授权slave

grant replication slave on *.* to 'slave'@'%'identified by '123456';

报错:

ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

原因:密码设置的太简单,不符合mysql密码设置规范

解决方法:

1、查看mysql完整的密码规则

show variables like 'validate_password%';

2、更改密码长度

set global validate_password_length=4;

3、设置密码验证策略(medium【中】,low【低】)

set global validate_password_policy=0;

六、查询master状态

show master status;

注:记录下file和position的值。执行完此步骤后不再操作主机mysql,防止主机状态值变化。

七、在从机上配置需要复制的主机

#复制主机的命令
change master to master_host='主机ip',
master_user='slave',
master_password='123456',
master_log_file='mysql-bin.具体数字',master_log_pos=具体值;

#启动从机复制功能
start slave;

#查看从机状态
show slave status\G;

报错:

ERROR 3021(HY000): This operation cannot be performed with a running slave io thread; run STOP SLAVE IO_THREAD FOR CHANNEL ' ' first.

原因:如果从机连过主机,需要重置一下

解决方法:

stop slave;
reset master;

八、验证

到此mysql的主从复制就做好了,我们可以进行验证一下

1、主机上创建一下testdb数据库,并查看数据库是否创建成功

create database testdb;
show databases;

2、主机上创建完成,我们去从机上看一下吧

扩展:

1、停止从服务复制功能

stop slave;

2、重新配置主从

stop slave;

reset master;

3、查看是否读写分离

#主机写入 @@环境变量
insert into user values (1,@@hostname);

#在mycat里查询
select * from user;

我们看到主机和从机上写的内容是一致,所以就证明没有实现读写分离。

读写分离设置

vim /usr/local/mycal/conf/schema.xml

#修改<dataHost>的 balance属性为3

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

        <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
        </schema>
        <dataNode name="dn1" dataHost="host1" database="testdb" />
        <dataHost name="host1" maxCon="1000" minCon="10" balance="3"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="hostM1" url="192.168.157.133:3306" user="root"
                                   password="root">
                   <readHost host="hostS1" url="192.168.157.135:3306" user="root" password="root"/>
                </writeHost>
        </dataHost>
</mycat:schema>

<dataHost>中的balance属性:【负载均衡类型】

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",所有读请求随机的分发到 readhost 执行,writerHost 不负担读压力。

好了重启一下mycat服务,进行验证一下吧

#重启mycat服务
mycat console

#在mycat里的mysql里
use TESTDB;
SELECT * FROM USER;

我们看到已经实现读写分离了

猜你喜欢

转载自blog.csdn.net/u013227399/article/details/109737486