1.简介
随着互联网急速增长,系统业务并发也越来越高,特别是在读多写少的场景下,我们不得不考虑将数据层面读写分离,所以mysql的主从结构也应运而生
Replication 线程
master与slave之间实现整个复制过程主要由三个线程完成:两个(SQL线程和IO线程)在slave端,一个(IO线程)在master端。
要实现MySQL的replication,必须打开master端的Binary Log(mysql-bin.xxx)功能。
整个复制过程实际上就是slave从master端获取日志然后在自己身上顺序执行日志中记录的各种操作
复制基本过程(异步的)
slave上的IO线程连接master,请求从指定日志文件的指定位置(或者从最开始)之后的日志内容。
master收到请求,负责复制的IO根据请求信息读取指定的日志,并返回(日志文件的地址也返回,方便下次直接根据地址请求)
slave的IO收到信息后,将日志内容依次写入到slave端的relay log文件的最末端,创建一个master.info的文件,该文件记录了master ip 用户名 密码 master bin-log名称,bin-log position。
slave的SQL线程检测到Relay Log中新加内容后,马上解析该Log文件的内容(Query语句),从而能保证两端的数据是一样的。
2.MySQL安装
准备两台机器,系统环境centos7,master:192.168.126.128,slave:192.168.126.129
2.1下载
访问https://dev.mysql.com/downloads/mysql/
我是centos7 64位,我选择对应的tar.gz包下载,然后上传到master上
2.2配置安装
先检查本机有没有安装过mysql或者mariadb:
rpm -qa|grep mysql
有的话先卸载:
rpm -e --nodeps xxx (xxx表示上面查询到的包名)
将下载好的mysql tar.gz包解压:
tar -zxvfmysql-5.7.29-linux-glibc2.12-x86_64.tar.gz -C /usr/local/
cd /usr/local/
mv mysql-5.7.29-linux-glibc2.12-x86_64 mysql(重命名)
创建mysql组和用户:
groupadd mysql
useradd -r -g mysql mysql #useradd -r参数表示mysql用户是系统用户,不可用于登录系统
修改配置:vim /etc/my.cnf
[mysqld]
#设置mysql的安装目录
basedir = /usr/local/mysql
#设置mysql数据库的数据存放目录
datadir = /usr/local/mysql/data
#设置端口
port = 3306
socket = /tmp/mysql.sock
#设置字符集
character-set-server=utf8
#日志存放目录
log-error = /usr/local/mysql/data/mysqld.log
pid-file = /usr/local/mysql/data/mysqld.pid
#允许时间类型的数据为零(去掉NO_ZERO_IN_DATE,NO_ZERO_DATE)
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
#ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
创建data目录:
mkdir /usr/local/mysql/data
#初始化
./bin/mysqld --initialize --user=mysql--basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
查看密码
cat /usr/local/mysql/data/mysqld.log
把启动脚本放到开机初始化目录
cp support-files/mysql.server/etc/init.d/mysql
#启动
service mysql start
#登录
./bin/mysql -u root -p
#修改密码
set password=password('123456');
#为远程root用户授权
grant all privileges on *.* to root@'%'identified by '123456';
flush privileges;
#用工具远程登录成功(注意防火墙问题,本地可以直接禁用防火墙,线上配置开发特定端口)
2.3主从配置
2.3.1 master上
#命令行登录
./bin/mysql -u root -p
#创建同步binlog用户
create user 'repl'@'%' identified by'123456';
GRANT REPLICATION SLAVE ON *.* TO'repl'@'%';
flush privileges;
添加如下配置:
vim /etc/my.cnf
#配置binlog日志名称
log_bin=master-bin
log_bin_index = master-bin.index
#配置serverid全局唯一
server-id=1
#设置binlog日志有效期,避免日志过多占用磁盘容量
expire-logs-days=7
#不同步这些表
binlog_ignore_db=mysql
binlog_ignore_db=information_schema
binlog_ignore_db=performation_schema
binlog_ignore_db=sys
重启服务:
service mysql restart
命令行登录:
./bin/mysql -u root -p
查看master状态:
show master status;
这样master就配置好了,记住File和Position,后面slave上面会使用到
2.3.2 slave上
和master一样,2.2配置安装好mysql后
添加如下配置:
vim /etc/my.cnf
server-id = 2
relay-log = slave-relay-bin
relay-log-index = slave-relay-bin.index
保存重启mysql服务:
service mysql restart
命令行登录:
./bin/mysql -u root -p
执行命令:
change master tomaster_host='192.168.126.128', master_port=3306, master_user='repl',master_password='123456', master_log_file='master-bin.000001',master_log_pos=154;
start slave;
查看slave状态:
show slave status \G;
如果IO和SQL两个线程是Yes状态说明主从配置成功
验证:
我使用navicat连接两个数据库,128(master), 129(slave),我在128上面创建数据库test_tm,然后创建表t1,在t1中插入一条数据
然后我们在129上面验证:
发现数据库和表数据都同步过来了,完成
如有疑问欢迎来讨论