双主模型、SSL、percona-toolkit、MySQL复制概念深入

【减轻复制压力】复制过滤器,指定需要复制的白名单,或者需要忽略的黑名单

[root@localhost ~]# cd /etc/
[root@localhost etc]# cp my.cnf{,.master}
[root@localhost etc]# ll my.cnf*
-rw-r--r--. 1 root root 4686 10月 13 04:43 my.cnf
-rw-r--r--. 1 root root 4686 10月 14 20:00 my.cnf.master

vim my.cnf:

[mysqld]


master:

binlog_do_db=

binlog_ignore_db=


slave:

replicate_do_db=

replicate_ignore_db=


replicate_do_table= db_name.table_name

replicate_ignore_table=


replicate_wild_do_table=

replicate_wild_ignore_table=






6、双主模型


1)、在两台服务器上各自建立一个具有复制权限的用户;

2)、修改配置文件:

确保双方服务器数据一致,才能这么做!,本演示是在以前的一主一从的拓扑演变而来



#【主服务器A上】

[root@localhost etc]# cp /etc/my.cnf /etc/my.cnf.master
[root@localhost etc]# vim /etc/my.cnf +61
[mysqld]
datadir= /mydata/data
server-id = 1
log-bin=/mydata/binlogs/master-bin
relay_log = /mydata/relaylogs/relay-bin
auto-increment-offset = 1	 #注意起始值顺序不要写反
auto-increment-increment = 2 #注意步长顺序需要写反

skip_slave_start  跳过自动启动slave,因为自动的容易出错

[root@localhost etc]# mkdir -pv /mydata/relaylogs/
mkdir: 已创建目录 "/mydata/relaylogs/"
[root@localhost etc]# chown -R mysql:mysql /mydata/relaylogs/
[root@localhost etc]# service mysqld restart
[root@localhost ~]# mysql -p
Enter password:
mysql> show master status;
保留此时的状态,不要再操作这个mysql服务器
+-------------------+----------+
| File              | Position |
+-------------------+----------+
| master-bin.000007 |      107 |
+-------------------+----------+
1 row in set (0.00 sec)




# 【主服务器B上】

[root@localhost ~]# cp /etc/my.cnf /etc/my.cnf.slave
[mysqld]
server-id = 11
log-bin=/mydata/binlogs/master-log
binlog_format=mixed #启用
# read-only = ON # 注释原来的只读
auto-increment-offset = 2		#注意起始值顺序不要写反
auto-increment-increment = 2	 #注意步长顺序需要写反
skip_slave_start	#跳过自动启动slave,因为自动的容易出错

[root@localhost ~]# mkdir -pv /mydata/binlogs/
mkdir: 已创建目录 "/mydata/binlogs/"
[root@localhost ~]# chown -R mysql:mysql /mydata/binlogs/
[root@localhost etc]# service mysqld restart
[root@localhost ~]# mysql -p
Enter password: 

#为对方创建一个具有所有权限的用户
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repluser'@'192.168.%.%' IDENTIFIED BY 'replpass';
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec) 

#检查SLAVE的状态
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
	   Slave_IO_State: 
		  Master_Host: 192.168.81.132
		  Master_User: repluser
		  Master_Port: 3306
		Connect_Retry: 60
	  Master_Log_File: master-bin.000006
  Read_Master_Log_Pos: 107
	   Relay_Log_File: relay-bin.000007
		Relay_Log_Pos: 254
Relay_Master_Log_File: master-bin.000006
	 Slave_IO_Running: No  没启动
	Slave_SQL_Running: No  没启动


用对方服务器192.168.81.132的repluser账户,指向对方服务器的日志文件	
mysql>  CHANGE MASTER TO  MASTER_HOST='192.168.81.132',  MASTER_USER='repluser', MASTER_PASSWORD='replpass',MASTER_LOG_FILE = 'master-bin.000007',MASTER_LOG_POS = 107;
Query OK, 0 rows affected (0.05 sec)
	
mysql> start slave;
Query OK, 0 rows affected (0.02 sec)

mysql> show slave status\G
*************************** 1. row ***************************
	   Slave_IO_State: Waiting for master to send event
		  Master_Host: 192.168.81.132
		  Master_User: repluser
		  Master_Port: 3306
		Connect_Retry: 60
	  Master_Log_File: master-bin.000007
  Read_Master_Log_Pos: 107
	   Relay_Log_File: relay-bin.000002
		Relay_Log_Pos: 254
Relay_Master_Log_File: master-bin.000007
	 Slave_IO_Running: Yes
	Slave_SQL_Running: Yes
			
			
查看主服务器B的状态【注意,不要再把服务器B当slave的思维】
mysql> show master status;
+-------------------+----------+
| File              | Position |
+-------------------+----------+
| master-log.000002 |      370 |
+-------------------+----------+
1 row in set (0.00 sec)



【在服务器A操作,把主指向服务器B】注意你的iptables

注意:用对方服务器192.168.81.133的repluser账户,指向对方服务器的日志文件
mysql> CHANGE MASTER TO  MASTER_HOST='192.168.81.133',  MASTER_USER='repluser', MASTER_PASSWORD='replpass',MASTER_LOG_FILE = 'master-log.000002',MASTER_LOG_POS = 370;
Query OK, 0 rows affected (0.03 sec)

mysql> show slave status\G
*************************** 1. row ***************************
	   Slave_IO_State: 
		  Master_Host: 192.168.81.133
		  Master_User: repluser
		  Master_Port: 3306
		Connect_Retry: 60
	  Master_Log_File: master-master-log.000002
  Read_Master_Log_Pos: 370
	   Relay_Log_File: relay-bin.000001
		Relay_Log_Pos: 4
Relay_Master_Log_File: master-master-log.000002
	 Slave_IO_Running: No
	Slave_SQL_Running: No
			
启动互为主从
mysql> start slave ;
Query OK, 0 rows affected (0.01 sec)

mysql> show slave status\G
*************************** 1. row ***************************
	   Slave_IO_State: Waiting for master to send event
		  Master_Host: 192.168.81.133
		  Master_User: repluser
		  Master_Port: 3306
		Connect_Retry: 60
	  Master_Log_File: master-log.000002
  Read_Master_Log_Pos: 370
	   Relay_Log_File: relay-bin.000002
		Relay_Log_Pos: 254
Relay_Master_Log_File: master-log.000002
	 Slave_IO_Running: Yes
	Slave_SQL_Running: Yes

			
【测试】在服务器A上创建一个数据库,并使用这个库创建自动增长的表
mysql> create database newdb;
Query OK, 1 row affected (0.00 sec)



【在服务器B上】查看是否存在

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| haha               |
| hellodb            |
| mysql              |
| newdb              |
| performance_schema |
| test               |
+--------------------+
7 rows in set (0.00 sec)

mysql> use newdb;
Database changed
mysql> create table t1(id int unsigned not null primary key auto_increment,name char(20));
Query OK, 0 rows affected (0.05 sec)
mysql> insert into t1 (name) values ('tom'),('jerry');
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from t1;
+----+-------+
| id | name  |
+----+-------+
|  2 | tom   |
|  4 | jerry |
+----+-------+
2 rows in set (0.00 sec)



【测试】在服务器A器上操作

mysql> use newdb;
Database changed
mysql> insert into t1 (name) values ('user1'),('user2');
Query OK, 2 rows affected (0.02 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from t1;
+----+-------+
| id | name  |
+----+-------+
|  2 | tom   |
|  4 | jerry |
|  5 | user1 |
|  7 | user2 |
+----+-------+
4 rows in set (0.00 sec)

mysql> select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
|                5 |
+------------------+
1 row in set (0.00 sec)

【注意】如果再次修改过mysqld配置文件。要手动启动slave
[root@localhost etc]# service mysqld restart
[root@localhost ~]# mysql -p
Enter password: 
mysql> start slave;
Query OK, 0 rows affected (0.05 sec)
mysql> create table t2 like t1;  | 或者mysql> truncate t2;清空自动增长
Query OK, 0 rows affected (0.02 sec)
mysql> select * from t2;
+----+-------+
| id | name  |
+----+-------+
|  1 | user1 |
|  3 | user2 |
+----+-------+
2 rows in set (0.01 sec)


最简单的双主模型 就是这样!】





推荐:

多主,且高可用的解决方案:

MMM:Multi Master MySQL

MHA:MySQL HA




基于ssl的复制【大概的讲一下】

mysql> show variables like "%ssl%";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_openssl  | NO    |
| have_ssl      | NO    |
| ssl_ca        |       |
| ssl_capath    |       |
| ssl_cert      |       |
| ssl_cipher    |       |
| ssl_key       |       |
+---------------+-------+
7 rows in set (0.00 sec)

需要编译安装好后,才能enable ssl的功能
client发送证书给server
server验证客户端

使用方法
mysql> help change master to
Syntax:
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)

server_id_list:
    [server_id [, server_id] ... ]		



复制相关的文件:

master.info: 文本文件,保存从服务器连接至主服务时所需要的信息,每行一个值;

有了这些才会自动启动change master to,删除了就不会自动连接了

relay-log.info: 文本文件,保存了复制位置:包括二进制日志和中继日志的文件及位置;

[root@localhost data]# cat /mydata/data/master.info 
18
master-log.000003
107
192.168.81.133
repluser
replpass
3306
60
0





0
1800.000

0
000

0


[root@localhost data]# cat /mydata/data/relay-log.info 
/mydata/relaylogs/relay-bin.000007
254
master-log.000003
107

370


[Action !]

这两个文件是实时更新的,如果遇到这种情况,maser服务器特别繁忙,

那么这两个文件会被频繁的修改,那么I/0的性能一定会下降

mysql> show global variables like "sync%";
+---------------------+-------+
| Variable_name       | Value |
+---------------------+-------+
| sync_binlog         | 0     |
| sync_frm            | ON    |
| sync_master_info    | 0     |
| sync_relay_log      | 0     |
| sync_relay_log_info | 0     |
+---------------------+-------+
5 rows in set (0.05 sec)


为了复制的安全性:

	sync_master_info = 1
	sync_relay_log = 1
	sync_relay_log_info = 1





安装percona-toolkit

[root@localhost home]# yum install ./percona-toolkit-2.2.4-1.noarch.rpm


使用方法

[root@localhost home]# pt-heartbeat -h
[root@localhost home]# pt  工具这么多
pt-agent                  pt-fingerprint            pt-pmp                    pt-table-checksum
pt-align                  pt-fk-error-logger        pt-query-digest           pt-table-sync
pt-archiver               pt-heartbeat              pt-show-grants            pt-table-usage
pt-config-diff            pt-index-usage            pt-sift                   pt-upgrade
pt-deadlock-logger        pt-ioprofile              pt-slave-delay            pt-variable-advisor
pt-diskstats              pt-kill                   pt-slave-find             pt-visual-explain
pt-duplicate-key-checker  pt-mext                   pt-slave-restart          ptx
pt-fifo-split             pt-mysql-summary          pt-stalk                  
pt-find                   pt-online-schema-change   pt-summary


查看配置信息

[root@localhost home]# pt-summary 
# Percona Toolkit System Summary Report ######################
        Date | 2015-10-17 09:25:30 UTC (local TZ: CST +0800)
    Hostname | localhost.localdomain
      Uptime | 11:59,  3 users,  load average: 0.00, 0.00, 0.00
    Platform | Linux
     Release | CentOS release 6.7 (Final)
      Kernel | 2.6.32-573.el6.x86_64
Architecture | CPU = 64-bit, OS = 64-bit
   Threading | NPTL 2.12
     SELinux | Enforcing
 Virtualized | VMWare
# Processor ##################################################
  Processors | physical = 2, cores = 4, virtual = 4, hyperthreading = no
      Speeds | 4x2195.089
      Models | 4xIntel(R) Core(TM) i3-2328M CPU @ 2.20GHz
      Caches | 4x3072 KB
# Memory #####################################################
       Total | 2.0G
        Free | 1.5G
        Used | physical = 487.5M, swap allocated = 2.1G, swap used = 0.0, virtual = 487.5M
     Buffers | 50.1M
      Caches | 181.6M
       Dirty | 12 kB
     UsedRSS | 157.0M
  Swappiness | 60
 DirtyPolicy | 20, 10
 DirtyStatus | 0, 0
# Mounted Filesystems ########################################
  Filesystem                    Size Used Type  Opts                                          Mountpoint
  /dev/mapper/VolGroup-lv_home   37G   1% ext4  rw                                            /home
  /dev/mapper/VolGroup-lv_root   50G   5% ext4  rw                                            /
  /dev/sda1                     477M   9% ext4  rw                                            /boot
  tmpfs                        1002M   0% tmpfs rw,rootcontext="system_u:object_r:tmpfs_t:s0" /dev/shm
# Disk Schedulers And Queue Size #############################
        dm-0 | 128
        dm-1 | 128
        dm-2 | 128
         sda | [cfq] 128
         sr0 | [cfq] 128
# Disk Partioning ############################################
Device       Type      Start        End               Size
============ ==== ========== ========== ==================
/dev/dm-0    Disk                              53687091200
/dev/dm-1    Disk                               2248146944
/dev/dm-2    Disk                              40173043712
/dev/sda     Disk                              96636764160
/dev/sda1    Part          1         64          518192640
/dev/sda2    Part         64      11749        96112396800
/dev/sr0     Disk                               3895459840
/dev/sr0p1   Part          1       3715        15577645056
# Kernel Inode State #########################################
dentry-state | 45417	37192	45	0	0	0
     file-nr | 768	0	200279
    inode-nr | 41113	103
# LVM Volumes ################################################
  LV      VG       Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv_home VolGroup -wi-ao---- 37.41g                                                    
  lv_root VolGroup -wi-ao---- 50.00g                                                    
  lv_swap VolGroup -wi-ao----  2.09g                                                    
# LVM Volume Groups ##########################################
  VG       VSize  VFree
  VolGroup 89.51g    0 
# RAID Controller ############################################
  Controller | No RAID controller detected
# Network Config #############################################
 FIN Timeout | 60
  Port Range | 61000
# Interface Statistics #######################################
  interface  rx_bytes rx_packets  rx_errors   tx_bytes tx_packets  tx_errors
  ========= ========= ========== ========== ========== ========== ==========
  lo              900         20          0        900         20          0
  eth0        7000000      20000          0    5000000      17500          0
# Network Devices ############################################
  Device    Speed     Duplex
  ========= ========= =========
  eth0       1000Mb/s   Full      
# Network Connections ########################################
  Connections from remote IP addresses
    192.168.81.1        3
    192.168.81.133      1
  Connections to local IP addresses
    192.168.81.132      4
  Connections to top 10 local ports
    22                  3
    50606               1
  States of connections
    ESTABLISHED         4
    LISTEN              5
# Top Processes ##############################################
   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
     1 root      20   0 19232 1520 1228 S  0.0  0.1   0:03.21 init
     2 root      20   0     0    0    0 S  0.0  0.0   0:00.04 kthreadd
     3 root      RT   0     0    0    0 S  0.0  0.0   0:00.61 migration/0
     4 root      20   0     0    0    0 S  0.0  0.0   0:00.30 ksoftirqd/0
     5 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 stopper/0
     6 root      RT   0     0    0    0 S  0.0  0.0   0:00.19 watchdog/0
     7 root      RT   0     0    0    0 S  0.0  0.0   0:00.80 migration/1
     8 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 stopper/1
     9 root      20   0     0    0    0 S  0.0  0.0   0:00.12 ksoftirqd/1
# Notable Processes ##########################################
  PID    OOM    COMMAND
11078    -17    sshd
# Simplified and fuzzy rounded vmstat (wait please) ##########
  procs  ---swap-- -----io---- ---system---- --------cpu--------
   r  b    si   so    bi    bo     ir     cs  us  sy  il  wa  st
   1  0     0    0     1     1      5      6   0   0 100   0   0
   0  0     0    0    35     0   2250   1250   4   9  88   0   0
   0  0     0    0     0     0      7     10   0   0 100   0   0
   0  0     0    0     0   250     25     45   0   0 100   0   0
   0  0     0    0     0     0      8     15   0   0 100   0   0
# The End ####################################################



从服务器意外崩溃时,建议使用pt-slave-start命令来启动slave;



基于行和基于语句复制:

基于语句:

数据量小;易于查看;适应性强;

有些语句无法做精确复制;无法对使用了触发器、存储过程等代码的应用实现精确复制;


基于行:

能够精确完成有着触发器、存储过程等代码场景中的复制;能完成几乎所有的复制功能;较少的CPU占用率;

无法判断执行了什么样的SQL语句;数据量可能略大;


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

Seconds_Behind_Master: 0

查看落后时长,如果落后,请观测此值


mysql> show slave status\G

Seconds_Behind_Master: 0



如果数据不一致,解决办法

1、重新备份并在从服务器导入数据;

2、pt-table-sync


为了提高复制时的数据安全性,在主服务器上的设定

sync_binlog = 1

innodb_flush_log_at_trx_commit = 1

此参数的值设定为1,性能下降会较严重;因此,一般设定为2等,

此时,主服务器崩溃依然有可能导致从服务器无法获取到全部的二进制日志事件;


如果master意外崩溃导致二进制日志中的某事件损坏,可以在从服务器使用如下参数忽略:

sql_slave_skip_counter = 0



第三方复制解决方案:Tungsten, Galera







复制要考虑的事儿:

何为雪崩效应?

如何缓存,高效命中缓存?[轮巡,对Sql语句hash取模?]

从服务器写入的压力并不比主服务器的压力小,

事务的手动自动提交,频繁同步到磁盘、

二进制日志文件的频繁写入读出,中继日志的写入读出,

SQl I/O <---> Slave 单线程忙碌

从服务器落后于主服务器的必然,

中途断电,缓存中的二进制文件未写入到磁盘,怎么办?

长途跨地,如何同步数据?

有了这位么多的从服务器,数据还需要备份吗?





2015.10.18


本文出自 “魂斗罗” 博客,谢绝转载!

你可能感兴趣的:(ssl,percona-toolkit,双主模型,MySQL复制概念深入)