mysql主从复制,Gtid复制,半主从复制,并行复制,组复制

(一)mysql 主从复制     (二)Gtid 主从复制: (三)半主从复制

         (四)数据库优化 (五)并行复制(MTS)(六)组复制


(一)mysql 主从复制

原理:

http://blog.itpub.net/31015730/viewspace-2154414主从不同步处理思路

http://blog.itpub.net/31015730/viewspace-2154408/ msyql必备知识

1. DBA都应该知道,MySQL的复制是基于binlog的。 

2. MySQL复制包括两部分,IO线程 和 SQL线程。 

3. IO线程主要是用于拉取接收Master传递过来的binlog,并将其写入到relay log 

4. SQL线程主要负责解析relay log,并应用到slave中 

主服务器(172.25.254.5):
开启二进制日志
配置唯一的 server-id
获得 master 二进制文件名及位置
创建一个用于 master 和 slave 通信的用户帐号
从服务器(172.25.254.6):
配置唯一的 server-id
使用 maseter 分的配的用户帐号读取 maseter 二进制日志
启用 slave 服务

(一)mysql 主从复制

master:
[root@server2 ~]# tar xf mysql-5.7.17-1.el6.x86_64.rpm-bundle.tar
[root@server2~]#     yum   install   -y
mysql-community-client-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.rpm
mysql-community-libs-5.7.17-1.el6.x86_64.rpm
mysql-community-common-5.7.17-1.el6.x86_64.rpm
(同时安装,不然报错有依赖性)
[root@server ~]# /etc/init.d/mysqld start
这里可能很慢,可以重新连一次虚拟机,ps ax 查看进程,若有 mysql 进程,killall -9 mysqld 重新开一下即可
[root@server ~]# grep "temporary password " /var/log/mysqld.log
2018-10-18T12:17:11.039151Z 1 [Note] A temporary password is generated for root@localhost:
K&K;)p.gW7rY
[root@server ~]# mysql_secure_installation 这里密码为强密码:大小写字母,数字,字符
密码设为:ZhanG@2424

当不进行初始密码的更改,会出现以下问题的错误

可以用原始密码登陆,再进行修改密码:

[root@server ~]# vim /etc/my.cnf

28 server-id=2  保证id不同
29 log-bin=mysql-bin
[root@server ~]# /etc/init.d/mysqld   restart

进入数据库授权:
[root@server ~]# mysql -pZhanG@2424
mysql> grant replication slave on *.* to student@'172.25.254.%' identified by 'ZhanG@2424';
Query OK, 0 rows affected, 1 warning (0.06 sec)
mysql> show master status;


slave:

前面初始化都一样:
[root@server ~]# vim /etc/my.cnf 末尾加上
server-id=3
[root@server ~]# /etc/init.d/mysqld restart

[root@server ~]# mysql -pZhanG@2424
mysql>change master  to   master_host='172.25.254.5',master_user='student',master_password='ZhanG@2424',master_log_file='
mysql-bin.000001',master_log_pos=451;
mysql> start slave;

Query OK, 0 rows affected (0.18 sec)

mysql> show slave status\G;
*************************** 1. row ***************************
              Slave_IO_State: Waiting for master to send event
              Master_Host: 172.25.254.5
              Master_User: student
              Master_Port: 3306
              Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
              Read_Master_Log_Pos: 154
              Relay_Log_File: server6-relay-bin.000003
              Relay_Log_Pos: 367
              Relay_Master_Log_File: mysql-bin.000002
              Slave_IO_Running: Yes 必须是 yes.一个负责与主机的io通信
              Slave_SQL_Running: Yes 必须是 yes.负责自己的slave mysql进程

 

测试:
master:


mysql> show databases;
+--------------------+
| Database
|
+--------------------+
| information_schema |
| mysql
|
| performance_schema |
| sys
|
+--------------------+
4 rows in set (0.00 sec)
mysql> create database westos;
Query OK, 1 row affected (0.10 sec)
mysql> use westos;
Database changed
mysql> create table info(
-> username varchar(10) not null,
-> password varchar(10) not null);Query OK, 0 rows affected (1.17 sec)
mysql> select * from westos.info;
+----------+----------+
| username | password |
+----------+----------+
| user1 | 123 |
| user2 | 456 |
+----------+----------+
2 rows in set (0.00 sec)

slave:

mysql> show databases;
+--------------------+
| Database
|
+--------------------+
| information_schema |
| mysql
|
| performance_schema |
| sys
|| westos
|
+--------------------+
5 rows in set (0.00 sec)
mysql> select * from westos.info;
+----------+----------+
| username | password |
+----------+----------+
| user1 | 123 |


| user2 | 456 |
+----------+----------+

 

(二)Gtid 主从复制:

GTID(Global Transaction ID)是MySQL5.6引入的功能,可以在集群全局范围标识事务,用于取代过去通过binlog文件偏移量定位复制位置的传统方式。借助GTID,在发 生主备切换的情况下,MySQL的其它Slave可以自动在新主上找到正确的复制位置,这大大简化了复杂复制拓扑下集群的维护,也减少了人为设置复制位置 发生误操作的风险。另外,基于GTID的复制可以忽略已经执行过的事务,减少了数据发生不一致的风险。

master:

[root@server5 ~]# vim /etc/my.cnf 末尾添加如下内容
gtid_mode=ON
enforce-gtid-consistency=true
[root@server5 ~]# /etc/init.d/mysqld  restart

slave:

[root@server6 ~]# vim /etc/my.cnf 末尾添加如下内容
gtid_mode=ON
enforce-gtid-consistency=true

[root@server6 ~]# /etc/init.d/mysqld    restart
[root@server6 ~]# mysql -pZhanG@2424
mysql> stop slave;
Query OK, 0 rows affected (0.18 sec)
mysql>  change master to master_host='172.25.254.5', master_user='student', master_password='ZhanG@2424',  MASTER_AUTO_POSIT ION=1;
mysql> start slave;
Query OK, 0 rows affected (0.07 sec)
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 172.25.254.5
Master_User: student
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 154
Relay_Log_File: server6-relay-bin.000002
Relay_Log_Pos: 367
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes 画重点
Slave_SQL_Running: Yes 画重点
 

测试:

maseter:
mysql> insert into info values('user3','333');
Query OK, 1 row affected (0.08 sec)
mysql> select * from westos.info-> ;
+----------+----------+
| username | password |
+----------+----------+
| user1 | 123 |
| user2 | 456 |
| user3 | 333 |
+----------+----------+
3 rows in set (0.00 sec)
slave:(可以同步过来 Oh yes!)
mysql> select * from westos.info;
+----------+----------+
| username | password |
+----------+----------+
| user1 | 123 |
| user2 | 456 |
| user3 | 333 |
+----------+----------
3 rows in set (0.00 sec)

(三)半主从复制

原理:半同步复制的工作原理就是当slave从库IO_Thread线程将binlog日志接收完毕之后,要给master主库一个确认,如果rpl_semi_sync_master_timeout=10000 (10秒)超过10秒未收到slave从库的接受确认信号,那么就会自动切换为传统的异步复制模式。

注意:半同步复制模式必须在主服务器和从服务器端同时开启,否则主服务器默认使用异步复制模式。

mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';安装半同步复制插件

Query OK, 0 rows affected (0.37 sec)

mysql> show global variables like '%semi%'; //查看参数
 

mysql>SET GLOBAL rpl_semi_sync_master_enabled = 1;打开半同步复制
Query OK, 0 rows affected (0.00 sec)

mysql> show global status like '%semi%';

 

 slave:同masetr端

装半同步复制插件

开启半同步复制

查看状态

mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
Query OK, 0 rows affected (0.12 sec)

mysql>  set global rpl_semi_sync_slave_enabled=1;
Query OK, 0 rows affected (0.00 sec)

mysql> show global variables like '%semi%';

mysql> stop slave io_thread; 重启线程
Query OK, 0 rows affected (0.11 sec)

mysql> start slave io_thread;
Query OK, 0 rows affected (0.00 sec)

测试:

masetr:

mysql> create database miaomiao;
Query OK, 1 row affected (0.11 sec)

slave:

延时测试:

slave:

mysql> stop slave io_thread;
Query OK, 0 rows affected (0.09 sec)

maseter:

mysql> create database beibei;
Query OK, 1 row affected (10.11 sec) 过了10妙开始异步传输

补:解决SQL,IO不同步的问题

解决SQL、IO状态为NO的步骤:
Slave: mysql> stop slave;
mysql> reset master;
mysql> reset slave;
mysql> start slave;
解决数据不同步的步骤:

(1)手动将master、slave的表和库等复制导入,保证数据同步
(2)Master:mysql> reset master; //重置
 Slave: mysql> stop slave;
mysql> reset master;
mysql> reset slave;
mysql> start slave;
mysql> show slave status\G;

查看错误日志/var/log/mysqld.log

同步过来了,ok 通关!

(四)数据库优化

使server6是server8的masetr

server8是server9的masetr

说明:配置上同前面主从之间完全一样达到server6的更新可以同步到8和9

(五)并行复制(MTS)

原理:

1. IO线程主要是用于拉取接收Master传递过来的binlog,并将其写入到relay log 

2. SQL线程主要负责解析relay log,并应用到slave中 

3. 不管怎么说,IO和SQL线程都是单线程的,然后master却是多线程的,所以难免会有延迟,为了解决这个问题,多线程应运而生了。 

4 IO多线程?  IO没必要多线程,因为IO线程并不是瓶颈啊 

5. SQL多线程?

 没错,目前最新的5.6,5.7,8.0 都是在SQL线程上实现了多线程,来提升slave的并发度  

重点

是否能够并行,关键在于多事务之间是否有锁冲突,这是关键。 下面的并行复制原理就是在看如何让避免锁冲突

 

(六)组复制

  介绍:MySQL Group Replication是一个MySQL数据库插件,它使开发人员和DBA能够创建弹性、高可用性、容错复制拓扑。它是一种管理一组服务器并将其呈现为单 个服务器的机制,因为同一组中的所有服务器执行相同的操作并具有相同的数据。拥有相同数据集的多个副本可以最大限度地降低丢失数据的风险。

MySQL Group Replication可以在两种模式下运行:

1.单主模式:只有primary成员可读写,而其他的节点为只读,在primary成员发生故障时,将会有其他成员顶替成primary,并且服务不会中断,因为所有操作都在后台进行。

2.多主模式:所有的成员均可读可写。

多组复制

[root@server8 ~]# uuidgen
03a7662a-4947-42b4-9e92-15917ba4650d

server6:

[root@server6 mysql]# vim /etc/my.cnf

server-id=1
gtid_mode=ON
enforce-gtid-consistency=on
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW

transaction_write_set_extraction=XXHASH64  指示Server必须为每个事务收集写集合并使用XXHASH64哈希算法将其编码为散列
loose-group_replication_group_name="03a7662a-4947-42b4-9e92-15917ba4650d"#自己生成的唯一uuid
loose-group_replication_start_on_boot=off#设置为Server启动时不自动启动组复制
loose-group_replication_local_address= "172.25.254.6:24901"#本机IP
loose-group_replication_group_seeds="172.25.254.6:24901,172.25.254.8:24901,172.25.254.9:24901"所有成员,最多9个
loose-group_replication_bootstrap_group=off     #配置是否自动引导组
loose-group_replication_single_primary_mode=off#设置组自动选择一个 server 来处理读/写工作。
loose-group_replication_enforce_update_everywhere_checks=on#多主模式下为多主更新启用或禁用严格一致性检查
loose-group_replication_ip_whitelist="172.25.254.0/24,127.0.0.1/8"#加入白名单

[root@server6 mysql]# /etc/init.d/mysqld start重启服务时间较长

 

[root@server6 mysql]# grep "temporary password" /var/log/mysqld.log
2019-05-01T09:51:58.455852Z 1 [Note] A temporary password is generated for root@localhost: !VY2WxykoewO

[root@server6 mysql]# mysql -p
Enter password:

mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

超级用户并没有查看的权限

mysql> alter user root@localhost identified by "Ting@2424";
Query OK, 0 rows affected (0.13 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

mysql> SET SQL_LOG_BIN=0;以下不写入日志

mysql>  GRANT REPLICATION SLAVE ON *.* TO student@'%' IDENTIFIED BY 'Ting@2424';更改密码

mysql> FLUSH PRIVILEGES;生效

mysql> SET SQL_LOG_BIN=1;以下写入日志

mysql> CHANGE MASTER TO MASTER_USER='student', MASTER_PASSWORD='Ting@2424' FOR CHANNEL 'group_replication_recovery';   #将 student 和 student_pass 替换为创建用户时使用的值

mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';安装组复制插件

mysql> show plugins;    #检查插件是否安插成功

mysql> SET GLOBAL group_replication_bootstrap_group=ON;只有第一个需要此部

mysql>  START GROUP_REPLICATION;开启

mysql> SET GLOBAL group_replication_bootstrap_group=OFF;只有第一个需要此信

mysql> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | c29b1a59-6bf6-11e9-8fb3-525400157aa3 | server6     |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
1 row in set (0.00 sec)

 

 

sercer8与server9

配置同server6一样,区别配置文件里,更改本机ip地址啦,

进入数据库无需执SET GLOBAL group_replication_bootstrap_group=ON;不执行SET GLOBAL group_replication_bootstrap_group=Off

排错:当该表只出现一个服务器时,可以重启服务重新设置权限

测试:

两个数据库都可以写入,且都可以同步

server8:

server6:

ok!通关

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值