一、mysql的安装
rpm包下载地址:https://dev.mysql.com/downloads/mysql/
安装:选择需要的rpm进行安装
主配置文件:/etc/my.cnf
服务名称:mysqld
端口号:3306
需要用到两台虚拟机master,slave
# yum install -y *.rpm 安装所有rpm包
二、mysql的主从复制
其中作为源的MySQL实例(数据库更改的来源)将更新和更改写入为“事件”到二进制日志。二进制日志中的信息根据所记录的数据库更改以不同的日志格式存储。副本被配置为从源读取二进制日志,并在副本的本地数据库上执行二进制日志中的事件。
官方文档:https://dev.mysql.com/doc/refman/5.7/en/replication-howto.html
# vim /etc/my.cnf 修改配置
master端:
[mysqld]
log-bin=mysql-bin
server-id=1
slave:
server-id=2
# systemctl start mysqld 开启服务
然后进行安全的初始化:
# cat /var/log/mysqld.log | grep password 查看默认mysql密码
master slave都需要执行
# mysql_secure_installation(密码设置需要字母加数字加特殊符号)
安全初始化执行完成后:
master端:
# mysql -uroot -p(密码)
mysql> CREATE USER 'repl'@'%.example.com' IDENTIFIED BY 'password';创建用户
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.example.com';授权所有表
mysql> show master status; 确定当前二进制日志文件的名称和位置:
在企业中需要进行读锁,将数据锁定,此时的数据是不可访问或查看的。(这一步没有去测试)
mysql> FLUSH TABLES WITH READ LOCK;
下一步进行slave端的一个配置
slave端
# vim /etc/my.cnf
mysql> CHANGE MASTER TO
-> MASTER_HOST='172.25.254.11',
-> MASTER_USER='repl',
-> MASTER_PASSWORD='Bp4890731+',
-> MASTER_LOG_FILE='mysql-bin.000002',
-> MASTER_LOG_POS=1407;
mysql> show slave status\G
测试:
在mater端创建库和表在slave端观察
master:
mysql> create database westos;
mysql> use database westos;
mysql> create table user(
-> username varchar(10) not null,
-> password varchar(15) not null);
insert into user values('user1','yueyue') ;
创建好表之后再slave端查看
slave端:可以看到master端创建的表
mysql> SHOW DATABASES;
mysql> use westos
mysql> select * from user;
一、GTID复制:
1、全局事物标识:global transaction identifieds。
2、GTID事物是全局唯一性的,且一个事务对应一个GTID。
3、一个GTID在一个服务器上只执行一次,避免重复执行导致数据混乱或者主从不一致。
4、GTID用来代替classic的复制方法,不在使用binlog+pos开启复制。而是使用master_auto_postion=1的方式自动匹配GTID断点进行复制。
6、在传统的slave端,binlog是不用开启的,但是在GTID中,slave端的binlog是必须开启的,目的是记录执行过的GTID(强制)。
二、GTID的组成部分:
前面是server_uuid:后面是一个序列号
例如:server_uuid:sequence number
7800a22c-95ae-11e4-983d-080027de205a:10
UUID:每个mysql实例的唯一ID,由于会传递到slave,所以也可以理解为源ID。
Sequence number:在每台MySQL服务器上都是从1开始自增长的序列,一个数值对应一个事务。
3、GTID的工作原理:
1、master更新数据时,会在事务前产生GTID,一同记录到binlog日志中。
2、slave端的i/o 线程将变更的binlog,写入到本地的relay log中。
3、sql线程从relay log中获取GTID,然后对比slave端的binlog是否有记录。
4、如果有记录,说明该GTID的事务已经执行,slave会忽略。
5、如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog。
6、在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。
配置:首先需要在配置文件中开启gtid、
# vim /etc/my.cnf
mater:
[mysqld]
log-bin=mysql-bin
server-id=1
gtid_mode=ON
enforce-gtid-consistency=ON
slave:
server-id=2
gtid_mode=ON
enforce-gtid-consistency=ON
mysql> stop slave;
mysql> CHANGE MASTER TO
-> MASTER_HOST = server11, 跟新master配置
-> MASTER_USER = repl,
-> MASTER_PASSWORD = Bp4890731+,
-> MASTER_AUTO_POSITION = 1;
mysql> start slave;
测试:在mater中插入表信息在slave中查看
mster:
mysql> insert into text values('user4','pp','boy');
slave:
mysql> select * from text;
三、半同步复制
- 从库节点只有在接收到某一个事务的所有Binlog,将其写入并Flush到Relay Log文件之后,才会通知对应主库上面的等待线程。
- 如果在等待过程中,等待时间已经超过了配置的超时时间,没有任何一个从节点通知当前事务,那么此时主库会自动转换为异步复制,当至少一个半同步从节点赶上来时,主库便会自动转换为半同步方式的复制。
- 半同步复制必须是在主库和从库两端都开启时才行,如果在主库上没打开,或者在主库上开启了而在从库上没有开启,主库都会使用异步方式复制。
安装半同步复制插件
master:
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME LIKE '%semi%'; 验证插件
mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;开启插件
mysql> SET GLOBAL rpl_semi_sync_master_timeout = 10000; 延迟10s
mysql> show status like '%rpl%'; 查看master节点变量
slava:
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
FROM INFORMATION_SCHEMA.PLUGINS 验证插件
mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;开启插件
mysql> STOP SLAVE IO_THREAD;
mysql> START SLAVE IO_THREAD; 重启i/o线程
mysql> show status like '%rpl%'; 查看master节点变量
测试
在master端中跟新表内容(为方便观察关掉slave节点的i/o线程mysql> STOP SLAVE IO_THREAD;)