Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过。但在实际的生产环境中,由单台Mysql作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面。

因此,一般来说都是通过 主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力 这样的方案来进行部署与实施的。


如下图所示:


mysql 主从复制_第1张图片



主从复制目的:

主从服务器设置的稳健性得以提升,如果主服务器发生故障,可以把本来作为备份的从服务器提升为新的主服务器。

在主从服务器上分开处理用户的请求,读的话,可以直接读取备机数据,可获得更短的响应时间。


用从服务器做数据备份而不会占用主服务器的系统资源




MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践


环境:二台虚拟机,linux系统


主mysql:  master   192.168.0.35


从mysql:  slave       192.168.0.36


操作方法:1.二台虚拟机分别安装mysql服务器

                2.分别修改二台mysal的配置文件,如端口

                3.修改完成后把mysql服务开启,设置为开机启动

                4.做测试操作,主mysql服务器上创建测试数据库,从mysql服务器在修改配置文件并重启

                5.数据同步




一.安装mysql




master 服务器上安装mysql


1.进入到cd /usr/local/src/目录下


2.用wget   http://mirrors.sohu.com/mysql/MySQL-5.1/mysql-5.1.73-linux-i686-glibc23.tar.gz


3.解压安装 tar zxf mysql-5.1.73-linux-i686-glibc23.tar.gz


4.创建mysql的账户

useradd -s /sbin/nologin -M mysql 

-s:shell 

-M:不建立使用者目录


5.把解压后的文件移到并重命名/usr/local/mysql目录下

mv mysql-5.1.73-linux-i686-glibc23 /usr/local/mysql1


6.进入到/usr/local/mysql下

cd /usr/local/mysql1


7.创建一个存放数据库的文件夹并更改权限

mkdir -p /data/mysql1

chown -R mysql /data/mysql1


8.初始化数据库

进入数据库的目录

cd /usr/local/mysql1


./scripts/mysql_install_db --user=mysql --datadir=/data/mysql1


注:如何查看初始化有没有完成,只要出现2个ok就表示成功了

或者echo $?结果为0即表示成功



9.把不同的文件放到不同的目录下,先进入配置文件里

cd support-files/


10.拷贝my-large.cnf文件到/etc/my.cnf下

cp my-large.cnf /etc/my.cnf 按y


11.拷贝mysql.server文件到/etc/init.d/mysqld目录下

cp mysql.server /etc/init.d/mysql1

vim !$可以打开刚拷贝的文件

修改basedir=/usr/local/mysql1  ---mysql所在的位置

       datedir=/data/mysql1  ----数据库所在的位置



12.把mysqld加入到系统启动中

chkconfig --add mysql1

把mysqld打开

chkconfig mysql1 on

启动mysqld

/etc/init.d/mysql1 start


13.查看mysqld的启动状态

ps aux |grep mysqld

查看port

netstat -lnpe |grep mysqld






slave 服务器上安装mysql



1.进入到cd /use/local/src/目录下


2.用wget   http://mirrors.sohu.com/mysql/MySQL-5.1/mysql-5.1.73-linux-i686-glibc23.tar.gz


3.解压安装 tar zxf mysql-5.1.73-linux-i686-glibc23.tar.gz


4.创建mysql的账户

useradd -s /sbin/nologin -M mysql 

-s:shell 

-M:不建立使用者目录


5.把解压后的文件移到并重命名/usr/local/mysql目录下

mv mysql-5.1.73-linux-i686-glibc23 /usr/local/mysql2


6.进入到/usr/local/mysql下

cd /usr/local/mysql2


7.创建一个存放数据库的文件夹并更改权限

mkdir -p /data/mysql2

chown -R mysql /data/mysql2


8.初始化数据库

进入数据库的目录

cd /usr/local/mysql2

./scripts/mysql_install_db --user=mysql --datadir=/data/mysql2


注:如何查看初始化有没有完成,只要出现2个ok就表示成功了

或者echo $?结果为0即表示成功



9.把不同的文件放到不同的目录下,先进入配置文件里

cd support-files/


10.拷贝my-large.cnf文件到/etc/my.cnf下

cp my-large.cnf /etc/my.cnf 按y


11.拷贝mysql.server文件到/etc/init.d/mysqld目录下

cp mysql.server /etc/init.d/mysql2

vim !$可以打开刚拷贝的文件

修改basedir=/usr/local/mysql2 ---mysql所在的位置

       datedir=/data/mysql2  ----数据库所在的位置



打开vim /etc/my.cnf

[mysqld]

port            = 3306                        -----改为3307

socket          = /tmp/mysql.sock    

skip-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




12.把mysqld加入到系统启动中

chkconfig --add mysql2

把mysqld打开

chkconfig mysql2 on

启动mysqld

/etc/init.d/mysql2 start


13.查看mysqld的启动状态

ps aux |grep mysqld

查看port

netstat -lnpe |grep mysqld







二.修改vi /etc/my.cnf参数




master操作


1.vi /etc/my.cnf


在[mysqld]下添加一行参数


log_bin=master-log  添加启动二进制日志文件


mysql 主从复制_第2张图片


2.重新/etc/my.cnf


/etc/init.d/mysql1 restart




slave操作


1.vi /etc/my.cnf


在[mysqld]下添加一行参数



  relay-log=relay-log     中继日志



mysql 主从复制_第3张图片


2.重新/etc/my.cnf


/etc/init.d/mysql2 restart







三.mysql的操作







master操作


1.创建一个同步使用的账号(mysql)


进入数据库

mysql


grant replication slave on *.* to 'user'@'192.168.0.36' identified by '123123';

赋予192.168.0.36也就是slave机器有File权限


2.刷新权限


flush privileges;


3.查看数据库信息


SHOW MASTER STATUS;


wKiom1hG4UDSl5-NAAAXkl1gL18017.png-wh_50





slave操作


1.进入数据库

mysql


2.设置连接主服务器的相关信息


 CHANGE MASTER TO MASTER_HOST='192.168.0.35',

    -> MASTER_USER='user',

    -> MASTER_PASSWORD='123123',

    -> MASTER_LOG_FILE='master-log.000001'# 复制主节点的二进制的日志文件  

    -> MASTER_LOG_POS=106;                  # 复制主节点二进制日志开始的位置



3.查看节点信息,发现未启动


SHOW SLAVE STATUS\G


mysql 主从复制_第4张图片



4.启动复制进程


START SLAVE;


SHOW SLAVE STATUS\G


mysql 主从复制_第5张图片







四.创建数据库,查看从服务器是否有同步






master操作


1.创建一个同步数据库

create database exam;


2.创建一个表结构


插入数据

insert into命令格式:insert into <表名> [(<字段名1>[,..<字段名n > ])] values ( 值1 )[, ( 值n )];


3.使用数据库


use exam;


create table myrise (id varchar(20),username varchar(20),password varchar(20));


insert into myrise values('x01','user1','123'),('x02','user2','123');


create table myhome(id varchar(20),username varchar(20),password varchar(20));


insert into myhome values('x01','user1','123'),('x02','user2','123');



create table myzixun(id varchar(20),username varchar(20),password varchar(20));


insert into myzixun values('x01','user1','123'),('x02','user2','123');



4.查看数据库


SHOW DATABASES;


mysql 主从复制_第6张图片






slave操作


SHOW DATABASES;


mysql 主从复制_第7张图片



出现如下错误的解决方法


wKioL1hG4haTU_KJAAAdNMQJKzg346.png-wh_50


mysql> slave stop;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> reset slave;

Query OK, 0 rows affected,(0.00 sec)