一、概述1.单个MySQL问题1)不支持高并发数2)单点故障3)数据丢失情况2.主从复制保证服务器之间的数据同步(主指写服务器,从指读服务器)实现过程1)当写服务器有数据写入时,数据将对应写入操纵完毕
一、概述
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 haha@'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=localbaseurl=file:///mntgpgcheck=0
mount /dev/cdrom /mnt
yum -y install mysql
mysql -u hehe -p -h 192.168.1.254 -P 8066mysql>show databases;mysql>create dabase hehe;mysql>show datasbases;