@@@@@@@@@@@@@@@@@@
实验环境:企业6.5
master–>server1:172.25.100.1
slave–>server2:172.25.100.2
@@@@@@@@@@@@@@@@@@
1.安装数据库:
官网下载安装包:mysql-5.7.17-1.el6.x86_64.rpm-bundle.tar;
在master和slave上分别解压安装;
解压后只安装下面5个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
2.启动数据库+初始化
启动数据库;
过滤临时密码,进行密码修改;
设置完新密码后,回车选择应用不再修改;
依次是移除匿名用户,不允许root用户远程登陆,移除test数据库,刷新数据库,全选yes;
master测试成功
slave测试成功
二.主从同步的基本配置:
1.master配置
更改配置文件,并重启动数据库
进入数据库
mysql -pXuehui+666
mysql> show master status\G; ##查看master状态
mysql> grant REPLICATION SLAVE ON *.* to redhat@'172.25.100.%' identified by 'Xuehui+666'; ##授权slave对任何数据库的任何表操作,以redhat身份,从172.25.100.0/24网段登陆,密码‘Xuehui+666‘
mysql> show master status\G; ##再次查看master状态
授权操作以后, Position发生改变
2.从(以下称slave)的配置
更改配置文件,并重启动数据库
进入数据库
mysql -pXuehui+666
mysql>change master to master_host='172.25.100.1',master_user='redhat',master_password='Xuehui+666',master_log_file='mysql-bin.000001',master_log_pos=450; ##和master建立认证联系
mysql> start slave; ##开启slave
mysql> show slave status\G; ##查看状态
slave和master建立认证联系
开启slave,查看状态 (IO线程和 sql线程已经正常开启 )
3.测试:
master新建个数据库xuehui, slave会自动同步
slave自动同步
三.gtid的使用:
Gtid全称global transaction identifiers全局事务标志
一个事务对应唯一的一个id(mysql的语句),一个gtid在一个服务器(master)上只会也只能执行一次,在从库上(slave)也只会出现一次;
Gtid由uuid+tid组成,uuid是mysql实例的唯一标识,tid代表了该实例(理解为语句,执行的动作)上已经提交的事务数量,并且会随着事务提交单调递增;
1.master配置
2.slave配置
3.测试:
master再xuehui库中新建表;
slave同步
在master的xuehui库的user_tb表中添加 use1,123,
slave同步
四.slave并行复制
并行复制可以优化把/var/lib/mysql/relay-log.info优化为 mysql 库中的表,就不用将其不断的写入磁盘了,此时此文件将不存在;
1.编辑slave配置文件
2.进入slave数据库,查看优化项
查看16个线程
……
五.半同步
在异步复制的情况下,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;
mysql> show variables like '%rpl_semi%';
mysql> set global rpl_semi_sync_master_enabled=1; ##global全局
……
查看加载模块信息
开启加载的master模块 ,延迟时间为10s;
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线程
模块添加完以后,IO线程正常
3.测试
关闭slave的IO线程
在master建立数据后,会停滞10s,从半同步转入异步模式;
再建立数据,会很快返回OK;
有两个事务没有slave没有接受到;
slave开启IO线程以后又会进入半同步模式;
六.读写分离
1.下载,解压mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz,找到它的启动脚本mysql-proxy
3.在/usr/local/mysql-proxy新建配置目录conf和日志目录logs,进入新建的目录内,编写配置文件mysql-proxy.conf
配置文件内容:
[mysql-proxy]
user=root ##root身份运行
proxy-address=172.25.100.3:3306 ###mysql中间代理件
proxy-backend-addresses=172.25.100.1:3306 ##master
proxy-read-only-backend-addresses=172.25.100.2:3306 ##slave
proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua ##lua脚本
pid-file=/usr/local/mysql-proxy/logs/mysql-proxy.pid
log-file=/usr/local/mysql-proxy/logs/mysql-proxy.log ##日志文件(手动新建logs)
log-level=info ##日志级别
keepalive=true ##持续连接
daemon=true ##后台运行
4.修改下lua脚本,方便实验效果
5.启动msql-proxy
/usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/mysql-proxy.conf
chmod 660 /usr/local/mysql-proxy/conf/mysql-proxy.conf ##报错后更改权限
/usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/mysql-proxy.conf
……
启动成功
6.master授权后物理机检测
物理机登陆代理server3
插入数据
server1和server2都可以读到数据,这说明master(hsot1)和slave(host2)都有读的功能;
将server1(master)关闭,物理机连接代理server3发现写不进去数据
把master(server1)数据库开启,关闭slave(server2),物理机插入数据user9,999,会发现写入成功,再到master (server1) 上查看,发现写进去了,这说明master有读和写的功能,而slave只有读的功能;
七.再加一台slave(master–>slave1–>slave2)
1.在server3上安装并启动mysql
杀死占用3306端口的mysql-proxy进程,才能成功启动mysql
初始化操作示图略
配置server-id,开启gtid
2.master将备份的数据库传给slave2(server3)
3.slave1上开启二进制日志,并授权
开启二进制日志
授权
mysql> grant REPLICATION SLAVE on *.* to redhat@'172.25.100.%' identified by 'Xuehui+666';
mysql> flush privileges;
4.在slave2上(server3)指定master为slave1(server2)
change master to master_host='172.25.100.2',master_user='redhat',master_password='Xuehui+666',master_auto_position=1;
IO和SQL线程正常开启
5.master(server1)进行一条事务,slave1(server2)和slave2(server3)同步