mysql多主主从数据库_MySQL多实例,主从同步

本文详细介绍了MySQL的多主主从复制原理,包括复制过程、配置步骤和主从同步的关键参数。首先,主从复制依赖于Master的Binlog功能,Slave通过IO线程从Master获取Binlog并在自身执行SQL。接着,文章提供了单实例和多实例的MySQL安装步骤,以及主从库的配置方法,包括创建复制用户、设置server-id和启用binlog。最后,文中展示了如何在主库和从库上执行必要的操作以实现主从复制,如锁表、解锁、数据迁移和配置同步参数。
摘要由CSDN通过智能技术生成

MySQL 主从复制是一个异步复制过程(但看起来也是实时的),数据库数据从一个MySQL数据库(我们称为Master)复制到另一个MySQL数据库(我们称之为Slave)。在Master和Slave之间实现整个主从复制的过程有三个线程参与完成。其中两个线程(SQL线程和IO线程)在Slave端,另一个线程(IO线程)在Master端。

要实现MySQL的主从复制,首先必须打开Master端的Binlog(MySQL-bin.XXXXX)功能,否则无法实现主从复制。因为整个复制过程实际上就是Slave从Master端获取Binlog日志,然后再在Slave自身上以相同顺序执行binlog日志中所记录的各种操作。打开MySQL的binlog可以通过MySQL的配置文件my.cnf中的mysqld模块([mysqld]标识后的参数部分)添加“log-bin”参数项。

MySQL主从复制过程描述

下面简单描述下MySQL Replication的复制过程:

1.Slave服务器上执行start slave,开启主从复制开关。

2.此时,Slave服务器的IO线程会通过在Master上授权的复制用户请求连接Master服务器,并请求从指定Binlog日志文件的指定位置(日志文件和位置是在配置主从服务时change master 时指定的)之后的Binlog日志内容。

3.Master服务器接收到来自Slave服务器的IO线程的请求后,Master服务器上负责复制IO线程根据Slave服务器的IO线程请求的信息读取指定Binlog日志文件指定位置之后的Binlog日志信息,然后返回给Slave端的IO线程。返回的信息中除了日志内容外,还有本次返回日志内容在Master服务器端的新Binlog文件名称以及在Binlog中的指定位置。

4. 当Slave服务器的IO线程获取到来自Master服务器上IO线程发送日志内容及日志文件及位置点后,将Binlog日志内容依次写入到Slave端自身的Relay Log(即中继日志)文件(MySQL-relay-bin.xxxxx)的最末端,并将新的Binlog文件名和位置记录到master-info文件中,以便下一次读取Master端新binlog日志时能够告诉Master服务器需要从新binlog日志的那个文件那个位置开始请求新的Binlog日志内容。

5. Slave服务器的SQL线程会实时的检测本地Relay Log中新增加了日志内容,然后及时的把Log文件中的内容解析成在Master端曾经执行的SQL语句的内容,并在自身Slave服务器上按语句的顺序执行应用这些SQL语句。

6. 经过了上面的过程,就可以确保在Master端和Slave端执行了同样的SQL语句。当复制状态正常的情况下,Master端和Slave端的数据是完全一样的。

主从复制的原理图

ba32a51723968763bee20469236f6745.png

具体实施主从复制

下面介绍的测试环境的安装,关于线上的环境不好多讲,具体步骤如下:

单实例安装步骤

1.建立MySQL 账户

#groupadd mysql #useradd -s /sbin/nologin -g mysql -M mysql

#tail -l /etc/passwd

建立 MySQL 软件目录

#mkdir -p /home/tools

#cd /home/tools/

#tar zxf mysql-5.1.62.tar.gz #cd mysql-5.1.62

配置

./configure \

--prefix=/usr/local/mysql \

--with-unix-socket-path=/usr/local/mysql/tmp/mysql.sock \

--localstatedir=/usr/local/mysql/data \

--enable-assembler \

--enable-thread-safe-client \

--with-mysqld-user=mysql \

--with-big-tables \

--without-debug \

--with-pthread \

--enable-assembler \

--with-extra-charsets=complex \

--with-ssl \

--with-embedded-server \

--enable-local-infile \

--with-plugins=partition,innobase \

--with-plugin-PLUGIN \

--with-mysqld-ldflags=-all-static \

--with-client-ldflags=-all-static

3.静态编译生成mysqld的执行文件

#make

4.安装MySQL

#make install

5.获取MySQL 配置文件

#ls -l support-files/*.cnf #cp support-files/my-small.cnf /etc/my.cnf

6.创建数据库文件

#mkdir -p /usr/local/mysql/data #chown -R mysql.mysql /usr/local/mysql

#/usr/local/mysql/bin/mysql_install_db --user=mysql

#

7.启动MySQL 数据库

#cp support-files/mysql.server /usr/local/mysql/bin #netstat -lnt|grep 3306

#/user/local/bin/mysql_safe --user=mysql &

8.配置MySQL 命令的全局使用路径

#echo 'export PATH=$PATH:/usr/local/mysql/bin' >>/etc/profile #source /etc/profile

9.配置/etc/init.d/mysqld start 方式启动数据库

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

#/etc/init.d/mysqld restart

多实例安装

1.采用不同的端口来作为二级目录

mkdir -p /data/{3306,3307}/data

2 创建MySQL多实例配置文件

ls -l support-files/*.cnf

/bin/cp support-files/my-small.cnf /etc/my.cnf

3 通过vi命令添加如下:

vi /data/3306/my.cnf

vi /data/3307/my.cnf

my.cnf配置

[client]

port            = 3306

socket          = /data/3306/mysql.sock

[mysql]

no-auto-rehash

[mysqld]

user    = mysql

port    = 3306

socket  = /data/3306/mysql.sock

basedir = /usr/local/mysql

datadir = /data/3306/data

open_files_limit    = 1024

back_log = 600

max_connections = 800

max_connect_errors = 3000

table_cache = 614

external-locking = FALSE

max_allowed_packet =8M

sort_buffer_size = 1M

join_buffer_size = 1M

thread_cache_size = 100

thread_concurrency = 2

query_cache_size = 2M

query_cache_limit = 1M

query_cache_min_res_unit = 2k

default_table_type = InnoDB

thread_stack = 192K

transaction_isolation = READ-COMMITTED

tmp_table_size = 2M

max_heap_table_size = 2M

long_query_time = 1

log_long_format

log-error = /data/3306/error.log

log-slow-queries = /data/3306/slow.log

pid-file = /data/3306/mysql.pid

log-bin = /data/3306/mysql-bin

relay-log = /data/3306/relay-bin

relay-log-info-file = /data/3306/relay-log.info

binlog_cache_size = 1M

max_binlog_cache_size = 1M

max_binlog_size = 2M

expire_logs_days = 7

key_buffer_size = 16M

read_buffer_size = 1M

read_rnd_buffer_size = 1M

bulk_insert_buffer_size = 1M

myisam_sort_buffer_size = 1M

myisam_max_sort_file_size = 10G

myisam_max_extra_sort_file_size = 10G

myisam_repair_threads = 1

myisam_recover

lower_case_table_names = 1

skip-name-resolve

slave-skip-errors = 1032,1062

replicate-ignore-db=mysql

server-id = 1

innodb_additional_mem_pool_size = 4M

innodb_buffer_pool_size = 32M

innodb_data_file_path = ibdata1:128M:autoextend

innodb_file_io_threads = 4

innodb_thread_concurrency = 8

innodb_flush_log_at_trx_commit = 2

innodb_log_buffer_size = 2M

innodb_log_file_size = 4M

innodb_log_files_in_group = 3

innodb_max_dirty_pages_pct = 90

innodb_lock_wait_timeout = 120

innodb_file_per_table = 0

[mysqldump]

quick

max_allowed_packet = 2M

[mysqld_safe]

log-error=/data/3306/mysql_barry3306.err

pid-file=/data/3306/mysqld.pid

4 创建MySQL多实例的启动文件

启动文件mysql 3306

#!/bin/sh

#/data/3306/mysql 脚本

#init

port=3306

mysql_user="root"

mysql_pwd=""

CmdPath="/usr/local/mysql/bin"

#startup function

function_start_mysql()

{

printf "Starting MySQL...\n"

/bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf 2>&1 > /dev/null &

}

#stop function

function_stop_mysql()

{

printf "Stoping MySQL...\n"

${CmdPath}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S /data/${port}/mysql.sock shutdown

}

#restart function

function_restart_mysql()

{

printf "Restarting MySQL...\n"

function_stop_mysql

sleep 2

function_start_mysql

}

case $1 in

start)

function_start_mysql

;;

stop)

function_stop_mysql

;;

restart)

function_restart_mysql

;;

*)

printf "Usage: /data/${port}/mysql {start|stop|restart}\n"

esac

5 目录结构

tree /data

/data

--3306

|--my.cnf

|--mysql

|--data

--3307

|--my.cnf

|--mysql

|--data

#授权

chown -R mysql.mysql /data

find /data -name mysql -exec chmod 700 {} \

6 配置MySQL命令全局使用路径

配置全局路径意义

如果不配置MySQL命令的全局路径,就无法直接敲MySQL等命令,也就是只能/usr/local/msyql/bin/mysql这样敲命令。

echo 'export PATH=$PATH:/usr/local/mysql/bin' >>/etc/profile

source /etc/profile

7 创建MySQL多实例数据文件

mysql_install_db --datadir=/data/3306/data  --user=mysql

mysql_install_db --datadir=/data/3307/data  --user=mysql

8启动MySQL多实例数据库

/data/3306/mysql start

/data/3307/mysql start

#检查MySQL数据是否启动

netstat -lnt|grep 330[6,7]

9 配置MySQL多实例数据库开机自动启动

echo "/data/3306/mysql start" >>/etc/rc.local

echo "/data/3307/mysql start" >>/etc/rc.local

10 登录MySQL测试

mysql -S /data/3306/mysql.sock

mysql -S /data/3307/mysql.sock

11 MySQL 安全配置

为root增加密码

mysqladmin -u root -S /data/3306/mysql.sock password 'barry123'  #

mysql -S /data/3306/mysql.sock #

mysql -uroot -p -S /data/3306/mysql.sock #

查看并清理多余用户

select user,host form mysql.user

主从复制配置

主库,称为Master 从库称为Slave。

1. 主库上执行操作

(1) 设置server-id 值并开启binlog设置

根据前文MySQL的同步原理,我们知道复制的关键因素就是binlog日志。

执行 vi /data/3306/my.cnf 编辑my.cnf配置文件,按如下两个参数内容修改:

[mysqld]

server-id =1

log-bin=/data/3306/mysql-bin

检查配置后的结果

grep -E "server-id|log-bin" /data/3306/my.cnf

log-bin=/data/3306/mysql-bin

server-id=1

(2) 建立用于同步的账号rep

mysql -uroot -p'' -S /data/3306/mysql.sock

grant replication slave on *.* to 'rep'@'10.0.0.%' identified by 'password';

(3) 锁表只读(当前窗口不要关闭)

生产环境时,操作主从复制,需要申请停机事件,锁表会影响业务。

flush tables with read lock;

interactive_timeout=60

wait_timeout=60

(4) 查看主库状态

查看主库状态,即当前日志文件名和二进制偏移量

show master status 命令显示的信息要记录在案,后面的从库复制时是从这个位置开始同步。

(5)导出数据库数据

单开新窗口,导出数据库数据,如果数据量比较大,可以停库直接打包数据文件迁移。

mkdir /server/backup/ -p

mysqldump -uroot -p'password' -S /data/3306/mysql.sock -A -B |gzip >/server/backup/mysql_bak.${date +%F}.sql.gz

ls -l /server/backup/mysql_bak.${date +%F}.sql.gz

导为了确保导库期间,数据库没有数据插入,可以再检查下主库状态信息

mysql -u root -p'password' -S /data/3306/mysql.sock -e "show master status"

导库后,解锁主库,恢复可写:

unlock tables;

(6) 把主库备份的MySQL数据迁移到从库

这不常用命令有scp,rsync等,相关命令前面的课程已详细讲解过了,这里就不多描述了。

本文讲解的是单数据库多实例主从配置,因此,数据在一台机器上,查看下数据

2 从库执行操作

(1) 设置server-id 值并关闭binlog设置

数据库的server-id一般在LAN内是唯一的,这里的server-id要和主库及其他从库不同,并解析掉从库的binlog参数配置执行vi /data/3307/my.cnf配置文件,按如下两个参数内容修改:

[mysqld]

server-id=2

#log-bin=/data/3307/mysql-bin

(2) 还原主库导出的数据备份

gzip -d mysql_bak.2014-04-17.sql.gz

mysql -uroot -p'password' -S /data/3307/mysql.sock < mysql_bak.2014-04-17.sql

(3) 登录从库配置同步参数

mysql -uroot -p'password' -S /data/3307/mysql.sock

CHANGE MASTER TO

MASTER_HOST='10.0.0.x', <==这里是主库的IP

MASTER_PORT=3306,  <==这里是主库的端口,从库端口可以和主库不同。

MASTER_USER='rep',<==这里是主库上建立的用于复制的用户rep

MASTER_PASSWORD='password',

MASTER_LOG_FILE='mysql-bin.0000008',<==这里是show master status时看到的查到二进制文件名称

MASTER_POS=342;<==这里是show master status时看到的查看二进制日志偏移量,注意不能多空格。

不登陆数据库,在命令行快速执行CHANGE MASTER的语句(适合在脚本中批量建Slave库用)

本文即用此法来操作

cat |mysql -uroot -p'password' -S /data/3307/mysql.sock<< EOF

CHANGE MASTER TO

MASTER_HOST='10.0.0.x',

MASTER_PORT=3306,

MASTER_USER='rep',

MASTER_PASSWORD='password',

MASTER_LOG_FILE='mysql-bin.0000008',

MASTER_LOG_POS=342;

EOF

也可登录数据库里面执行如下语句:

CHANGE MASTER TO

MASTER_HOST='192.168.1.234',

MASTER_PORT=3306,

MASTER_USER='rep',

MASTER_PASSWORD='password',

MASTER_LOG_FILE='mysql-bin.000010',

MASTER_LOG_POS=261;

(4) 启动从库同步开关

启动从库同步开关,并查看同步状态

mysql -uroot -p'password' -S /data/3307/mysql.sock -e "start slave;"

mysql -uroot -p'password' -S /data/3307/mysql.sock -e "show slave status\G;"

判断复制是否搭建成功就看如下IO和SQL两个线程是否显示为Yes状态

Slave_IO_Running:Yes  负责从库去主库读取Binlog日志,并写入从库的中继日志中

Slave_SQL_Runnint:Yes  负责读取并中继日志中Binlog,转换SQL语句后应用到数据库汇总

Ok 到此整个过程基本上完成了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值