Nicksxs's Blog

What hurts more, the pain of hard work or the pain of regret?

0%

# docker-mysql-cluster

发表于 2016-08-14 更新于 2020-01-12 分类于 docker 阅读次数： 阅读次数： Disqus：

### docker-mysql-cluster

基于docker搭了个mysql集群，稍微记一下，
首先是新建mysql主库容
`docker run -d -e MYSQL_ROOT_PASSWORD=admin --name mysql-master -p 3307:3306 mysql:latest`
`-d`表示容器运行在后台，`-e`表示设置环境变量，即`MYSQL_ROOT_PASSWORD=admin`,设置了mysql的root密码，
`--name`表示容器名，`-p`表示端口映射，将内部mysql:3306映射为外部的3307，最后的`mysql:latest`表示镜像名
此外还可以用`-v /local_path/my-master.cnf:/etc/mysql/my.cnf`来映射配置文件
然后同理启动从库
`docker run -d -e MYSQL_ROOT_PASSWORD=admin --name mysql-slave -p 3308:3306 mysql:latest`
然后进入主库改下配置文件
`docker-enter mysql-master`如果无法进入就用`docker ps -a`看下容器是否在正常运行，如果status显示
未正常运行，则用`docker logs mysql-master`看下日志哪里出错了。
进入容器后，我这边使用的镜像的mysqld配置文件是在`/etc/mysql`下面，这个最新版本的mysql的配置文件包含
三部分，`/etc/mysql/my.cnf`和`/etc/mysql/conf.d/mysql.cnf`，还有`/etc/mysql/mysql.conf.d/mysqld.cnf`
这里需要改的是最后一个，加上

    log-bin = mysql-bin
    server_id = 1

保存后退出容器重启主库容器，然后进入从库更改相同文件，

    log-bin = mysql-bin
    server_id = 2

### 主从配置

同样退出重启容器，然后是配置主从，首先进入主库，用命令mysql -u root -pxxxx进入mysql，然后赋予一个同步
权限`GRANT REPLICATION SLAVE ON *.* to 'backup'@'%' identified by '123456';`还是同样说明下，ON *.*表示了数
据库全部的权限，如果要指定数据库/表的话可以使用类似`testDb/testTable`，然后是`'backup'@'%'`表示给予同步
权限的用户名及其主机ip，%表示不限制ip，当然如果有防火墙的话还是会有限制的，最后的`identified by '123456'`
表示同步用户的密码，然后就查看下主库的状态信息`show master status`，如下图：
把file跟position记下来，然后再开一个terminal，进入从库容器，登陆mysql，然后设置主库

    change master to
    master_host='xxx.xxx.xxx.xxx',   //如果主从库的容器都在同一个宿主机上，这里的ip是docker容器的ip
    master_user='backup',            //就是上面的赋予权限的用户
    master_password='123456',
    master_log_file='mysql-bin.000004',  //主库中查看到的file
    master_log_pos=312,                  //主库中查看到的position
    master_port=3306;                    //如果是同一宿主机，这里使用真实的3306端口，3308及主库的3307是给外部连接使用的

通过`docker-ip mysql-master`可以查看容器的ip
这里有一点是要注意的，也是我踩的坑，就是如果是同一宿主机下两个mysql容器互联，我这里只能通过docker-ip和真实
的3306端口能够连接成功。
本文参考了这位同学的文章