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

0%

docker-mysql-cluster

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
这里需要改的是最后一个,加上

1
2
log-bin = mysql-bin
server_id = 1

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

1
2
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,如下图:
9G5FE[9%@7%G(B`Q7]E)5@R.png
把file跟position记下来,然后再开一个terminal,进入从库容器,登陆mysql,然后设置主库

1
2
3
4
5
6
7
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
S(GP)P(M$N3~N1764@OW3E0.png
这里有一点是要注意的,也是我踩的坑,就是如果是同一宿主机下两个mysql容器互联,我这里只能通过docker-ip和真实
的3306端口能够连接成功。
本文参考了这位同学的文章

请我喝杯咖啡