MySQL主从复制与读写分离

搭建mysql的master-slave环境
一.mysql主从备份(复制)的基本原理
mysql支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。mysql复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新、删除等等)。因此,要进行复制,必须在主服务器上启用二进制日志。每个从服务器从主服务器接收主服务器已经记录到其二进制日志的保存的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,并在本机上执行相同的更新。然后封锁并等待主服务器通知新的更新。从服务器执行备份不会干扰主服务器,在备份过程中主服务器可以继续处理更新。
二.主从备份的实现细节
mysql使用3个线程来执行复制功能(其中1个在主服务器上,另两个在从服务器上)。当发出start slave时,从服务器创建一个I/O线程,以连接主服务器并让它发送记录在其二进制日志中的语句。主服务器创建一个线程将二进制日志中的内容发送到从服务器。该线程可以即为主服务器上show processlist输出中的Binlog Dump线程。从服务器I/O线程读取主服务器Binlog Dump线程发送的内容并将该数据拷贝到从服务器数据目录中的本地文件中,即中继日志。第3个线程是sql线程,由从服务器创建,用于读取中继日志并执行日志中包含的更新。
三.配置
在进行mysql主从备份时,最好确保主从服务器的版本兼容。从服务器至少与主服务器版本相同或更高。
主数据库服务器ip:10.80.3.87
从数据库服务器ip:10.80.3.86
主机(master)配置:
1.修改mysql配置文件my.cnf
在[mysqld]标签下添加以下几行
log-bin=mysql-bin #开启二进制日志
server-id=1 #主服务器id号,自定义
#binlog-do-db=db_nameA #指定对db_nameA记录二进制日志
#binlog-ignore-db=db_namB #指定不对db_namB记录二进制日志
#expire_logs_days=2  # 自动清理 2 天前的log文件,可根据需要修改  
注意:
log-bin,server-id是配置文件中必须添加的内容。此时主服务器默认对所有数据库进行备份。如果需要特殊指明只对某个数据库进行备份或不备份,则可以加入binlog-do-db和binlog-ignore-db选项
2.为从服务器添加复制账户并配置权限
在Master MySQL上创建一个用户‘repl’,并允许其他Slave服务器可以通过远程访问Master,通过该用户读取二进制日志,实现数据同步。
mysql>create user repl;
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'10.80.5.%' IDENTIFIED BY 'mysql';
从机(slave)配置:
修改mysql配置文件my.cnf
在[mysqld]标签下添加:
server-id=2
#log-bin=mysql-bin
#master-connect-retry=60 # 链接重连间隔(单位s)
replicate-ignore-db=mysql # 不从主机同步的数据库(多个写多行)
#replicate-do-db=db1 # 要从主机同步的库(多个写多行)
#replicate-do-db=db2 # 要从主机同步的库(多个写多行)
#log-slave-update # 启用从机服务器上的slave日志功能,使这台计算机可以用来构成一个镜像链(A->B->C)
slave-skip-errors # 跳过错误,从机一般应该配置该项
 
主从配置文件修改完成,重启MySQL
登录主服务器MySQL,查看master状态:
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 | 535 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
登录从服务器MySQL,查看slave状态:
mysql> change master to  
master_host = '10.80.3.87',  
master_user = 'repl',  
master_password = 'mysql',  
master_log_file = 'mysql-bin.000003',  
master_log_pos = 0; # 0代表日志开始位置  
mysql> start slave #启动slave
mysql> show slave status\G
注:Slave_IO及Slave_SQL进程必须正常运行,即YES状态,否则都是错误的状态(如:其中一个NO均属错误)
至此,主从服务器配置完成。
四.测试
主服务器Mysql中,建立数据库,并在这个库中建表插入一条数据,随后在从服务器MySQL中可以查到同样的数据。
######################################################################
搭建database proxy
amoeba代理服务器ip:10.80.3.80
基于 Amoeba 实现mysql数据库读写分离的配置
简要原理图
 
Amoeba是java编写的,运行需要JDK环境,下载jdk1.6 http://www.oracle.com/technetwork/java/javase/downloads/java-se-6u24-download-338091.html
chmod +x jdk-6u24-linux-x64.bin
./jdk-6u24-linux-x64.bin
cd jdk1.6.0_24/
mkdir /usr/local/jdk
cp -rf * /usr/local/jdk/
vim /etc/profile.d/java.sh 添加一下内容
JAVA_HOME="/usr/local/jdk"
CLASS_PATH="$JAVA_HOME/lib:$JAVA_HOME/jre/lib"
PATH=".:$PATH:$JAVA_HOME/bin"
export JAVA_HOME
保存退出
source /etc/profile.d/java.sh
java -version 查看版本
amoeba下载地址: https://sourceforge.net/projects/amoeba/files/Amoeba%20for%20mysql/3.x/ 最新版本为amoeba-mysql-3.0.5-RC
unzip amoeba-mysql-3.0.5-RC-distribution.zip -d /usr/local/
cd /usr/local
mv amoeba-mysql-3.0.5-RC-distribution amoeba
cd amoeba/conf
实现读写分离只需配置amoeba.xml,dbServers.xml
启动amoeba
launcher
mysql -uroot -p -h127.0.0.1 -P8066
 
出现红框信息说明通过中间代理登录到MySQL
测试读写分离(node1:master node2:slave)
在node3上操作
use mydb
create table stu(name varchar(10),age int);
select * from stu;
insert into stu values('bill',35);
同时查看node1,node2上MySQL的操作日志,如未开启日志功能需开启
show global variables like 'general_log';
set global general_log=1;
show global variables like 'general_log';
tail -f /var/run/mysqld/mysqld.log
node1:
node2:
可以看到写操作insert发生在master上,slave同步执行了这条语句
读操作select仅在slave上发生
通过以上验证得知简单的master-slave读写分离得以生效
 
常用命令:
show binlog events;查看二进制日志事件
reset master;删除所有二进制日志文件并清空所有二进制日志索引文件
reset slave;删除slave复制所用的所有文件
posted @ 2019-02-16 17:45  RockinRobin  阅读(468)  评论(2编辑  收藏  举报