Mysql-主从复制 2019-08-26 程序之旅 暂无评论 822 次阅读 ### 主从复制 最近使用到Mycat,为了实现高可用、读写分离、集群、故障转移和数据备份等。学习Mycat之前,想了解一下Mysql的主从复制功能。 Mysql的主从复制是本身自带功能,Mycat做读写分离,与Nginx类似。 #### 主要原理 数据库的dmlsql操作语句写入到二进制日志文件中(binLog)。 在进行主从复制的过程中,**从数据库**会开启两个线程,一个线程用来获取二进制文件binLog,从而写到relay log文件中去,另一个线程用于执行文件中的sql操作;**主数据库**中开启一个logDump线程,用于返回本地binlog二进制执行文件到从数据库节点。**简单的说就是master端(主库)执行一条sql命令,Slave端同样的也执行一遍,从而达到复制的效果。** ![主从复制原理](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/typecho/2019/08/26/320973148206598/主从复制原理-1566825674917.png) #### 实战实现 需求:完成数据库主从复制 环境: - win10 - mysql 5.7 - ip:192.168.124.100 - 虚拟机 ubuntu-18.04.3-desktop-amd64 - mysql 5.7 - ip:192.168.124.18 ##### 实现过程 我使用win10的数据库作为主库,使用ubuntu上的数据库为从库,主库就叫mysql01,从数据库就叫mysql02。首先在主数据库中添加一个库`test`用于同步。 1. 配置主服务器数据库 找到数据库的配置文件`my.ini`,win10下的路径是`C:\ProgramData\MySQL\MySQL Server 5.7\my.ini` 使用文本编辑器打开,找到`server-id`,给数据库给一个唯一的id,并开启日志服务 ```xml server-id= 88 # 给予唯一标识 log-bin = mysql-bin # 开启日志服务,设置文件前缀 binlog_do_db = test # 需要同步的数据库 ``` > 不同系统下数据库的配置文件会有所不同 如果需要添加其他的主从数据库需要单独的添加一行配置项,例如 binlog_do_db = test2,不能写成 binlog_do_db = test,test2 配置完成后重启数据库服务,输入以下命令,查看是否配置成功 ``` # 重启服务 systemctl restart mysql # centos7 sudo /etc/init.d/mysql restart # ubuntu # 查看配置 show variables like '%server_id%'; show master status; # 查看同步的文件和行数 ``` > File:同步的文件,也就是主服务器sql操作写入的文件 > > Position:同步的行数,也就是在sql操作mysql-bin文件中,操作执行所在的行,为了避免从服务器宕机后,数据丢失问题 2. 配置从服务器数据库 同样的找到配置文件,在ubuntu中,配置文件的位置`/etc/mysql/mysql.conf.d/mysqld.cnf`,修改字段 ```xml server-id = 8866 # 唯一标识 log-bin = mysql-bin ###日志文件同步方式 ``` > ~~这里需要注意的是,在配置数据库之前,需要在master和slave中创建好同名的数据库,例如Master下有一个test数据库,slave下有一个同名的test数据库~~ 配置完后直接在master主数据库中添加test数据库,从数据库也会自动新增test数据库 之后重启服务器,并测试是否配置成功,并配置服务器,开启同步 ```xml show variables like '%server_id%'; # 查看配置的数据库id change master to master_host = '192.168.124.100', master_user = 'root', master_password = 'root', master_log_file = 'mysql-bin.000003', master_log_pos = 154;# 配置需要绑定的数据库 start slave; # 开启同步 show slave status; # 查看运行状态,判断是否连接成功就看 Slave_IO_Running和Slave_SQL_Running状态是否为Yes ``` > 这里需要注意的是,如果slave数据库一直处在connect状态,可以使用以下三点来进行排查错误 > > 1. master密码错误 > 2. master没有授权远程登录 > 3. master端口权限没开 ------ #### 测试阶段 在本地(Master)中添加一个数据,ubuntu(Slave)中自动同步一个数据,大功告成。接下来就是使用Mycat的读写分离和高可用配置。 ![1566831585949](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/typecho/2019/08/26/32074883261318/1566831585949.png) ![1566831611740](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/typecho/2019/08/26/320753003340207/1566831611740.png) PS:刚大学毕业的时候,上级领导给了我一个任务,也就是数据库定时备份,当时没有想到mysql中会存在这样的功能,还想着弄个定时器来定时备份,现在回头看看懵懂的我,哈哈哈!^_^ 打赏: 微信, 支付宝 标签: mysql, mycat 本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。