MySQL主从复制读写分离
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL主从复制读写分离相关的知识,希望对你有一定的参考价值。
一、概述
1.单个mysql问题
1)不支持高并发数
2)单点故障
3)数据丢失情况
2.主从复制
- 保证服务器之间的数据同步(主指写服务器,从指读服务器)
实现过程
1)当写服务器有数据写入时,数据将对应写入操纵完毕后,再将所有写入操作写入本地日志文件中(源码:/usr/local/mysql/data、RPM:/var/lib/mysql)
2)在读服务器中,一直有两个线程(I/O线程:拿取写服务器新增的日志文件内容到本地日志文件;SQL线程:从本地新增的本地日志文件中进入数据库进行重放操作)
3)读服务器的I/O线程去查询写服务器是否有新增日志文件内容,如有则将新增日志内容放在读服务器本地日志文件中
4)读服务器的SQL线程检查本地日志是否有新内容产生,如有则进行重放(将日志文件中的SQL语句都执行一次)操作
5)读服务器同步完毕后,通知写服务器,写服务器通知代理服务器,代理转告Web,Web告知客户端写入完毕
3.读写分离
- 由于数据库查询较多,写入较少,因此将读、写分离,使用多个读服务器,一个写服务器
实现过程
1)客户端访问Web,如需要数据库操作,Web将请求转发到代理服务器(Amoeba)
2)代理服务器通过配置,判断为读还是为写,如为读,将请求转发到读的服务器
3)读服务器收到请求后,拿取用户所需数据返回给代理服务器,代理再转交给Web,Web再交由客户端
4)如判断为写的操作,将请求转发到写的服务器
5)写服务器收到后,写入用户所需数据后,读服务器从写服务器同步数据,同步完毕后,写服务器回应代理服务器写入完毕
6)代理服务器回应Web,Web回应客户端写入完毕
实现方式:
-
代码层次:由开发人员内嵌分离代码,由Web服务器中网页做判断,是读还是写
- 软件层次:通过第三方软件,如Amoeba,软件中写明读、写服务器地址,由软件判断为读还是写
二、案例
实验环境:
- 需要五台服务器(写服务器:master。读服务器:slave01、slave02。读写调度器:amoeba。客户端client)
- 需至少有一块网卡为同一网段IP
写服务器master
1.环境准备
vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
IPADDR=192.168.1.30
NETMASK=255.255.255.0
rm -rf /etc/yum.repos.d/*
vim /etc/yum.repos.d/local.repo
[local]
name=local
baseurl=file:///mnt
gpgcheck=0
mount /dev/cdrom /mnt
yum -y install ntp ncurses-devel cmake
vim /etc/ntp.conf
server 127.127.1.0 //指定本地作为NTP服务器
fudge 127.127.1.0 stratum 8 //指定本地优先级大于网络同步NTP
/etc/init.d/ntpd restart && chkconfig --level 35 ntpd on
2.部署Mysql
tar zxvf /root/mysql-5.5.22.tar.gz -C /usr/src/
cd /usr/src/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
3.优化mysql
cp /usr/src/mysql-5.5.22/support-files/my-medium.cnf /etc/my.cnf
cp /usr/src/mysql-5.5.22/support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
chkconfig --add mysqld && chkconfig --level 35 mysqld on
echo "export PATH=$PATH:/usr/local/mysql/bin" >>/etc/profile && source /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
/etc/init.d/mysqld start
4.配置主从复制
vim /etc/my.cnf
50 log-slave-updates=true //允许从服务器同步
58 server-id=10 //标识符,三台不能一样
/etc/init.d/mysqld restart
mysql -u root -p
mysql> grant replication slave on *.* to ‘slave‘@‘192.168.1.%‘ identified by ‘123‘; //新建同步用户,专用于同步
mysql> flush privileges;
mysql> show master status; ##记住File的及Position的值,此处为master-bin.000001和337
读服务器slave01
1.环境准备
vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
IPADDR=192.168.1.10
NETMASK=255.255.255.0
rm -rf /etc/yum.repos.d/*
vim /etc/yum.repos.d/local.repo
[local]
name=local
baseurl=file:///mnt
gpgcheck=0
mount /dev/cdrom /mnt
yum -y install ntp ncurses-devel cmake
ntpdate 192.168.1.30
2.部署Mysql
tar zxvf /root/mysql-5.5.22.tar.gz -C /usr/src/
cd /usr/src/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
3.优化mysql
cp /usr/src/mysql-5.5.22/support-files/my-medium.cnf /etc/my.cnf
cp /usr/src/mysql-5.5.22/support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
chkconfig --add mysqld && chkconfig --level 35 mysqld on
echo "export PATH=$PATH:/usr/local/mysql/bin" >>/etc/profile && source /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
/etc/init.d/mysqld start
4.配置主从复制
vim /etc/my.cnf
50 relay-log=relay-log-bin //指定从服务器日志文件名
51 relay-log-index=slave-relay-bin.index //指定从服务器索引文件名
59 server-id=20
/etc/init.d/mysqld restart
mysql -u root -p
mysql> change master to master_host=‘192.168.1.30‘,master_user=‘slave‘,master_password=‘123‘,master_log_file=‘master-bin.000001‘,master_log_pos=333;
选项
master_host:指定主服务器IP
master_user:指定连接主服务器用户
master_password:指定连接主服务器用户的密码
master_log_file:指定主服务器日志文件名;主服务器show master status;查看
master_log_pos:指定主服务器的偏移值;主服务器show master status;查看
mysql> start slave;
mysql> show slave status G;
读服务器slave02
1.环境准备
vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
IPADDR=192.168.1.20
NETMASK=255.255.255.0
rm -rf /etc/yum.repos.d/*
vim /etc/yum.repos.d/local.repo
[local]
name=local
baseurl=file:///mnt
gpgcheck=0
mount /dev/cdrom /mnt
yum -y install ntp ncurses-devel cmake
ntpdate 192.168.1.30
2.部署Mysql
tar zxvf /root/mysql-5.5.22.tar.gz -C /usr/src/
cd /usr/src/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
3.优化mysql
cp /usr/src/mysql-5.5.22/support-files/my-medium.cnf /etc/my.cnf
cp /usr/src/mysql-5.5.22/support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
chkconfig --add mysqld && chkconfig --level 35 mysqld on
echo "export PATH=$PATH:/usr/local/mysql/bin" >>/etc/profile && source /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
/etc/init.d/mysqld start
4.配置主从复制
vim /etc/my.cnf
50 relay-log=relay-log-bin
51 relay-log-index=slave-relay-bin.index
59 server-id=30
/etc/init.d/mysqld restart
mysql -u root -p
mysql> change master to master_host=‘192.168.1.30‘,master_user=‘slave‘,master_password=‘123‘,master_log_file=‘master-bin.000001‘,master_log_pos=333;
mysql> start slave;
mysql> show slave status G;
读写调度器amoeba
1.环境准备
vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
IPADDR=192.168.1.254
NETMASK=255.255.255.0
2.安装jdk与amoeba
yum -y erase java-*
chmod +x jdk-6u14-linux-x64.bin
./jdk-6u14-linux-x64.bin
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
source /etc/profile && java -version
mkdir /usr/local/amoeba
tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
chmod -R 755 /usr/local/amoeba/
3.在主Mysql数据库新建授权用户
mysql -u root -p
mysql> grant all on *.* to [email protected]‘192.168.1.%‘ identified by ‘123‘;
4.编辑amoeba配置文件
vim /usr/local/amoeba/conf/amoeba.xml
30 <property name="user">hehe</property> //设置连接Amoeba用户
32 <property name="password">123</property> //设置连接Amoeba用户
115 <property name="defaultPool">master</property>
117 <property name="writePool">master</property> 注意删除<!-- -->的注释
118 <property name="readPool">slaves</property> //定义读服务器池
vim /usr/local/amoeba/conf/dbServers.xml
25 <!-- mysql user -->
26 <property name="user">haha</property> //设置连接Mysql的用户
28 <property name="password">123</property> //设置连接mysql的密码
**注意删除<!-- -->的注释**
43 <dbServer name="master" parent="abstractServer">
44 <factoryConfig>
45 <!-- mysql ip -->
46 <property name="ipAddress">192.168.1.10</property> //定义写服务器IP
47 </factoryConfig>
48 </dbServer>
49 <dbServer name="slave1" parent="abstractServer">
50 <factoryConfig>
51 <!-- mysql ip -->
52 <property name="ipAddress">192.168.1.20</property> //定义读服务器IP
53 </factoryConfig>
54 </dbServer>
55 <dbServer name="slave2" parent="abstractServer">
56 <factoryConfig>
57 <!-- mysql ip -->
58 <property name="ipAddress">192.168.1.30</property> //定义读服务器IP
59 </factoryConfig>
61 </dbServer>
62 <dbServer name="slaves" virtual="true">
68 <property name="poolNames">slave1,slave2</property> //定义输入slaves读服务器池的主机
69 </poolConfig>
amoeba start &
netstat -utpln | grep 8066
客户端client
vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
IPADDR=192.168.1.100
NETMASK=255.255.255.0
rm -rf /etc/yum.repos.d/*
vim /etc/yum.repos.d/local.repo
[local]
name=local
baseurl=file:///mnt
gpgcheck=0
mount /dev/cdrom /mnt
yum -y install mysql
mysql -u hehe -p -h 192.168.1.254 -P 8066
mysql>show databases;
mysql>create dabase hehe;
mysql>show datasbases;
以上是关于MySQL主从复制读写分离的主要内容,如果未能解决你的问题,请参考以下文章
MySQL主从复制以及读写分离(❤❤❤❤含理论和实验❤❤❤❤大家中秋快乐!㊗)