一、准备工作
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。




