Mariadb的主从复制实验和半同步的实现

1,主服务器需要开启二进制日志记录,并且授权一个用户给从节点。

主服务器的主配置文件[mysqld]内容如下。

  1. [mysqld]
  2. port3306
  3. socket= /tmp/mysql.sock
  4. skip-external-locking
  5. key_buffer_size = 256M
  6. max_allowed_packet = 1M
  7. table_open_cache = 256
  8. sort_buffer_size = 1M
  9. read_buffer_size = 1M
  10. read_rnd_buffer_size = 4M
  11. myisam_sort_buffer_size = 64M
  12. thread_cache_size = 8
  13. query_cache_size16M
  14. thread_concurrency = 8
  15. log-bin=/mydata/binlog/mysql-bin   定义二进制日志的位置,生产环境中不应当与数据库文件在一个磁盘上。
  16. binlog_format=mixed
  17. server-id1        server-id就使用默认的1
  18. datadir=/mydata/data
  19. sync_binlog = 1    产生二进制日志就写入磁盘

给从节点授权一个复制使用的用户

MariaDB [(none)]> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO slaveuser@’172.16.2.17′ IDENTIFIED BY ‘slavepass’;

MariaDB [(none)]> FLUSH PRIVILEGES;

从节点配置:

mysql的主配置文件[mysqld]段如下

 
  1. [mysqld]
  2. port3306
  3. socket= /tmp/mysql.sock
  4. skip-external-locking
  5. key_buffer_size = 256M
  6. max_allowed_packet = 1M
  7. table_open_cache = 256
  8. sort_buffer_size = 1M
  9. read_buffer_size = 1M
  10. read_rnd_buffer_size = 4M
  11. myisam_sort_buffer_size = 64M
  12. thread_cache_size = 8
  13. query_cache_size16M
  14. thread_concurrency = 8
  15. #log-bin=mysql-bin        因为节点无需二进制日志,所以把这项注释掉了
  16. relay-log=/mydata/relaylog/relay-log       定义中继日志
  17. binlog_format=mixed
  18. server-id2           server-id定义为2
  19. datadir=/mydata/data
  20. read_only = 1            设定数据库为只读,但对于超级用户无效。只能针对普通用户。

在mysql中执行

 
  1. CHANGE MASTER TO MASTER_HOST=‘172.16.2.15’MASTER_USER=‘realuser’MASTER_PASSWORD=‘passwd’MASTER_LOG_FILE=‘master_bin.000001’MASTER_LOG_POS=495;
  2. START SLAVE;

配置完成后,在主库创建数据库和表,然后到从库查看。如果有说明配置成功。

查看从节点状态的命令是:SHOW SLAVE STATUS; 其它含意解释如下。

 
  1. MariaDB [(none)]> show slave status\G
  2. *************************** 1. row ***************************
  3. Slave_IO_State:                      当前从节点IO的状态
  4. Master_Host: 172.16.2.16      主节点的IP
  5. Master_User: slave                  使用那个用户连接的主节点
  6. Master_Port: 3306                  主节点使用的TCP端口
  7. Connect_Retry: 60                    多长时间读取一次
  8. Master_Log_File: mysql-bin.000005    当前主节点的二进制日志文件
  9. Read_Master_Log_Pos: 581                      当前主节点二进制日志文件位置
  10. Relay_Log_File: relay-log.000001        当前从节点中继日志文件
  11. Relay_Log_Pos: 4                                当前从节点中继日志文件中记录的位置
  12. Relay_Master_Log_File: mysql-bin.000005  正在中继主节点的日志文件是那个
  13. Slave_IO_Running: No                            从节点的IO_THREAD线程是否启动,如果为NO表示还没有向主节点请求二进制日志文件。这个线程工作内容是把主节点的二进制日志一条一条的同步到从节点的中继日志中。
  14. Slave_SQL_Running: No                 从节点的SQL线程是否启用,这个线程的任务是把中继日志中的SQL语句一条一条的读的MySQL中执行,以实现数据的写入。
  15. Master_Server_Id: 0               主节点的ID

当数据库已经运行了一段时间后,主节点已经有大量的数据。这时如果添加一台从节点,最好把主节点做一个完整备份,恢复到从节点。然后再配置从节点到主节点复制数据,这样能快速把主从节点数据同步一致。

1,先对主服务器做一个完整备份。然后把备份好的数据发送到从节点上。

 
  1. # mysqldump –lock-all-tables –all-databases –master-data=2 > master.sql
  2. # scp master.sql 172.16.2.17:/root

需要创建从节点连接主节点使用的数据库。

 
  1. mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO  realuser@’172.16.2.13′  IDENTIFIED BY ‘passwd’
  2. mysql> FLUSH PRIVILEGES;

2,定义好从节点的工作特性。然后恢复数据。

在配置文件中[mysqld]加入以下段,并且注释二进制日志,因为从节点要二进制日志没用,白白浪费空间。

 
  1. relay-log  =  /mydata/relaylog/relay-log
  2. server-id = 2             serviceID 一定不能与主节点的ID重复。
  3. read_only = 1           设置数据库为只读模式,但对于超级用户无效。普通用户只能读,不能修改。
  4. sql < /root/master.sql    把主节点备份的数据恢复到库中

3,恢复数据时需要在备份的文件中找到,备份主节点时二进制日志文件使用到那个文件了,二进制日志文件中事件id所在的位置。大概如下:
— CHANGE MASTER TO MASTER_LOG_FILE=’mysql-bin.000009′, MASTER_LOG_POS=7925;

然后到数据库执行连接到主服务器。

CHANGE MASTER TO MASTER_HOST=’172.16.2.15′, MASTER_USER=’realuser’, MASTER_PASSWORD=’passwd’, MASTER_LOG_FILE=’master_bin.000001′, MASTER_LOG_POS=495;

启动IO_THREAD线程和SQL_THREAD线程

START SLAVE;

复制总结:

1,对于master 需要启动二进制日志,有惟一的server-id

2,binlog dump : 将从服务的 io thread 发出的读取二进制日志事件请求的数据发送给对方 。

3,slave 必须启用中继日志,关闭二进制日志(建议),有惟一的server-id。

IO thread:向master请求二进制日志并保存到本地的中继日志。

SQL thread:把本的中继日志中的sql语句一条一条的读取并执行

4,对于从服务器,一般只有一个主服务器。否则会造成中继日志混乱。

5,MariaDB 10 版本支持多源复制。从服务器支持多个主服务器,但是多个数据库。

6,可以多级复制,但从服务器如果做为其它从服务器的主服务器,需要开启二进制日志

7,从服务器可以有多个。

8,因为是异步复制,从服务器的数据可能会落后于主服务器。这个问题一很难避免。

如何启用半同步? 从mysql5.5.8后才有的功能。由google贡献给mysql的补丁,以插件式安装,默认没有安装。位于mysql的安装目录下的 lib/plugin下的 semisync_master.so 和 semisync_slave.so 一个是主节点专用,一个是从节点专用。

什么叫半同步: master至少要等待一个从节点把数据完全复制过去。

使用INSTALL 命令安装。配置文件中[mysql]下的plugin_dir= 用来指定插件文件的保存位置。如果有其它插件保存在其它位置,需要在这里定义,这样INSTALL命令可以找到。

在mysql下的安装方法

MariaDB> INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master.so’;

安装过后引入几个新的服务器变量: 查看方法: SHOW GLOBAL VARIABLES LIKE ‘%semi%’;

  1. | rpl_semi_sync_master_enabled     | OFF |   是否开启此插件
  2. | rpl_semi_sync_master_timeout      | 10000 |    等待从节点最多多长时间,单位是毫秒。如果从节点在等待时间内没有响应,就不再等待,从半同步模式变为异步模式。
  3. | rpl_semi_sync_master_trace_level    | 32 |
  4. | rpl_semi_sync_master_wait_no_slave | ON       如果没有从节点是否还需要等待。

需要在配置文件中的[mysql]段中写入

rpl_semi_sync_master_enabled=1

rpl_semi_sync_master_timeout=1000

设置好后重新启动服务就可以了。

在从节点上的设置方法

 
  1. MariaDB> INSTALL PLUGIN rpl_semi_sync_slave SONAME ‘semisync_slave.so’;
  2. MariaDB> SHOW GLOBAL VARIABLES LIKE ‘rpl_semi%’;       查看安装插件后生成的服务器变量
  3.       | rpl_semi_sync_slave_enabled      | OFF    是否开启了此插件,ON为开启。
  4.       | rpl_semi_sync_slave_trace_level  | 32     此项需要与主节点保持一致。

在主配置文件中的[mysql] 段中写入

rpl_semi_sync_slave_enabled=1

在从节点上重启IO THREAD线程就可以了。

MariaDB> STOP SLAVE IO_THREAD;

MariaDB> START SLAVE IO_THREAD;

查看是否已经启用半同步模式,需要在MASTER上查看。

 
  1. MariaDB> SHOW GLOBAL STATUS LIKE ‘%semi%’;
  2.      Rpl_semi_sync_master_clients    工作于半同步的客户端有几个
  3.      Rpl_semi_sync_master_net_avg_wait_time   主节点为等待IO_THREAD平均等待的时间
  4.      Rpl_semi_sync_master_net_wait_time     主节点为等待IO_THREAD等待的时间
  5.      Rpl_semi_sync_master_net_waits           主节点为等待IO_THREAD等待的次数
  6.      Rpl_semi_sync_master_tx_avg_wait_time  主节点为等待IO_THREAD等待的事务

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/87305

(0)
HGGHGG
上一篇 2017-09-17 21:51
下一篇 2017-09-18 01:40

相关推荐

  • KeepAlived高可用集群详解及拓扑实验搭建配置

    Linux Cluster:KeepAlive 1.集群类型:LB(负载均衡集群),HA(高可用集群),HP(高性能集群)     LB:均衡负载的实现LVS     HA:高可用的实现KeepAlived 2.RS:健康状态检测方式: (1)网络层:icmp ping (2)传…

    Linux干货 2016-11-01
  • ELK+RabbitMQ架构处理nginx及tomcat日志

    前言       查看日志的传统方法是:登录操作系统,使用命令工具如cat、tail、sed、awk、grep等等进行过滤输出后分析,处理少量日志还好,日志量大处理效率就没那么高了。而且很多情况下开发人员需要查看并分析日志进行排错,但他们对Linux命令又不是太熟悉,而且有时候又不能赋予他们服务器权限,更多时…

    Linux干货 2016-08-02
  • N25-第6周

    vim:    模式化的编辑器        基本模式:            编辑模式,命令模式,            输入模式       &n…

    Linux干货 2017-02-13
  • Http请求流程

    1、http请求流程 1.连接 当我们输入这样一个请求时,首先要建立一个socket连接,因为socket是通过ip和端口建立的,所以之前还有一个DNS解析过程,把www.mycompany.com变成ip,如果url里不包含端口号,则会使用该协议的默认端口号。 DNS的过程是这样的:首先我们知道我们本地的机器上在配置网络时都会填写DNS,这样本机就会把这个…

    Linux干货 2017-02-13
  • linux发展简史

    前言 为什么要写这么一篇文章呢?我发现我虽然知道linux的一些知识,却不知道linux方面的历史,所以今天写一篇关于linux方面历史的文章,用来总结这段时间自己所学习到的关于linux的历史与linux的知识。关于说起linux的历史,就不得不介绍计算机的历史,与其他相关操作系统的一些历史,所以本文中的会简单介绍Linux与其他操作系统的关系。主要讲li…

    Linux干货 2017-02-16
  • 【招聘需求】高级运维工程师/上海虹口区/待遇20k左右

    上海虹口区/待遇20k左右 有意向者发简历至@管家邮箱 邮件名是:[求职]Net-姓名-花名-工作年限 岗位职责:1、降低技术壁垒,建设运维工具、运维平台,实现运维自动化,包括 运维自动化、配置管理中心等。2、具备前瞻性,带领运维技术团队完成业务支撑,负责定位、分析、跟踪和相协调处理重大事故,使之对业务影响降至最低。3、技术支持、培训、知识库建设。4、运维接…

    Linux干货 2015-03-12