MySQL 主从复制读写分离(mysql-proxy & Amoeba)

Linux安装MySQL 5.7

1. 打开虚拟机(此处使用Xshell)

2. 更换yum源

 执行 yum install wget -y
 执行 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
 执行 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
 执行 yum clean all
 执行 yum makecache

3. 查看系统是否自带mysql

 yum list installed | grep mysql

4. 删除系统自带的mysql及其依赖(防止冲突)

 yum -y remove mysql-libs.x86_64

5. 安装wget命令

 yum install wget -y

6. 给CentOS添加rpm源,并且选择较新的源

wget dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm

7. 安装rpm

 yum install mysql-community-release-el6-5.noarch.rpm -y

8. 安装成功之后,会在/etc/yum.repos.d/文件夹下增加两个文件

在这里插入图片描述

9. 修改 mysql-community.repo 文件

 把5.6中的enabled的值改为0
 把5.7中的enabled的值改为1

在这里插入图片描述

10. 使用yum安装mysql

 yum install mysql-community-server -y

如果速度太慢,可以使用Xftp上传安装包,详细参考:
https://www.cnblogs.com/damofeisha/p/10962856.html

如果出现 libnuma.so.1()(64bit) is needed 错误
安装numactl即可

 yum  install    numactl

11. 启动mysql服务

#启动之前需要生成临时密码,需要用到证书,可能证书过期,需要进行更新操作

 yum update -y

#启动mysql服务

 service mysqld start

在这里插入图片描述
#设置mysql开机启动

 chkconfig mysqld on

12. 获取mysql的临时密码

 grep "password" /var/log/mysqld.log

在这里插入图片描述

13. 使用临时密码登录

 mysql -uroot -p

在这里插入图片描述

14. 修改密码

set global validate_password_policy=0;
set global validate_password_length=1;
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';

15. 修改远程访问权限

grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;
flush privileges;

主从复制安装配置

一主一从:

1. 在两台数据库中分别创建数据库

create database msb;
use msb;

2. 配置主机(node01)

#修改配置文件,执行以下命令打开mysql配置文件
vi /etc/my.cnf
#在mysqld模块中添加如下配置信息
log-bin=master-bin #二进制文件名称
binlog-format=ROW  #二进制日志格式,有row、statement、mixed三种格式,row指的是把改变的内容复制过去,而不是把命令在从服务器上执行一遍,statement指的是在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。mixed指的是默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。
server-id=1		   #要求各个服务器的id必须不一样
binlog-do-db=msb   #同步的数据库名称

3.在主机配置授权

--授权操作
set global validate_password_policy=0;
set global validate_password_length=1;
grant replication slave on *.* to 'root'@'%' identified by '123456';
--刷新权限
flush privileges;

4. 从服务器配置

#修改配置文件,执行以下命令打开mysql配置文件
vi /etc/my.cnf
#在mysqld模块中添加如下配置信息
log-bin=master-bin	#二进制文件的名称
binlog-format=ROW	#二进制文件的格式
server-id=2			#服务器的id

5. 重启主服务器sql服务

service mysqld restart; 
#登录mysql数据库
mysql -uroot -p
#查看master的状态
show master status

在这里插入图片描述

6.重启从服务器sql服务

#重启mysql服务
service mysqld restart
#登录mysql
mysql -uroot -p
#连接主服务器
change master to master_host='192.168.30.11',master_user='root',master_password='123456',master_port=3306,master_log_file='master-bin.000001',master_log_pos=154;
#启动slave
start slave
#查看slave的状态
show slave status\G(注意没有分号)

此时可以在主服务器进行相关的数据添加删除工作,在从服务器看相关的状态。

测试主从服务器

测试主机写,从机读

在主机运行:
在这里插入图片描述
在从机查询:
在这里插入图片描述
发现可以查询到主机创建的表和插入的数据。

测试从机写,主机读

在从机插入数据:
在这里插入图片描述
在主机查找:
在这里插入图片描述
主机没有查询到从机写入的数据。
因为现在是一主一从的关系,主要用于主机读写,从机只读的场景。
如果要都能更新且备份,那么是互为主从的关系。

读写分离配置

使用Mysql-proxy实现读写分离

生产环境一般不用
在这里插入图片描述

 master 192.168.30.11
 slave  192.168.30.22
 proxy  192.168.30.33

proxy相关配置

#1、下载mysql-proxy
https://downloads.mysql.com/archives/proxy/#downloads
#2、上传软件到proxy的机器
直接通过xftp进行上传

#3、解压安装包
tar -zxvf mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit.tar.gz
#4、修改解压后的目录
mv mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit mysql-proxy
#5、进入mysql-proxy的目录
cd mysql-proxy
#6、创建目录
mkdir conf
mkdir logs
#7、添加环境变量
#打开/etc/profile文件
vi /etc/profile
#在文件的最后面添加一下命令
export PATH=$PATH:/root/mysql-proxy/bin
#8、执行命令让环境变量生效
source /etc/profile
#9、进入conf目录,创建文件并添加一下内容
vi mysql-proxy.conf
添加内容
[mysql-proxy]
user=root
proxy-address=192.168.30.33:3030
proxy-backend-addresses=192.168.30.11:3306
proxy-read-only-backend-addresses=192.168.30.22:3306
proxy-lua-script=/root/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
log-file=/root/mysql-proxy/logs/mysql-proxy.log
log-level=debug
daemon=true
#10、开启mysql-proxy
mysql-proxy --defaults-file=/root/mysql-proxy/conf/mysql-proxy.conf

测试

使用navicat客户端连接到proxy
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

使用amoeba实现mysql读写分离

1、什么是amoeba?

​ Amoeba(变形虫)项目,专注 分布式数据库 proxy 开发。座落与Client、DB Server(s)之间。对客户端透明。具有负载均衡、高可用性、sql过滤、读写分离、可路由相关的query到目标数据库、可并发请求多台数据库合并结果。

主要解决:

• 降低 数据切分带来的复杂多数据库结构

• 提供切分规则并降低 数据切分规则 给应用带来的影响

• 降低db 与客户端的连接数

• 读写分离

2、为什么要用Amoeba

目前要实现mysql的主从读写分离,主要有以下几种方案:

1、 通过程序实现,网上很多现成的代码,比较复杂,如果添加从服务器要更改多台服务器的代码。

2、 通过mysql-proxy来实现,由于mysql-proxy的主从读写分离是通过lua脚本来实现,目前lua的脚本的开发跟不上节奏,而写没有完美的现成的脚本,因此导致用于生产环境的话风险比较大,据网上很多人说mysql-proxy的性能不高。

3、 自己开发接口实现,这种方案门槛高,开发成本高,不是一般的小公司能承担得起。

4、 利用阿里巴巴的开源项目Amoeba来实现,具有负载均衡、高可用性、sql过滤、读写分离、可路由相关的query到目标数据库,并且安装配置非常简单。

3、安装Amoeba

注:在测试前,先在proxy机器停止之前测试的mysql-proxy。使用 ps -ef | grep mysql 找到 mysql-proxy 进程号,再使用 kill -9 (进程号) 即可杀死进程。

  1. 下载jdk的rpm包,使用xftp上传到虚拟机里
  2. 解压
    在这里插入图片描述
  3. 在 /etc/profile 文件末尾添加java环境变量
    在这里插入图片描述
    在这里插入图片描述
  4. 下载amoeba
    https://sourceforge.net/projects/amoeba/files/Amoeba%20for%20mysql/3.x/
    上传到虚拟机
    解压压缩包前
    安装 yum install zip unzip
    解压压缩包 unzip amoeba…
    进入配置文件夹
    在这里插入图片描述
    dbServers.xml
<?xml version="1.0" encoding="gbk"?>

<!DOCTYPE amoeba:dbServers SYSTEM "dbserver.dtd">
<amoeba:dbServers xmlns:amoeba="http://amoeba.meidusa.com/">

		<!-- 
			Each dbServer needs to be configured into a Pool,
			If you need to configure multiple dbServer with load balancing that can be simplified by the following configu
ration:			 add attribute with name virtual = "true" in dbServer, but the configuration does not allow the element with n
ame factoryConfig			 such as 'multiPool' dbServer   
		-->
		
	<dbServer name="abstractServer" abstractive="true">
		<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
			<property name="connectionManager">${defaultManager}</property>
			<property name="sendBufferSize">64</property>
			<property name="receiveBufferSize">128</property>
				
			<!-- mysql port -->
			<property name="port">3306</property>
			
			<!-- mysql schema -->
			<property name="schema">msb</property>
			
			<!-- mysql user -->
			<property name="user">root</property>
			
			<property name="password">123456</property>
		</factoryConfig>

		<poolConfig class="com.meidusa.toolkit.common.poolable.PoolableObjectPool">
			<property name="maxActive">500</property>
			<property name="maxIdle">500</property>
			<property name="minIdle">1</property>
			<property name="minEvictableIdleTimeMillis">600000</property>
			<property name="timeBetweenEvictionRunsMillis">600000</property>
			<property name="testOnBorrow">true</property>
			<property name="testOnReturn">true</property>
			<property name="testWhileIdle">true</property>
		</poolConfig>
	</dbServer>

	<dbServer name="writedb"  parent="abstractServer">
		<factoryConfig>
			<!-- mysql ip -->
			<property name="ipAddress">192.168.30.11</property>
		</factoryConfig>
	</dbServer>
	
	<dbServer name="slave"  parent="abstractServer">
		<factoryConfig>
			<!-- mysql ip -->
			<property name="ipAddress">192.168.30.22</property>
		</factoryConfig>
	</dbServer>
	<dbServer name="myslave" virtual="true">
		<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
			<!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
			<property name="loadbalance">1</property>
			
			<!-- Separated by commas,such as: server1,server2,server1 -->
			<property name="poolNames">slave</property>
		</poolConfig>
	</dbServer>
</amoeba:dbServers>

amoeba.xml

<?xml version="1.0" encoding="gbk"?>

<!DOCTYPE amoeba:configuration SYSTEM "amoeba.dtd">
<amoeba:configuration xmlns:amoeba="http://amoeba.meidusa.com/">

	<proxy>
	
		<!-- service class must implements com.meidusa.amoeba.service.Service -->
		<service name="Amoeba for Mysql" class="com.meidusa.amoeba.mysql.server.MySQLService">
			<!-- port -->
			<property name="port">8066</property>
			
			<!-- bind ipAddress -->
			<!-- 
			<property name="ipAddress">127.0.0.1</property>
			 -->
			
			<property name="connectionFactory">
				<bean class="com.meidusa.amoeba.mysql.net.MysqlClientConnectionFactory">
					<property name="sendBufferSize">128</property>
					<property name="receiveBufferSize">64</property>
				</bean>
			</property>
			
			<property name="authenticateProvider">
				<bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">
					
					<property name="user">root</property>
					
					<property name="password">123456</property>
					
					<property name="filter">
						<bean class="com.meidusa.toolkit.net.authenticate.server.IPAccessController">
							<property name="ipFile">${amoeba.home}/conf/access_list.conf</property>
						</bean>
					</property>
				</bean>
			</property>
			
		</service>
		
		<runtime class="com.meidusa.amoeba.mysql.context.MysqlRuntimeContext">
			
			<!-- proxy server client process thread size -->
			<property name="executeThreadSize">128</property>
			
			<!-- per connection cache prepared statement size  -->
			<property name="statementCacheSize">500</property>
			
			<!-- default charset -->
			<property name="serverCharset">utf8</property>
			
			<!-- query timeout( default: 60 second , TimeUnit:second) -->
			<property name="queryTimeout">60</property>
		</runtime>
		
	</proxy>
	
	<!-- 
		Each ConnectionManager will start as thread
		manager responsible for the Connection IO read , Death Detection
	-->
	<connectionManagerList>
		<connectionManager name="defaultManager" class="com.meidusa.toolkit.net.MultiConnectionManagerWrapper">
			<property name="subManagerClassName">com.meidusa.toolkit.net.AuthingableConnectionManager</property>
		</connectionManager>
	</connectionManagerList>
	
		<!-- default using file loader -->
	<dbServerLoader class="com.meidusa.amoeba.context.DBServerConfigFileLoader">
		<property name="configFile">${amoeba.home}/conf/dbServers.xml</property>
	</dbServerLoader>
	
	<queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">
		<property name="ruleLoader">
			<bean class="com.meidusa.amoeba.route.TableRuleFileLoader">
				<property name="ruleFile">${amoeba.home}/conf/rule.xml</property>
				<property name="functionFile">${amoeba.home}/conf/ruleFunctionMap.xml</property>
			</bean>
		</property>
		<property name="sqlFunctionFile">${amoeba.home}/conf/functionMap.xml</property>
		<property name="LRUMapSize">1500</property>
		<property name="defaultPool">writedb</property>
		
		<property name="writePool">writedb</property>
		<property name="readPool">myslave</property>
		<property name="needParse">true</property>
	</queryRouter>
</amoeba:configuration>

还需要再jvm.properties里修改栈大小,否则运行会报错。
在这里插入图片描述
运行:
在这里插入图片描述
使用其他虚拟机登陆:
在这里插入图片描述
测试查询、插入:
在这里插入图片描述
–将master上的mysql服务停止,继续插入数据会发现插入不成功,但是能够查询
–将master上的msyql服务开启,停止slave上的mysql,发现插入成功,但是不能够查询

发布了40 篇原创文章 · 获赞 1 · 访问量 1079

猜你喜欢

转载自blog.csdn.net/weixin_44495162/article/details/103905973
今日推荐