原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://sohudrgon.blog.51cto.com/3088108/1608207

一.复制概述

    MariaDB/MySQL内建的复制功能是构建大型,高性能应用程序的基础。将MySQL的数据分布到多个系统上去,这种分布的机制,是通过将MySQL的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的。复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。

    请注意当你进行复制时,所有对复制中的表的更新必须在主服务器上进行。否则,你必须要小心,以避免用户对主服务器上的表进行的更新与对从服务器上的表所进行的更新之间的冲突。

1.mysql支持的复制类型:

(1):基于语句的复制:在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。  

  一旦发现没法精确复制时,会自动选着基于行的复制。    

(2):基于行的复制:把改变的内容复制过去,而不是把命令在从服务器上执行一遍. 从mysql5.0开始支持

(3):混合类型的复制: 默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。

2.复制解决的问题

MySQL复制技术有以下一些特点:

(1).数据分布 (Data distribution )

(2).负载平衡(load balancing)

(3).备份(Backups) 

(4).高可用性和容错行 High availability and failover 

3.复制如何工作 

整体上来说,复制有3个步骤:   

(1).master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);

(2).slave将master的binary log events拷贝到它的中继日志(relay log);

(3).slave重做中继日志中的事件,将改变反映它自己的数据。

下图描述了复制的过程,经典的图哦:摘自《高性能MySQL_第3版》这本经典书中的复制那章;

wKioL1TEevjT8n3DAADUwaoLIc4842.jpg

    该过程的第一部分就是master记录二进制日志。在每个事务更新数据完成之前,master在二日志记录这些改变。MySQL将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。

    下一步就是slave将master的binary log拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。

    SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。

    此外,在master中也有一个工作线程:和其它MySQL的连接一样,slave在master中打开一个连接也会使得master开始一个线程。复制过程有一个很重要的限制——复制在slave上是串行化的,也就是说master上的并行更新操作不能在slave上并行操作。

二.复制配置过程简介

有两台MySQL数据库服务器node3和node4,node3为主服务器,node4为从服务器,初始状态时,node3和node4中的数据信息相同,当node3中的数据发生变化时,node4也跟着发生相应的变化,使得node3和node4的数据信息同步,达到备份的目的。

要点:

负责在主、从服务器传输各种修改动作的媒介是主服务器的二进制变更日志,这个日志记载着需要传输给从服务器的各种修改动作。因此,主服务器必须激活二进制日志功能。从服务器必须具备足以让它连接主服务器并请求主服务器把二进制变更日志传输给它的权限。

配置主从复制的过程:

1).主节点操作步骤

(1)、启用二进制日志

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

(3)、创建一个有复制权限(replication slave,replication client)帐号;

2).slave节点的操作步骤

(1)、启用中继日志;

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

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

注意:

(1)、服务器版本:主从服务器版本一致;

如果版本不一致,必须保证从服务器的版本高于主服务器的版本;

(2)、如果mysql数据库的隔离级别为可读,其二进制日志格式尽量使用基于行的;

实验环境:

服务器版本为:

CentOS 6.6 64bit

数据库软件版本为:

mariadb-10.0.12.tar.gz

node3节点的IP地址:172.16.31.20/16

node4节点的IP地址:172.16.31.21/16

数据库主从复制实现

三.编译安装mariadb数据库过程略。

提供的my.cnf如下:

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

30

31

32

33

[root@node3 ~]# grep -v '^#' /etc/my.cnf 

[client]

port            = 3306

socket          = /tmp/mysql.sock

[mysqld]

port            = 3306

socket          = /tmp/mysql.sock

skip-external-locking

key_buffer_size = 256M

max_allowed_packet = 1M

table_open_cache = 256

sort_buffer_size = 1M

read_buffer_size = 1M

read_rnd_buffer_size = 4M

myisam_sort_buffer_size = 64M

thread_cache_size = 8

query_cache_size= 16M

thread_concurrency = 4

datadir = /mydata/data

innodb_file_per_table = on

skip_name_resolve = on

[mysqldump]

quick

max_allowed_packet = 16M

[mysql]

no-auto-rehash

[myisamchk]

key_buffer_size = 128M

sort_buffer_size = 128M

read_buffer = 2M

write_buffer = 2M

[mysqlhotcopy]

interactive-timeout

我这里提供一个脚本,基本上可以实现mariadb编译安装自动化:

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

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

[root@node3 ~]# cat installmysql.sh 

#!/bin/bash

#install mysql

mysql_dir="/usr/local/mysql"

mysql_datadir="/mydata/data"

mysql_logdir="/mydata/data/"

mysql_passwd="oracle"

function install_mysql()  {

yum groupinstall -y Development Tools

yum install -y cmake ncurses-devel openssl-devel openssl

cd /root/

useradd -M -s /sbin/nologin mysql

mkdir -p $mysql_datadir

chown mysql.mysql -R $mysql_datadir

tar zxf mariadb-10.0.12.tar.gz 

cd mariadb-10.0.12

cmake . -DCMAKE_INSTALL_PREFIX=$mysql_dir/ \

-DMYSQL_DATADIR=$mysql_datadir \

-DWITH_INNOBASE_STORAGE_ENGINE=1 \

-DWITH_ARCHIVE_STORAGE_ENGINE=1 \

-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \

-DENABLED_LOCAL_INFILE=1 \

-DMYSQL_TCP_PORT=3306 \

-DWITH_SSL=system \

-DWITH_ZLIB=system \

-DWITH_LIBWRAP=0 \

-DCMAKE_THREAD_PREFER_PTHREAD=1 \

-DEXTRA_CHARSETS=all \

-DDEFAULT_CHARSET=utf8 \

-DDEFAULT_COLLATION=utf8_general_ci \

-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \

-DWITH_DEBUG=0

make && make install

rm -rf /etc/my.cnf

rm -rf /etc/init.d/mysqld

cp /root/my.cnf /etc/my.cnf

cp support-files/mysql.server /etc/init.d/mysqld

chmod 755 /etc/init.d/mysqld

chkconfig --add mysqld

chkconfig mysqld on

chown mysql.mysql -R $mysql_logdir

chown mysql.mysql -R $mysql_datadir

$mysql_dir/scripts/mysql_install_db --user=mysql --basedir=$mysql_dir --datadir=$mysql_datadir

/sbin/service mysqld start

echo 'export PATH=$PATH:'$mysql_dir'/bin' >> /etc/profile

source /etc/profile

$mysql_dir/bin/mysql -e "grant all privileges on *.* to root@'%' identified by '$mysql_passwd' with grant option;"

$mysql_dir/bin/mysql -e "flush privileges;"

$mysql_dir/bin/mysql -e "delete from mysql.user where password='';"

/sbin/service mysqld restart

echo "mysql install success!"

}

install_mysql

将数据库源码包和配置好的my.cnf文件放置在/root目录下后即可进行编译安装;