基于MyCat的MySql自动故障转移



# MySql双主复制
## 创建主a,b镜像
    建立文件夹,创建相关文件,这里只给a的过程


mkdir mysql-mm-a
touch Dockerfile
touch mysql.cnf
mkdir /var/docker/mysql/data-mm-a


文件内写入相应内容


FROM mysql:latest
COPY mysql.cnf /etc/mysql/conf.d/mysql.cnf


[mysqld]
log-bin=mysql-bin   #[必须]启用二进制日志
server-id=1           #设置为主机ip,主机b此处设为2
relay-log=slave-relay-bin


创建镜像 注意要在相应目录下 mysql-mm-a,启动镜像


docker build -t mysql-mm-a .
docker run --privileged=true -p 33075:3306 --name mysql-mm-a -v /var/docker/mysql/data-mm-a/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e MYSQL_USER=dev -e MYSQL_PASSWORD=dev -d mysql-mm-a
# 注意启动b的时候要在不同端口及文件夹
docker run --privileged=true -p 33076:3306 --name mysql-mm-a -v /var/docker/mysql/data-mm-b/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e MYSQL_USER=dev -e MYSQL_PASSWORD=dev -d mysql-mm-b


创建b的镜像与a基本相同,需要注意的地方前面的步骤已经说明,主要是文件夹,命名,端口不一样
 
## 配置两个服务互为主从
    连入mysql-mm-a,并执行相应命令


mysql -h127.0.0.1 -P33075 -uroot -p


输入密码,进入后执行以下命令:


GRANT REPLICATION SLAVE ON *.* TO 'dev'@'%' IDENTIFIED BY 'dev';
FLUSH TABLES WITH READ LOCK;
UNLOCK TABLES;
SHOW MASTER STATUS; --file和position参数要用于从节点配置


连接mysql-mm-b,执行相应命令:


mysql -h127.0.0.1 -P33076 -uroot -p


输入密码,进入后执行以下命令:


change master to
master_host='127.0.0.1',
master_port=33075,
master_user='dev',
master_password='dev',
master_log_file='mysql-bin.000003',
master_log_pos=428;   -- 这两个参数是另一个服务执行 SHOW MASTER STATUS的结果
START SLAVE;


至此便完成了主33075从33076的复制状态,将以上步骤按照33075和33076互换,配置为主33076从33075,这样便互为主从复制了


# 创建MyCat服务
    


mkdir mycat-mm
cd mycat-mm
touch Dockerfile
wget http://dl.mycat.io/1.7-BETA/Mycat-server-1.7.0-DEV-20170416134921-linux.tar.gz
mv Mycat-server-1.7.0-DEV-20170416134921-linux.tar.gz mycat.tar.gz


将MyCat压缩包解压,将conf文件夹复制到当前目录
文件内写入相应内容


FROM openjdk:8
ADD mycat.tar.gz /usr/local/
COPY conf /usr/local/mycat/conf
VOLUME /usr/local/mycat/conf
ENV MYCAT_HOME=/usr/local/mycat
EXPOSE 8066 9066
CMD ["/usr/local/mycat/bin/mycat", "console","&"]


<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

	<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
		<table name="user" primaryKey="id" dataNode="dn1" rule="auto-sharding-long" />
	</schema>
	<dataNode name="dn1" dataHost="host1" database="test" />
	<dataHost name="host1" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<!-- can have multi write hosts -->
		<writeHost host="host1" url="127.0.0.1:33075" user="root" password="root"></writeHost>
		<writeHost host="host2" url="127.0.0.1:33076" user="root" password="root"></writeHost>
	</dataHost>

</mycat:schema>


创建镜像 注意要在相应目录下 mycat-mm,启动镜像


docker build -t mycat-mm .
docker run --name mycat-mm -p 8088:8066 -p 9088:9066 -d mycat-mm


# 测试
尝试连接8088端口的mycat服务,对user表进行插入,分别到33075,33076数据库中查看已有记录;
停止 33075,再执行插入,可以看到插入依然成功,到33076可以看到数据插入该库,mycat以将写入库切换到33076
重新启动33075,查询其中的数据,可以看到,重启后的33075会自动同步33076的数据
再次插入数据,可以看到33075,33076都插入,说明33075恢复后又自动纳入了mycat的管理

# MySql双主复制
## 创建主a,b镜像
    建立文件夹,创建相关文件,这里只给a的过程


mkdir mysql-mm-a
touch Dockerfile
touch mysql.cnf
mkdir /var/docker/mysql/data-mm-a


文件内写入相应内容


FROM mysql:latest
COPY mysql.cnf /etc/mysql/conf.d/mysql.cnf


[mysqld]
log-bin=mysql-bin   #[必须]启用二进制日志
server-id=1           #设置为主机ip,主机b此处设为2
relay-log=slave-relay-bin


创建镜像 注意要在相应目录下 mysql-mm-a,启动镜像


docker build -t mysql-mm-a .
docker run --privileged=true -p 33075:3306 --name mysql-mm-a -v /var/docker/mysql/data-mm-a/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e MYSQL_USER=dev -e MYSQL_PASSWORD=dev -d mysql-mm-a
# 注意启动b的时候要在不同端口及文件夹
docker run --privileged=true -p 33076:3306 --name mysql-mm-a -v /var/docker/mysql/data-mm-b/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e MYSQL_USER=dev -e MYSQL_PASSWORD=dev -d mysql-mm-b


创建b的镜像与a基本相同,需要注意的地方前面的步骤已经说明,主要是文件夹,命名,端口不一样
 
## 配置两个服务互为主从
    连入mysql-mm-a,并执行相应命令


mysql -h127.0.0.1 -P33075 -uroot -p


输入密码,进入后执行以下命令:


GRANT REPLICATION SLAVE ON *.* TO 'dev'@'%' IDENTIFIED BY 'dev';
FLUSH TABLES WITH READ LOCK;
UNLOCK TABLES;
SHOW MASTER STATUS; --file和position参数要用于从节点配置


连接mysql-mm-b,执行相应命令:


mysql -h127.0.0.1 -P33076 -uroot -p


输入密码,进入后执行以下命令:


change master to
master_host='127.0.0.1',
master_port=33075,
master_user='dev',
master_password='dev',
master_log_file='mysql-bin.000003',
master_log_pos=428;   -- 这两个参数是另一个服务执行 SHOW MASTER STATUS的结果
START SLAVE;


至此便完成了主33075从33076的复制状态,将以上步骤按照33075和33076互换,配置为主33076从33075,这样便互为主从复制了


# 创建MyCat服务
    


mkdir mycat-mm
cd mycat-mm
touch Dockerfile
wget http://dl.mycat.io/1.7-BETA/Mycat-server-1.7.0-DEV-20170416134921-linux.tar.gz
mv Mycat-server-1.7.0-DEV-20170416134921-linux.tar.gz mycat.tar.gz


将MyCat压缩包解压,将conf文件夹复制到当前目录
文件内写入相应内容


FROM openjdk:8
ADD mycat.tar.gz /usr/local/
COPY conf /usr/local/mycat/conf
VOLUME /usr/local/mycat/conf
ENV MYCAT_HOME=/usr/local/mycat
EXPOSE 8066 9066
CMD ["/usr/local/mycat/bin/mycat", "console","&"]


<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

	<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
		<table name="user" primaryKey="id" dataNode="dn1" rule="auto-sharding-long" />
	</schema>
	<dataNode name="dn1" dataHost="host1" database="test" />
	<dataHost name="host1" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<!-- can have multi write hosts -->
		<writeHost host="host1" url="127.0.0.1:33075" user="root" password="root"></writeHost>
		<writeHost host="host2" url="127.0.0.1:33076" user="root" password="root"></writeHost>
	</dataHost>

</mycat:schema>


创建镜像 注意要在相应目录下 mycat-mm,启动镜像


docker build -t mycat-mm .
docker run --name mycat-mm -p 8088:8066 -p 9088:9066 -d mycat-mm


# 测试
尝试连接8088端口的mycat服务,对user表进行插入,分别到33075,33076数据库中查看已有记录;
停止 33075,再执行插入,可以看到插入依然成功,到33076可以看到数据插入该库,mycat以将写入库切换到33076
重新启动33075,查询其中的数据,可以看到,重启后的33075会自动同步33076的数据
再次插入数据,可以看到33075,33076都插入,说明33075恢复后又自动纳入了mycat的管理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值