Slave服务器 io线程以redhat身份(密码认证成功)去拷贝master服务器的二进制日志(记载了master做了些什么,比如新建数据库等),到自己的relay-log中,slave的sql线程会去读取拷贝来的二进制日志,查看master做了什么,然后再进行相同的动作,达到数据同步:
多线程并行复制5.6就支持,(slave的sql多线程),5.7基于数据库(有几个数据库则有几个线程)
实验环境 :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.rpmmysql-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
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
启动数据库
/etc/init.d/mysqld start
grep "temporary password" /var/log/mysqld.log ##过滤临时密码,初始化过程中修改密码用(kfwjXi4h5p!F)
mysql_secure_installation
输入当前密码,就是过滤出来的那个,键入后回车
设置新密码,这里设置为Westos+007,再次确认,并选择应用不再修改
依次是移除匿名用户,不允许root用户远程登陆,移除test数据库,刷新数据库,全选yes
测试下:登陆成功,就没问题
vim /etc/my.cnf
29 server-id=1 ##服务器标识,正整数,2的32次方减1
30 log-bin=mysql-bin ##二进制日志
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状态
vim /etc/my.cnf
29 server-id=2
/etc/init.d/mysqld restart
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; ##查看状态
IO线程和sql线程开启
slave io线程 以redhat身份拷贝(多线程)master的log-bin 到自己的relay-log,slave的sql线程(单线程)读取relay-log,照着master的事务再做一阿遍) ###多线程并行复制5.6就支持了。基于库的(几个数据库几个线程),5.7基于主辅制的
master新建个数据库westos,slave会自动同步
slave自动同步
cd /var/lib/mysql
mysqlbinlog mysql-bin.000001 ##查看二进制日志
Gtid全称global transaction identifiers全局事务标志
一个事务对应唯一的一个id(mysql的语句),一个gtid在一个服务器(master)上只会也只能执行一次,在从库上(slave)也只会出现一次
Gtid由uuid+tid组成,uuid是mysql实例的唯一标识,tid代表了该实例(理解为语句,执行的动作)上已经提交的事务数量,并且会随着事务提交单调递增:
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> 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
master再westos库中新建表linux;
slave同步
再master的westos库的user_tb中添加use1,123,
slave同步
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,
并行复制就是多个事务同时进行复制,但并行复制存在salve端sql线程运行时,master不断写入,会出现问题,所有有锁表机制
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> show processlist; ##查看线程16个
mysql> use mysql;
mysql> show tables;
在异步复制的情况下,mysql master server 会将自己的二进制日志通过copy线程传输给slave以后,master会自动返回数据给客户端,而不管slave上是否接收到了这个日志。
半同步,当master把日志传给slave时,确保slave收到了日志,才会返回数据给客户端。
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加载模块
查看加载模块信息
开启加载的master模块
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线程
查看slave状态
mysql> show slave status\G;
set global rpl_semi_sync_slave_enabled=1;
在上边实验的基础上在增加slave2(host3)
mysql> grant REPLICATION SLAVE on *.* to redhat@'172.25.254.%' identified by 'Westso+007';
mysql> flush privileges;
mysqldump -p westos >/mnt/westos.sql
vim /etc/my.cnf
40 log-slave-updates=ON
41 log-bin=mysql-bin
/etc/init.d/mysqld restart
scp /mnt/westos.sql host3:/mnt
安装数据库完成初始化
vim /etc/my.cnf
29 server-id=3
30 gtid_mode=ON
31 enforce-gtid-consistency=true
/etc/init.d/mysqld restart
mysqladmin -p create westos;
mysql -p westos </mnt/westos.sql
mysql -pWestos+007
进入数据库后,指定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线程开启,则成功
host1(master)进行一条事务,host2和host3同步
分区分表
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/)
等
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
##简化名字
/usr/local/bin/mysql-proxy
cd /usr/local/mysql-proxy
mkdir conf
cd conf
vim mysql-proxy.conf (/usr/local/mysql-proxy/bin/mysql-proxy --help-proxy 获得帮助说明信息)
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 ##后台运行
修改下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
/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
master授权
mysql -pWestos+007
mysql> grant all on *.* to root@'%' identified by 'Westos+007';
物理机登陆代理host3
插入数据user6,666
host1和host2都可以看到
将host1(master)关闭,物理机连接代理host3发现写不进去数据
把host1(master)数据库开启,关闭slave(host2),物理机插入数据user8,888,会发现写入成功,再到host1(master上查看,发现写进去了),这说明master有读和写的功能,而slave只有读的功能
物理机尝试写入数据,ok写进去了
当开启slave时,数据同步,slave(host2也会有记录)
物理机连接host3(proxy),host3此时指向master
物理机再开一个终端,连接host3(proxy),host3指向matser
物理机再开一个终端,连接host3(proxy),host3指向slave (还记得lua脚本的参数吗,连接proxy的最大客户数量为2,超出这个host3转向slave)