标签:mysql数据库
MySQL主从复制原理:
(1)在每个事物更新数据完成之前,Master在二进制记录这些改变。写入二进制日志完成后,Master通知存储引擎提交事物。
(2)Slave将Master的Binary log复制到其中继日志。首先,Slave开始一个工作线程---I/O线程,I/O线程在Master上打开一个普通的连接,然后开始Binlog dump process(二进制文件转存过程),Binlog dump process从Master的二进制中读取事件,如果已经跟上Master,他会睡眠等待Master产生新的事件。I/O线程将这些事件写入中继日志。
(3)SQL slave thread (SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新SLave的数据,使其与Master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。
MySQL读写分离原理:
简单来说,读写分离就是在主服务器上写,只在从服务器上读。基本的原理是让主数据库处理事务性查询,而从数据库处理select查询。数据库复制被用来把事务性查询导致的变更同步到集群中的从数据库。
实验案例操作:
1、实验思路:
第一步 | 在主从节点搭建时间服务器 |
第二步 | 在主从节点安装mysql |
第三步 | 配置mysql主从复制 |
第四步 | 搭建mysql读写分离 |
第五步 | 测试读写分离 |
2、实验环境:
主机 | 操作系统 | IP地址 | 主机软件 |
Master | CentOS6.5 | 192.168.100.150 | cmake-2.8.6.tar.gz mysql-5.5.22.tar.gz |
Slave1 | CentOS6.5 | 192.168.100.151 | cmake-2.8.6.tar.gz mysql-5.5.22.tar.gz |
Slave2 | CentOS6.5 | 192.168.100.152 | cmake-2.8.6.tar.gz mysql-5.5.22.tar.gz |
Amoeba | CentOS6.5 | 192.168.100.153 | amoeba-mysql-binary-2.2.0.tar.gz Jdk-6u14-linux-x64.bin |
客户端 | CentOS6.5 | 192.168.100.154 |
1、配置PC的IP地址和源地址。
(略。。。)
2、搭建时间服务器。
1)主节点上安装ntp时间服务:192.168.100.150
yum -y install ntp
sed -i ‘/^server/s/^/#/g‘ /etc/ntp.conf
cat <<END >>/etc/ntp.conf
server 127.127.1.0
fudge 127.127.1.0 stratum 8
END
/etc/init.d/ntpd restart
netstat -utpln |grep ntp
2)从节点同步时间:192.168.100.151-152
yum -y install ntpdate
/usr/sbin/ntpdate 192.168.100.150 ##指主服务器IP进行同步时间
3、在主从节点安装MySQL。
1)在主从节点准备mysql的必要安装包。(红色为必要的安装包)
2)在主从节点新建mysql安装脚本和mysql的配置脚本。
安装MySql脚本
[root@localhost]# cat mysql_install.sh
#!/bin/bash
##第一配置yum,安装ncurses依赖包
yum -y install ncurses-*
#解压cmake,安装基础环境
tar zxvf /root/cmake-2.8.6.tar.gz -C /usr/src/
cd /usr/src/cmake-2.8.6
#配置,编译安装cmake
./configure &&gmake &&gmake install
##解压mysql
tar zxvf /root/mysql-5.5.22.tar.gz -C /usr/src/
cd /usr/src/mysql-5.5.22/
#cmake进行配置mysql
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql #指定安装目录\
-DDEFAULT_CHARSET=utf8 #指定字符集为utf8 \
-DDEFAULT_COLLATION=utf8_general_ci ##指定字符校验 \
-DWITH_EXTRA_CHARSETS=all ##支持额外字符集\
-DSYSCONFDIR=/etc/ ##指定配置文件位置
make &&make install #编译安装
if [ -e /usr/local/mysql ];then
echo "mysql install successfully."
fi
配置MySql脚本
[root@localhost]# cat mysql_config.sh
#!/bin/bash
#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
chmod +x /etc/init.d/mysqld
chkconfig --add mysqld
chkconfig mysqld on
#3.优化PATH路径,执行命令时方便,单引号双引号都行
grep mysql /etc/profile
if [ $? -eq 0 ];then
echo "PATH is set."
else
echo "export PATH=$PATH:/usr/local/mysql/bin" >>/etc/profile
source /etc/profile ##执行文件
fi
#4.初始化mysql,创建用户,赋权
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
#5.启动mysql,并设置为开机启动
if [ -e /tmp/mysql.sock ];then
/etc/init.d/mysqld restart
else
/etc/init.d/mysqld start
fi
chkconfig mysqld on
#6.修改密码,并提示密码
mysqladmin -u root password ‘123123‘ &&echo "mysql root password is 123123"
在主从节点安装mysql完成后,重启计算机。
4、配置MySql主从复制。
1)配置主服务器:192.168.100.150
sed -i ‘s/^log-bin=.*/log-bin=master-bin\nlog-slave-updates=ture/g‘ /etc/my.cnf
sed -i ‘/^server-id/s/1/11/g‘ /etc/my.cnf ##设置优先级
/etc/init.d/mysqld restart
mysql -uroot -p123123
mysql> grant replication slave on *.* to ‘myslave‘@‘192.168.100.%‘ identified by ‘123123‘; ##设置数据库用户的复制从权限
mysql> flush privileges; ##刷新用户授权信息
mysql> show master status;
##记住File的及Position的值,此处为master-bin.000001和339
mysql> create database db_test; ##创建测试数据库
mysql> quit
2)配置从服务器1:192.168.100.151
sed -i ‘/^server-id/s/1/22/g‘ /etc/my.cnf
sed -i ‘/^server-id/arelay-log=relay-log-bin\nrelay-log-index=slave-relay-bin.index‘ /etc/my.cnf
/etc/init.d/mysqld restart
mysql -uroot -p123123
mysql> change master to master_host=‘192.168.100.150‘,master_user=‘myslave‘,master_password=‘123123‘,master_log_file=‘master-bin.000001‘,master_log_pos=339;
##指向主服务器的文件及目录
mysql> start slave; ##启动同步复制
mysql> show slave status\G;
mysql> show databases; ##验证数据库是否同步
mysql> quit
3)配置从服务器2:192.168.100.152
sed -i ‘/^server-id/s/1/33/g‘ /etc/my.cnf
sed -i ‘/^server-id/arelay-log=relay-log-bin\nrelay-log-index=slave-relay-bin.index‘ /etc/my.cnf
/etc/init.d/mysqld restart
mysql -uroot -p123123
mysql> change master to master_host=‘192.168.100.150‘,master_user=‘myslave‘,master_password=‘123123‘,master_log_file=‘master-bin.000001‘,master_log_pos=339;
mysql> start slave;
mysql> show slave status\G;
mysql> show databases; ##验证数据库是否同步
mysql> quit
5、搭建MySQL读写分离。
1)基本配置:192.168.100.153
yum -y remove java
chmod +x jdk-6u14-linux-x64.bin
./jdk-6u14-linux-x64.bin
mv jdk1.6.0_14/ /usr/local/jdk1.6
vi /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
:wq
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/
/usr/local/amoeba/bin/amoeba ##验证
2)数据授权给amoeba读写权限:
mysql> grant all on *.* to linuxfan@‘192.168.100.%‘ identified by ‘123123‘; ##在Master上完成
mysql> show grants for linuxfan@‘192.168.100.%‘; ##在192.168.100.151-152上查看是否同步了权限
3)修改配置文件:192.168.100.153
vim /usr/local/amoeba/conf/amoeba.xml
30 <property name="user">amoeba</property>
31
32 <property name="password">123456</property>
115 <property name="defaultPool">master</property>
116
117 <property name="writePool">master</property> ##注意删除<!-- -->的注释
118 <property name="readPool">slaves</property>
:set nu ##显示行号
:wq
vim /usr/local/amoeba/conf/dbServers.xml
25 <!-- mysql user -->
26 <property name="user">linuxfan</property> ##该用户必须是上一步授权的用户
27
28 <!-- mysql password --> ##修改
29 <property name="password">123123</property> ##删除下一行的“-->”
44 <dbServer name="master" parent="abstractServer"> ##修改为master
45 <factoryConfig>
46 <!-- mysql ip -->
47 <property name="ipAddress">192.168.100.150</property> ##指定正确的master的ip
51 <dbServer name="slave1" parent="abstractServer"> ##修改为slave1
52 <factoryConfig>
53 <!-- mysql ip -->
54 <property name="ipAddress">192.168.100.151</property> ##指定slave1的ip地址
55 </factoryConfig>
56 </dbServer>
57 <dbServer name="slave2" parent="abstractServer"> ##添加如下6行,指定slave2的ip
58 <factoryConfig>
59 <!-- mysql ip -->
60 <property name="ipAddress">192.168.100.152</property>
61 </factoryConfig>
62 </dbServer>
64 <dbServer name="slaves" virtual="true"> ##修改为slaves
70 <property name="poolNames">slave1,slave2</property> ##修改集群的成员名称用逗号隔开
:wq
/usr/local/amoeba/bin/amoeba start& ##启动代理服务
netstat -utpln |grep 8066 ##验证
6、测试读写分离。
1)验证主从复制:192.168.100.154
yum -y install mysql
mysql -uamoeba -p123456 -h 192.168.100.153 -P 8066
##登录db集群192.168.100.154
mysql>show databases;
mysql> use db_test;
mysql> create table linuxfan(id int(10),name varchar(10),address varchar(20));
在192.168.100.151-152上查看结果:
mysql -uroot -p123123
mysql> use db_test;
mysql> show tables; ##同步
2)关闭slave1,slave2的复制功能:192.168.100.151-152
mysql> stop slave;
3)分别在master,slave1,slave2上创建不同的数据:
master:
mysql> use db_test;
mysql> insert into linuxfan values(1,‘hehe‘,‘this is master‘);
slave1:
mysql> use db_test;
mysql> insert into linuxfan values(2,‘hehe‘,‘this is slave1‘);
slave2:
mysql> use db_test;
mysql> insert into linuxfan values(3,‘hehe‘,‘this is slave2‘);
4)应用客户端验证读:192.168.100.157
mysql> select * from linuxfan; ##使用这条命令,多次查询
5)应用客户端上验证写:
mysql> insert into linuxfan values(4,‘hehe‘,‘app write test‘); ##写入数据
Query OK, 1 row affected (0.02 sec)
mysql> select * from linuxfan; ##查不到刚写入的数据
master上验证:
mysql> select * from linuxfan; ##查到数据
标签:mysql数据库
原文地址:http://12536054.blog.51cto.com/12526054/1893554