MySQL主从复制(Master-Slave),半同步复制与读写分离(MySQL-Proxy)

Mysql作为目前世界上使用最广泛的免费数据库,在实际的生产环境中,由单台Mysql作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面。

因此,一般来说都是通过 主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力 这样的方案来进行部署与实施的。

如下图所示:
这里写图片描述

复制架构衍生史

MySQL的复制架构衍生史。 MySQL的复制分为四种:

普通的replication,异步同步。搭建简单,使用非常广泛,从mysql诞生之初,就产生了这种架构,性能非常好,可谓非常成熟。 但是这种架构数据是异步的,所以有丢失数据库的风险。
semi-sync replication,半同步。性能,功能都介于异步和全同步中间。从mysql5.5开始诞生,目的是为了折中上述两种架构的性能以及优缺点。
sync replication,全同步。目前官方5.7基于Group replication的全同步技术处在labs版本,离正式集成已经不远。全同步技术带来了更多的数据一致性保障。相信是未来同步技术一个重要方向,值得期待。
mysql cluster。 基于NDB引擎,搭建也简单,本身也比较稳定,是mysql里面对数据保护最靠谱的架构,也是目前唯一一个数据完全同步的架构,数据零丢失。不过对业务比较挑剔,限制也较多。

一、mysql的主从复制

# 实验环境
iptables和selinux关闭
redhat6.5
主数据库 server1 172.25.254.1
从数据库 server2 172.25.254.2

# 实验所需的的rpm包
mysql-community-client-5.7.17-1.el6.x86_64.rpm
mysql-community-common-5.7.17-1.el6.x86_64.rpm
mysql-community-libs-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
1 主从复制原理:

在主数据库执行后,都会写入本地的日志系统A中。假设,实时的将变化了的日志系统中的数据库事件操作,在主数据库的3306端口,通过网络发给从数据。从数据库收到后,写入本地日志系统B,然后一条条的将数据库事件在数据库中完成。那么,主数据库的变化,从数据库也会变化,这样就是所谓的MYSQL的复制。

2 数据库的配置:
# 安装数据库(主从都安装)
[root@server1 ~]# yum install mysql-community-client-5.7.17-1.el6.x86_64.rpm mysql-community-common-5.7.17-1.el6.x86_64.rpm mysql-community-libs-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 -y

[root@server1 ~]# /etc/init.d/mysqld start  

# 修改密码:
[root@server1 ~]# grep password /var/log/mysqld.log  #查看那数据库的临时密码
2018-03-09T07:58:51.814306Z 1 [Note] A temporary password is generated for root@localhost: uTRjffrJH4+f

[root@server1 ~]# mysql -p #登陆数据库的修改密码
Enter password:
mysql> show databases;
mysql> ALTER USER root@localhost identified by ‘Redhat+007’; #添加本地数据库用户 
3 主从复制:
主数据库
# 配置主数据文件
[root@server1 ~]# vim /etc/my.cnf
server-id=1
log-bin=mysql-bin
[root@server1 ~]# /etc/init.d/mysqld restart 

从数据库
# 配置从数据文件
[root@server2 ~]# vim /etc/my.cnf
server-id=2
[root@server2 ~]# /etc/init.d/mysqld restart

主数据库
# 主数据库上添加一个授权的账户
[root@server1 ~]# mysql -p
mysql> show databases;
mysql> grant replication slave on . to cqn@’172.25.254.%’ identified by ‘Redhat+007’; 
#主数据上添加一个授权的账户,使得到时候从数据库可以使用该账号来完成数据的获取.

# 可以在从数据库端进行测试: 
[root@server2 mysql]# mysql -ucqn -p -h 172.25.254.1
Enter password:
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.01 sec)

# 在从数据库上
[root@server2 ~]# mysql -p 
Enter password: 
mysql> CHANGE MASTER TO MASTER_HOST='172.25.254.1', MASTER_USER='cqn', MASTER_PASSWORD='Redhat+007', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=599;
mysql> START SLAVE;
mysql> SHOW SLAVE STATUS\G;
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.25.254.1
                  Master_User: cqn
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 599
               Relay_Log_File: server2-relay-bin.000002
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
            。。。。。。。。。。。。。。

# 测试:
在主数据库上
[root@server1 ~]# mysql -p
mysql> create database test;
mysql> use test;
Database changed
mysql> create table usertb (
-> username varchar(15) not null ,
-> password varchar(25) not null );
mysql> insert into usertb values (“user1”,”123”);
mysql> insert into usertb values (“user2”,”123”);
mysql> select * from usertb ;
mysql> update usertb set password=’333’ where username=’user2’;
mysql> select * from usertb ;

从数据库
[root@server2 ~]# mysql -p
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
mysql> use test;
mysql> select * from usertb;
+----------+-------------------------------------------+
| username | password                                  |
+----------+-------------------------------------------+
| user1    | 123                                       |
| user2    | 333                                       |
+----------+-------------------------------------------+
GTID

GTID是一个基于原始MySQL服务器生成的一个已经被成功执行的全局事务ID,它由服务器ID以及事务ID组合而成。这个全局事务ID不仅仅在原始服务器器上唯一,在所有存在主从关系 的mysql服务器上也是唯一的。正是因为这样一个特性使得mysql的主从复制变得更加简单,以及数据库一致性更可靠。

主数据库
[root@server1 mysql]# vim /etc/my.cnf
gtid_mode=ON
enforce-gtid-consistency=true
[root@server1 mysql]# /etc/init.d/mysqld restart

从服务器
[root@server2 ~]# vim /etc/my.cnf
gtid_mode=ON
enforce-gtid-consistency=true
[root@server2 ~]# /etc/init.d/mysqld restart
[root@server2 ~]# mysql -pRedhat+007
mysql> stop slave;
mysql> change master to master_host=’172.25.254.1’,master_user=’cqn’, master_password=’Redhat+007’,MASTER_AUTO_POSITION=1;
mysql> start slave;
mysql> show slave status\G;
           ......
           Retrieved_Gtid_Set: 6e31175c-2388-11e8-925b-525400c6dd93:1-6
            Executed_Gtid_Set: 6e31175c-2388-11e8-925b-525400c6dd93:1-6
           ......

# mysql> set global read_only=on ; 
# mysql> use mysql;
# mysql> show tables;
# mysql> select * from gtid_executed;

二、半同步复制指IO线程为尽可能的数据一致性

[root@server1 mysql]# cd /usr/lib64/mysql/plugin/ 
[root@server1 plugin]# ls 查看半同步模块 
[root@server1 mysql]# mysql -pRedhat+007
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so’;  #导入半同步模块
mysql> show plugins;  #查看模块
mysql> show variables like ‘%semi_sync%’;
| Variable_name                             | Value      |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled              | OFF        |
| rpl_semi_sync_master_timeout              | 10000      |
# 会等待十秒。如果不能收到从服务器的回应,则转化为异步
| rpl_semi_sync_master_trace_level           | 32         |
| rpl_semi_sync_master_wait_for_slave_count | 1          |
| rpl_semi_sync_master_wait_no_slave        | ON         |
| rpl_semi_sync_master_wait_point           | AFTER_SYNC |
+-------------------------------------------+------------+
6 rows in set (0.00 sec)
mysql> set global rpl_semi_sync_master_enabled=1;
mysql> show variables like ‘%semi_sync%’;
mysql> show status like ‘%semi_sync%’;

从数据库上:
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME ‘semisync_slave.so’;  #导入模块
mysql> show plugins;
mysql> show variables like ‘%semi_sync%’;
| rpl_semi_sync_slave_enabled     | OFF   |
| rpl_semi_sync_slave_trace_level | 32    |
mysql> set global rpl_semi_sync_slave_enabled=1;
mysql> show variables like ‘%semi_sync%’;
| rpl_semi_sync_slave_enabled     | ON    |
| rpl_semi_sync_slave_trace_level | 32    |

mysql> show status like ‘%semi_sync%’;
| Rpl_semi_sync_slave_status | OFF |
# 停掉开启使其生效
mysql> stop slave io_thread;
mysql> start slave io_thread;

mysql> show status like ‘%semi_sync%’;
| Rpl_semi_sync_slave_status | ON |

测试:
在主数据库上:
mysql> use test;
mysql> insert into usertb values (‘user3’,’1234’);
mysql> show status like ‘%semi_sync%’;
mysql> insert into usertb values (‘user4’,’5432’);
mysql> show status like ‘%semi_sync%’;
mysql> insert into usertb values (‘user5’,’545532’);

可以停掉从数据库上的IO线程再测试
mysql> stop slave io_thread;
mysql> start slave io_thread;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值