读写分离实现原理
首先MySQL主库在事务提交的时候会把数据变更作为Events记录在二进制文件Binlog中,MySQL主库的sync_binlog参数控制Binlog日志刷新到磁盘。
-
主库推送二进制日志文件Binlog中的事件到从库的中继日志Rely Log,之后从库根据Relay Log重做数据变更操作,通过逻辑赋值达到主库和从库数据一致的目的。MySQL通过3个线程完成主从复制:其中Binlog Dump线程跑在主库上,I/O线程和SQL线程跑在从库上,主库随后创建Binlog Dump线程读取数据库事件并发送给I/O线程,I/O线程获取到事件数据后,更新到从库的Relay log中去,之后从库的SQL线程读取RelayLog并应用。
实验介绍
实验背景
- 两台Mac电脑A和B,使用MAMP自带的mysql数据库,通过
vim ~/.zshrc
添加
alias mysql=/Applications/MAMP/Library/bin/mysql
实现mysql命令重定向。
A作为主库服务器主要负责写,B作为从库服务器负责读。
B开启了远程ssh登录,用SecureCRT同时连接本地和B。
实验步骤
1.连接数据库
分别在两个窗口连接数据库,两个数据库事先建立数据库learn
,和一个表content
mysql -u root -p
2.编辑mysql配置文件
- 主库配置
server-id = 1 #主机设置为1,从机设置为IP的最后一段保证唯一性
log-bin=mysql-bin
创建一个专门用来同步数据的账号
grant replication slave on *.* to 'mysync'@'%' identified by '123456789';
show master status # 查看主库的状态
2.从库配置
#主服务器地址,同步数据的用户名,密码,日志文件的位置,日志文件名
change master to master_host='192.168.0.105',master_user='mysync',master_password='123456789',master_log_file='mysql-bin.000001',master_log_pos=439;
start slave;#开启从服务器
检验从服务器是否配置好
show slave status \G;
#查看服务器状态
Slave_IO_Running :connect
Slave_SQL_Running:yes
的时候表示成功
验证,如果在主库的表插入一条记录,会发现从库表也有了相同的记录。主库增删改都会在从库体现。
查询从库发现中文显示问号,但是去从库里面实际观察发现存入的是中文
更改为UTF8
set character_set_connection=utf8;
set character_set_results=utf8;
set character_set_client=utf8