Home  >  Article  >  Database  >  linuxcentos下mysql数据库的主从复制环境搭建_MySQL

linuxcentos下mysql数据库的主从复制环境搭建_MySQL

WBOY
WBOYOriginal
2016-06-08 08:50:351028browse

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

原理图如下:

\

简单来说,mysql的主从复制的原理就是slave把master上面执行的 update,insert这些会使数据发生改变的sql语句从master上面同步过来,然后在自己的机器上再执行一遍,那么这两台数据库服务器上的数据就一模一样了,而那些要同步的sql语句就存在bin-log文件里面

我这里有两台机器分别是192.168.1.6(master) 192.168.1.5(slave)

\

我们先从master机器开始配置

修改/etc/my.cnf 文件(mysql启动默认是从/etc/my.cnf读取的,所以你别的地方有配置文件的话建议直接移到/etc目录下)

 

[client]
port = 3306
socket = /usr/local/mysql/mysql.sock

[mysqld]
character-set-server = utf8
collation-server = utf8_general_ci

skip-external-locking
skip-name-resolve

user = mysql
port = 3306
basedir = /usr/local/mysql
datadir = /home/mysql/data
tmpdir = /home/mysql/temp
# server_id = .....
socket = /usr/local/mysql/mysql.sock
log-error = /home/mysql/logs/mysql_error.log
pid-file = /home/mysql/mysql.pid

open_files_limit = 10240

back_log = 600
max_connections=500
max_connect_errors = 6000
wait_timeout=605800

#open_tables = 600
#table_cache = 650
#opened_tables = 630

max_allowed_packet = 32M

sort_buffer_size = 4M
join_buffer_size = 4M
thread_cache_size = 300
query_cache_type = 1
query_cache_size = 256M
query_cache_limit = 2M
query_cache_min_res_unit = 16k

tmp_table_size = 256M
max_heap_table_size = 256M

key_buffer_size = 256M
read_buffer_size = 1M
read_rnd_buffer_size = 16M
bulk_insert_buffer_size = 64M

lower_case_table_names=1

default-storage-engine = INNODB

innodb_buffer_pool_size = 2G
innodb_log_buffer_size = 32M
innodb_log_file_size = 128M
innodb_flush_method = O_DIRECT

#####################
thread_concurrency = 32
long_query_time= 2
slow-query-log = on
slow-query-log-file = /home/mysql/logs/mysql-slow.log  

## replication
server_id=6
binlog-ignore-db=mysql
log-bin=master-mysql-bin
binlog_cache_size=1M
binlog_format=mixed
expire_logs_days=7
slave_skip_errors=1062

[mysqldump]
quick
max_allowed_packet = 32M

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

这里主要的配置就是和复制相关的这段配置,其它配置是mysql源码安装时配置,里面具体参数代表什么意思可以网上搜一下,文档很多的

 

 

## replication
server_id=6
binlog-ignore-db=mysql
log-bin=master-mysql-bin
binlog_cache_size=1M
binlog_format=mixed
expire_logs_days=7
slave_skip_errors=1062
我简单解释一下,复制有关的参数

 

serverid 全局唯一的

binlog-ignore-db=mysql复制过滤,我们不同步mysql系统自带的数据库

log-bin=master-mysql-bin 开启logbin功能并设置logbin文件的名称

binlog_format=mixed 混合型复制模式,默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。

接下来重启mysql服务并用客户端登录

\

slave想要同步master上的数据首先肯定需要权限,所以我们要在master上面开通权限

 

grant replication slave, replication client on *.* to 'root'@'192.168.1.5' identified by
'root';
账号和密码都是root ,允许192.168.1.5这台机器向master发送同步请求,当然你可以设成别的,我这里只是为了方便记忆,设了太多不同的密码容易忘记

 

\

刷新一下授权信息,然后查看当前master的状态

\

show master status,我这里解释一下,我们知道关于对数据库修改的sql全部记录在了bin-log里面,那么我们就每次都把bin-log里面的sql全部执行一遍?肯定不是,我们肯定要记录我上次复制到哪儿里了,然后我下次再从这个点开始同步,就像我们玩单机游戏闯了3关以后要存下档一样,下次玩我们继续从第三关开始玩,这是一个意思。

接下来我们随便写点测试数据到数据库里面去

 

create database if not exists pcx default charset utf8 collate utf8_general_ci;
use pcx;
DROP TABLE IF EXISTS `fruits`;
CREATE TABLE fruits
(
f_id    char(10)     	NOT NULL,
s_id    INT        	NOT NULL,
f_name  char(255)  	NOT NULL,
f_price decimal(8,2)  	NOT NULL,
PRIMARY KEY(f_id) 
)ENGINE=InnoDB DEFAULT CHARSET=utf8 ;

INSERT INTO fruits (f_id, s_id, f_name, f_price)
     VALUES('a1', 101,'apple',5.2),
     ('b1',101,'blackberry', 10.2),
     ('bs1',102,'orange', 11.2),
     ('bs2',105,'melon',8.2),
     ('t1',102,'banana', 10.3),
     ('t2',102,'grape', 5.3),
     ('o2',103,'coconut', 9.2),
     ('c0',101,'cherry', 3.2),
     ('a2',103, 'apricot',2.2),
     ('l2',104,'lemon', 6.4),
     ('b2',104,'berry', 7.6),
     ('m1',106,'mango', 15.6),
     ('m2',105,'xbabay', 2.6),
     ('t4',107,'xbababa', 3.6),
     ('m3',105,'xxtt', 11.6),
     ('b5',107,'xxxx', 3.6);
\

 

接下来我们把pcx这个库下的数据全部备份下来

首先我们要锁表

 

flush tables with read lock;
接下来用mysql的备份命令进行备份

 

\

最后我们把edu-master.sql发送到slave的机器上面

好了,我们接下来开始配置slave(192.168.1.5)

同样打开my.cnf文件开始配置

 

vi /etc/my.cnf

 

 

[client]
port = 3306
socket = /usr/local/mysql/mysql.sock

[mysqld]
character-set-server = utf8
collation-server = utf8_general_ci

skip-external-locking
skip-name-resolve

user = mysql
port = 3306
basedir = /usr/local/mysql
datadir = /home/mysql/data
tmpdir = /home/mysql/temp
# server_id = .....
socket = /usr/local/mysql/mysql.sock
log-error = /home/mysql/logs/mysql_error.log
pid-file = /home/mysql/mysql.pid

open_files_limit = 10240

back_log = 600
max_connections=500
max_connect_errors = 6000
wait_timeout=605800

#open_tables = 600
#table_cache = 650
#opened_tables = 630

max_allowed_packet = 32M

sort_buffer_size = 4M
join_buffer_size = 4M
thread_cache_size = 300
query_cache_type = 1
query_cache_size = 256M
query_cache_limit = 2M
query_cache_min_res_unit = 16k

tmp_table_size = 256M
max_heap_table_size = 256M

key_buffer_size = 256M
read_buffer_size = 1M
read_rnd_buffer_size = 16M
bulk_insert_buffer_size = 64M

lower_case_table_names=1

default-storage-engine = INNODB

innodb_buffer_pool_size = 2G
innodb_log_buffer_size = 32M
innodb_log_file_size = 128M
innodb_flush_method = O_DIRECT

#####################
thread_concurrency = 32
long_query_time= 2
slow-query-log = on
slow-query-log-file = /home/mysql/logs/mysql-slow.log  


## replication
server_id=5
binlog-ignore-db=mysql
log-bin=mysql-slave-bin
binlog_cache_size = 1M
binlog_format=mixed
expire_logs_days=7
slave_skip_errors=1062
relay_log=mysql-relay-bin
log_slave_updates=1
read_only=1


[mysqldump]
quick
max_allowed_packet = 32M

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
配置文件和master的差不多,主要差别在一下几点

 

log-bin=mysql-slave-bin开启了二进制日志,实际上不开也没关系,因为我们这个slave只是做slave,如果你这台slave还有可能要做别人的master的话那么必须开启

relay_log=mysql-relay-bin配置中继日志,用来存放从master的bin-log那边同步来的数据

配置好后重启数据库服务

 

service mysql restart

我们首先要创建一下数据库,因为我们备份下来的数据库文件里面是不包含创建数据库的命令的,所以我们要手动创建一下

 

\

把我们从master那边备份过来的数据恢复到slave中

\

登录 Slave 数据库

\

在mysql客户端中输入一下命令连接master

\

change master to ,
master_host='192.168.1.6' master主机的ip地址

master_user='root',

master_password='root', 我们刚刚在master有执行过授权的账号密码就是这个

master_port=3306,master数据库的端口号

master_log_file='edu-mysql-bin.000002',

master_log_pos=427, 这个是我们通过show master status看到的position

 

master_connect_retry=30;

 

使用命令查看slave状态,我们可以看到slave目前还未开始同步

 

 show slave status\G;
\

 

开始主从同步,主要看到两个yes就代表同步成功了

 

start slave;
\

 

在master机器上查看状态,可以看见slave的连接信息

 

show processlist\G;
\

 

接下来我们测试一下主从复制的功能

master 上原来的数据

\

这是我插入的记录

\

我们到slave上面看看有没有,有就代表成功了

\

至此mysql原生支持的主从复制搭建完毕,当然我们说mysql的主从复制

性能上回有延迟,master上的数据不是无延迟的同步到slave上面,所以如果你对数据的一致性要求非常高的话,那么mysql官方的主从复制就不合适了,可以考虑用别的数据同步方案例如“Galera Cluster for MySQL” ,当然也有人说mysql官方支持的主从复制只是适合在中小规模的集群下运行。

 

 

 

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn