mysql主从复制与读写分离配置详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Hemk340200600/article/details/78727199

mysql主从复制与读写分离配置详解

当网站达到一定规模时,数据库最先出现压力,这时候用户会明显感觉到卡顿,其原因是数据库的写入操作,影响了查询的效率。这时可以考虑对数据库配置主从复制和读写分离。设置多台数据库服务器,包括一个主服务器和n个从服务器,主服务器负责写入数据,从服务器负责读取数据,主服务器定时将数据更新到从服务器上。

这样做的好处是:
① 将数据库的读和写分开,极大程度的缓解了锁的争用
② 增加了机器的处理能力。
③ 对于读操作为主的应用(事实上大部分网站都是读操作为主),使用读写分离是最好的场景,因为可以确保写的服务器压力更小,而读又可以接受些许时间上的延迟。

一、 配置主从复制

① 主服务器上修改mysql数据库配置文件my.cnf,在[mysqld]下配置。
这里写图片描述
参数解释:
binlog-do-db:设置需要复制的数据库
binlog-ignore-db:设置忽略的数据库,mysql表示忽略所有的数据库,跟binlog-do-b配合使用
log-bin:开启bin-log日志
server-id: 配置服务器id,这个参数必须全局唯一。

② 重启mysql服务

③ 进入mysql命令行,输入:show master status;记住File和Position两个值,之后需要用到。
这里写图片描述

④ 从服务器上修改mysql数据库配置文件my.cnf
这里写图片描述
注意server-id要跟主服务器的不一样,replicate-do-db要跟主服务器的一样。
⑤ 为slave端单独建立一个账号,方便权限管理,然后把这个账号的权限赋予给slave端。

create useruser’@’X.X.X.X’ indetified by ‘XXXXX’;
grant replication slave on *.* touser’@’X.X.X.X’ identified by ‘XXXXX’;

X.X.X.X为从服务器IP,XXXXX为密码。这里我的IP是172.18.225.2,密码是123456

⑥ 进入从服务器mysql命令行,执行下列命令:
这里写图片描述
参数说明:
master_host:主服务器ip
master_user:slave连接主服务器的账号
master_password:slave连接主服务器的账号的密码
master_log_file,master_log_pos填写刚刚主服务器show master status看到的两个file和position两个值。

⑦ 从服务器mysql命令行输入show slave status\G;跟下图类似说明配置完成。
这里写图片描述

⑧ 测试在主服务器写入数据,在从服务器能否看到相同的数据,如果可以说明主从复制配置完成。

二、 配置读写分离

① 使用mycat来管理mysql实现读写分离,mycat下载地址:http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE.jar (mycat需要jdk1.8的支持,没有配置的请自行配置)

② 修改mycat目录下conf/schema.xml,配置如下。里面的url 链接到对应主机的IP,user是主服务器能够登录到该IP对应主机的账号密码,因此需要在从服务器先为主服务器分配好账号和密码。
这里写图片描述

balance参数说明:

  • balance=”0”, 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上。
  • balance=”1”,全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且M1与 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡。
  • balance=”2”,所有读操作都随机的在writeHost、readhost上分发。
  • balance=”3”,所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力,注意balance=3只在1.4及其以后版本有,1.3没有。

writeType参数说明:

  • writeType=”0”, 所有写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .
  • writeType=”1”,所有写操作都随机的发送到配置的writeHost。

slaveThreshold=”100” 心跳时间

③ 修改mycat目录下conf/schema.xml,配置如下,注意schemas要跟schema.xml里schema的name对应。
这里写图片描述

④ 配置完成之后进到mycat目录下bin/,键入命令:./mycat start;或者也可以输入两次./mycat restart;通过有没有提示Mycat-server was not running来判断是否成功启动,注意两次restart间隔不要太短。如果不能成功启动,可以通过mycat目录下logs/wrapper.log日志来查看错误日志。

⑤ 如果成功启动,可以通过mysql -h127.0.0.1 -uroot -p123456 -P8066来进入mycat环境下的操作界面。其中h后的ip指向主服务器,如果是在从服务器上连接mycat,则写上主机IP。账号密码使用的是server.xml里面配置的user和password,-P指定8066端口是mycat默认数据端口,管理端口为9066。
这里写图片描述

⑥ 在mycat目录下logs/输入命令 tail -f mycat.log 可以动态查看mycat.log的变化。观察到心跳包出现与从服务器的连接正常。
这里写图片描述

⑦ 登录mycat后执行一条select语句和insert语句,通过日志观察是否从从服务器读取,从主服务器写入。

select语句:
这里写图片描述

insert语句:
这里写图片描述

三、配置过程中遇到的问题

  1. 由于我使用的是两个虚拟机进行主从复制和读写分离的配置,虚拟机之间势必要互相连通。因此两台主机必须互相能够ping通。一开始两台虚拟机使用的网卡模式为桥接模式,这种网卡模式需要为两台虚拟机配置好跟宿主机相同网段的IP,就可以互相访问,但是我配置完之后发现不能够ping通,检查完之后发现是被虚拟机里面的ubuntu防火墙限制了。将防火墙禁用后可以互相ping通

  2. 配置了两次主从,第二次时候出现ERROR 1201 (HY000): Could not initialize master!,这时候只需要在从服务器mysql命令行中reset slave;再配置即可。

  3. 从服务器的IO状态一直显示connecting,但是其他配置都正确,检查后发现,原因是mysql的配置文件my.cnf里面的bind-address,只允许本机mysql连接,注释掉就好了
    这里写图片描述

  4. 防火墙记得打开Mycat端口8066(数据端口)和9066(管理端口)

猜你喜欢

转载自blog.csdn.net/Hemk340200600/article/details/78727199