设为首页 收藏本站
查看: 810|回复: 0

[经验分享] 基于MySQL实现数据库的半同步主从复制

[复制链接]

尚未签到

发表于 2017-11-23 13:58:35 | 显示全部楼层 |阅读模式
首先我们来了解一下数据库常遇到的问题:
    第一就是性能上的问题
1、向上拓展(硬件方面) scale up 个体本身 容易达到极限
    2、向外拓展 scale out
    第二就是可用性的问题
1、数据库服务中断
2、误操作数据损坏
3、硬件故障
4、数据库升级测试遭遇bug
5、黑客攻击
    基于以上这些问题就有了一个比较好的解决方案,那就是实现数据库的主从复制。MySQL主从复制技术可以提高服务器的性能。除此之外MySQL复制还可以解决以下几个问题:
    1、数据分布 (Data distribution )
    2、负载平衡(load balancing)
    3、备份(Backups)
    4、高可用性和容错性 High availability and failover
    在开始实验前我们先来了解几个概念:异步复制、全同步复制和异步复制。
    异步复制
MySQL默认的是异步复制,就是主库在执行完客户端提交的事务后立即将结果返回给客户端,并不关系从库是否已经接受处理,这样如果主挂掉,主上提交的事务可能并没有完全传到从上,如果此时强行把从提升为主,可能会导致新主上的数据不完整。
全同步复制
指当主库执行完一个事务,等到所有从库都执行完该事务才将结果返回给客户端。因为需要等待所有从库都执行完下能返回,所以全同步复制的性能必然会受到影响,需要有超时时间。
半同步复制
    介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立即返回给客户端,而是等到至少一个从库接收到并写到realy log中才返回给客户端。相对于异步复制,半同步复制提高了数据库的安全性,同时也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用。
如果想更好地实现MySQL的主从复制,必须首先要想清楚它的复制原理,这样在工作中才能熟练的操作和应用。
MySQL复制的工作原理:
1、主服务器(master)将改变记录写入到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events) ,在事件 写入二进制日志完成后,master通知存储引擎提交事务。此后可接收slave的请求
2、从服务器(slave)将主服务器master的binary log events拷贝到自己的中继日志(relay log) 。Slave的I/O线程在master上打开一个普通的连接,并将这些二进制事件写入中继日志。
3、SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数据一致。
MySQL还提供了一种复制过滤器:就是指在数据库复制的过程中,仅复制一个或几个数据库相关的数据,并非所有,它提供了两种复制方法:一种是在主服务器的配置文件中添加配置文件,另一种是在从服务器中添加配置文件。
1、在主服务器中
主服务器仅向二进制日志中记录有关特定数据库相关的写操作。
binlog_do_db= #要复制的数据库
    binlog_ignore_db=#要忽略的数据库
2、在从服务器中
从服务器的SQL THREAD仅重放关注的数据库或表相关的事件,并将其应用于本地;
Replicate_Do_DB= #要复制过来的数据库
Replicate_Ignore_DB=#不要复制过来的数据库

下面我们开始基于上边的理论来完成我们今天的实验。

4531414b9e233caa9da7e07459f99756.png
MySQL主从架构图
一、环境准备:
centos系统服务器2台、一台用户做Mysql主服务器,一台用于做 Mysql从服务器,配置好yum源、防火墙关闭、各节点时钟服务同步、各节点之间可以通过主机名互相通信
二、准备步骤:
1、iptables -F && setenforce 清空防火墙策略,关闭selinux
2、拿两台服务器都使用yum方式安装Mysql服务,要求版本一致
3、分别启动两台服务器mysql服务,确保服务正常
   三、实现步骤:
配置master主服务器:
1、对master进行配置,包括打开二进制日志,指定唯一的servr ID。在配置文件加入如下值:
1
2
3
4
5
   server-id=1 #配置server-id,让主服务器有唯一ID号

   log-bin=mysql-bin #打开Mysql日志,日志格式为二进制

   skip-name-resolve#关闭名称解析,(非必须)




2、创建复制帐号 在Master的数据库中建立一个备份帐户:每个slave使用标准的MySQL用户名和密码连接master 。进行复制操作的用户会授予REPLICATION SLAVE权限。

1
   grant replication slave,replication client on *.* to slave@'172.17.%.%' identified by '111111';




3.查看主服务器状态,在Master的数据库执行show master status,查看主服务器二进制日志状态
1
2
3
4
5
6
7
   MariaDB [(none)]> show master status;
   +------------------+----------+--------------+------------------+
   | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
   +------------------+----------+--------------+------------------+
   | mysql-bin.000001 |      414 |              |                  |
   +------------------+----------+--------------+------------------+
   1 row in set (0.00 sec)



配置slave从服务器:
1、对slave进行配置,打开中继日志,指定唯一的servr ID,设置只读权限。在配置文件加入如下值
1
2
3
4
5
6
7
8
9
    server-id=2 #配置server-id,让从服务器有唯一ID号

    relay_log = mysql-relay-bin #打开Mysql日志,日志格式为二进制

    read_only = 1 #设置只读权限

    log_bin = mysql-bin #开启从服务器二进制日志

    log_slave_updates = 1 #使得更新的数据写进二进制日志中




2、启动从服务器复制线程 让slave连接master,并开始重做master二进制日志中的事件。
1
2
3
4
5
6
7
    MariaDB [(none)]> change master to

    master_host='172.17.253.210',master_user='slave',master_password='111111',master_log_file='mysql-bin.000001',master_log_pos=245;

    Query OK, 0 rows affected (0.01 sec)

    执行start slave;# 启动复制线程。




3、查看从服务器状态 可使用SHOW SLAVE STATUS\G查看从服务器状态,如下所示,也可用show processlist \G查看当前复制状态:
Slave_IO_Running: Yes #IO线程正常运行
Slave_SQL_Running: Yes #SQL线程正常运行
实现半同步复制:
主节点:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    MariaDB [(none)]> install plugin rpl_semi_sync_master soname 'semisync_master.so';
    Query OK, 0 rows affected (0.00 sec)

    MariaDB [(none)]> show global variables like 'rpl_semi%';
    +------------------------------------+-------+
    | 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_no_slave | ON    |
    +------------------------------------+-------+
    4 rows in set (0.01 sec)

    MariaDB [(none)]> set global rpl_semi_sync_master_enabled=on;
    Query OK, 0 rows affected (0.00 sec)



从节点:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
    MariaDB [(none)]> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';     
    Query OK, 0 rows affected (0.01 sec)

    MariaDB [(none)]> show global variables like 'rpl_semi%';
    +---------------------------------+-------+
    | Variable_name                   | Value |
    +---------------------------------+-------+
    | rpl_semi_sync_slave_enabled     | OFF   |
    | rpl_semi_sync_slave_trace_level | 32    |
    +---------------------------------+-------+
    2 rows in set (0.01 sec)

     MariaDB [(none)]> stop slave io_thread;
    Query OK, 0 rows affected (0.00 sec)

    MariaDB [(none)]> set global rpl_semi_sync_slave_enabled =on;
    Query OK, 0 rows affected (0.01 sec)

    MariaDB [(none)]> show global variables like 'rpl_semi%';   
    +---------------------------------+-------+
    | Variable_name                   | Value |
    +---------------------------------+-------+
    | rpl_semi_sync_slave_enabled     | ON    |
    | rpl_semi_sync_slave_trace_level | 32    |
    +---------------------------------+-------+
    2 rows in set (0.00 sec)

    MariaDB [(none)]> start slave io_thread;              
    Query OK, 0 rows affected (0.00 sec)



    四、测试

    在master上创建数据库和数据表,观察slave数据库中的数据,是否和master同步。






运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-409887-1-1.html 上篇帖子: mysql 5.5 .17 多实例的例子 下篇帖子: CentOS 7 源码编译安装MySQL 5.7.20
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表