MySQL主从
MySQL主从同步原理
- 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线程处于活跃状态即为正常。