docker下实现mysql的主从复制+主备切换

安装两个mysql数据库:

我选择使用docker,可以直接本地安装两个,只要端口不冲突。

只要有两个mysql就直接看7.修改主从配置即可

 

架构图:

 

image.png 

1. 安装docker

2. 下载mysql5.7镜像

查看镜像是否下载成功:

image.png 

3. 创建主节点

运行mysql5.7镜像

docker run -itd --name mysql-master -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

 

-p 3306:3306 :映射容器服务的 3306 端口到宿主机的 3306 端口,外部主机可以直接通过 宿主机ip:3306 访问到 MySQL 的服务。

MYSQL_ROOT_PASSWORD=123456:设置 MySQL 服务 root 用户的密码。

image.png 

4. 创建副节点

运行mysql5.7镜像

 

docker run -itd --name mysql-slave -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

image.png 

5. 数据库连接测试

image.png 

image.png 

6. Docker进入服务器

image.png 

执行apt-get update,然后再次执行apt-get install -y vim

7. 安装Mycat1.6

7.1 安装jdk和Mycat

运行镜像

docker run -itd --name mycat -p 8066:8066 centos:centos7

安装jdk

Mycat1.6要求使用jdk,切换到Mycat用户,并把,将jdk1.8.0_112.tar上传到/home/Mycat目录下,进行解压执行如下命令

tar -xvf jdk1.8.0_112.tar

 

删除压缩包,执行如下命令

rm -f jdk1.8.0_112.tar

 

设置jdk环境变量,.bash_profile文件

cd /home/Mycat;

vi .bash_profile;

i进入编辑模式,在行尾加入

##--------- JDK --------##

export JAVA_HOME=$HOME/jdk1.8.0_112

export JRE_HOME=$JAVA_HOME/jre

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

export PATH=$JAVA_HOME/bin:$HOME/bin:$PATH:/sbin:./:$PATH

Esc键,输入:wq!并且回车对内容进行保存(红色部分)

执行如下命令,使.bash_profile生效

source .bash_profile;

 

检查jdk是否安装成功,执行命令

java -version

成功则显示如下

image.png 

安装MyCat

/home/Mycat目录下,进行解压执行如下命令

tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

 

删除压缩包,执行如下命令

rm -f Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

 

设置jdk环境变量,.bash_profile文件

cd /home/Mycat;

vi .bash_profile;

i进入编辑模式,在行尾加入

##--------- mycat --------##

export MYCAT_HOME=/home/Mycat/mycat

export PATH=$PATH:$MYCAT_HOME/bin

Esc键,输入:wq!并且回车对内容进行保存(红色部分)

执行如下命令,使.bash_profile生效

source .bash_profile;

 

成功则显示如下

image.png 

7.2 配置server.xml

路径:

image.png 

添加两个mycat逻辑库:user,pay

system 参数是所有的mycat参数配置,比如添加解析器:defaultSqlParser,其他类推

user 是用户参数。

<user name="root">

        <property name="password">123456</property>

        <property name="schemas">test1,test2,test3</property>

 

        <!-- 表级 DML 权限设置 -->

        <!--

        <privileges check="false">

                <schema name="TESTDB" dml="0110" >

                        <table name="tb01" dml="0000"></table>

                        <table name="tb02" dml="1111"></table>

                </schema>

        </privileges>

         -->

</user>

7.3 配置schema.xml

路径:

image.png 

修改dataHostschema对应的连接信息,user,pay 垂直切分后的配置如下所示:

 

schema 是实际逻辑库的配置,userpay分别对应两个逻辑库,多个schema代表多个逻辑库。

 

dataNode是逻辑库对应的分片,如果配置多个分片只需要多个dataNode即可。

 

dataHost是实际的物理库配置地址,可以配置多主主从等其他配置,多个dataHost代表分片对应的物理库地址,下面的writeHostreadHost代表该分片是否配置多写,主从,读写分离等高级特性。

 

以下例子配置了两个writeHost为主从。

 

<schema name="test1" checkSQLschema="true" sqlMaxLimit="100">

        <table name="test1" type="global" dataNode="dn1" />

</schema>

<schema name="test2" checkSQLschema="true" sqlMaxLimit="100">

        <table name="test2" type="global" dataNode="dn2" />

</schema>

<schema name="test3" checkSQLschema="true" sqlMaxLimit="100">

        <table name="test3" type="global" dataNode="dn3" />

</schema>

<dataNode name="dn1" dataHost="localhost1" database="test1" />

<dataNode name="dn2" dataHost="localhost1" database="test2" />

<dataNode name="dn3" dataHost="localhost1" database="test3" />

 <dataHost name="localhost1" 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="hostM1" url="172.17.0.2:3306" user="root"

                           password="123456">

                <!-- can have multi read hosts -->

                <!--<readHost host="hostS2" url="172.17.0.2:3306" user="slave" password="123456" />-->

        </writeHost>

        <writeHost host="hostS1" url="172.17.0.3:3306" user="root"

                           password="123456" />

        <!-- <writeHost host="hostM2" url="172.17.0.3:3306" user="slave" password="123456"/> -->

</dataHost>

 

7.4 防火墙

开放8066端口

7.5 效果图:

image.png 

 

8. 修改主从配置

8.1 新配my.cnf配置:本系统在/etc/mysql目录下

server-id:同一局域网内注意要唯一

log-bin:开启二进制日志功能,可以随便取(关键)

relay_log:relay_log配置中继日志

 

my.cnf中添加如下配置:

master节点

[mysqld]

server-id=100

log-bin=mysql-bin

slave节点:

[mysqld]

server-id=101

log-bin=mysql-bin

relay_log=edu-mysql-relay-bin

配置完成之后,使用service mysql restart重启mysql服务使配置生效。

8.2 链接Master和Slave

主从复制的话,就互为主从,即

1为主时;设置21的从

1为从时;设置21的主

master节点

创建用户

CREATE USER 'slave'@'%' IDENTIFIED BY '123456';

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

flush privileges;

查看master节点的binlog状态

show master status;

image.png 

记住这个File和Position属性的值配置slave的时候需要用

slave节点:

配置连接master

注意事项:在后面的操作完成之前,需要保证Master库不能做任何操作,否则将会引起状态变化,FilePosition字段的值变化。

change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= 761, master_connect_retry=30;

 

mysql-bin.000014show master status;中的File154show master status;中的Position

查看连接状态:

show slave status

启主从复制:

start slave;

 

 

9. 测试

9.1 新增数据是否同步

在主新增数据库,看从上是否有服务器

image.png 

在从新增数据库,看主上是否有服务器

image.png 

9.2 数据库宕机是否同步

关闭主节点,然后复制test1test11

image.png 

重启主节点,观察主节点是否有新增的表

image.png 

 

 


下一篇: 没有了