mysql数据库的同步

Slave服务器 io线程以redhat身份(密码认证成功)去拷贝master服务器的二进制日志(记载了master做了些什么,比如新建数据库等),到自己的relay-log中,slave的sql线程会去读取拷贝来的二进制日志,查看master做了什么,然后再进行相同的动作,达到数据同步:
多线程并行复制5.6就支持,(slave的sql多线程),5.7基于数据库(有几个数据库则有几个线程)

一.数据库的安装

1.官网下载https://www.mysql.com/

实验环境 :master–host1–172.25.254.1
slave–host2–172.25.254.2
以下操作再haost1上:

mysql-5.7.17-1.el6.x86_64.rpm-bundle.tar
解压

tar xf mysql-5.7.17-1.el6.x86_64.rpm-bundle.tar 

会解压出以下9个rpm包

mysql-community-client-5.7.17-1.el6.x86_64.rpm
mysql-community-common-5.7.17-1.el6.x86_64.rpm
mysql-community-libs-5.7.17-1.el6.x86_64.rpm
mysql-community-libs-compat-5.7.17-1.el6.x86_64.rpm
mysql-community-server-5.7.17-1.el6.x86_64.rpm

mysql-community-embedded-devel-5.7.17-1.el6.x86_64.rpm
mysql-community-devel-5.7.17-1.el6.x86_64.rpm
mysql-community-embedded-5.7.17-1.el6.x86_64.rpm
mysql-community-test-5.7.17-1.el6.x86_64.rpm

mysql数据库的同步_第1张图片
安装这五个

yum install  mysql-community-client-5.7.17-1.el6.x86_64.rpm 
yum install  mysql-community-common-5.7.17-1.el6.x86_64.rpm  
yum install  mysql-community-libs-5.7.17-1.el6.x86_64.rpm 
yum install  mysql-community-libs-compat-5.7.17-1.el6.x86_64.rpm 
yum install  mysql-community-server-5.7.17-1.el6.x86_64.rpm 

这里写图片描述
mysql数据库的同步_第2张图片

2.启动数据库,初始化

启动数据库

 /etc/init.d/mysqld start

这里写图片描述
初始化:

grep "temporary password" /var/log/mysqld.log   ##过滤临时密码,初始化过程中修改密码用(kfwjXi4h5p!F)

这里写图片描述

mysql_secure_installation

输入当前密码,就是过滤出来的那个,键入后回车
mysql数据库的同步_第3张图片
设置新密码,这里设置为Westos+007,再次确认,并选择应用不再修改
mysql数据库的同步_第4张图片
依次是移除匿名用户,不允许root用户远程登陆,移除test数据库,刷新数据库,全选yes
mysql数据库的同步_第5张图片
测试下:登陆成功,就没问题
mysql数据库的同步_第6张图片

3.slave数据库的安装同此

mysql数据库的同步_第7张图片

二.主从同步的基本配置

1.主(以下称master)的配置

vim /etc/my.cnf
     29 server-id=1     ##服务器标识,正整数,2的32次方减1
     30 log-bin=mysql-bin  ##二进制日志

完成后保存退出,重启数据库:
mysql数据库的同步_第8张图片
mysql数据库的同步_第9张图片

进入数据库
 mysql -pWestos+007
 mysql> show master status\G;   ##查看master状态
 mysql> grant REPLICATION SLAVE ON *.* to redhat@'172.25.254.%' identified by 'Westos+007';  授权slave对任何数据库的任何表操作,以redhat身份,从172.25.254.0/24网段登陆,密码‘Westos+007‘
 mysql> show master status\G;   ##再次查看master状态

mysql数据库的同步_第10张图片
记录file和position值
mysql数据库的同步_第11张图片

2.从(以下称slave)的配置

vim /etc/my.cnf
    29 server-id=2
/etc/init.d/mysqld restart

mysql数据库的同步_第12张图片
这里写图片描述

进入数据库
mysql -pWestos+007
mysql> show slave status\G;
mysql>change master to master_host='172.25.254.1',master_user='redhat',master_password='Westos+007',master_log_file='mysql-bin.000001',master_log_pos=450;    ##和master建立认证联系
mysql> start slave;   ##开启slave
mysql> show slave status\G;  ##查看状态

mysql数据库的同步_第13张图片
IO线程和sql线程开启
mysql数据库的同步_第14张图片
slave io线程 以redhat身份拷贝(多线程)master的log-bin 到自己的relay-log,slave的sql线程(单线程)读取relay-log,照着master的事务再做一阿遍) ###多线程并行复制5.6就支持了。基于库的(几个数据库几个线程),5.7基于主辅制的

实验:

master新建个数据库westos,slave会自动同步
mysql数据库的同步_第15张图片
slave自动同步
mysql数据库的同步_第16张图片

cd /var/lib/mysql
mysqlbinlog mysql-bin.000001  ##查看二进制日志

这个日志记载master的事务
授权
这里写图片描述
建库
这里写图片描述

Gtid全称global transaction identifiers全局事务标志
一个事务对应唯一的一个id(mysql的语句),一个gtid在一个服务器(master)上只会也只能执行一次,在从库上(slave)也只会出现一次
Gtid由uuid+tid组成,uuid是mysql实例的唯一标识,tid代表了该实例(理解为语句,执行的动作)上已经提交的事务数量,并且会随着事务提交单调递增:

三.gtid的使用

1.master

mysql> quit
vim /etc/my.cnf
   29 server-id=1
   30 log-bin=mysql-bin
   31 
   32 gtid_mode=ON
   33 enforce-gtid-consistency=true
  /etc/init.d/mysqld restart

mysql数据库的同步_第17张图片
这里写图片描述

slave配置

mysql> stop slave;
mysql> quit
vim /etc/my.cnf
  29 server-id=2
  30 gtid_mode=ON
  31 enforce-gtid-consistency=true
/etc/init.d/mysqld restart

mysql数据库的同步_第18张图片
这里写图片描述

实验:

master再westos库中新建表linux;

mysql数据库的同步_第19张图片
slave同步
mysql数据库的同步_第20张图片
再master的westos库的user_tb中添加use1,123,
mysql数据库的同步_第21张图片
slave同步
mysql数据库的同步_第22张图片

matser退出数据库
mysql> quit
cd /var/lib/mysql
mysqlbinlog mysql-bin.000002    ##查看事务日志

第一个htid对应的事务是在westos建立表user_tb
这里写图片描述
这里写图片描述
第二个gtid是添加用户user1和密码123
这里写图片描述

关闭slave退出后进入/var/lib/mysql

mysqlbinlog host2-relay-bin.000005 

和master比对会发现gtid相同,slave的IO线程考来了master的事务日志,然后交给sql线程去执行,master的每条事务对应一个gtid,
mysql数据库的同步_第23张图片
这里写图片描述

四.slave并行复制

并行复制就是多个事务同时进行复制,但并行复制存在salve端sql线程运行时,master不断写入,会出现问题,所有有锁表机制

1.并行复制可以优化把/var/lib/mysql/relay-log.info优化为 mysql 库中的表,此时此文件将不存在

mysql数据库的同步_第24张图片

2.编辑slave配置文件
vim /etc/my.cnf
     33 slave-parallel-type=LOGICAL_CLOCK    ##锁表
     34 slave-parallel-workers=16   ##最大线程16
     35   ##下边的是优化项,
     36 master_info_repository=TABLE   
     37 relay_log_info_repository=TABLE
     38 relay_log_recovery=ON

mysql数据库的同步_第25张图片

3.进入slave数据库:
mysql> show processlist;   ##查看线程16个

mysql数据库的同步_第26张图片

4.slave查看优化项
mysql> use mysql;
mysql> show tables;

mysql数据库的同步_第27张图片

五.半同步

在异步复制的情况下,mysql master server 会将自己的二进制日志通过copy线程传输给slave以后,master会自动返回数据给客户端,而不管slave上是否接收到了这个日志。
半同步,当master把日志传给slave时,确保slave收到了日志,才会返回数据给客户端。

#1.master加载模块
mysql>INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
mysql> show plugins;  ##最后有rpl_semi_sync_master       | ACTIVE
mysql> show variables like  '%rpl_semi%';
mysql> set global rpl_semi_sync_master_enabled=1;  ##global全局

master加载模块
mysql数据库的同步_第28张图片
这里写图片描述
查看加载模块信息
mysql数据库的同步_第29张图片
开启加载的master模块
mysql数据库的同步_第30张图片

2.slave端
mysql> install plugin rpl_semi_sync_slave SONAME 'semisync_slave.so';   ##加载slave模块
mysql> set global rpl_semi_sync_slave_enabled=1;  ##开启slave模块
mysql> show variables like  '%rpl_semi%';   ##查看信息
mysql> STOP SLAVE IO_THREAD;   ##关闭slaveIO线程
mysql> START SLAVE IO_THREAD;  ##开启slaveIO线程

mysql数据库的同步_第31张图片
mysql数据库的同步_第32张图片

查看slave状态

mysql> show slave status\G;

mysql数据库的同步_第33张图片

实验:master在westos中的user_tb中添加信息,等待slave响应,因为等待,所以返回客户端时间较长;但下边的好像不是很长,这是由于之前并行实验有16个线程的缘故

mysql数据库的同步_第34张图片

配置slave的/etc/my.cnf 注释并行复制配置参数,重启服务

mysql数据库的同步_第35张图片
mysql数据库的同步_第36张图片

matser再次插入会发现返回客户端时间较长

mysql数据库的同步_第37张图片
mysql数据库的同步_第38张图片

关闭slave的半同步,master进行事务返回客户端时间有短了
set global rpl_semi_sync_slave_enabled=1;

mysql数据库的同步_第39张图片
这里写图片描述

mysql数据库的同步_第40张图片

六.单点.多个salve

在上边实验的基础上在增加slave2(host3)

slave(host2)授权以下操作在host2上

实验前开启gtid
mysql数据库的同步_第41张图片
这里写图片描述

mysql> grant REPLICATION SLAVE on *.* to redhat@'172.25.254.%' identified by 'Westso+007';
mysql> flush privileges;

mysql数据库的同步_第42张图片
quit退出后
备份数据库

mysqldump -p westos >/mnt/westos.sql

mysql数据库的同步_第43张图片
slave(host2) 编辑配置文件

vim /etc/my.cnf

 40 log-slave-updates=ON
 41 log-bin=mysql-bin
/etc/init.d/mysqld restart

mysql数据库的同步_第44张图片
mysql数据库的同步_第45张图片
将备份的数据库传给slave2(host3)

scp /mnt/westos.sql host3:/mnt

mysql数据库的同步_第46张图片

slave2(host3)以下操作在host3

安装数据库完成初始化

vim /etc/my.cnf

 29 server-id=3
 30 gtid_mode=ON
 31 enforce-gtid-consistency=true
/etc/init.d/mysqld restart

mysql数据库的同步_第47张图片
创建数据库,导入数据库,进入数据库

mysqladmin -p create westos;
mysql -p westos </mnt/westos.sql
mysql -pWestos+007

mysql数据库的同步_第48张图片
mysql数据库的同步_第49张图片

进入数据库后,指定master为slave(host2),指定认证身份密码,等信息;

mysql>change master to master_host='172.25.254.2',master_user='redhat',master_password='Westos+007',master_auto_position=1;
mysql> start slave;
mysql> show slave status\G;

查看host3的slave状态io线程和sql线程开启,则成功
mysql数据库的同步_第50张图片
host1(master)进行一条事务,host2和host3同步
mysql数据库的同步_第51张图片

七.读写分离

分区分表
mysql中间件https://blog.csdn.net/javacodekit/article/details/76559112
这里以mysql-proxy为例说明,类似的中间件还有Atlas(官网:https://github.com/Qihoo360/Atlas/blob/master/README_ZH.md)
Mysql router(官网:http://dev.mysql.com/doc/mysql-router/en/)
Mycat(官网:http://www.mycat.org.cn/)
Cobar(官网:https://github.com/alibaba/cobar/wiki)
Amoeba(官网:http://docs.hexnova.com/amoeba/)

1.下载,解压mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz

tar zxf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz  -C /usr/local/    ##解压到/usr/local下
mv mysql-proxy-0.8.5-linux-el6-x86-64bit/ mysql-proxy
 ##简化名字

mysql数据库的同步_第52张图片

2.找到它的启动脚本

/usr/local/bin/mysql-proxy

mysql数据库的同步_第53张图片

3.在/usr/local/mysql-proxy新建配置目录conf,进入新建的目录内,编写配置文件mysql-proxy.conf

cd /usr/local/mysql-proxy
mkdir conf
cd conf
vim mysql-proxy.conf  (/usr/local/mysql-proxy/bin/mysql-proxy --help-proxy 获得帮助说明信息)

mysql数据库的同步_第54张图片
mysql数据库的同步_第55张图片

配置文件编写
vim  /usr/local/mysql-proxy/conf/mysql-proxy.conf   
-------->>
  1 [mysql-proxy]
  2 user=root    ##root身份运行
  3 proxy-address=172.25.254.3:3306   ###mysql中间代理件
  4 proxy-backend-addresses=172.25.254.1:3306    ##主
  5 proxy-read-only-backend-addresses=172.25.254.2:3306 ##读
  6 proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua    ##lua脚本
  7 log-file=/usr/local/mysql-proxy/logs/mysql-proxy.log  ##日志文件(手动新建logs)
  8 plugins=proxy
  9 log-level=debug  ##日志级别
  10 keepalive=true   ##持续连接
 11 daemon=true    ##后台运行

mysql数据库的同步_第56张图片
mysql数据库的同步_第57张图片

修改下lua脚本,方便实验效果

cd  /usr/local/mysql-proxy/share/doc/mysql-proxy
 vim rw-splitting.lua
   40         min_idle_connections = 1,
   41         max_idle_connections = 2, ##master最大被连接两次就会交给slave

mysql数据库的同步_第58张图片
mysql数据库的同步_第59张图片

启动msql-proxy
/usr/local/mysql-proxy/bin/mysql-proxy   ##卡住的话打入后台crtl+z
/usr/local/mysql-proxy/bin/mysql-proxy  --defaults-file=/usr/local/mysql-proxy/conf/mysql-proxy.conf
##会报错
##解决方法
chmod 0660 /usr/local/mysql-proxy/conf/mysql-proxy.conf 

mysql数据库的同步_第60张图片

关闭代理的mysql服务3306端口空出来
这里写图片描述
ps aux查看进程
mysql数据库的同步_第61张图片

master授权

mysql -pWestos+007
mysql> grant all on *.* to root@'%' identified by 'Westos+007';

物理机登陆代理host3
插入数据user6,666
mysql数据库的同步_第62张图片
host1和host2都可以看到
mysql数据库的同步_第63张图片
mysql数据库的同步_第64张图片

这说明master(hsot1)和slave(host2)都有读的功能

将host1(master)关闭,物理机连接代理host3发现写不进去数据
mysql数据库的同步_第65张图片
mysql数据库的同步_第66张图片
把host1(master)数据库开启,关闭slave(host2),物理机插入数据user8,888,会发现写入成功,再到host1(master上查看,发现写进去了),这说明master有读和写的功能,而slave只有读的功能

这里写图片描述
这里写图片描述
物理机尝试写入数据,ok写进去了
mysql数据库的同步_第67张图片
mysql数据库的同步_第68张图片
当开启slave时,数据同步,slave(host2也会有记录)
mysql数据库的同步_第69张图片

###说明

物理机连接host3(proxy),host3此时指向master
这里写图片描述
物理机再开一个终端,连接host3(proxy),host3指向matser
这里写图片描述
物理机再开一个终端,连接host3(proxy),host3指向slave (还记得lua脚本的参数吗,连接proxy的最大客户数量为2,超出这个host3转向slave)
mysql数据库的同步_第70张图片

八.

你可能感兴趣的:(Linux)