mysql主从同步

mysql主从同步读写分离

标签: mysql

环境背景

随着网站用户增加访问量增大,数据库读写会成为整个架构的瓶颈。所以我们一般使用数据库的主从同步将“读”和“写”分开,从而提高数据库的 读写性能。

主从原理

mysql

mysql主从复制可以分为:

  • 单向主从
  • 双向主主
  • 线性级联单项双主
  • 环状级联单向多主
  • 环状级联单向多主多从 原理基本一致:mysql_Slave服务器的IO线程会通过在master上已经授权的复制用户权限请求连接master服务器,并请求从执行binlog日志文件的指定位置(日志文件名和位置就是在配置主从复制服务时执行change
    master命令指定的)之后开始发送binlog日志内容。Master服务器接收到来自Slave服务器的IO线程的请求后,其上负责复制的IO线程会根据Slave服务器的IO线程请求的信息分批读取指定binlog日志文件指定位置之后的binlog日志信息,然后返回给Slave端的IO线程。返回的信息中除了binlog日志内容外,还有在Master服务器端记录的IO线程。返回的信息中除了binlog中的下一个指定更新位置。当Slave服务器的IO线程获取到Master服务器上IO线程发送的日志内容、日志文件及位置点后,会将binlog日志内容依次写到Slave端自身的Relay Log(即中继日志)文件(Mysql-relay-bin.xxx)的最末端,并将新的binlog文件名和位置记录到master-info文件中,以便下一次读取master端新binlog日志时能告诉Master服务器从新binlog日志的指定文件及位置开始读取新的binlog日志内容。Slave服务器端的SQL线程会实时检测本地Relay Log 中IO线程新增的日志内容,然后及时把Relay LOG 文件中的内容解析成sql语句,并在自身Slave服务器上按解析SQL语句的位置顺序执行应用这样sql语句,并在relay-log.info中记录当前应用中继日志的文件名和位置点。

环境搭建

1
2
3
sed -i 's#=enforcing#=disabled#' /etc/selinux/config
setenforce 0
systemctl stop firewalld #关闭防火墙

主从同步

在MySQL_MASTER配置文件中添加内容

1
2
3
4
5
6
7
8
9
10
11
vim/etc/mysql/my.cnf

server-id = 1 #数据库标识
log_bin = master-bin #主服务器日志文件
log_bin_index = master-bin.index
#binlog_do_db = my_data #指定同步的库
#binlog_ignore_db = mysql #指定不同步的库

max_binlog_size = 500M #每个bin-log最大大小,当此大小等于500M时会自动生成一个新的日志文件。一条记录不会写在2个日志文件中,所以有时日志文件会超过此大小。
binlog_cache_size = 128K #日志缓存大小
expire_logs_day=2 #设置bin-log日志文件保存的天数,此参数mysql5.0以下版本不支持

登陆mysql_master服务器

1
2
3
grant replication slave on *.* to 'admin' @'192.168.1.%' identified by 'admin';
#创建远程登陆账户admin并授权远程登陆
flush privileges;

重启mysql服务

1
service mysql restart

登陆mysql_master服务器

1
show master status;

status

在MYSQL_SLAVE配置文件中添加内容

1
2
3
4
5
6
7
vim/etc/mysql/my.cnf

server-id = 2 #数据库标识
relay-log = slave-relay-bin #从服务器日志文件
read-only = on #从库设置只读权限
relay-log-index = slave-relay-bin.index
#replicate-do-db = test #制定要同步多数据库

登陆mysql_slave服务器

1
2
3
4
5
6
7
change master to master_host='192.168.1.103',master_port=3306,master_user='admin',master_password='admin',master_log_file='master-bin.000001',master_log_pos=316;
#建立与msyql_maseter的连接
#master_host 主mysql地址
#master_port 主mysql端口
#master_user,master_password 远程用户和密码
#master_log_file File名称
#master_log_pos=2403; Position列对应数字
1
2
3
start|stop slave; #启动|关闭同步
change master to master_connect_retry=50; #设置超时时间
show slave status\G #查看同步状态
1
2
Slave_IO_Running:YES
Slave_IO_Running:YES

显示以上参数为YES表明同步没有问题