1 .主从复制
1.1原理
主库打开xldxhlog功能,并允许库连接到主库。 通过change master从库中获取有关主库的同步信息,并连接到主库进行验证。 主库IO线程根据库slave线程的请求,从master.info开始记录的位置开始向下检索信息,同时将检索到的位置和最新的位置与xldxhlog信息一起发送到库IO 这样就完成了整个同步过程,然后无限地重复上述过程。
1.2作用
1 )辅助备份
2 )高可用性、双重主从
3 )分担负荷,分离读写
2 .主从复制部署
2.1主库创建授权用户repl
mysqlgrantreplicationslaveon *.* to repl @ ' 10.0.0.% ' idnetifiedby ' 123456 ';
2.2准备工作(对于新环境,省略此步骤; 如果主库中运行了一段时间,则必须将主库中的数据备份到从库中。)
主库的备份
[ root @ master~] # mysqldump-a-- master-data=2- p/tmp/full1. SQL
从库中恢复
[ root @ backup~] # scp 172.16.1.1023360/tmp/full.SQL/tmp
mysql set sql_log_xldxh=0;
mysql source /tmp/full.sql;
2.3打开主库xldxhlog
[root@master ~]#vim /etc/my.cnf
log _ xld xh=/data/MySQL/MySQL-xld xh
xldxhlog_format=row
[ root @ master~~ ] #/etc/init.d/mysqld restart
2.4建立库到主库的连接
mysqlCHANGE MASTER TO
MASTER_HOST='172.168.1.102 ',
MASTER_USER='repl ',
MASTER_PASSWORD='123456 ',
MASTER_PORT=3306,
master _ log _ file=' MySQL-xld xh.000002 ',
MASTER_LOG_POS=656;
2.5从库中复制
mysql start slave;
2.6检查
mysql show slave statusG;
Slave_IO_Running: Yes
slave _ SQL _ running :是
注意:只有所有的是会成功; 否则就会失败。
3.Gtid主从复制
3.1概述
gID是基于原始mysql服务器生成并成功执行的全局事务ID,是服务器ID和事务ID的组合。 此全局事务ID不仅对于原始服务器是唯一的,对于所有依赖关系的mysql服务器也是唯一的。 这些特性简化了mysql主从机的复制,并使数据库更加一致可靠
3.2概念
1 )全局事务id )全局事务标识符。
2 ) GTID是1对1对应于一个事务且全局唯一的ID。
3 )在一台服务器上只运行一次GTID,避免重复运行导致的数据混乱和主控不一致。
4 )使用GTID代替传统的复制方法,不再使用MASTER_LOG_FILE MASTER_LOG_POS打开复制。 而是使用MASTER_AUTO_POSTION=1开始复制。
5 ) MySQL-5.6.5开始支持是在MySQL-5.6.10或更高版本开始改进。
6 )在以往的slave侧,xldxhlog可以不打开,但在GTID中slave侧的xldxhlog必须打开,以记录执行的GTID为目的。
3.3好处
1 )更容易实现failover,不再需要像以前那样查找log_file和log_pos
2 )更方便地制作主从副本
3 )比传统复制更安全
4 ) GTID连续无空洞,保证数据一致性,零丢失
3.4工作原理
1 )在主库端执行和提交单个事务时,将生成GTID并将其记录在xldxhlog日志中
2 )将xldxhlog转发到slave,存储到slave的relaylog中后,读取此GTID的GTID_next变量,将下一个执行的GTID值传递给slave。
3 ) sql线程从relay log获取GTID,并比较slave端的xldxhlog中是否存在该GTID
4
)如果有记录,说明该GTID的事务已经执行,slave会忽略5)如果没有记录,slave就会执行该GTID事务,并记录该GITD到自身的xldxhlog,在读取执行事务前会先检查其他的session持有 GTID,确保不被重复执行。
6)在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描
4.部署gtid主从复制
4.1清理环境
rm -rf /application/myql/data/*
4.2构建主从环境
----------master节点----------
vim /etc/my.cnf
[mysqld]
basedir=/application/mysql
datadir=/application/mysql/data
server-id=1 #同一个复制拓扑中的所有服务器的id号必须唯一
log-xldxh=mysql-xldxh
socket=/tmp/mysql.sock
xldxhlog-format=ROW #二进制日志格式,强烈建议为ROW
gtid-mode=on #启用gtid类型,否则就是普通的复制架构
enforce-gtid-consistency=true #强制gtid的一致性
log-slave-updates=1 #slave更新是否记入日志
skip-name-resolve
[client]
socket=/tmp/mysql.sock
----------slave1----------
vim /etc/my.cnf
[mysqld]
basedir=/application/mysql
datadir=/application/mysql/data
server-id=2
xldxhlog-format=ROW
gtid-mode=on
enforce-gtid-consistency=true
log-xldxh=mysql-xldxh
log_slave_updates = 1
socket=/tmp/mysql.sock
skip-name-resolve
[client]
socket=/tmp/mysql.sock
----------slave2----------
vim /etc/my.cnf
[mysqld]
basedir=/application/mysql
datadir=/application/mysql/data
server-id=3
xldxhlog-format=ROW
gtid-mode=on
enforce-gtid-consistency=true
log-xldxh=mysql-xldxh
log_slave_updates = 1
socket=/tmp/mysql.sock
skip-name-resolve
[client]
socket=/tmp/mysql.sock
4.3初始化master、slave所有节点,并启动
/application/mysql/scripts/mysql_install_db --basedir=/application/mysql --datadir=/application/mysql/data --user=mysql
/etc/init.d/mysqld start
4.4master节点授权用户repl
mysql> gant replication slave on *.* to repl@'10.0.0.%' identified by '123456';
4.5slave节点创建与master节点的连接
mysql> change master to
>master_host='172.16.1.102',
>master_user='repl',
>master_password='123456',
>master_auto_position=1;
4.6slave节点开启复制
mysql> start slave;
4.7slave节点查看状态
mysql> show slave statusG;