MySQL主从复制其实是一个异步复制的过程,要实现首先需要在master上开启bin-log日志功能,整个过程需要开启3个线程,分别是master开IO线程,slave开启IO线程和SQL线程。
1,在从服务器上执行slave start ,从服务器IO线程会通过授权用户连接master,并要求master从指定的文件和位置之后发送bin-log日志内容。
2,master服务器接收到来自slave服务器的IO线程的请求后,master服务器上的IO线程根据slave服务器发送指定bin-log日志之后的内容,然后返回给slave端的IO线程。(返回的信息除了bin-log日志内容外,还有本次返回日志内容后在master服务器端的新的bin-log文件名以及bin-log中的下一个指定更新位置)
3,slave的IO线程收到信息后,将接收到的日志内容依次添加到slave端的relay-log文件的最末端,并将读取到master端的bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的告诉master“我需要从某个bin-log的那个位置往后的日志内容,发给我”
4,slave的SQL线程检测到relay-log中新增加了内容后,会马上解析relay-log的内容成为在master端真实执行时候的那些可执行的内容,并在自身执行。
如图所示:
一、搭建主从复制
5,安装ntp时间同步器
1)安装。
[root@master /]# yum -y install ntp
2)配置ntp服务。
[root@master /]# vim /etc/ntp.conf
18 restrict 192.168.100.0 mask 255.255.255.0 nomodify notrap 设置100.0网段的使用ntp
19 server 127.127.1.0 监听的IP地址,固定
20 fudge 127.127.1.0 stratum 8 设置时区
3)启动服务。
[root@master /]# systemctl start ntpd
[root@master /]# systemctl enable ntpd
[root@slave01 ~]# ntpdate 192.168.100.10
6,MySQL数据库主从配置。
1)修改主MySQL和备份MySQL的id号
[root@master ~]# vim /etc/my.cnf
49 log-bin=mysql-bin
57 server-id = 10
58 log-slave-update = true
[root@slave01 ~]# vim /etc/my.cnf
49 log-bin=mysql-bin
57 server-id = 20
58 relay-log=relay-bin
59 relay-log-index=slave-bin.index
[root@slave02 ~]# vim /etc/my.cnf
49 log-bin=mysql-bin
57 server-id = 30
58 relay-log=relay-bin
59 relay-log-index=slave-bin.index
[root@master ~]# systemctl restart mysqld
[root@slave ~]# systemctl restart mysqld
2)进入主MySQL。
[root@master ~]# mysql -u root -p
mysql> grant replication slave on . to ‘tongbu’@’%’ identified by ‘123456’;
Query OK, 0 rows affected (0.00 sec)
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000006 | 251 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
3)进入从MySQL。
[root@slave01]# mysql -u root -p
mysql> change master to master_host=‘192.168.100.10’,master_user=‘tongbu’,master_password=‘123456’,master_log_file=‘mysql-bin.000006’,master_log_pos=251;
Query OK, 0 rows affected (0.31 sec)
mysql> slave start
mysql> show slave status\G
[root@slave02]# mysql -u root -p
mysql> change master to master_host=‘192.168.100.10’,master_user=‘tongbu’,master_password=‘123456’,master_log_file=‘mysql-bin.000006’,master_log_pos=251;
Query OK, 0 rows affected (0.31 sec)
mysql> slave start
mysql> show slave status\
二、配置读写分离
7,MySQL数据库读写分离配置。
1.安装jdk和amoeba。
1)配置JDK。
[root@amoeba ~]# mkdir /usr/local/jdk
[root@amoeba /]# cp /usr/src/jdk-6u14-linux-x64.bin /usr/local
[root@amoeba local]# ./jdk-6u14-linux-x64.bin
[root@amoeba local]# mv ./jdk1.6.0_14/* ./jdk
2)安装amoeba。
[root@amoeba jdk]# mkdir /usr/local/amoeba
[root@amoeba jdk]# mv /usr/src/conf/* /usr/local/amoeba
3)配置环境变量。
[root@amoeba /]# vim /etc/profile.d/jdk.sh
export JAVA_HOME=/usr/local/jdk
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin:$PATH:$HOME/bin
export AMOEBA_HOME=/usr/local/amoeba
export PATH=$PATH:$AMOEBA_HOME/bin
[root@amoeba /]# source /etc/profile
[root@amoeba local]# java -version
4)设置amoeba账户管理权限。
[root@amoeba /]# chmod 755 /usr/local/amoeba/
2.设置amoeba读写分离账户。
1)设置主mysql允许test账户访问mysql,需要在主从上同时配置。
[root@master /]# mysql -uroot -p
mysql> grant all on . to ‘test’@‘192.168.100.%’ identified by ‘pwd@123’;
2)修改amoeba配置文件配置客户端访问amoeba的账户密码。(此文件中的用户是客户端访问mysql数据库使用的用户,并在其中设置写入池和读取池)
[root@amoeba /]# vim /usr/local/amoeba/amoeba.xml
10 <property name="port">8066</property> 客户端访问amoeba的端口
30 <property name="user">anoeba</property> 访问amoeba的账户
32 <property name="password">pwd@123</property> 访问amoeba账户的密码
115 <property name="defaultPool">master</property> 默认写mysql池的名字
116 <property name="writePool">master</property> 写入MySQL数据库的池
117
<property name="readPool">slaves</property> 读取MySQL数据库的池
3)设置amoeba服务器的host文件,添加解析主机名。(在群集中所有的服务器上配置,也可配置DNS)
[root@amoeba /]# vim /etc/hosts
192.168.100.10 master
192.168.100.20 slave01
192.168.100.40 amoeba
4)修改amoeba的配置文件添加服务器池。(此文件中的用户和目录是master数据库中授权的用户)
[root@amoeba /]# vim /usr/local/amoeba/dbServers.xml
26 <property name="user">test</property>
27 <property name="password">pwd@123</property>
42 <dbServer name="master" parent="abstractServer">
43 <factoryConfig>
44 <!-- mysql ip -->
45 <property name="ipAddress">192.168.100.10</property>
46 </factoryConfig>
47 </dbServer>
49 <dbServer name="slave01" parent="abstractServer">
50 <factoryConfig>
51 <!-- mysql ip -->
52 <property name="ipAddress">192.168.100.20</property>
53 </factoryConfig>
54 </dbServer>
56 <dbServer name="slave02" parent="abstractServer">
57 <factoryConfig>
58 <!-- mysql ip -->
59 <property name="ipAddress">192.168.100.30</property>
60 </factoryConfig>
61 </dbServer>
64 <dbServer name="slaves" virtual="true">
65 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
66 <property name="loadbalance">1</property>
67 <property name="poolNames">slave01,slave02</property>
68 </poolConfig>
69 </dbServer>
5)启动amoeba。
[root@amoeba /]# amoeba start&
[root@amoeba /]# netstat -anptu | grep 8066
[root@amoeba /]# netstat -anptu | grep java
6)客户端登录到数据库。
[root@Centos ~]# mysql -u amoeba -p -h 192.168.100.40 -P 8066