mysql复制

一、Mysql复制简介

     随着业务规模的增加当单个mysql服务器承载的访问压力过大时的可以通过mysql内置的复制功能向外扩展。

1、复制的原理

     对mysql的复制是通过二进制日志实现的,当主节点mysql服务器发生任何有可能引起数据变化的操作,产生二进制日志信息时,从节点从主节点复制二进制日志文件中的增加的条目并执行。

复制是单向的,从服务器应该只读。

2、复制功用

数据分布,

负载均衡:读操作,适用于读密集型的应用

备份

高可用和故障切换

MySQL升级测试

二、复制的类型

1、主从模型

从服务器启动两类线程:

       I/O线程:从master请求二进制日志信息,并保存至中继日志;

       SQL线程:从relay log(中继日志)中读取日志信息,在本地完成重放;

异步模式(async):

从服务器落后于主服务器;

主从数据不一致;

2、双主模型

读:负载均衡

写:无法均衡         #写完后要同步,所以无法负载均衡




Perlcona-Galera Cluster

配置过程:

1、master

(1) 启用二进制日志;

(2) 设置一个在当前集群中惟一的server-id;

(3) 创建一个有复制权限(REPLICATION SLAVE, REPLICATION CLIENT)账号;

2、slave

(1) 启用中继日志;

(2) 设置一个在当前集群中惟一的server-id;

(3) 使用有复制权限用户账号连接至主服务器,并启动复制线程;

传统上:一主多从,但一从一主;

而今:一从多主;

服务器程序版本:最好相同;从高;

总结:

master: binlog dump 

slave: IO thread, SQL thread 

slave: 如果连接至主服务器:

CHANGE MASTER TO option [, option] ...


option:

MASTER_BIND = 'interface_name'

| MASTER_HOST = 'host_name'     主服务器地址

| MASTER_USER = 'user_name'     有复制权限的用户名

| MASTER_PASSWORD = 'password'   用户密码

| MASTER_PORT = port_num         主服务器的端口

| MASTER_CONNECT_RETRY = interval    连接重试时间间隔

| MASTER_HEARTBEAT_PERIOD = interval    心跳检测时间间隔

| MASTER_LOG_FILE = 'master_log_name'    主服务器二进制日志文件

| MASTER_LOG_POS = master_log_pos          二进制日志文件中的位置

| RELAY_LOG_FILE = 'relay_log_name'           

| RELAY_LOG_POS = relay_log_pos

| MASTER_SSL = {0|1}

| MASTER_SSL_CA = 'ca_file_name'

| MASTER_SSL_CAPATH = 'ca_directory_name'

| MASTER_SSL_CERT = 'cert_file_name'

| MASTER_SSL_KEY = 'key_file_name'

| MASTER_SSL_CIPHER = 'cipher_list'

| MASTER_SSL_VERIFY_SERVER_CERT = {0|1}

| IGNORE_SERVER_IDS = (server_id_list)

主主:

互为主从:

1、数据不一致; 

2、自动增长id

定义一个节点使用奇数id

auto_increment_offset=1

auto_increment_increment=2

定义另一个节点使用偶数id

auto_increment_offset=2

auto_increment_increment=2

(1) 各自使用不同的server id

(2) 都启用binlog和relay log 

(3) 定义自动增长的id字段的增长方式

(4) 都授权有复制权限的用户账号

(5) 各自把对方指定为主服务器

GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repluser'@'172.16.%.%' IDENTIFIED BY 'replpass';

复制如何开始?

主节点运行很长时间,且已经有一定规模的数据,如何启动复制?

在主节点做一个完全备份,并记录二进制日志文件及位置;

在从节点恢复此完全备份,并在启动复制时从记录的二进制日志文件和位置开始;

复制时应该注意的问题:

1、如何限制从服务器只读?

在从服务器启动read_only;但仅对非具有SUPER权限的用户有效;

阻止所有用户 :MariaDB> FLUSH TABLES WITH READ LOCK;

2、如何保证主从复制时的事务安全?

在master节点启用参数:

sync_binlog = on

如果用到的为InnoDB存储引擎:

innodb_flush_logs_at_trx_commit

innodb_support_xa=on

在slave节点:

skip_slave_start

主节点:

sync_master_info = 1

从节点

sync_relay_log = 1

sync_relay_log_info = 1

3、半同步复制

主节点:

MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

Query OK, 0 rows affected (0.05 sec)

MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE '%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.00 sec)


MariaDB [(none)]> SET GLOBAL rpl_semi_sync_master_enabled=1;

Query OK, 0 rows affected (0.00 sec)


MariaDB [(none)]> SET GLOBAL rpl_semi_sync_master_timeout=2000;

Query OK, 0 rows affected (0.00 sec)

从节点:

MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

Query OK, 0 rows affected (0.05 sec)


MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE '%semi%';

+---------------------------------+-------+

| Variable_name                   | Value |

+---------------------------------+-------+

| rpl_semi_sync_slave_enabled     | OFF   |

| rpl_semi_sync_slave_trace_level | 32    |

+---------------------------------+-------+

2 rows in set (0.00 sec)


MariaDB [(none)]> SET GLOBAL rpl_semi_sync_slave_enabled=1;

Query OK, 0 rows affected (0.00 sec)

如果从服务器已经启动,还需要重启IO_THREAD; 

4、复制过滤器

让slave仅复制有限的几个数据库,而非所有;

有两种实现思路:

(1) 主服务器仅向二进制日志中记录有特定数据库相关的写操作;

问题:即时点还原将无法全面实现; 

binlog_do_db=                  # 数据库白名单

binlog_ignore_db=           # 数据库黑名单

(2)从服务器的SQL_THREAD仅在中断日志中读取特定数据相关的语句并应用在本地;

问题:会造成网络带宽和磁盘IO的浪费;

Replicate_Do_DB=

Replicate_Ignore_DB=

Replicate_Do_Table=

Replicate_Ignore_Table= 

Replicate_Wild_Do_Table= 

Replicate_Wild_Ignore_Table=

5、基于SSL的复制

前提:支持SSL

(1) 主服务器端配置证书和私钥,并创建一个要求必须使用SSL连接的复制账号(REQUIRE SSL);

(2) SLAV端连接master时,使用MASTER_SSL相关的选项来配置证书等信息;

6、跟复制功能相关的文件:

master.info:用于保存slave连接至master时的相关信息;

relay-log.info:保存了当前slave节点上已经复制的当前二进制日志和本地relay log日志对应关系; 

7、复制的监控和维护

(1) 清理日志:PURGE 

(2) 复制监控

SHOW MASTER STATUS

SHOW BINLOG EVENTS

SHOW BINARY LOGS

SHOW SLAVE STATUS

(3) 如何判断slave是否落后于master

Seconds_Behind_Master: 0

 

(4) 如何确定主从节点数据是否一致?

通过表自身的CHECKSUM检查

使用percona-tools中pt-table-checksum

(5) 数据不一致的修复方法:

重复复制;


回顾:

replication:横向扩展

主从、主主

master/slave

master: 写

slave:只读 

复制形式:

row

statement

mixed

master: binlog dump

slave: IO_THREAD, SQL_THREAD 

半同步复制:

INSTALL PLUGIN

博客作业:

主从、主主、半同步、SSL复制、过滤器

复制(2)


由于写操作只能发往主节点

通常读操作都发往从节点

读写分离器:

mysql-proxy (C++) --> Qihoo (atlas)

amoeba (java) 

dbrelay

sharding framework 2.2.1-2.el6 

cobar

gizzard

mysql-proxy:

epel源:yum -y install mysql-proxy

使用官方二进制格式文件中的rw-splitting.lua脚本进行读写分离

配置文件:/etc/mysql-proxy.cnf

[mysql-proxy]

daemon = true

pid-file = /var/run/mysql-proxy.pid

log-file = /var/log/mysql-proxy.log

log-level = debug

max-open-files = 1024

plugins = admin,proxy

user = mysql-proxy

#

#Proxy Configuration

proxy-address = 0.0.0.0:3306                                          #代理服务监听的地址和端口

proxy-backend-addresses = 172.16.100.7:3306            #支持读写操作的后端mysql                       

proxy-read-only-backend-addresses = 172.16.100.8:3306        # 只读后端

#proxy-lua-script = 

proxy-lua-script = /usr/lib64/mysql-proxy/lua/rw-splitting.lua  #读写分离脚本

#proxy-skip-profiling = true

#

# Admin Configuration

admin-address = 0.0.0.0:4041

admin-lua-script = /usr/lib64/mysql-proxy/lua/admin.lua

admin-username = admin

admin-password = admin

启动服务:/etc/init.d/mysql-proxy

amoeba:

先配置java环境

配置文件:

dbServers.xml

amoeba.xml

http://docs.hexnova.com/amoeba/

mmm, percona-Galera cluster

读写分离:mysql-proxy, amoeba

mmm: MySQL Master-Master Replication Manager

复制的问题和解决方案:

(1) 数据损坏或丢失

从服务器:master.info

(2) 混合使用存储引擎

(3) 不唯一的server id

(4) 复制延迟

切分:sharding

垂直切分:按表进行切分

水平切分:按表中的行进行的切分

MySQL数据库的向外扩展方式:复制、拆分、sharding

拆分方式:

按功能拆分:也即按应用拆分;

数据分片:

选择切分键

把数据存储在哪里?

从哪儿读数据?

数据库切分框架:

cobar

gizzard

Hibernat Shards

HiveDB

qps, tps

重点:备份/恢复(备份策略,备份脚本,备份恢复测试)、复制(主从、读写分离、主主、MMM或MHA)


你可能感兴趣的:(mysql)