mysql主从原理
随着访问量的增加,数据库压力的增加,需要对msyql进行优化和架构改造,优化方法有:
- 高可用
- 主从复制
- 读写分离
- 拆分库
- 拆分表
原理
- 异步复制过程
- master开启bin-log日志功能,默认关闭
- slave开启IO线程和SQL线程
过程
- salve执行slave start,salve服务IO线程会通过授权的用户连接上master,并请求master从指定的文件和位置之后发送bin-log日志内容
- master服务器接收到来自slave服务器的IO线程请求后,master服务器上的IO线程根据slave服务器发送的指定bin-log日志之后的内容,然后返回给slave的IO线程,返回的信息中出了bin-log日志内容wait,还有本次返回日志内容后在master服务器端新的binlog文件名已经在binlog中的下一个指定更新位
- slave的IO线程接收到信息后,将接收到的日志内容依次添加到salve端的relay-log文件的最末端,并将读取到的master端的bin-log的文件名和位置记录到master-info文件中,以便下一次读取的时候能够清楚的告诉master“我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我”、
- slave的SQL线程检测到relay-log中新增了内容后,会马上解析relay-log的内容成为master端真实执行时候的那些可执行的内容,并在自身执行。
主从配置
- master my.cnf
-
[mysqld] datadir=/data/mysql socket=/var/lib/mysql/mysql.sock user=mysql # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 log-bin=mysql-bin server-id = 1 auto_increment_offset=1 auto_increment_increment=2 [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid replicate-do-db =all
slave my,cnf
-
[mysqld] datadir=/data/mysql socket=/var/lib/mysql/mysql.sock user=mysql # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 log-bin=mysql-bin server-id = 2 auto_increment_offset=2 auto_increment_increment=2 [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid master-host =192.168.33.10 master-user=tongbu master-pass=123456 master-port =3306 master-connect-retry=60 replicate-do-db =all
maste
-
grant replication slave on *.* to 'tongbu'@'%' identified by '123456'; show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000006 | 98 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec)
slave
-
change master to master_host='192.168.33.10',master_user='tongbu',master_password='123456',master_log_file='mysql-bin.000006',master_log_pos=98; show slave statusG
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
-
两个状态为YES,代表slave已经启动两个线程,一个为IO线程,一个为SQL线程。
问题:如果master挂掉了,如果快速恢复服务
方法一:
- 如果程序连的是master的IP,直接在slave服务器上添加master的IP即可
- 手动操作,花费时间长,存在误操作可能,不推荐
方法二:
- 使用keeplved、heartbeat作为HA检测软件
- 检车mysql服务,不正常则自动切换到slave上