简介
MySQL作为世界上使用最为广泛的数据库之一,免费是其原因之一。但不可忽略的是它本身的功能的确很强大。随着技术的发展,在实际的生产环境中,由单台MySQL数据库服务器不能满足实际的需求。此时数据库集群就很好的解决了这个问题了。采用MySQL分布式集群,能够搭建一个高并发、负载均衡的集群服务器(这篇博客暂时不涉及)。在此之前我们必须要保证每台MySQL服务器里的数据同步。数据同步我们可以通过MySQL内部配置就可以轻松完成,主要有主从复制和主主复制。
环境
两台linux虚拟主机
Linux版本CentOS7、MySQL 5.6
ip:192.168.1.233、192.168.1.234
主从配置
配置文件
一般Linux中的MySQL配置文件都在/etc/my.cnf(windows中的配置文件为mysql.ini)
log-bin=mysql-bin 开启二进制日志
配置主数据库
- 在主数据库里创建一个同步账号
- 每个从数据库会使用一个MySQL账号来连接主数据库,所以我们要在主数据库里创建一个账号,并且该账号要授予 REPLICATION SLAVE 权限,你可以为每个从数据库分别创建账号,当然也可以用同一个!
- 下面来创建一个账号,账号名:repl,密码:repl123,只允许192.168.1.234IP登录,如下:
mysql>GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.234' IDENTIFIED BY 'repl123'; mysql>FLUSH PRIVILEGES;
- 要配置主数据库,你必须要启用二进制日志(binary logging),并且创建一个唯一的Server ID,这步骤可能要重启MySQL。
- 复制组中的每台服务器都要配置唯一的Server ID,取值范围是1到(232)−1,你自己决定取值。
- 配置二进制日志和Server ID,你需要关闭MySQL和编辑my.cnf或者my.ini文件,在 [mysqld] 节点下添加配置 log-bin=mysql-bin server-id=1
- 查看二进制文件名和位置 mysql>SHOW MASTER STATUS;
配置从数据库
- 从服务器,同理,要分配一个唯一的Server ID,需要关闭MySQL,修改好my.cnf后再重启,如下:
server-id=2 replicate-do-db = test 要复制的库
- 配置
mysql> stop slave; mysql>CHANGE MASTER TO MASTER_HOST='192.168.1.233',MASTER_USER='repl',MASTER_PASSWORD='real123',MASTER_LOG_FILE='mysql-bin.000048',MASTER_LOG_POS=432; mysql> start slave;
- 查看从服务器状态
mysql> show slave status \G;
测试数据同步
- 测试,连接主服务器 192.168.1.233,添加了表 stu_user,
- 然后再连接上 192.168.1.234,发现也自己同步创建了表 stu_user,如图:
- 然后在主数据库添加一条记录,从数据库也自动添加了记录,如图:
至此,主从的配置已经完成了, 目前是在从库里面配置复制“test”这个库,
如果要添加其它库,可以在主服务器中添加“binlog-do-db”配置,或者在从服务器中添加“replicate-do-db”配置。
读写分离
- 主从配置是读写分离的前提,现在前提已经配置好了,读写分离就看具体项目的实现, 读写分离,就是“写”的操作都在主数据库,“读”的操作都在从数据库! 很多PHP框架都封装了读写分离,这里我以laravel为例: Laravel5读写分离配置比较简单,只需修改config/database.php,下面以MySQL数据库为例 内容如下:
- 设置完毕之后,Laravel5默认将select的语句让read指定的数据库执行,insert/update/delete则交给write指定的数据库,达到读写分离的作用。 这些设置对原始查询raw queries,查询生成器query builder,以及对象映射 Eloquent 都生效。 官网解释如下: Sometimes you may wish to use one database connection for SELECT statements, and another for INSERT, UPDATE, and DELETE statements. Laravel makes this a breeze, and the proper connections will always be used whether you are using raw queries, the query builder, or the Eloquent ORM
参考