一、MySQL主从复制原理
MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践
Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过。但在实际的生产环境中,由单台Mysql作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面。
因此,一般来说都是通过 主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力 这样的方案来进行部署与实施的。
如下图所示:
在一主多从的数据库体系中,多个从服务器采用异步的方式更新主数据库的变化,业务服务器在执行写或者相关修改数据库的操作是在主服务器上进行的,读操作则是在各从服务器上进行。如果配置了多个从服务器或者多个主服务器又涉及到相应的负载均衡问题,关于负载均衡具体的技术细节还没有研究过,今天就先简单的实现一主一从的主从复制功能。
Mysql主从复制的实现原理图大致如下:
二、主从实验
1、实验对象准备
主数据库服务器:192.168.48.128,linux
从数据库服务器:127.0.0.1,windows
2、主数据库配置
1)修改mysql配置
找到主数据库的配置文件my.cnf,修改配置并重启
vi /etc/my.cnf
service mysqld restart
在[mysqld]部分插入如下两行:
[mysqld]
#开启二进制日志
log-bin=mysql-bin
#设置server-id,id不能与其他mysql重复
server-id=1
#设置 Master 对哪些库记日志
binlog_do_db=name
#设置 Master 对哪些库不记日志
binlog_ignore_db=name
2)创建用于同步的用户账号
进入主数据库mysql,创建用户:repl密码:slavepass
#创建用户
mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'slavepass';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' ; #分配权限
mysql>flush privileges; #刷新权限
3)查看master状态,记录二进制文件名(mysql-bin.000001)和位置(120):
SHOW MASTER STATUS;
3、从数据库slave修改
1)修改mysql配置
同样找到my.ini配置文件,添加server-id,然后重启mysql
[mysqld]
#设置server-id,必须唯一
server-id=2
# 要同步的mstest数据库,要同步多个数据库,就多加几个
replicate-do-db=name
#要忽略的数据库
replicate-ignore-db=mysql
2)执行同步SQL语句
进入从数据库,执行同步语句,需要主服务器主机名,登陆凭据,二进制文件的名称和位置)
mysql> CHANGE MASTER TO
MASTER_HOST='192.168.48.128',
MASTER_USER='repl',
MASTER_PASSWORD='slavepass',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=120;
3)启动slave同步进程
mysql>start slave;
mysql>show slave status\G;
当看到Slave_IO_Running和 Slave_SQL_Running这两项都为YES时,说明主从已经配置成功。这样一来,从数据库就可以通过读取主数据库的binlog进行同步数据。
不过需要注意的是:如果对从数据库进行修改,是不会同步对主数据库进行修改的,这样就应该用主-主同步了,方法类似,所以insert,delete update 都应该是对主数据库的操作, 而select操作则对从表进行操作。