-
mysql 从 5.6.5 后新增了一种基于 GTID 的复制方式
-
普通主从复制:
普通主从复制主要是基于二进制日志文件位置的复制,因此主必须启动二进制日志记录并建立唯一的服务器ID,复制组中的每个服务器都必须配置唯一的服务器ID。如果您省略server-id(或者明确地将其设置为其默认值0),则主设备将拒绝来自从设备的任何连接。 -
GTID 主从:
MySQL 5.6 的新特性之一,全局事务标识符(GTID)是创建的唯一标识符,并与在源(主)服务器上提交的每个事务相关联。此标识符不但是唯一的,而且在给定复制设置中的所有服务器上都是唯一的。所有交易和所有GTID之间都有一对一的映射关系 。它由服务器ID以及事务ID组合而成。这个全局事务ID不仅仅在原始服务器上唯一,在所有存在主从关系 的mysql服务器上也是唯一的。正是因为这样一个特性使得mysql的主从复制变得更加简单,以及数据库一致性更可靠。一个GTID在一个服务器上只执行一次,避免重复执行导致数据混乱或者主从不一致
环境
- 2台 CentOS Linux release 7.5.1804 (Core)
master 端 192.168.153.177
slave 端 192.168.153.177
关闭防火墙和selinux
部署:
安装 mysql5.6.5 及以上版本
yum -y install wget
wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
yum -y install mysql57-community-release-el7-10.noarch.rpm
yum -y install mysql-community-server
启动 mysql
service mysqld start
查看 mysql 初始密码
[root@localhost ~]# grep password /var/log/mysqld.log
登录 mysql
mysql -uroot -p
回车后输入刚刚获取的密码
修改初始密码(密码有难度要求)
mysql> set password = password("NTMSsb_123");
Query OK, 0 rows affected, 1 warning (0.00 sec)
配置 GTID
配置文件修改
vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
port=3306
server_id=1 #服务器id
gtid_mode=on #开启gtid模式
enforce_gtid_consistency=on #强制gtid一致性,开启后对特定的create table 不支持
log-bin=mysql-bin #开启二进制日志
binlog_format=row #默认为mixed混合模式,更改成row复制,为了数据一致性
log-slave-updates=1 #从库binlog才会记录主库同步的操作日志
skip_slave_start=1 #跳过slave复制线程
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
重启 mysqld
service mysqld restart
检查 GTID 状态
主从配置
主master操作:
mysql> grant all on *.* to slave@'192.168.153.177' identified by 'NTMSsb_123';
Query OK, 0 rows affected, 1 warning (0.00 sec)
从slave操作:
mysql> change master to master_host='192.168.153.178',master_user='slave',master_password='NTMSsb_123',master_AUTO_POSITION=1;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
验证主从
主库插入
mysql> create database test;
Query OK, 1 row affected (0.00 sec)
mysql> use test;
Database changed
mysql> create table tb(id int);
Query OK, 0 rows affected (0.01 sec)
mysql> insert tb values(0);
Query OK, 1 row affected (0.05 sec)
从库验收
mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from tb;
+------+
| id |
+------+
| 0 |
+------+
1 row in set (0.00 sec)
模拟故障
断开主从 切换身份
mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)
mysql> reset slave;
Query OK, 0 rows affected (0.01 sec)
故障中在从库插入数据
mysql> create database test2;
Query OK, 1 row affected (0.00 sec)
mysql> use test2;
Database changed
mysql> create table tb2(id int);
Query OK, 0 rows affected (0.01 sec)
mysql> insert tb2 values(0);
Query OK, 1 row affected (0.00 sec)
建立主从 从升级为主 主降级为从
从升级为主
mysql> grant all on *.* to slave@'192.168.153.178' identified by 'NTMSsb_123';
Query OK, 0 rows affected, 1 warning (0.00 sec)
主降级为从
mysql> change master to master_host='192.168.153.177',master_user='slave',master_password='NTMSsb_123',master_AUTO_POSITION=1;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
成功切换,查看数据是否成功同步
新从验证
成功同步!
mysql> use test2;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from tb2;
+------+
| id |
+------+
| 0 |
+------+
1 row in set (0.00 sec)