MySQL高可用方案

投票选举机制,较复杂

MySQL本身没有提供replication failover的解决方案,自动切换需要依赖MHA脚本

可以有多台从库,从库可以做报表和备份

MySQL复制技术

===========================================================================

重置数据库:

# service mysqld stop
# rm -rf /usr/local/mysql/data/*
# /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

复制拓扑:

复制原理:

1. 在主库上把数据更改记录到二进制日志(Binary Log)中。

2. 备库将主库上的日志复制到自己的中继日志(Relay Log)中。

3. 备库读取中继日志中的事件,将其重放到备库数据库之上。

一、主/备均为刚初始的数据库

单主到多备: Master-MultiSlave

Master                        Slave1                        Slave2

================================

IP 192.168.1.27          192.168.1.66             192.168.1.251

Server_ID  27               66                             251

如何实现主从复制?

在主服务器(master)上

启用二进制日志

选择一个唯一的server-id

创建具有复制权限的用户

在从服务器(slave)上

启用中继日志(二进制日志可开启,也可不开启)

选择一个唯一的server-id

连接至主服务器,并开始复制

1. 主库

[root@master ~]# vim /etc/my.cnf
[mysqld]
log-bin=master-bin
binlog_format = row
sync_binlog = 1
skip_name_resolv = 1
log_slave_updates = 1
server_id = 27
[root@master ~]# service mysqld start
[root@master ~]# mysql
mysql> reset master;
mysql> grant replication slave, replication client on *.*
-> to rep@'192.168.1.%' identified by 'localhost';
mysql> flush privileges;

2. 备库

a. 测试复制账号

[root@slave1 ~]# mysql -h 192.168.1.27 -urep -plocalhost

b. 配置复制

[root@slave1 ~]# vim /etc/my.cnf
log-bin=slave1-bin
binlog_format = row
sync_binlog = 1
skip_name_resolv = 1
log_slave_updates = 1
server_id = 66
[root@slave1 ~]# service mysqld start
[root@slave1 ~]# mysql
mysql> reset master;
mysql> change master to
-> master_host='192.168.1.27',
-> master_user='rep',
-> master_password='localhost',
-> master_log_file='master-bin.000001',
-> master_log_pos=0;
Query OK, 0 rows affected (0.02 sec) mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: 192.168.1.27
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 4
Relay_Log_File: mysql-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: No
Slave_SQL_Running: No mysql> start slave;
Query OK, 0 rows affected (0.00 sec) mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.27
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 354
Relay_Log_File: mysql-relay-bin.000002
Relay_Log_Pos: 500
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

3. 测试

Master:
mysql> show processlist\G
*************************** 2. row ***************************
Id: 2
User: rep
Host: 192.168.10.37:50915
db: NULL
Command: Binlog Dump
Time: 324
State: Master has sent all binlog to slave; waiting for binlog to be updated
Info: NULL
2 rows in set (0.00 sec) mysql> create database bbs;
Query OK, 1 row affected (0.00 sec) mysql> create table bbs.t1(id int);
Query OK, 0 rows affected (0.03 sec) mysql> insert into bbs.t1 values(1);
Query OK, 1 row affected (0.02 sec)
mysql> select * from bbs.t1;
+------+
| id |
+------+
| 1 |
+------+
1 row in set (0.00 sec) Slave:
mysql> show processlist\G
*************************** 2. row ***************************
Id: 2
User: system user
Host:
db: NULL
Command: Connect
Time: 356
State: Waiting for master to send event
Info: NULL
*************************** 3. row ***************************
Id: 3
User: system user
Host:
db: NULL
Command: Connect
Time: -173772
State: Slave has read all relay log; waiting for the slave I/O thread to update it
Info: NULL
3 rows in set (0.00 sec) mysql> select * from bbs.t1;
+------+
| id |
+------+
| 1 |
+------+
1 row in set (0.03 sec)

二、针对已经运行一段时间的主库实现主/备

单主到多备: Master-MultiSlave

Master                       Slave1                             Slave2

================================

IP 192.168.1.27          192.168.1.66                 192.168.1.251

Server_ID   27            66                                   251

1. 主库

[root@master ~]# vim /etc/my.cnf
log-bin=master-bin
binlog_format = row
sync_binlog = 1
skip_name_resolv = 1
log_slave_updates = 1
server_id = 27
[root@master ~]# service mysqld restart
[root@master ~]# mysql
mysql> grant replication slave, replication client on *.*
-> to rep@'192.168.1.%' identified by 'localhost';
mysql> flush privileges;

========================================================

初始化备库(使其和主库数据一致): 逻辑备份,物理备份

主库:

mysql> flush tables with read lock; //主服务器锁定表
[root@master ~]# mysqldump --all-databases > all.sql
[root@master ~]# mysql -e 'show master status'
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| master-bin.000001 | 699 | | |
+------------------+----------+--------------+------------------+
mysql> unlock tables; //解锁表
[root@master ~]# rsync -va all.sql 192.168.1.66:/

========================================================

2. 备库

[root@slave1 ~]# vim /etc/my.cnf
server-id = 66
[root@slave1 ~]# service mysqld start
[root@slave1 ~]# mysql
mysql> reset master;
mysql> source /all.sql mysql> change master to
master_host='192.168.1.27',
master_user='rep',
master_password='localhost',
master_log_file='master-bin.000001',
master_log_pos=699;
Query OK, 0 rows affected (0.02 sec) mysql> start slave;
Query OK, 0 rows affected (0.00 sec) mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.27
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin.000001
Read_Master_Log_Pos: 354
Relay_Log_File: mysql-relay-bin.000002
Relay_Log_Pos: 500
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

MySQL主从复制的状况监测

主从状况监测主要参数

Slave_IO_Running: IO线程是否打开 YES/No/NULL

Slave_SQL_Running: SQL线程是否打开 YES/No/NULL

Seconds_Behind_Master: NULL #和主库比同步的延迟的秒数

可能导致主从延时的因素

主从时钟是否一致

网络通信是否存在延迟

是否和日志类型,数据过大有关

从库性能,有没开启binlog

从库查询是否优化

常见状态错误排除

发现IO进程错误,检查日志,排除故障:

# tail localhost.localdomain.err

...2015-11-18 10:55:50 3566 [ERROR] Slave I/O: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work. Error_code: 1593

找到原因:从5.6开始复制引入了uuid的概念,各个复制结构中的server_uuid得保证不一样

解决方法:(从库是克隆机器)修改从库的uuid

# vim auto.cnf server-uuid=

show slave status;报错:Error xxx doesn’t exist

解决方法:

stop slave;

set global sql_slave_skip_counter = 1;

start slave;

三、常见复制拓朴

1. 一主库多备库

2. 主库,分发主库以及备库

3. 主——主复制(双主)

四、MySQL 主主同步

重置数据库:

# service mysqld stop
# rm -rf /usr/local/mysql/data/*
# /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

1. mysql1 192.168.1.4:

[root@mysql1 ~]# vim /etc/my.cnf
log-bin=mysql-bin
server-id = 4
[root@mysql1 ~]# service mysqld start
[root@mysql1 ~]# mysql
mysql> reset master;
mysql> grant replication slave, replication client on *.*
-> to rep@'192.168.1.%' identified by 'localhost';
mysql> flush privileges;
mysql> change master to
-> master_host='192.168.1.251',
-> master_user='rep',
-> master_password='localhost',
-> master_log_file='mysql-bin.000001',
-> master_log_pos=0;
Query OK, 0 rows affected (0.02 sec)
mysql> show slave status\G

2. mysql2 192.168.1.251:

[root@mysql2 ~]# vim /etc/my.cnf
log-bin=mysql-bin
server-id = 251
[root@mysql2 ~]# service mysqld start
[root@mysql2 ~]# mysql
mysql> reset master;
mysql> grant replication slave, replication client on *.*
-> to rep@'192.168.1.%' identified by 'localhost';
mysql> flush privileges;
mysql> change master to
-> master_host='192.168.1.4',
-> master_user='rep',
-> master_password='localhost',
-> master_log_file='mysql-bin.000001',
-> master_log_pos=0;
Query OK, 0 rows affected (0.02 sec)
mysql> show slave status\G

3. mysql1,mysql2

mysql> slave start;
mysql> show slave status\G

4. 测试

5. 建立用于客户连接用户

mysql> grant ALL on *.* to admin@'192.168.1.%' identified by 'localhost';
mysql> flush privileges;

===========================================================================

生产环境其他常用设置

1、配置忽略权限库同步参数

binlog-ignore-db='information_schema mysql test'

2、从库备份开启binlog

log-slave-updates

log_bin = mysql-bin

expire_logs_days = 7

应用场景:级联复制或从库做数据备份。

3、从库只读read-only来实现

innodb_read_only = ON或1,或者innodb_read_only

结论:当用户权限中没有SUPER权限(ALL权限是包括SUPER的)时,从库的read-only生效!

MySQL复制技术的更多相关文章

  1. 业务零影响!如何在Online环境中巧用MySQL传统复制技术【转】

    业务零影响!如何在Online环境中巧用MySQL传统复制技术 这篇文章我并不会介绍如何部署一个MySQL复制环境或keepalived+双主环境,因为此类安装搭建的文章已经很多,大家也很熟悉.在这篇 ...

  2. 高性能Mysql主从架构的复制原理及配置详解

    温习<高性能MySQL>的复制篇. 1 复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台 ...

  3. mysql 主主互备

    双机热备的概念简单说一下,就是要保持两个数据库的状态自动同步.对任何一个数据库的操作都自动应用到另外一个数据库,始终保持两个数据库数据一致. 这样做的好处多. 1. 可以做灾备,其中一个坏了可以切换到 ...

  4. 理解 OpenStack 高可用(HA) (6): MySQL HA

    本系列会分析OpenStack 的高可用性(HA)概念和解决方案: (1)OpenStack 高可用方案概述 (2)Neutron L3 Agent HA - VRRP (虚拟路由冗余协议) (3)N ...

  5. 分享MYSQL中的各种高可用技术(源自姜承尧大牛)

    分享MYSQL中的各种高可用技术(源自姜承尧大牛) 图片和资料来源于MYSQL大牛姜承尧老师(MYSQL技术内幕作者) 姜承尧: 网易杭州研究院 技术经理 主导INNOSQL的开发 mysql高可用各 ...

  6. mysql传统主从、双主复制+keepalived配置步骤

    mysql主从.主主复制(双主复制)配置步骤 一:MySQL复制: MySQL复制简介: 将master服务器中主数据库的ddl和dml操作通过二进制日志传到slaves服务器上,然后在master服 ...

  7. Mysql主从数据库架构的复制原理及配置详解

    1 复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重 ...

  8. mysql (master/slave)复制原理及配置

    1 复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重 ...

  9. 转:高性能Mysql主从架构的复制原理及配置详解

    温习<高性能MySQL>的复制篇. 1 复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台 ...

随机推荐

  1. 清北学堂(2019 5 2) part 5

    今天讲图论,顺便搞一搞之前没弄完的前向星dij 1.图的基本概念(课件原话): G (图)= (V(点); E(边)) 一般来说,图的存储难度主要在记录边的信息 无向图的存储中,只需要将一条无向边拆成 ...

  2. Oracle--缓冲区忙等待事件

    一,缓冲区等待事件 缓冲区忙等待是I/O-bound Oracle系统中比较常见的现象,特别是在Oracle STATSPACK报告的前五个忙等待的读(顺序/分散)系统中,如前5个定时事件: % 总和 ...

  3. vue.js三种安装方式

    Vue.js(读音 /vjuː/, 类似于 view)是一个构建数据驱动的 web 界面的渐进式框架.Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件.它不仅易于上手 ...

  4. cloudstack4.11 centos7 安装文档

    centos 7.x  cloudstack 4.11 提示:生产环境 建议用ceph 块存储为主存储, 这里测试使用的是nfs主存储     组件 172.16.19.116  cloudstack ...

  5. .NET Core:Api版本控制

    (1)先安装Microsoft.AspNetCore.Mvc.Versioning (2)在Startup的ConfigureServices方法中加入:services.AddApiVersioni ...

  6. jenkins pipeline 复杂的发布流程

    1.参数化构建界面 2.交付流水线界面 3.脚本详解 #!groovy pipeline { //在任何可用的代理上执行Pipeline agent any //参数化变量,目前只支持[boolean ...

  7. vue需求表单有单位(时分秒千克等等)

    需求如下: 问题分析: 因为用elementui组件 el-input 相当于块级元素,后面的单位<span>分</span>会被挤下去,无法在同一水平. 解决方法: 不用它的 ...

  8. 自定义httpservletrequest解析参数

    3.添加参数解析器 4.注册

  9. SQL Server使用sp_executesql在存储过程中执行多个批处理

    SQL Server中有些SQL语句只能在一个批处理里面完成,例如CREATE SCHEMA语句创建SCHEMA的时候,每个SCHEMA都需要在一个单独的批处理里面完成: CREATE SCHEMA ...

  10. 使用RunTime.getRunTime().addShutdownHook优雅关闭线程池

    有时候我们用到的程序不一定总是在JVM里面驻守,可能调用完就不用了,释放资源. RunTime.getRunTime().addShutdownHook的作用就是在JVM销毁前执行的一个线程.当然这个 ...