通过主从复制(Master-Slave)同步数据,通过读写分离提升数据库的并发负载能力。通过一台主MYSQL和两台从MYSQL做数据复制,前端应用在进行数据库写操作是,对主设备进行操作,在进行数据库读操作时,对两台从设备进行操作。
基于语句的复制
在主服务器上执行SQL语句,在从服务器上执行同样的语句。MYSQL默认采用基于语句的复制。
基于行的复制
把改变的内容复制过去,而不是把命令在从服务器上执行一遍
混合类型的复制
默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。
主从复制是通过中继二进制日记实现的。主端记录二进制日记,从端读取二进制日记。
Amoeba(变形虫)代理程序:客户端访问时去找代理服务器。
(主机1:客户端) Vnmet8 关闭防火墙 固化IP;IPADDR=192.168.1.111
(主机2:amoeba调度器) Vmnet8 关闭防火墙 IPADDR=192.168.1.110
(主机3:主MYSQL) Vmnet8 关闭防火墙 IPADDR=192.168.1.101
(主机4:从MYSQL1) Vmnet8 关闭防火墙 IPADDR=192.168.1.102
(主机5:从MYSQL2) Vmnet8 关闭防火墙 IPADDR=192.168.1.103
建立时间同步环境,在主节点上搭建时间同步服务器
主机3
rpm -q ntp
#查看当前时间
date
#更新当前时间
date -s “2017-4-2 2:20:20”
vim /etc/ntp.conf
server 127.127.1.0
fudge 127.127.1.0 stratum 8
service ntpd restart
netstat -anu | grep :123
主机4
rpm -q ntpdate
ntpdate 192.168.1.101
date
主机5
rpm -q ntpdate
ntpdate 192.168.1.101
date
主机2
#预安装jdk环境
cd /media/20150729-135701/Y2C
cp jdk-6u14-linux-x64.bin amoeba-mysql-binary-2.2.0.tar.gz /usr/src
cd /usr/src
chmod +x /usr/src/jdk-6u14-linux-x64.bin
./jdk-6u14-linux-x64.bin
yes
mv jdk1.6.0_14/ /usr/local/jdk1.6
vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.6
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
. /etc/profile
echo $PATH
mkdir /usr/local/amoeba
tar zxf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba
chmod -R 755 /usr/local/amoeba
amoeba
amoeba stop | start //显示此内容说明Amoeba安装成功
#配置amoeba读写分离,两个Slave读负载均衡。
cd /usr/local/amoeba/conf
#编辑amoeba.xml配置文件
vim amoeba.xml
<property name=”authenticator”>
<bean class=”com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator”>
改 <property name=”user”>amoeba</property>
改 <property name=”password”>123456</property>
<property name=”filter”>
<bean class=“com.meidusa.amoeba.server.IPAccessController”>
<queryRouter class=”com.meidusa.amoeba.mysql.parser.MysqlQueryrouter”>
<property name=”ruleLoader”>
改 <property name=”defaultPool”>master</property>
删 <!--
改 <property name=”writePool”>master</property>
改 <property name=”readPool”>slaves</property>
删 --!>
</queryRouter>
#关于数据库服务器的相关配置
vim dbServers.xml
--snip--
<!-- mysql user -->
改 <property name=”user”>test</property>//连接服务器的用户名
<!-- mysql password -->
改 <property name=”password”>123.com</property>
--snip--
改 <dbServer name=”master” parent=”abstractServer”>//定义服务器
<factoryConfig>
<!--mysql ip -->
改 <property name=”ipAddress”>192.168.1.101</property>
</factoryConfig>
</dbServer>
改 <dbServer name=”slave1” parent=”abstractServer”>//定义服务器
<factoryConfig>
<!--mysql ip -->
改 <property name=”ipAddress”>192.168.1.102</property>
</factoryConfig>
</dbServer>
改 <dbServer name=”slave2” parent=”abstractServer”>//定义服务器
<factoryConfig>
<!--mysql ip -->
改 <property name=”ipAddress”>192.168.1.103</property>
</factoryConfig>
</dbServer>
改 <dbServer name=”slaves” virtual=”ture”>
<property name=”loadbalance”>1</property> //负载均衡的算法:轮询
改 <property name=”poolNames”>slave1,slave2<.property>//定义服务器池
</dbServer>
主机3
#编译安装cmake软件
rpm -q ncurses-devel
rpm -q mysql
cd /media/20150729-135701/Y2C
cp cmake-2.8.6.tar.gz mysql-5.5.22.tar.gz /usr/src
cd /usr/src
tar zxf cmake-2.8.6.tar.gz
cd cmake-2.8.6
./configure && gmake && gmake install
#编译安装mysql服务
cd ..
tar zxf mysql-5.5.22.tar.gz
cd mysql-5.5.22
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DSYSCONFDIR=/etc && make && make install
#配置mysql服务
cp support-files/my-medium.cnf /etc/my.cnf //输入yes
cp support-files/mysql.server /etc/rc.d/init.d/mysqld
chmod +x /etc/rc.d/init.d/mysqld
chkconfig --add mysqld
echo “PATH=$PATH:/usr/local/mysql/bin” >> /etc/profile #加入管理队列
vim /etc/profile
改 export PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/sbin****
. /etc/profile
groupadd mysql
useradd -M -s /sbin/nologin mysql -g mysql
chown -R mysql:mysql /usr/local/mysql/
/usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql #初始化数据库
service mysqld start
chkconfig mysqld on
mysqladmin -u root password ‘pwd123’
#配置mysql主服务器功能
vim /etc/my.cnf
改 server-id =11
改 log-bin=master-bin //声明开启二进制功能身份为主
改 log-slave-updates=ture
service mysqld restart
mysql -u root -p //登陆mysql程序,给从服务器授权
>grant replication slave on *.* to ‘myslave’@’192.168.1.%’ identified by ‘123456’; //定义哪些主机可以以此用户的身份进行链接同步
>flush privileges; //更新权限
>show master status; //查看偏移量并记录
主机4
rpm -q ncurses-devel
rpm -q mysql
cd /media/20150729-135701/Y2C
cp cmake-2.8.6.tar.gz mysql-5.5.22.tar.gz /usr/src
cd /usr/src
tar zxf cmake-2.8.6.tar.gz
cd cmake-2.8.6
./configure && gmake && gmake install
#编译安装mysql服务
cd ..
tar zxf mysql-5.5.22.tar.gz
cd mysql-5.5.22
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DSYSCONFDIR=/etc && make && make install
cp support-files/my-medium.cnf /etc/my.cnf //输入yes
cp support-files/mysql.server /etc/rc.d/init.d/mysqld
chmod +x /etc/rc.d/init.d/mysqld
chkconfig --add mysqld
echo “export PATH=$PATH:/usr/local/mysql/bin” >> /etc/profile //加入管理队列
. /etc/profile
useradd -M -s /sbin/nologin mysql
chown -R mysql:mysql /usr/local/mysql/
/usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql #初始化数据库
service mysqld start
chkconfig mysqld on
mysqladmin -u root password ‘pwd123’
#配置mysql从服务器的功能
mysql -u root -p
vim /etc/my.cnf
改 server-id =22
改 relay-log=relay-log-bin //开启中继二进制功能
改 relay-log-index=slave-relay-bin.index
service mysqld restart
mysql -u root -p //登陆mysql程序,给从服务器授权
>change master to master_host=’192.168.1.101’,master_user=’myslave’,
master_password=’123456’,master_log_file=’master-bin.000001’,master_log_pos=496; //master_log_pos=加自己的偏移量
>start slave;
>show slave status\G; //查看状态
Slave_IO_Running:yes //都为yes便成功
Slave_SQL_Running:yes
主机5
rpm -q ncurses-devel
rpm -q mysql
cd /media/20150729-135701/Y2C
cp cmake-2.8.6.tar.gz mysql-5.5.22.tar.gz /usr/src
cd /usr/src
tar zxf cmake-2.8.6.tar.gz
cd cmake-2.8.6
./configure && gmake && gmake install
#编译安装mysql服务
cd ..
tar zxf mysql-5.5.22.tar.gz
cd mysql-5.5.22
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DSYSCONFDIR=/etc && make && make install
cp support-files/my-medium.cnf /etc/my.cnf //输入yes
cp support-files/mysql.server /etc/rc.d/init.d/mysqld
chmod +x /etc/rc.d/init.d/mysqld
chkconfig --add mysqld
echo “export PATH=$PATH:/usr/local/mysql/bin” >> /etc/profile //加入管理队列
. /etc/profile
useradd -M -s /sbin/nologin mysql
chown -R mysql:mysql /usr/local/mysql/
/usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql #初始化数据库
service mysqld start
chkconfig mysqld on
mysqladmin -u root password ‘pwd123’
#配置mysql从服务器的功能
mysql -u root -p
vim /etc/my.cnf
改 server-id =22
改 relay-log=relay-log-bin //开启中继二进制功能
改 relay-log-index=slave-relay-bin.index
service mysqld restart
mysql -u root -p //登陆mysql程序,给从服务器授权
>change master to master_host=’192.168.1.101’,master_user=’myslave’,
master_password=’123456’,master_log_file=’master-bin.000001’,master_log_pos=496; //master_log_pos=加自己的偏移量
>start slave;
>show slave status\G; //查看状态
Slave_IO_Running:yes //都为yes便成功
Slave_SQL_Running:yes
配置Amoeba读写分离,两个Slave读负载均衡
(主机3)>grant all on . to test@’192.168.1.%’ indentified by ‘123.com’; //Master、Slave1、Slave2中开放权限给Amoeba访问
(主机4)>grant all on . to test@’192.168.1.%’ indentified by ‘123.com‘; //Master、Slave1、Slave2中开放权限给Amoeba访问
(主机5)>grant all on . to test@’192.168.1.%’ indentified by ‘123.com’; //Master、Slave1、Slave2中开放权限给Amoeba访问
(主机2)#amoeba start &
测试主从同步
show databases; //查看有几个数据库
(主机3) >create database db_test;
show databases;
(主机5)>show databases; //此时增加了新库db_test
参考资料 :http://www.111cn.net/database/mysql/65579.htm
MySQL主主复制结构区别于主从复制结构。在主主复制结构中,两台服务器的任何一台上面的数据库存发生了改变都会同步到另一台服务器上,这样两台服务器互为主从,并且都能向外提供服务。
有了上一节的主从复制,那么主主复制就很容易了。
服务器A(192.168.1.254)配置如下
log-bin = mysql-bin
server-id = 1
expire-logs-days = 100
replicate-do-db = test
binlog-ignore-db = mysql
binlog-ignore-db = information_schema
auto-increment-increment = 2
auto-increment-offset = 1
服务器B(192.168.1.252)配置
log-bin = mysql-bin
server-id = 2
expire-logs-days = 100
replicate-do-db = test
binlog-ignore-db = mysql
binlog-ignore-db = information_schema
auto-increment-increment = 2
auto-increment-offset = 2
两台服务器都重启
mysql> service mysqld restart
二都只有server-id不同和 auto-increment- offset不同.
auto-increment-offset是用来设定数据库中自动增长的起点的,回为这两能服务器都设定了一次自动增长值2,所以它们的起点必须得不同,这样才能避免两台服务器数据同步时出现主键冲突
replicate-do-db 指定同步的数据库,我们只在两台服务器间同步test数据库
另:auto-increment-increment的值应设为整个结构中服务器的总数,本案例用到两台服务器,所以值设为2
本文是用test做的实验,导出将test.sql文件从254服务器拷贝到252服务器
备份数据前先锁表,保证数据一致性
mysql> FLUSH TABLES WITH READ LOCK;
mysqldump -uroot -p123456 test> /tmp/test.sql;
mysql> UNLOCK TABLES;
scp /tmp/test.sql [email protected]:/tmp
在服务器A(192.168.1.254)上
mysql> GRANT REPLICATION SLAVE ON . TO ‘mysync’@‘192.168.1.252’ IDENTIFIED BY PASSWORD ‘123456’;
mysql> flush privileges;
在服务器B(192.168.1.252)上
mysql> GRANT REPLICATION SLAVE ON . TO ‘mysync’@‘192.168.1.254’ IDENTIFIED BY PASSWORD ‘123456’;
mysql> flush privileges;
在服务器A(192.168.1.254)
mysql> show master status;
±-----------------±---------±-------------±-------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
±-----------------±---------±-------------±-------------------------+
| mysql-bin.000006 | 106 | | mysql,information_schema |
±-----------------±---------±-------------±-------------------------+
在服务器A(192.168.1.252)
mysql> show master status;
±-----------------±---------±-------------±-------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
±-----------------±---------±-------------±-------------------------+
| mysql-bin.000008 | 192 | | mysql,information_schema |
±-----------------±---------±-------------±-------------------------+
在A服务器(192.168.1.254)上执行
mysql> change master to master_host=‘192.168.1.252’,master_user=‘mysync’,master_password=‘123456’,master_log_file=‘mysql-bin.000008’,master_log_pos=192;
在B服务器(192.168.1.252)上执行
mysql> change master to master_host=‘192.168.1.254’,master_user=‘mysync’,master_password=‘123456’,master_log_file=‘mysql-bin.000006’,master_log_pos=106;
mysql> start slave;
mysql> show slave status\G
A服务器(192.168.1.254)状态如下:
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.252
Master_User: mysync
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000008
Read_Master_Log_Pos: 192
Relay_Log_File: mysqld-relay-bin.000009
Relay_Log_Pos: 337
Relay_Master_Log_File: mysql-bin.000008
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: test
B服务器(192.168.1.252)状态如下:
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.254
Master_User: mysync
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000006
Read_Master_Log_Pos: 106
Relay_Log_File: mysqld-relay-bin.000014
Relay_Log_Pos: 251
Relay_Master_Log_File: mysql-bin.000006
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: test
当看到了两个yes,即:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
说明已经配置成功了
接下来看可以做一下实验,测试一下是否同步
在测试的过程当中,我也遇到一些问题主要是两台机器互相通信的问题
请注意,一定要保持两台的服务器的mysql端口都向对方打开,要不然是不能成功同步的。