Mysql数据库的主从复制和读写分离

数据库的应用在日常的工作和生产中充当着数据管理者的身份 对于一些企业级的数据 数据安全和数据的操作效率显得尤为重要

那么在这里将以数据库常见的主从复制和数据库的读写分离进行一个总结

读写分离

对于这样的一个应用首先要明白他的应用场景 我们知道sql的查询比一些新增 删除这些操作更为耗时

也就是主数据库负责网站NonQuery操作,从服务器负责Query操作,用户可以根据网站功能模特性块固定访问Slave服务器,或者自己写个池或队列,自由为请求分配从服务器连接

大型网站对于网站的大并发量的访问 除了实现网站的负载均衡 对于数据的处理也格外注意 如果还是传统的数据库架构 如果多的数据的操作势必会造成互数据的压力倍增从而导致请求超时和用户
体验的下降 因此我们会想到减少数据库的连接 除了代码的优化以及一些缓存技术的应用我们也是可以尝试这样的架构方式来减轻主数据库的压力 即主数据库负责写 从数据库只负责数据查询

主从复制

数据库的主从复制可以理解为就是主数据库也就是我们项目直接使用操作的数据库 而从数据库当主数据库进行数据操作变化时也会
同步更新 即主数据库怎么做从属数据库就怎么做 这样一来对于主数据库的数据就可以起到一种备份的作用

对于原理其实就是对于主数据库在进行数据操作 如增删改查时 会把这些操作记录在二进制日志中 这样从属数据库如果拿到这份日志
这样就可以重复执行这些动作 所以也就达到了复制的作用

为了演示可以准备两台服务器 这里我用的是DigitalOcean 作为测试服务器很是方便

选择创建两个Droplets 具体配置根据自己的需求来
one
two

这里由于选择本地的ssh key因此可以无需密码登录服务器

登录masterslave服务器安装mysql 这里我以5.7

1
$ apt-get install  mysql-server-5.7 -y

配置Mysql

Master

进入mysql的配置路径/etc/mysql
three

这里更改bind_ip为内网ip
four

更改server_id=1这里的1可以根据需要更改为一个数字一用来区分

最终配置为

1
2
3
4
server-id               = 1
log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10
max_binlog_size = 100M

重启mysql服务

1
$ service mysql restart

进入mysql创建一个数据库app

1
$ create database app charset utf8mb4;

配置主数据

1
2
3
mysql> create user 'slave'@'10.138.12.79' identified by 'slavepwd';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'10.138.12.79';
mysql> FLUSH PRIVILEGES;

我们可以查看到主数据库的状态

1
mysql> show master status;

five

记录下这个日志的positionfile

Slave

进入主服务器
我们需要配置下mysql的基本配置 路径还是/etc/mysql

需要区分从数据库的server_id这里更改为2
最终的配置为

1
2
3
4
server-id               = 2
log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10
max_binlog_size = 100M

接下来就是从数据库的配置 进入mysql
首先关系从属配置

1
mysql> stop slave;

1
2
3
4
5
6
mysql> CHANGE MASTER TO 
mysql> MASTER_HOST='10.138.204.172',
mysql> MASTER_USER='slave',
mysql> MASTER_PASSWORD='slavepwd',
mysql> MASTER_LOG_FILE='mysql-bin.000001',
mysql> MASTER_LOG_POS=771;

这里的log就是master数据库配置的信息

重启slave

1
mysql> start slave;

为了确认可以查看最终的Slave状态

1
mysql> show slave status/G

如果Slave_IO_RunningSlave_SQL_Running都为yes即为成功配置
six

这样的话在主数据库同一个数据库下的sql都将同步到salve 也就实现了我们需要的mysql主从复制