MySQL主从 - 邱乘屹的个人技术博客

MySQL主从同步原理

  1. master服务器将数据的改变记录二进制binlog日志,当master上的数据发生改变时,则将其改变写入二进制日志中;

slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/OThread请求master二进制事件

同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至从节点本地的中继日志中,从节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,使得其数据和主节点的保持一致,最后I/OThread和SQLThread将进入睡眠状态,等待下一次被唤醒。

MySQL主从一致效验

我们可以通过采用pt-table-checksum工具来检查主从的一致性,以下是具体流程。

工具安装

wget http://www.percona.com/get/percona-toolkit.tar.gz

安装所需依赖

yum install perl perl-devel perl-Time-HiRes perl-DBI perl-DBD-MySQL
perl-Compress-Raw-Bzip2
perl-Compress-Raw-Zlib
perl-Digest
perl-Digest-MD5
perl-IO-Compress
perl-IO-Socket-IP
perl-IO-Socket-SSL
perl-Mozilla-CA
perl-Net-Daemon
perl-Net-LibIDN
perl-Net-SSLeay

安装工具

# tar zxf percona-toolkit-2.2.13.tar.gz
# cd percona-toolkit-2.2.13
# perl Makefile.PL
# make && make install

在进行主从校验之前,我们首先需要对主从库进行授权

#主库授权
root@node1 12:28:  [pt_check]> GRANT CREATE,INSERT,SELECT,DELETE,UPDATE,LOCK TABLES,PROCESS,SUPER,REPLICATION SLAVE ON *.* TO 'root'@'47.97.218.145' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.00 sec)
root@node1 12:29:  [pt_check]>  flush privileges;
Query OK, 0 rows affected (0.00 sec)
root@node1 12:29:  [pt_check]> select Host,User  from mysql.user;
+----------------+---------------+
| Host         | User        |
+---------------------+--------------------+
| localhost      | root          |
| localhost      | mysql.session  |
| localhost      | mysql.sys      |
| 172.16.156.%   | rep           |
| %            | java          |
| 192.168.1.101   | ptuser        |
+----------------------+---------------------+

#从库授权
MariaDB [(none)]> GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE ON *.* TO 'root'@'9.106.84.122' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

授权到主从两个数据库之后呢,我们就可以开开心心的,进行主从数据一致性的校验。且看下面

pt-table-checksum是通过在主(master)上通过执行校验的查询对复制的一致性进行检查,对比主从的校验值,从而产生结果。
DSN指向的是主的地址,该工具的退出状态不为零,如果发现有任何差别,或者如果出现任何警告或错误,可以查看官方资料。

MySQL基于Docker的主从复制

基于Docker的主从复制的好处:
• 一台服务器可以运行多个docker容器。
• docker 容器之间相互独立,互不冲突。
• docker 使用步骤简便。

首先基于docker拉取mysql镜像

docker pull mysql:5.7

使用下载好的镜像,启动主从两个容器

docker run -p 3339:3306 --name mymysql –e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7  # 主
docker run -p 3340:3306 --name mymysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7  # 从

配置主从

docker exec -it 627a2368c865 /bin/bash # 进入容器,627a2368c865是容器的id,而mysql-master是容器的名称
apt-get update
apt-get install vim # 在容器中手动安装 vim

vi my.cnf,进入/etc/mysql目录下,对my.cnf进行编辑

[mysqld]
server-id = 100
log-bin = mysql-bin
service mysql restart   		# 重启mysql
docker start mysql-master 	# 启动容器

创建主从所需权限用户

CREATE USER 'slave'@'%' IDENTIFIED BY '123456'  # 创建用户
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%'  # 设置权限

配置从数据库

[mysqld]
server-id = 101
service mysql restart   		# 重启mysql
docker start mysql-master 	# 启动容器
change master to master_host='172.17.0.2', master_user='slave', 		 master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= 254, master_connect_retry=30;

这里需要注意的是,有两个参数来自于主库,可以通过主库中运行show master status 查看得到,分别是master_log_file以及master_log_pos。
最终在从库执行show slave status查看从库状态即可。看到IO与SQL线程处于活跃状态即为正常。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章