MySQL主从复制读写分离
mysql主从与读写分离
主从复制:保证服务器之间的数据同步(主指写服务器,从指读服务器)
实现过程
1)当写服务器有数据写入时,数据将对应写入操纵完毕后,再将所有写入操作写入本地日志文件中(源码:/usr/local/mysql/data、RPM:/var/lib/mysql)
2)在读服务器中,一直有两个线程(I/O线程:拿取写服务器新增的日志文件内容到本地日志文件;SQL线程:从本地新增的本地日志文件中进入数据库进行重放操作)
3)读服务器的I/O线程去查询写服务器是否有新增日志文件内容,如有则将新增日志内容放在读服务器本地日志文件中
4)读服务器的SQL线程检查本地日志是否有新内容产生,如有则进行重放(将日志文件中的SQL语句都执行一次)操作
5)读服务器同步完毕后,通知写服务器,写服务器通知代理服务器,代理转告Web,Web告知客户端写入完毕
读写分离:由于数据库查询较多,写入较少,因此将读、写分离,使用多个读服务器,一个写服务器
实现过程
1)客户端访问Web,如需要数据库操作,Web将请求转发到代理服务器(Amoeba)
2)代理服务器通过配置,判断为读还是为写,如为读,将请求转发到读的服务器
3)读服务器收到请求后,拿取用户所需数据返回给代理服务器,代理再转交给Web,Web再交由客户端
4)如判断为写的操作,将请求转发到写的服务器
5)写服务器收到后,写入用户所需数据后,读服务器从写服务器同步数据,同步完毕后,写服务器回应代理服务器写入完毕
6)代理服务器回应Web,Web回应客户端写入完毕
实现方式:
1)代码层次:由开发人员内嵌分离代码,由Web服务器中网页做判断,是读还是写
2)软件层次:通过第三方软件,如Amoeba,软件中写明读、写服务器地址,由软件判断为读还是写
案例:主从复制
环境:5台服务器(1台写服务器(192.168.1.10),两台读服务器(192.168.1.20,30),一台Amoeba(192.168.1.40),一台客户端(192.168.1.50))
写服务器搭建(192.168.1.10)
1.环境准备
1)配置ip
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
reboot
2)`配置本地yum
rm -rf /etc/yum.repos.d/*
//删除本地yum源
vim /etc/yum.repos.d/local.repo
[local]
name=local
baseurl=file:///mnt
gpgcheck=0
mount /dev/cdrom /mnt
//挂载
3)
yum -y install ntp ncurses-devel cmake
//下载安装包
4)
vim /etc/ntp.conf
server 127.127.1.0
//添加指定本地作为NTP服务器
fudge 127.127.1.0 stratum 8
//添加指定本地优先级大于网络同步NTP
5)
/etc/init.d/ntpd restart && chkconfig --level 35 ntpd on
//重启服务并设置3,5级别开机自动开启
2.部署mysql
上传安装包
1)
tar -zxvf mysql-5.5.22.tar.gz -C /usr/src/
//解压到/usr/src/目录下
2)
cd /usr/src/mysql-5.5.22/
3)
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DSYSCONFDIR=/etc
选项:
-DCMAKE_INSTALL_PREFIX:指定MySQL安装位置
-DDEFAULT_CHARSET:指定默认字符集编码
-DDEFAULT_COLLATION:指定默认使用字符集校对规则
-DWITH-EXTRA-CHARSETS:指定额外支持的其他字符集编码
-DSYSCONFDIR:配置文件存储位置
4)编译并安装
make && make install
3.优化mysql
1)
cp /usr/src/mysql-5.5.22/support-files/my-medium.cnf /etc/my.cnf
//拷贝源码目录提供配置文件
2)
cp /usr/src/mysql-5.5.22/support-files/mysql.server /etc/init.d/mysqld
//拷贝服务脚本文件到/etc/init.d/目录下并改名为mysqld
3)
chmod +x /etc/init.d/mysqld
//增加执行权限
4)
chkconfig --add mysqld && chkconfig --level 35 mysqld on
5)
echo "export PATH=$PATH:/usr/local/mysql/bin" >>/etc/profile && source /etc/profile
//添加mysql命令到搜索路径,并让profile文件生效。
6)
useradd -M -s /sbin/nologin mysql
//新建mysql用户并不能登陆
7)
chown -R mysql:mysql /usr/local/mysql
//更改所有组和所有者为mysql
8)
usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
//执行初始化脚本,生成默认的库和表
9)
/etc/init.d/mysqld start
//启动mysql服务
4.配置主从复制
1)
vim /etc/my.cnf
50 log-slave-updates=true
//允许从服务器同步
58 server-id=10
//标识符,三台不能一样
2)
/etc/init.d/mysqld restart
//重启mysql服务
3)
mysql -u root -p
//登陆mysql数据库默认密码为空
grant replication slave on *.* to 'slave'@'192.168.1.%' identified by '123';
//新建同步用户,专用于同步
flush privileges;
//刷新
show master status;
##记住File的及Position的值,此处为master-bin.000004
和332
读服务器1(192.168.1.20)
1.环境准备
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
reboot
2)
rm -rf /etc/yum.repos.d/*
3)
vim /etc/yum.repos.d/local.repo
[local]
name=local
baseurl=file:///mnt
gpgcheck=0
4)
mount /dev/cdrom /mnt
5)
yum -y install ntp ncurses-devel cmake
6)
ntpdate 192.168.1.10
2.部署mysql
上传包
1)
tar -zxvf mysql-5.5.22.tar.gz -C /usr/src/
2)
cd /usr/src/mysql-5.5.22/
3)
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DSYSCONFDIR=/etc/
//初始化脚本并生成库和表
4)
make && make install
//编译安装
3.优化mysql
1)
cp /usr/src/mysql-5.5.22/support-files/my-medium.cnf /etc/my.cnf
//拷贝源码目录提供配置文件
2)
cp /usr/src/mysql-5.5.22/support-files/mysql.server /etc/init.d/mysqld
//拷贝服务脚本文件到/etc/init.d/目录下并改名为mysqld
3)
chmod +x /etc/init.d/mysqld
4)
chkconfig --add mysqld && chkconfig --level 35 mysqld on
5)
echo "export PATH=$PATH:/usr/local/mysql/bin" >>/etc/profile && source /etc/profile
6)
useradd -M -s /sbin/nologin mysql
7)
chown -R mysql:mysql /usr/local/mysql
8)
/usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
9)
/etc/init.d/mysqld start
4.配置主从配置
1)
vim /etc/my.cnf
50 relay-log=relay-log-bin
//指定从服务器日志文件名
51 relay-log-index=slave-relay-bin.index
//指定从服务器索引文件名
59 server-id=20
2)
/etc/init.d/mysqld restart
3)
mysql -u root -p
//登陆mysql数据库,默认密码为空
change master to master_host='192.168.1.10',master_user='slave',master_password='123',master_log_file='mysql-bin.000004',master_log_pos=332;
选项:
master_host:指定主服务器IP
master_user:指定连接主服务器用户
master_password:指定连接主服务器用户的密码
master_log_file:指定主服务器日志文件名;主服务器show master status;查看
master_log_pos:指定主服务器的偏移值;主服务器show master status;查看
start slave;
show slave status \G;
读服务器2(192.168.1.30)
1.环境准备
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
reboot
2)
rm -rf /etc/yum.repos.d/*
3)
vim /etc/yum.repos.d/local.repo
[local]
name=local
baseurl=file:///mnt
gpgcheck=0
4)
mount /dev/cdrom /mnt
5)
yum -y install ntp ncurses-devel cmake
6)
ntpdate 192.168.1.10
2.部署mysql
上传包
1)
tar -zxvf mysql-5.5.22.tar.gz -C /usr/src/
2)
cd /usr/src/mysql-5.5.22/
3)
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DSYSCONFDIR=/etc/
//初始化脚本并生成库和表
4)
make && make install
//编译安装
3.优化mysql
1)
cp /usr/src/mysql-5.5.22/support-files/my-medium.cnf /etc/my.cnf
//拷贝源码目录提供配置文件
2)
cp /usr/src/mysql-5.5.22/support-files/mysql.server /etc/init.d/mysqld
//拷贝服务脚本文件到/etc/init.d/目录下并改名为mysqld
3)
chmod +x /etc/init.d/mysqld
4)
chkconfig --add mysqld && chkconfig --level 35 mysqld on
5)
echo "export PATH=$PATH:/usr/local/mysql/bin" >>/etc/profile && source /etc/profile
6)
useradd -M -s /sbin/nologin mysql
7)
chown -R mysql:mysql /usr/local/mysql
8)
/usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
9)
/etc/init.d/mysqld start
4.配置主从配置
1)
vim /etc/my.cnf
50 relay-log=relay-log-bin
//指定从服务器日志文件名
51 relay-log-index=slave-relay-bin.index
//指定从服务器索引文件名
59 server-id=30
2)
/etc/init.d/mysqld restart
3)
mysql -u root -p
//登陆mysql数据库,默认密码为空
change master to master_host='192.168.1.10',master_user='slave',master_password='123',master_log_file='mysql-bin.000004',master_log_pos=332;
选项:
master_host:指定主服务器IP
master_user:指定连接主服务器用户
master_password:指定连接主服务器用户的密码
master_log_file:指定主服务器日志文件名;主服务器show master status;查看
master_log_pos:指定主服务器的偏移值;主服务器show master status;查看
start slave;
show slave status \G;
部署amoeba(192.168.1.40)
1.环境准备
1)
vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
IPADDR=192.168.1.40
NETMASK=255.255.255.0
reboot
2.安装jdk与amoeba
yum -y erase java-*
上传包
1)
chmod +x jdk-6u14-linux-x64.bin
2)
./jdk-6u14-linux-x64.bin
3)
mv jdk1.6.0_14/ /usr/local/jdk1.6
4)
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
5)
source /etc/profile && java -version
6)
mkdir /usr/local/amoeba
7)
tar -zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
8)
chmod -R 755 /usr/local/amoeba/
3.在主mysql数据库新建授权用户(192.168.1.10)
1)
mysql -u root -p
grant all on *.* to [email protected]'192.168.1.%' identified by '123';
4.编辑amoeba配置文件(192.168.1.40)
1)
vim /usr/local/amoeba/conf/amoeba.xml
30 <property name="user">hehe</property>
//设置连接Amoeba用户
31
32 <property name="password">123</property>
//设置连接Amoeba 用户
115 <property name="defaultPool">master</property>
116
117 <property name="writePool">master</property>
118 <property name="readPool">slaves</property>
//定义读服务器池
2)
vim /usr/local/amoeba/conf/dbServers.xml
25 <!-- mysql user -->
26 <property name="user">haha</property>
//设置连接 Mysql 的用户
27
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
50 <dbServer name="slave1" parent="abstractServer">
51 <factoryConfig>
52 <!-- mysql ip -->
53 <property name="ipAddress">192.168.1.20</property>
//定义读服务器IP
54 </factoryConfig>
55 </dbServer>
56
57 <dbServer name="slave2" parent="abstractServer">
58 <factoryConfig>
59 <!-- mysql ip -->
60 <property name="ipAddress">192.168.1.30</property>
//定义读服务器IP
61 </factoryConfig>
62 </dbServer>
63 <dbServer name="slaves" virtual="true">
69 <property name="poolNames">slave1,slave2</property>
70 </poolConfig>
3)
amoeba start &
4)
netstat -utpln | grep 8066
客户端验证(192.168.1.50)
1.环境准备
1)
vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
IPADDR=192.168.1.50
NETMASK=255.255.255.0
reboot
2)修改本地yum
rm -rf /etc/yum.repos.d/*
3)
vim /etc/yum.repos.d/local.repo
[local]
name=local
baseurl=file:///mnt
gpgcheck=0
4)
mount /dev/cdrom /mnt
5)
yum -y install mysql
6)
mysql -u hehe -p -h 192.168.1.40 -P 8066
show databases;
create dabase hehe;
show datasbases;
注:写服务器读服务器都会新建hehe库