暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

使用docker镜像建立mysql主从,双主环境

初七的学习笔记 2021-06-10
588

一、准备工作

1.docker安装步骤略

2.拉取网易蜂巢的mysql-server:5.6

docker pull hub.c.163.com/nce2/mysql:5.6

二、搭建主从

1.创建mysql容器 1个master+3个slave

docker run --name mysql-master -d -P hub.c.163.com/nce2/mysql:5.6

docker run --name mysql-slave1 -d -P hub.c.163.com/nce2/mysql:5.6

docker run --name mysql-slave2 -d -P hub.c.163.com/nce2/mysql:5.6

docker run --name mysql-slave3 -d -P hub.c.163.com/nce2/mysql:5.6

2.查看容器

[root@docker ~]# docker ps -a

CONTAINER ID        IMAGE                          COMMAND             CREATED             STATUS              PORTS                     NAMES      

429eb0994e3b        hub.c.163.com/nce2/mysql:5.6   "/run.sh"           41 hours ago        Up 41 hours         0.0.0.0:32771->3306/tcp   mysql-slave3        

2bc6a8288acf        hub.c.163.com/nce2/mysql:5.6   "/run.sh"           41 hours ago        Up 41 hours         0.0.0.0:32770->3306/tcp   mysql-slave2        

c4b203cf3d96        hub.c.163.com/nce2/mysql:5.6   "/run.sh"           41 hours ago        Up 41 hours         0.0.0.0:32769->3306/tcp   mysql-slave1        

825af360d400        hub.c.163.com/nce2/mysql:5.6   "/run.sh"           41 hours ago        Up 41 hours         0.0.0.0:32768->3306/tcp   mysql-master

3.进入master容器

这里以进入mysql-master为例

[root@bogon ~]# docker exec -it mysql-master bash

root@825af360d400:~# 

4.容器之间的隔离性可自行验证,可以在mysql-master和mysql-slave1建立不同名的database进行验证

5.登录到容器进行如下操作,master,slave都需要这么做

a).查看容器的操作系统环境

uname -a

cat etc/pro

cat etc/lsb-release

发现我们的容器是ubuntu14.04

root@825af360d400:~# cat /etc/lsb-release

DISTRIB_ID=Ubuntu

DISTRIB_RELEASE=14.04

DISTRIB_CODENAME=trusty

DISTRIB_DESCRIPTION="Ubuntu 14.04.3 LTS"

b).执行apt-get install时候发现什么也装不了,也没有vi编辑器

追加内容到 /etc/apt/sources.list

echo deb http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse >> /etc/apt/sources.list

echo deb http://mirrors.163.com/ubuntu/ trusty-security main restricted universe multiverse >> /etc/apt/sources.list

echo deb http://mirrors.163.com/ubuntu/ trusty-updates main restricted universe multiverse >> /etc/apt/sources.list

echo deb http://mirrors.163.com/ubuntu/ trusty-proposed main restricted universe multiverse >> /etc/apt/sources.list

echo deb http://mirrors.163.com/ubuntu/ trusty-backports main restricted universe multiverse >> /etc/apt/sources.list

echo deb-src http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse >> /etc/apt/sources.list

echo deb-src http://mirrors.163.com/ubuntu/ trusty-security main restricted universe multiverse >> /etc/apt/sources.list

echo deb-src http://mirrors.163.com/ubuntu/ trusty-updates main restricted universe multiverse >> /etc/apt/sources.list

echo deb-src http://mirrors.163.com/ubuntu/ trusty-proposed main restricted universe multiverse >> /etc/apt/sources.list

echo deb-src http://mirrors.163.com/ubuntu/ trusty-backports main restricted universe multiverse >> /etc/apt/sources.list

c).更新源

apt-get update

apt-get install vim

d).然后通过vi把/etc/apt/sources.list文件的前两行删除掉 再重新update一下。

apt-get update

e).安装一个网络工具获取ip

apt-get install net-tools

f).拷贝mysql的配置文件

cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld

chmod +x /etc/init.d/mysqld

cp /usr/local/mysql/support-files/my-docker.cnf  /etc/my.cnf

g).获取到master的ip地址

root@825af360d400:~# ifconfig

eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:01  

          inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0

          inet6 addr: fe80::42:acff:fe11:1/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:11711 errors:0 dropped:0 overruns:0 frame:0

          TX packets:10500 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0 

          RX bytes:30347188 (30.3 MB)  TX bytes:776169 (776.1 KB)


lo        Link encap:Local Loopback  

          inet addr:127.0.0.1  Mask:255.0.0.0

          inet6 addr: ::1/128 Scope:Host

          UP LOOPBACK RUNNING  MTU:65536  Metric:1

          RX packets:22 errors:0 dropped:0 overruns:0 frame:0

          TX packets:22 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0 

          RX bytes:2212 (2.2 KB)  TX bytes:2212 (2.2 KB)

h).修改mysql密码,并且赋值权限

mysql -u root

use mysql;

update user set password = password('mysql') where user = 'root';

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

flush privileges;

6.配置主从

a).Master

(1)在my.cnf的[mysqld]下面增加下面几行代码

server-id = 1     //给数据库服务的唯一标识,不要重复

log-bin = master-bin

log-bin-index = master-bin.index

(2)重启MySQL服务使配置生效

service mysqld restart

(3)查看日志

mysql> show master status;

+------------------+----------+--------------+------------------+-------------------+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

+------------------+----------+--------------+------------------+-------------------+

| mysql-bin.000005 |     2976 |              |                  |                   |

+------------------+----------+--------------+------------------+-------------------+

1 row in set (0.05 sec)

b).Slave

(1)在my.cnf的[mysqld]下面增加下面几行代码

server-id = 2

relay-log-index = slave-relay-bin.index

relay-log = slave-relay-bin

(2)重启MySQL服务使配置生效

service mysqld restart

(3)连接Master

change master to master_host='172.17.0.1', //Master服务器IP

master_port=3306,

master_user='root',

master_password='mysql',

master_log_file='master-bin.000005',//Master服务器产生的日志

master_log_pos=2976;

(4)启动Slave

start slave;

(5)查看日志

另外两台slave也需要重复上述操作

(6)自行验证主从复制功能

三、搭建双主

1.在my.cnf的[mysqld]下面增加下面几行代码

Master1添加

server-id=1

log-bin=mysqlmaster-bin.log

auto-increment-increment=2

auto-increment-offset=1

Master2添加

server-id=2

log-bin=mysqlmaster-bin.log

auto-increment-increment=2

auto-increment-offset=2

说明:auto-increment-increment的值设为整个结构中服务器的总数,此实验为两台服务器,所以值为2

auto-increment-offset是用来设定数据库中自动增长的起点的,因为服务器都设定了一次自动增长的值为2,所以他们的起点必须得不同,这样才能避免两台服务器数据同步时出现主键冲突

2.重启MySQL服务使配置生效

service mysqld restart

3.添加同步数据所需要的用户

Master1

GRANT REPLICATION SLAVE ON *.* TO 'root'@'172.17.0.%' IDENTIFIED BY 'mysql';

Master2

GRANT REPLICATION SLAVE ON *.* TO 'root'@'172.17.0.%' IDENTIFIED BY 'mysql';

4.查看两台服务器Master状态

Master1

mysql> show master status;

+------------------+----------+--------------+------------------+-------------------+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

+------------------+----------+--------------+------------------+-------------------+

| mysql-bin.000006 |      242 |              |                  |                   |

+------------------+----------+--------------+------------------+-------------------+

1 row in set (0.00 sec)

Master2

mysql> show master status;

+------------------+----------+--------------+------------------+-------------------+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

+------------------+----------+--------------+------------------+-------------------+

| mysql-bin.000007 |      121 |              |                  |                   |

+------------------+----------+--------------+------------------+-------------------+

1 row in set (0.00 sec)

5.互相连接

Master1

change master to master_host='172.17.0.11',master_user='root',master_password='mysql',master_log_file='mysql-bin.000007',master_log_pos=121;

Master2

change master to master_host='172.17.0.10',master_user='root',master_password='mysql',master_log_file='mysql-bin.000006',master_log_pos=242;

6.开启复制功能

Master1和Master2都执行

start slave;

7.查看连接状态

show slave status \G;

查看

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

都显示yes表示启动正常

8.自行验证双主复制功能

备注:一般生产环境双主是互为主备的关系,只要Master1是正常的,Master2不对外提供服务

Master1与Master2之间属于"主-主"复制关系,即自己既是主机,又是对方的从机

通过keepalived来进行failover

四、双主多从架构简介

1.Master(192.168.31.230)为正常运行环境下的主库,为两个Slave(192.168.31.231和192.168.31.232)提供“主-从”复制功能;

2.Master_Backup(192.168.31.233)是Master的备份库,只要Master是正常的,它不对外提供服务。它与Master之间属于"主-主"复制关系,即自己既是主机,又是对方的从机;

3.同理,192.168.31.234和192.168.31.235为Slave_Backup,分别为192.168.31.231和 192.168.31.232的备份库,只要Slave是正常的,对应的备份机不对外提供服务;

4.Slave在此架构中的目的是为了实现读写分离,对应用程序来说,Master只负责写,两个Slave只负责读。Slave的数据来源于Master的复制操作;

5.如果Master由于某种原因(例如:宕机和断电等)导致不能正常运行,则此时需要让Master_Backup自动切换为新主机,而Slave和Slave_Backup也能自动切换数据源到Master_Backup;

6.同理,如果Slave由于某种原因(例如:宕机和断电等)导致不能正常运行,则此时需要让对应的Slave_Backup自动切换为新从机;

7.无论是Master还是切换后的Master_Backup,它们向客户端提供的连接地址应保持一致,如上图提供的VIP+Port,即192.168.31.201:3306,Slave和Slave_Backup也应如此,对外提供的连接地址始终是192.168.31.202:3306和192.168.31.203:3306。


文章转载自初七的学习笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论