本文讲解mysql的集群搭建
1. docker安装并启动三台mysql
docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD="123456" \
--privileged=true -v /c/Users/Public/conf/my.cnf:/etc/mysql/my.cnf \
--name=mysql1 mysql:5.6.17
参数说明:
-d 后台运行容器并打印容器id
-p 指定端口映射 主机:容器
-e 设置环境变量
–privileged 是否容器有足够的权限(root)
-v 指定目录映射
–name 指定容器名称
docker exec -it mysql1 /bin/bash
第二台
docker run -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD="123456" \
--privileged=true -v /c/Users/Public/conf/my.cnf:/etc/mysql/my2.cnf \
--name=mysql1 mysql:5.6.17
第三台
docker run -d -p 3309:3306 -e MYSQL_ROOT_PASSWORD="123456" \
--privileged=true -v /c/Users/Public/conf/my.cnf:/etc/mysql/my3.cnf \
--name=mysql1 mysql:5.6.17
2. 创建基础库并设置可访问用户
分别在三台mysql上建立test数据库
create database test character set utf8 collate utf8_general_ci;
设置mysql用户及权限
grant all privileges on test.* to culter@'%' identified by "123321";
flush privileges;
3. 主从配置
主:192.168.0.97:3306
从:192.168.99.100:3307
192.168.99.100:3308
192.168.99.100:3309
3.1 主服务器配置
# 主从复制需要开启binglog
log-bin=mysql-bin
# 二进制格式推荐 mixed
binlog_format=mixed
# required unique id between 1 and 2^32 - 1
# defaults to 1 if master-host is not set
# but will not function as a master if omitted
server-id = 1
设置复制权限:
grant replication slave on *.* to 'culter'@'%' identified by '123321';
如果指定数据库 会报错:
mysql> grant replication slave on test.* to 'culter'@'%' identified by '123321';
ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES
mysql> grant replication slave on *.* to 'culter'@'%' identified by '123321';
Query OK, 0 rows affected (0.00 sec)
展示主服务器状态:
show master status;
下面的从库配置会使用到:
3.2 从服务器配置
step 1 更改配置文件
分别在从服务器中的my.cnf中添加 将id分别改为 2,3,4
[mysqld]
log-bin=mysql-bin
binlog_format=mixed
server-id = 2
step 2 配置同步主库源
然后我们对三台机器分别设置
change master to master_host='192.168.0.97',master_user='culter',master_password='123321',master_log_file='mysql-bin.000003',master_log_pos=204;
完整语法:
CHANGE MASTER TO
MASTER_HOST='192.168.0.97',
MASTER_USER='culter',
MASTER_PASSWORD='123321',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=325,
MASTER_AUTO_POSITION=0;
报错:
ERROR 1794 (HY000): Slave is not configured or failed to initialize properly. You must at least set --server-id to enable either a master or a slave. Additional error messages can be found in the MySQL error log.
注意:由于我使用的docker安装的,并指定了my.cnf的映射目录,导致 /etc/mysql/my.cnf
无论怎样
更改权限,都无法加载,会报如下错误(必须进入mysql对应的容器内部执行命令才能看到)
root@8251dd588c9c:/usr/local/mysql# mysql -uculter -p
Warning: World-writable config file '/etc/mysql/my.cnf' is ignored
这个错误的原因是因为mysql认为my.cnf
的操作权限是777,任何人都能操作,所以存在安全隐患,就直接忽略了这个配置文件。
但是由于我们无法更改,只能新建一个 /etc/my.cnf
然后重新加入上面的内容,并重启容器
命令执行顺序
docker exec -it mysql1 /bin/bash
vim /etc/my.cnf
内容
[mysqld]
log-bin=mysql-bin
binlog_format=mixed
server-id = 2
重启
docker restart mysql1
step 3 启动主从复制
mysql> slave start;
报错:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'slave start' at line 1
mysql> start slave ;
Query OK, 0 rows affected (0.01 sec)
根据部分mysql版本的原因,可能会出现命令的不一致,需要更改命令为:
mysql> start slave;
码字不易,打赏一下小弟吧