01-MySQL8主从详解

打印 上一主题 下一主题

主题 530|帖子 530|积分 1590

主从原理

master服务器将数据的改变记录二进制binlog日志,当master上的数据发生改变时,则将其改变写入二进制日志中;slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,
当master服务器数据发生变化,则slave开始一个I/O Thread请求master二进制事件,同时maser节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至从节点本地的中继日志Relay_Log_File中,从节点将启动SQL Thread从中继日志中读取二进制日志,在本地重放,使得其数据和主节点的保持一致,最后I/O Thread和SQL Thread将进入睡眠状态,等待下一次被唤醒。
注意几点:
1--master将操作语句记录到binlog日志中,然后授予slave远程连接的权限(master一定要开启binlog二进制日志功能;通常为了数据安全考虑,slave也开启binlog功能)。
2--slave开启两个线程:IO线程和SQL线程。其中:IO线程负责读取master的binlog内容到中继日志relay log里;SQL线程负责从relay log日志里读出binlog内容,并更新到slave的数据库里,这样就能保证slave数据和 master数据保持一致了。
3--Mysql复制至少需要两个Mysql的服务,当然Mysql服务可以分布在不同的服务器上,也可以在一台服务器上启动多个服务。
4--Mysql复制最好确保master和slave服务器上的Mysql版本相同(如果不能满足版本一致,那么要保证master主节点的版本低于slave从节点的版本)
5--master和slave两节点间时间需同步
1.1 Mysql复制的流程


1、第一阶段
Mysql复制过程的第一部分就是master记录二进制日志。在每个事务更新数据完成之前,master在二日志记录这些改变。MySQL将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。
2、第二阶段
就是slave将master的binary log拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。
3、第三阶段
SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。
此外,在master中也有一个工作线程:和其它MySQL的连接一样,slave在master中打开一个连接也会使得master开始一个线程。复制过程有一个很重要的限制——复制在slave上是串行化的,也就是说master上的并行更新操作不能在slave上并行操作。
1.2 主从复制的前提条件


  • 开启binlog功能
  • 主库master节点建立同步数据账号
  • 从库要配置master.info(CHANGE MASTER to...相当于配置密码文件和Master的相关信息)
  • start slave 开启复制功能
主从配置

2.1 基础环境

操作系统centos7.5,
节点名称IP地址master192.168.150.185slave192.168.150.252.2 基础配置

关闭selinux
  1. #临时关闭
  2. setenforce 0
  3. #永久关闭
  4. vi /etc/sysconfig/selinux
  5. ...
  6. ...
  7. SELINUX=disabled
  8. ...
  9. ...
复制代码
关闭防火墙
  1. systemctl stop firewalld&&systemctl stop iptables
复制代码
时钟同步配置
  1. #安装chrony
  2. yum install chrony
  3. #修改配置文件
  4. vi /etc/sysconfig/selinux
  5. ...
  6. ...
  7. server ntp1.aliyun.com iburst
  8. ...
  9. ...
  10. #启动服务
  11. systemctl start chronyd
复制代码
2.3 master主节点配置

修改配置文件
  1. vim /etc/my.cnf
  2. ..........
  3. [mysqld]
  4. #数据库唯一ID,主从的标识号绝对不能重复。
  5. server-id=1
  6. #开启bin-log,并指定文件目录和文件名前缀
  7. log-bin=mysql-bin
  8. #同步test数据库。如果同时同步多个库,就以此格式另写几行即可。如果不指定某个库同步,删除此行,表示同步所有库(除了ignore忽略的库)
  9. binlog-do-db=test
  10. #不同步mysql系统数据库。如果是多个不同步库,就以此格式另写几行;也可以在一行,中间逗号隔开。
  11. binlog-ignore-db=mysql
  12. #设置二进制日志自动删除/过期的天数,避免占用磁盘空间。默认值为0,表示不自动删除。
  13. expire_logs_days=7
  14. #确保binlog日志写入后与硬盘同步
  15. sync_binlog=1         
  16. #bin-log日志文件格式
  17. binlog_format=ROW
复制代码
温馨提示:在主服务器上最重要的二进制日志设置是sync_binlog,这使得mysql在每次提交事务的时候把二进制日志的内容同步到磁盘上,即使服务器崩溃也会把事件写入日志中。
sync_binlog这个参数是对于MySQL系统来说是至关重要的,他不仅影响到Binlog对MySQL所带来的性能损耗,而且还影响到MySQL中数据的完整性。对于"sync_binlog"参数的各种设置的说明如下:
sync_binlog=0,当事务提交之后,MySQL不做fsync之类的磁盘同步指令刷新binlog_cache中的信息到磁盘,而让Filesystem自行决定什么时候来做同步,或者cache满了之后才同步到磁盘。
sync_binlog=n,当每进行n次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘。
在MySQL中系统默认的设置是sync_binlog=0,也就是不做任何强制性的磁盘刷新指令,这时候的性能是最好的,但是风险也是最大的。因为一旦系统Crash,在binlog_cache中的所有binlog信息都会被丢失。而当设置为“1”的时候,是最安全但是性能损耗最大的设置。因为当设置为1的时候,即使系统Crash,也最多丢失binlog_cache中未完成的一个事务,对实际数据没有任何实质性影响。
从以往经验和相关测试来看,对于高并发事务的系统来说,“sync_binlog”设置为0和设置为1的系统写入性能差距可能高达5倍甚至更多。
2.4 数据一致性

在同步前保证master和slave中的数据一致,新环境忽略本步骤
导出数据库之前先锁定数据库
  1. #数据库只读锁定命令,防止导出数据库的时候有数据写入,unlock tables命令解除锁定
  2. mysql> flush tables with read lock;   
复制代码
导出master数据库中需要同步的库
  1. #导出需要同步的库
  2. [root@master ~]#mysqldump -uroot test -p123456 >/opt/test.sql
  3. #如不指定,则导出所有库
  4. mysqldump -uroot -p123456 --all-databases>/opt/all.sql
复制代码
将导出数据导入salve中
  1. #传到slave
  2. scp /opt/all slave:/opt
  3. #在slave导入数据库
  4. mysql> source /opt/all.sql
复制代码
2.5 创建数据同步账号

登录主数据库创建一个用于从数据库复制的账号
  1. mysql> create user 'rep'@'192.168.150.25' identified with mysql_native_password by 'repl123';
  2. grant replication slave on *.* to 'rep'@'192.168.150.25';
  3. mysql> flush privileges;
复制代码
查看主服务器master状态(注意File与Position项,从服务器需要这两项参数)
  1. mysql> show master status;
  2. +-----------+-----------+--------------+------------------+-------------------+
  3. | File      | Position  | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  4. +-----------+-----------+--------------+------------------+-------------------+
  5. | mysql-bin.000065 | 186607472 |              |                  |                   |
  6. +-----------+-----------+--------------+------------------+-------------------+
  7. 1 row in set (0.00 sec)
复制代码
2.6 配置slave

修改my.cnf配置文件
  1. vim /etc/my.cnf
  2. #设置从服务器id,必须于主服务器不同
  3. server-id=2   
  4. #启动MySQ二进制日志系统
  5. log-bin=mysql-bin   
  6. #需要同步的数据库名。如果不指明同步哪些库,就去掉这行,表示所有库的同步(除了ignore忽略的库)
复制代码
配置主从同步指令
  1. #执行同步前,要先关闭slave
  2. mysql> stop slave;   
  3. mysql> change master to master_host='192.168.150.185',master_user='repl',master_password='repl123',master_log_file='ON.000065',master_log_pos=186607472;
  4. mysql> start slave;
  5. mysql> show slave status \G;
复制代码
  1. mysql> show slave status \G
  2. *************************** 1. row ***************************
  3.                Slave_IO_State: Waiting for master to send event
  4.                   Master_Host: 192.168.150.185
  5.                   Master_User: slave
  6.                   Master_Port: 3306
  7.                 Connect_Retry: 60
  8.               Master_Log_File: ON.000065
  9.           Read_Master_Log_Pos: 187730832
  10.                Relay_Log_File: xmkjoa02-relay-bin.000002
  11.                 Relay_Log_Pos: 46151494
  12.         Relay_Master_Log_File: ON.000065
  13.              Slave_IO_Running: Yes
  14.             Slave_SQL_Running: Yes
  15.               Replicate_Do_DB:
  16.           Replicate_Ignore_DB:
  17.            Replicate_Do_Table:
  18.        Replicate_Ignore_Table:
  19.       Replicate_Wild_Do_Table:
  20.   Replicate_Wild_Ignore_Table:
  21.                    Last_Errno: 0
  22.                    Last_Error:
  23.                  Skip_Counter: 0
  24.           Exec_Master_Log_Pos: 187730832
  25.               Relay_Log_Space: 46151706
  26.               Until_Condition: None
  27.                Until_Log_File:
  28.                 Until_Log_Pos: 0
  29.            Master_SSL_Allowed: Yes
  30.            Master_SSL_CA_File:
  31.            Master_SSL_CA_Path:
  32.               Master_SSL_Cert:
  33.             Master_SSL_Cipher:
  34.                Master_SSL_Key:
  35.         Seconds_Behind_Master: 0
  36. Master_SSL_Verify_Server_Cert: No
  37.                 Last_IO_Errno: 0
  38.                 Last_IO_Error:
  39.                Last_SQL_Errno: 0
  40.                Last_SQL_Error:
  41.   Replicate_Ignore_Server_Ids:
  42.              Master_Server_Id: 1
  43.                   Master_UUID: 6c3f5abb-1c32-11ec-96ba-fa163e7a46bf
  44.              Master_Info_File: mysql.slave_master_info
  45.                     SQL_Delay: 0
  46.           SQL_Remaining_Delay: NULL
  47.       Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
  48.            Master_Retry_Count: 86400
  49.                   Master_Bind:
  50.       Last_IO_Error_Timestamp:
  51.      Last_SQL_Error_Timestamp:
  52.                Master_SSL_Crl:
  53.            Master_SSL_Crlpath:
  54.            Retrieved_Gtid_Set:
  55.             Executed_Gtid_Set:
  56.                 Auto_Position: 0
  57.          Replicate_Rewrite_DB:
  58.                  Channel_Name:
  59.            Master_TLS_Version:
  60.        Master_public_key_path:
  61.         Get_master_public_key: 1
  62.             Network_Namespace:
  63. 1 row in set (0.00 sec)
复制代码
如上,当IO和SQL线程的状态均为Yes,则表示主从已实现同步了!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王海鱼

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表