对于很多大型网站(pv值百万、千万)来说,在所处理的业务中,其中有70%的业务是查(select)相关的业务操作(新闻网站,插入一条新闻。查询操作),剩下的则是写(insert、update、delete,只要能对MySQL的数据造成更改的操作都叫写操作)操作。在使用负载均衡集群之后,可以很大程度的提升网站的整体性能,但是最终的数据处理的压力还是会落到MySQL数据库上,所有很有必要使用一些技术来提升MySQL的负载能力。(读写分离写专门交给写服务器处理(一般网站来说写是比较少的读写比4:1)那么需要把读的任务分配多台服务器来完成的架构,就叫做读写分离。
接下来我们就来尝试一下搭建读写分离的步骤
既然说到了读写分离,那么读写分离是基于代码层面的,我们根据自己的搭建架构来决定我们到底是选择哪一个服务器来使用写,其余的来执行读。也就是我们所说的主从复制,接下来的步骤就是如何搭建主从复制,至于读写分离我们在以后会讲到如何用代码来控制。
既然需要主从复制,那么我们肯定需要两台mysql服务器。我的选择是一台在windows,一台搭建在linux。linux搭建服务器的话我采用的是yum源安装。不过linux的centos精简版默认没有mysql的yum源,所以我们需要去mysql的官网下载yum源,并修改对应的配置来决定使用那一个版本。具体的做法可以自行查阅。个人搭建使用的是5.6系列的版本。诸君可用别的版本进行尝试。
搭建完我们的数据库之后我们需要修改一下我们的配置文件来使它能够实现同步也就是复制的功能。
找打我们的配置文件,windows下一般是在programdata文件夹下面,这个文件夹是一个隐藏的文件夹,所以需要显示隐藏的文件夹才能看到。找到mysql和自己对应的版本修改自己的my.ini配置文件。在[mysqld]下面添加
log-bin = mysql-bin //开启mysql的二进制的文件,记录每次的更新操作
server-id = 1 // 每个服务器的id 不能重复
innodb-file-per-table = ON
skip_name_resolve = ON //是否解析hostname,关闭可加快连接速度
主从复制的原理其实就是把主服务器上的bin日志复制到从服务器上执行一遍,这样从服务器上的数据就和主服务器上的数据相同了。
修改完配置文件后,启动或者重新启动mysql服务。因为我是在window为主服务器,所以我需要在我的mysql服务器上面添加从服务器的账号来实现复制功能:
GRANT REPLIACTION SLAVE,REOPLIATION CLIENT ON *.* TO 'repluser' @'192.168.10.128' IDENTIFIED BY 'repluser'
如果不设置我们的这一个账号属性,我们在后续的从服务器上面使用 show slave status 会发现里面有提示access denied。也就是拒绝连接,因为我们数据库不允许这个用户进行连接。做完上述步骤之后我们刷新一下数据库完成权限的添加。
FLUSH PRIVILEGES
然后执行SHOW MASTER STATUS查看我们的主服务器的状态,可能有下面的结果:
File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
---|---|---|---|---|
mysql-bin.000005 | 120 | together | mysql |
其中的file 和 position我们要记得,这在下面的从服务器配置中很重要;Binlog_Do_DB则是我们要进行主从复制的数据库,Binlog_Ignore_DB则是忽略复制的数据库,这些都是在配置文件中配置,键名也和我们的查询结果一致。
到此为止我们的一个主服务器的配置已经可以使用了,接下来我们就可以配置我们的从服务器了。
因为我是在linux通过yun安装的服务器,所以我们要修改位于/etc下的my.cnf文件,同样是在[mysqld]下添加如下信息:
relay-log=relay-log
relay-log-index=relay-log.index
server-id=2
innodb_file_per_table=ON
skip_name_resolve=ON
重新启动我们的服务器。
进入mysql的命令行。执行我们的从服务器的配置。
CHANGE MASTER TO
MASTER_HOST='192.168.0.196',//我们主服务器的地址
MASTER_USER='repluser',//我们第一步创建的登录用户
MASTER_PASSWORD='replpass',//对应的密码
MASTER_LOG_FILE='mysql-bin.000042',//对应我们主服务器的file一项的值
MASTER_LOG_POS=362;//对应主服务器的position的值
执行START SLAVE来启动我们的从服务器。
执行完毕,我们需要SHOW SLAVE STATUS来查看我们的从服务器的状态.
可以使用\G来纵向展示数据,不过只能在mysql自身的客户端来使用这个\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.3.125
Master_User: liuw
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000005
Read_Master_Log_Pos: 120
Relay_Log_File: mysqld-relay-bin.000006
Relay_Log_Pos: 283
Relay_Master_Log_File: mysql-bin.000005
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: together
Replicate_Ignore_DB: mysql
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 120
Relay_Log_Space: 620
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID: c9a966cf-373b-11e9-8b07-00e04c2254a8
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
要特别注意Slave_IO_Running和Slave_SQL_Running这两个对应的值,如果不全是yes就证明我们的配置出现了问题。
出现问题的时候不要慌张,可以查看Slave_SQL_Running_State该列的值来确定我们出了什么问题。
基本到了这里我们就可以测试一下的数据库来观察我们的数据是否实现了主从复制。