Linux&&mysql主从复制+读写分离

Linux&&mysql主从复制+读写分离

  • mysql主从复制+读写分离
    • 了解
      • MYSQL支持的复制类型
    • 实现
      • 环境
      • 部署
        • 服务器之间时间同步
        • 配置主从同步
        • 配置读写分离
    • 测试
  • mysql主主复制
    • 了解
    • 实现
      • 先修改配置文件
      • 同步数据
      • 相互授权用户(在A服务器授权一个允许B访问的用户,反之亦然)
      • 互告bin-log信息
      • 在两服务器都执行以下命令
      • 查看状态

mysql主从复制+读写分离

了解

通过主从复制(Master-Slave)同步数据,通过读写分离提升数据库的并发负载能力。通过一台主MYSQL和两台从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

mysql主主复制

了解

参考资料 :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服务器授权一个允许B访问的用户,反之亦然)

在服务器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;

互告bin-log信息

在服务器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端口都向对方打开,要不然是不能成功同步的。

你可能感兴趣的:(Linux)